summaryrefslogtreecommitdiff
path: root/texmf-dist/scripts/ketpic/data
diff options
context:
space:
mode:
Diffstat (limited to 'texmf-dist/scripts/ketpic/data')
-rw-r--r--texmf-dist/scripts/ketpic/data/Rtutorial/t4sample1.csv1
-rw-r--r--texmf-dist/scripts/ketpic/data/Rtutorial/t4sample2.csv74
-rw-r--r--texmf-dist/scripts/ketpic/data/Rtutorial/t6sample.csv21
-rw-r--r--texmf-dist/scripts/ketpic/data/Rtutorial/t7sample.csv21
-rw-r--r--texmf-dist/scripts/ketpic/data/Rtutorial/t8sampledistrtest.csv201
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/0Small.pngbin0 -> 44733 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/0Smalla-h.pngbin0 -> 53016 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/0Smalli-o.pngbin0 -> 50904 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/0Smallp-w.pngbin0 -> 50873 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/0Smallxyz.pngbin0 -> 25488 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/nsi.cdybin0 -> 150809 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/nsi.txt29
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/pcr.cdybin0 -> 17929 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/pcr.txt26
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/qcr.cdybin0 -> 17298 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/qcr.txt23
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/rcr.cdybin0 -> 18491 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/rcr.txt34
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/tsi.cdybin0 -> 149969 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/tsi.txt23
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/xsi.cdybin0 -> 150258 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/xsi.txt26
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/ysi.cdybin0 -> 150465 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/ysi.txt26
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/zsi.cdybin0 -> 150287 bytes
-rw-r--r--texmf-dist/scripts/ketpic/data/fontF/zsi.txt28
-rw-r--r--texmf-dist/scripts/ketpic/data/js/Cindy.js757
-rw-r--r--texmf-dist/scripts/ketpic/data/js/CindyJS.css121
-rw-r--r--texmf-dist/scripts/ketpic/data/js/ketcindylib.txt6389
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/READMEj(kobayashi-suzuki).txt116
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/READMEj(mitani).txt7
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/a03.obj14
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/a04.obj18
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/a05.obj22
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/a06.obj26
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/a07.obj30
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/a08.obj34
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/a09.obj38
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/a10.obj42
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n01.obj10
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n02.obj12
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n03.obj17
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n04.obj22
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n05.obj27
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n06.obj37
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n07.obj14
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n08.obj18
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n09.obj22
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n10.obj22
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n11.obj27
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n12.obj11
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n13.obj17
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n14.obj17
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n15.obj22
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n16.obj27
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n17.obj26
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n18.obj29
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n19.obj38
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n20.obj47
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n21.obj57
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n22.obj35
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n23.obj46
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n24.obj57
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n25.obj67
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n26.obj16
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n27.obj26
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n28.obj34
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n29.obj34
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n30.obj42
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n31.obj42
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n32.obj52
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n33.obj52
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n34.obj62
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n35.obj38
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n36.obj38
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n37.obj50
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n38.obj62
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n39.obj62
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n40.obj72
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n41.obj72
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n42.obj82
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n43.obj82
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n44L.obj44
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n44R.obj44
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n45L.obj58
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n45R.obj58
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n46L.obj72
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n46R.obj72
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n47L.obj82
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n47R.obj82
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n48L.obj92
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n48R.obj92
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n49.obj15
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n50.obj19
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n51.obj23
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n52.obj21
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n53.obj25
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n54.obj24
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n55.obj28
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n56.obj28
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n57.obj32
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n58.obj37
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n59.obj42
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n60.obj42
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n61.obj47
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n62.obj22
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n63.obj17
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n64.obj20
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n65.obj29
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n66.obj50
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n67.obj62
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n68.obj107
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n69.obj122
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n70.obj122
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n71.obj137
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n72.obj122
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n73.obj122
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n74.obj122
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n75.obj122
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n76.obj107
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n77.obj107
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n78.obj107
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n79.obj107
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n80.obj92
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n81.obj92
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n82.obj92
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n83.obj77
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n84.obj20
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n85.obj42
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n86.obj24
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n87.obj28
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n88.obj30
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n89.obj35
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n90.obj40
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n91.obj28
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/n92.obj38
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/p03.obj11
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/p04.obj14
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/p05.obj17
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/p06.obj20
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/p07.obj23
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/p08.obj26
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/p09.obj29
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/p10.obj32
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/r01.obj8
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/r02.obj14
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/r03.obj14
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/r04.obj32
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/r05.obj32
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s01.obj26
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s02.obj62
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s03.obj20
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s04.obj38
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s05.obj38
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s06.obj92
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s07.obj92
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s08.obj50
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s09.obj122
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s10.obj74
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s11.obj182
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s12L.obj62
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s12R.obj62
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s13L.obj152
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/s13R.obj152
-rw-r--r--texmf-dist/scripts/ketpic/data/polyhedrons_obj/整面凸多面体データ.pdfbin0 -> 77577 bytes
165 files changed, 14606 insertions, 0 deletions
diff --git a/texmf-dist/scripts/ketpic/data/Rtutorial/t4sample1.csv b/texmf-dist/scripts/ketpic/data/Rtutorial/t4sample1.csv
new file mode 100644
index 00000000..75715f97
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/Rtutorial/t4sample1.csv
@@ -0,0 +1 @@
+-0.16,-1.79,0.21,0.64,1.12,-0.04,0.05,0.99,-0.4,-0.17,0.94,-0.99,1.43,-0.74,-0.16,0.75,1.18,1.53,1.55,0.17,-0.02,-0.78,0.5,0.16,-1.47,-0.26,0.14,-1.8,-0.78,0.29,-0.02,-0.06,-0.08,1.37,0.77,-0.06,-0.21,0.72,-1.08,-0.72,-0.51,0.8,-0.95,0.36,-1.5,-0.24,-1.21,2.5,0.03,-0.8,0.32,0.79,1.03,-1.32,-1.17,1,0.89,0.47,1.18,-0.21,0.39,-1.17,-0.49,1.04,0.09,0.97,-0.55,-0.09,-1,1.15,-0.89,-0.77,1.04,-0.79,-0.66,-0.9,0.78,-0.55,-0.42,0.32,-0.75,-0.6,-0.66,-0.05,-0.94,-0.54,0.83,0.08,-0.93,-0.3,0.74,-1.35,1.5,-2.44,-0.44,-0.17,-1.32,0.13,-1.49,0.43
diff --git a/texmf-dist/scripts/ketpic/data/Rtutorial/t4sample2.csv b/texmf-dist/scripts/ketpic/data/Rtutorial/t4sample2.csv
new file mode 100644
index 00000000..928f94d0
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/Rtutorial/t4sample2.csv
@@ -0,0 +1,74 @@
+,No1,No2,,,,,,,,
+,60,66,,,,,,,,
+,62,67,,,,,,,,
+,30,60,,,,,,,,
+,60,70,,,,,,,,
+,77,60,,,,,,,,
+,65,60,,,,,,,,
+,30,54,,,,,,,,
+,30,50,,,,,,,,
+,20,40,,,,,,,,
+,88,80,,,,,,,,
+,82,60,,,,,,,,
+,87,88,,,,,,,,
+,60,66,,,,,,,,
+,83,85,,,,,,,,
+,87,88,,,,,,,,
+,60,66,,,,,,,,
+,87,88,,,,,,,,
+,60,66,,,,,,,,
+,60,66,,,,,,,,
+,73,76,,,,,,,,
+,82,80,,,,,,,,
+,60,66,,,,,,,,
+,87,88,,,,,,,,
+,63,68,,,,,,,,
+,20,50,,,,,,,,
+,72,75,,,,,,,,
+,70,80,,,,,,,,
+,60,66,,,,,,,,
+,60,66,,,,,,,,
+,87,88,,,,,,,,
+,84,86,,,,,,,,
+,99,90,,,,,,,,
+,89,90,,,,,,,,
+,60,80,,,,,,,,
+,96,97,,,,,,,,
+,81,83,,,,,,,,
+,92,70,,,,,,,,
+,60,66,,,,,,,,
+,60,66,,,,,,,,
+,40,56,,,,,,,,
+,66,70,,,,,,,,
+,63,68,,,,,,,,
+,80,82,,,,,,,,
+,64,69,,,,,,,,
+,80,82,,,,,,,,
+,95,96,,,,,,,,
+,80,50,,,,,,,,
+,20,40,,,,,,,,
+,94,80,,,,,,,,
+,94,95,,,,,,,,
+,87,88,,,,,,,,
+,60,66,,,,,,,,
+,80,82,,,,,,,,
+,70,74,,,,,,,,
+,99,100,,,,,,,,
+,86,87,,,,,,,,
+,40,56,,,,,,,,
+,60,70,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,,
+,,,,,,,,,, \ No newline at end of file
diff --git a/texmf-dist/scripts/ketpic/data/Rtutorial/t6sample.csv b/texmf-dist/scripts/ketpic/data/Rtutorial/t6sample.csv
new file mode 100644
index 00000000..70614266
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/Rtutorial/t6sample.csv
@@ -0,0 +1,21 @@
+no1,no2
+2.50029,3.0914
+1.14447,0.5
+6.61082,5.12323
+7.91532,9.5
+9.58157,9.21903
+8.16335,8.71356
+8.3303,8.32783
+2.90018,2.22525
+4.58738,4.33457
+8.77463,6.63825
+4.04384,3.51828
+6.31744,6.42058
+9.99769,9.5
+1.74338,2.08149
+1.74195,0.55616
+7.79965,8.14211
+2.48528,2.20084
+3.54729,3.61683
+6.72468,5.99547
+1.22752,1.05287
diff --git a/texmf-dist/scripts/ketpic/data/Rtutorial/t7sample.csv b/texmf-dist/scripts/ketpic/data/Rtutorial/t7sample.csv
new file mode 100644
index 00000000..ed185bf1
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/Rtutorial/t7sample.csv
@@ -0,0 +1,21 @@
+no1,no2
+5.18806,5.84027
+2.40647,2.1354
+1.67986,2.65213
+6.07764,6.3763
+1.34631,0.5
+7.48434,7.81286
+3.51076,2.85506
+9.90707,9.5
+4.50056,4.59383
+8.65694,7.76352
+2.40712,4.22212
+9.48185,9.5
+4.8778,3.83387
+7.79092,7.81612
+8.40402,8.06828
+2.25626,2.57587
+2.35259,3.0321
+6.69321,6.61142
+5.94798,5.43573
+1.40489,0.5
diff --git a/texmf-dist/scripts/ketpic/data/Rtutorial/t8sampledistrtest.csv b/texmf-dist/scripts/ketpic/data/Rtutorial/t8sampledistrtest.csv
new file mode 100644
index 00000000..ba609bb7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/Rtutorial/t8sampledistrtest.csv
@@ -0,0 +1,201 @@
+n=1,n=10
+4,5.2
+4,5.2
+5,5.3
+2,6.6
+6,5.9
+5,5.9
+6,5.7
+3,3.7
+7,6.2
+6,5.8
+0,6.2
+6,4.6
+5,5.3
+6,5.5
+8,6.2
+5,4.9
+7,5.5
+3,4.2
+5,6.4
+5,4.9
+3,4.9
+1,4.7
+3,4.3
+8,4.4
+2,4.3
+3,4.2
+1,4.6
+3,5.4
+5,5.3
+7,4.8
+3,4.5
+7,4.4
+3,5.2
+8,4.3
+0,4.3
+6,6.1
+6,3.9
+2,4.9
+8,5.4
+8,5.7
+7,4.6
+6,4.5
+5,3.5
+4,5.1
+5,5.9
+2,4.5
+3,4.6
+6,5.6
+3,4.8
+3,5.9
+6,4.2
+9,4.1
+7,5.2
+10,4.7
+2,5.4
+6,5.5
+8,3.9
+1,4.9
+3,4
+6,5.5
+6,4.2
+6,4.8
+9,4.6
+2,4.8
+5,4.9
+3,4.7
+5,5
+6,5.1
+3,6.4
+3,5.5
+9,4
+3,5
+10,4.5
+12,5.6
+2,5.3
+3,5.2
+2,3.4
+7,5
+4,4.5
+1,4
+3,5.3
+5,3.8
+7,3.5
+5,5.5
+5,4.9
+6,4.7
+5,4.1
+11,4.6
+2,4.9
+1,5
+5,4.7
+4,5.3
+6,5.4
+5,5.6
+7,3.6
+8,5.7
+5,5.8
+6,4.9
+7,3.6
+9,4.7
+2,4.8
+4,4.9
+8,5.4
+2,5.2
+4,6.3
+3,5.5
+6,6.7
+7,4.7
+6,4.8
+4,5
+7,4.4
+5,4.7
+5,4.4
+8,5.3
+4,5.5
+5,5
+4,6.9
+4,5.6
+4,5.9
+4,4.8
+4,4.2
+3,5.3
+5,6
+4,5.1
+6,5.9
+6,4.9
+5,4.3
+5,5.5
+6,3.5
+6,5.4
+5,5.7
+2,4.5
+5,4.7
+3,5.3
+7,4.8
+6,4.3
+4,5.5
+7,6.2
+6,7.1
+5,4.4
+5,4.6
+5,5.6
+3,4.7
+1,4.7
+11,5
+7,5.6
+5,5.8
+6,5.8
+3,5.7
+6,5.3
+6,3.9
+4,6.3
+5,4.8
+3,5
+5,4.4
+7,5.6
+6,5.2
+5,5.2
+4,5.5
+2,5.3
+9,4.1
+6,5.3
+10,6
+4,4.6
+9,6.3
+3,3.5
+4,5.5
+4,4.8
+3,4.7
+2,4
+5,4.4
+3,4.3
+8,4.6
+3,4.1
+7,4.8
+2,6.2
+5,5.4
+8,4.7
+8,4.6
+6,6
+5,4.7
+2,4.5
+8,4.5
+3,7.2
+4,4.1
+4,5.6
+4,5.2
+5,6
+4,5.5
+7,4.5
+5,4.8
+2,4.7
+7,5.1
+13,4.1
+10,5.6
+10,4.5
+1,4.5
+2,4.9
+4,6.3
+7,4.6
diff --git a/texmf-dist/scripts/ketpic/data/fontF/0Small.png b/texmf-dist/scripts/ketpic/data/fontF/0Small.png
new file mode 100644
index 00000000..8d491ce0
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/0Small.png
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/0Smalla-h.png b/texmf-dist/scripts/ketpic/data/fontF/0Smalla-h.png
new file mode 100644
index 00000000..4578fb1e
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/0Smalla-h.png
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/0Smalli-o.png b/texmf-dist/scripts/ketpic/data/fontF/0Smalli-o.png
new file mode 100644
index 00000000..812d3755
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/0Smalli-o.png
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/0Smallp-w.png b/texmf-dist/scripts/ketpic/data/fontF/0Smallp-w.png
new file mode 100644
index 00000000..29c6c446
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/0Smallp-w.png
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/0Smallxyz.png b/texmf-dist/scripts/ketpic/data/fontF/0Smallxyz.png
new file mode 100644
index 00000000..a4e3a6a6
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/0Smallxyz.png
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/nsi.cdy b/texmf-dist/scripts/ketpic/data/fontF/nsi.cdy
new file mode 100644
index 00000000..53393398
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/nsi.cdy
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/nsi.txt b/texmf-dist/scripts/ketpic/data/fontF/nsi.txt
new file mode 100644
index 00000000..3492d65d
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/nsi.txt
@@ -0,0 +1,29 @@
+nsin//
+start//
+[[2,0]]//
+end//
+nsi1k//
+start//
+[[-1.7646,1.9555],[-0.8458,1.7871],[-1.3206,-0.0046]]//
+end//
+nsi1c//
+start//
+[[-1.4431,3.395],[-0.5243,3.104]]//
+end//
+start//
+[[-0.9837,1.3328],[-1.1521,0.664]]//
+end//
+nsi2k//
+start//
+[[-1.3206,-0.0046],[-0.9224,1.5114],[0.9152,1.4348],[1.7115,0.9601]]//
+end//
+nsi2c//
+start//
+[[-1.1776,0.5007],[-1.0449,1.0367]]//
+end//
+start//
+[[-0.218,3.7166],[1.6962,3.104]]//
+end//
+start//
+[[0.0919,-0.3982],[1.4206,-0.2037]]//
+end////
diff --git a/texmf-dist/scripts/ketpic/data/fontF/pcr.cdy b/texmf-dist/scripts/ketpic/data/fontF/pcr.cdy
new file mode 100644
index 00000000..cc8891d0
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/pcr.cdy
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/pcr.txt b/texmf-dist/scripts/ketpic/data/fontF/pcr.txt
new file mode 100644
index 00000000..76c429b5
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/pcr.txt
@@ -0,0 +1,26 @@
+pcrn//
+start//
+[[2,0]]//
+end//
+pcr1k//
+start//
+[[-1.4642,4.3617],[-1.4816,0.0001]]//
+end//
+pcr1c//
+start//
+[[-1.4642,3.0117],[-1.4642,1.5578]]//
+end//
+pcr2k//
+start//
+[[-1.7654,4.3962],[0.3658,4.3899],[0.3704,2.1982],[-1.4816,2.1982]]//
+end//
+pcr2c//
+start//
+[[-1.1236,4.3899],[0,4.3899]]//
+end//
+start//
+[[1.8552,4.3638],[1.7769,2.2211]]//
+end//
+start//
+[[0.0242,2.1982],[-0.72,2.1982]]//
+end////
diff --git a/texmf-dist/scripts/ketpic/data/fontF/qcr.cdy b/texmf-dist/scripts/ketpic/data/fontF/qcr.cdy
new file mode 100644
index 00000000..ad28dd15
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/qcr.cdy
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/qcr.txt b/texmf-dist/scripts/ketpic/data/fontF/qcr.txt
new file mode 100644
index 00000000..58a390e9
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/qcr.txt
@@ -0,0 +1,23 @@
+qcrn//
+start//
+[[2,0]]//
+end//
+qcr1k//
+start//
+[[0,0.1212],[0,4.5347],[0,0.1212]]//
+end//
+qcr1c//
+start//
+[[2.5616,0.1904],[2.527,4.5347]]//
+end//
+start//
+[[-2.527,4.4828],[-2.527,0.1731]]//
+end//
+qcr2k//
+start//
+[[0,1],[2.1808,-0.1904]]//
+end//
+qcr2c//
+start//
+[[0.9866,0.9692],[1.402,-0.1731]]//
+end////
diff --git a/texmf-dist/scripts/ketpic/data/fontF/rcr.cdy b/texmf-dist/scripts/ketpic/data/fontF/rcr.cdy
new file mode 100644
index 00000000..e5a02dd9
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/rcr.cdy
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/rcr.txt b/texmf-dist/scripts/ketpic/data/fontF/rcr.txt
new file mode 100644
index 00000000..f668aba4
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/rcr.txt
@@ -0,0 +1,34 @@
+rcrn//
+start//
+[[3,0]]//
+end//
+rcr1k//
+start//
+[[-1.5231,4.4135],[-1.5231,0]]//
+end//
+rcr1c//
+start//
+[[-1.5231,2.9424],[-1.5231,1.4712]]//
+end//
+rcr2k//
+start//
+[[-1.7827,4.4135],[0.6231,4.4135],[0.5885,2.3366],[-1.5231,2.3366]]//
+end//
+rcr2c//
+start//
+[[-0.9808,4.4135],[-0.1788,4.4135]]//
+end//
+start//
+[[2.0943,4.4135],[2.025,2.3539]]//
+end//
+start//
+[[-0.1038,2.3366],[-0.75,2.3366]]//
+end//
+rcr3k//
+start//
+[[-0.3981,2.3366],[1.8866,-0]]//
+end//
+rcr3c//
+start//
+[[1.2808,2.3193],[1.0731,1.2462]]//
+end////
diff --git a/texmf-dist/scripts/ketpic/data/fontF/tsi.cdy b/texmf-dist/scripts/ketpic/data/fontF/tsi.cdy
new file mode 100644
index 00000000..2fa6231c
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/tsi.cdy
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/tsi.txt b/texmf-dist/scripts/ketpic/data/fontF/tsi.txt
new file mode 100644
index 00000000..6a51e190
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/tsi.txt
@@ -0,0 +1,23 @@
+tsin//
+start//
+[[2,0]]//
+end//
+tsi1k//
+start//
+[[-0.9341,2.8483],[0.9494,2.879]]//
+end//
+tsi1c//
+start//
+[[-0.3063,2.8585],[0.3216,2.8687]]//
+end//
+tsi2k//
+start//
+[[0.3828,4.2112],[-0.49,0.6125],[0.8422,0.9801]]//
+end//
+tsi2c//
+start//
+[[0.0919,3.0117],[-0.1991,1.8121]]//
+end//
+start//
+[[-0.7044,-0.2144],[0.4594,-0.1072]]//
+end////
diff --git a/texmf-dist/scripts/ketpic/data/fontF/xsi.cdy b/texmf-dist/scripts/ketpic/data/fontF/xsi.cdy
new file mode 100644
index 00000000..428c783d
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/xsi.cdy
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/xsi.txt b/texmf-dist/scripts/ketpic/data/fontF/xsi.txt
new file mode 100644
index 00000000..f16d04f0
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/xsi.txt
@@ -0,0 +1,26 @@
+xsin//
+start//
+[[2,0]]//
+end//
+xsi1k//
+start//
+[[-1.2134,2.2311],[0.027,1.3889],[1.2521,0.6232]]//
+end//
+xsi1c//
+start//
+[[-0.9837,3.0734],[0.6855,3.4869]]//
+end//
+start//
+[[-0.6468,-0.5866],[0.9765,-0.1118]]//
+end//
+xsi2k//
+start//
+[[1.6043,2.5527],[0.027,1.3889],[-1.5503,0.3935]]//
+end//
+xsi2c//
+start//
+[[1.4818,3.1193],[0.4864,3.2265]]//
+end//
+start//
+[[-0.4324,-0.3722],[-1.489,-0.2037]]//
+end////
diff --git a/texmf-dist/scripts/ketpic/data/fontF/ysi.cdy b/texmf-dist/scripts/ketpic/data/fontF/ysi.cdy
new file mode 100644
index 00000000..ff075329
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/ysi.cdy
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/ysi.txt b/texmf-dist/scripts/ketpic/data/fontF/ysi.txt
new file mode 100644
index 00000000..83f6b329
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/ysi.txt
@@ -0,0 +1,26 @@
+ysin//
+start//
+[[2,0]]//
+end//
+ysi1k//
+start//
+[[-1.3052,2.1239],[-0.5549,1.4042],[1.0684,1.3889]]//
+end//
+ysi1c//
+start//
+[[-0.8458,3.2418],[0.2567,3.2572]]//
+end//
+start//
+[[-1.198,-0.1272],[0.4099,-0.8316]]//
+end//
+ysi2k//
+start//
+[[1.4665,2.8284],[0.7008,-0.0506],[-1.244,-0.8316]]//
+end//
+ysi2c//
+start//
+[[1.1756,1.7462],[0.9152,0.7406]]//
+end//
+start//
+[[0.2721,-1.6738],[-1.1981,-1.5666]]//
+end////
diff --git a/texmf-dist/scripts/ketpic/data/fontF/zsi.cdy b/texmf-dist/scripts/ketpic/data/fontF/zsi.cdy
new file mode 100644
index 00000000..3326d6ad
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/zsi.cdy
Binary files differ
diff --git a/texmf-dist/scripts/ketpic/data/fontF/zsi.txt b/texmf-dist/scripts/ketpic/data/fontF/zsi.txt
new file mode 100644
index 00000000..f62925cd
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/fontF/zsi.txt
@@ -0,0 +1,28 @@
+zsin//
+start//
+[[3,0]]//
+end//
+zsi1k//
+start//
+[[-0.8152,2.2618],[1.1756,2.6752]]//
+end//
+zsi1c//
+start//
+[[0.1802,3.7319],[0.2874,1.7564]]//
+end//
+zsi2k//
+start//
+[[1.3287,2.8896],[-1.3818,-0.02]]//
+end//
+zsi2c//
+start//
+[[0.5783,1.7564],[-0.7846,1.052]]//
+end//
+zsi3k//
+start//
+[[-1.1215,0.3629],[1.0684,0.8835]]//
+end//
+zsi3c//
+start//
+[[-0.5549,0.9754],[0.2108,-0.9388]]//
+end////
diff --git a/texmf-dist/scripts/ketpic/data/js/Cindy.js b/texmf-dist/scripts/ketpic/data/js/Cindy.js
new file mode 100644
index 00000000..0fe1c2a5
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/js/Cindy.js
@@ -0,0 +1,757 @@
+/* CindyJS - (C) 2014-2016 The CindyJS Project
+ * Mostly licensed under the Apache License 2.0, but subprojects may use different licensing.
+ * See https://github.com/CindyJS/CindyJS/tree/a578a6389991b86a1b9f4e54197acf99bc1adec0
+ * for corresponding sources and their respective licensing conditions.
+ */
+(function(){function q(b,d,e){h.biginteger_used=1;null!=b&&("number"==typeof b&&"undefined"==typeof d?this.fromInt(b):"number"==typeof b?this.fromNumber(b,d,e):null==d&&"string"!=typeof b?this.fromString(b,256):this.fromString(b,d))}function H(){return new q(null)}function oa(b,d,e,l,h,r){for(;0<=--r;){var k=d*this[b++]+e[l]+h;h=Math.floor(k/67108864);e[l++]=k&67108863}return h}function ib(b,d,e,l,h,r){var k=d&32767;for(d>>=15;0<=--r;){var E=this[b]&32767,B=this[b++]>>15,q=d*E+B*k,E=k*E+((q&32767)<<
+15)+e[l]+(h&1073741823);h=(E>>>30)+(q>>>15)+d*B+(h>>>30);e[l++]=E&1073741823}return h}function Ia(b,d,e,l,h,r){var k=d&16383;for(d>>=14;0<=--r;){var E=this[b]&16383,B=this[b++]>>14,q=d*E+B*k,E=k*E+((q&16383)<<14)+e[l]+h;h=(E>>28)+(q>>14)+d*B;e[l++]=E&268435455}return h}function Ja(b,d){var e=Ya[b.charCodeAt(d)];return null==e?-1:e}function Ba(b){var d=H();d.fromInt(b);return d}function k(b){var d=1,e;0!=(e=b>>>16)&&(b=e,d+=16);0!=(e=b>>8)&&(b=e,d+=8);0!=(e=b>>4)&&(b=e,d+=4);0!=(e=b>>2)&&(b=e,d+=2);
+0!=b>>1&&(d+=1);return d}function Ra(b){this.m=b}function L(b){this.m=b;this.mp=b.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<b.DB-15)-1;this.mt2=2*b.t}function fa(b,d){return b&d}function Y(b,d){return b|d}function Q(b,d){return b^d}function X(b,d){return b&~d}function xb(){}function Fc(b){return b}function ka(b){this.r2=H();this.q3=H();q.ONE.dlShiftTo(2*b.t,this.r2);this.mu=this.r2.divide(b);this.m=b}var h={},Ib=!1;"undefined"!==typeof module&&module.exports?(module.exports=
+h,Ib=!0):"undefined"!==typeof document?window.ClipperLib=h:self.ClipperLib=h;var da;if(Ib)S="chrome",da="Netscape";else{var S=navigator.userAgent.toString().toLowerCase();da=navigator.appName}var Za,Wb,La,$a,jb,pb;Za=-1!=S.indexOf("chrome")&&-1==S.indexOf("chromium")?1:0;Ib=-1!=S.indexOf("chromium")?1:0;Wb=-1!=S.indexOf("safari")&&-1==S.indexOf("chrome")&&-1==S.indexOf("chromium")?1:0;La=-1!=S.indexOf("firefox")?1:0;S.indexOf("firefox/17");S.indexOf("firefox/15");S.indexOf("firefox/3");$a=-1!=S.indexOf("opera")?
+1:0;S.indexOf("msie 10");S.indexOf("msie 9");jb=-1!=S.indexOf("msie 8")?1:0;pb=-1!=S.indexOf("msie 7")?1:0;S=-1!=S.indexOf("msie ")?1:0;h.biginteger_used=null;"Microsoft Internet Explorer"==da?(q.prototype.am=ib,da=30):"Netscape"!=da?(q.prototype.am=oa,da=26):(q.prototype.am=Ia,da=28);q.prototype.DB=da;q.prototype.DM=(1<<da)-1;q.prototype.DV=1<<da;q.prototype.FV=Math.pow(2,52);q.prototype.F1=52-da;q.prototype.F2=2*da-52;var Ya=[],K;da=48;for(K=0;9>=K;++K)Ya[da++]=K;da=97;for(K=10;36>K;++K)Ya[da++]=
+K;da=65;for(K=10;36>K;++K)Ya[da++]=K;Ra.prototype.convert=function(b){return 0>b.s||0<=b.compareTo(this.m)?b.mod(this.m):b};Ra.prototype.revert=function(b){return b};Ra.prototype.reduce=function(b){b.divRemTo(this.m,null,b)};Ra.prototype.mulTo=function(b,d,e){b.multiplyTo(d,e);this.reduce(e)};Ra.prototype.sqrTo=function(b,d){b.squareTo(d);this.reduce(d)};L.prototype.convert=function(b){var d=H();b.abs().dlShiftTo(this.m.t,d);d.divRemTo(this.m,null,d);0>b.s&&0<d.compareTo(q.ZERO)&&this.m.subTo(d,d);
+return d};L.prototype.revert=function(b){var d=H();b.copyTo(d);this.reduce(d);return d};L.prototype.reduce=function(b){for(;b.t<=this.mt2;)b[b.t++]=0;for(var d=0;d<this.m.t;++d){var e=b[d]&32767,l=e*this.mpl+((e*this.mph+(b[d]>>15)*this.mpl&this.um)<<15)&b.DM,e=d+this.m.t;for(b[e]+=this.m.am(0,l,b,d,0,this.m.t);b[e]>=b.DV;)b[e]-=b.DV,b[++e]++}b.clamp();b.drShiftTo(this.m.t,b);0<=b.compareTo(this.m)&&b.subTo(this.m,b)};L.prototype.mulTo=function(b,d,e){b.multiplyTo(d,e);this.reduce(e)};L.prototype.sqrTo=
+function(b,d){b.squareTo(d);this.reduce(d)};q.prototype.copyTo=function(b){for(var d=this.t-1;0<=d;--d)b[d]=this[d];b.t=this.t;b.s=this.s};q.prototype.fromInt=function(b){this.t=1;this.s=0>b?-1:0;0<b?this[0]=b:-1>b?this[0]=b+this.DV:this.t=0};q.prototype.fromString=function(b,d){var e;if(16==d)e=4;else if(8==d)e=3;else if(256==d)e=8;else if(2==d)e=1;else if(32==d)e=5;else if(4==d)e=2;else{this.fromRadix(b,d);return}this.s=this.t=0;for(var l=b.length,h=!1,r=0;0<=--l;){var k=8==e?b[l]&255:Ja(b,l);0>
+k?"-"==b.charAt(l)&&(h=!0):(h=!1,0==r?this[this.t++]=k:r+e>this.DB?(this[this.t-1]|=(k&(1<<this.DB-r)-1)<<r,this[this.t++]=k>>this.DB-r):this[this.t-1]|=k<<r,r+=e,r>=this.DB&&(r-=this.DB))}8==e&&0!=(b[0]&128)&&(this.s=-1,0<r&&(this[this.t-1]|=(1<<this.DB-r)-1<<r));this.clamp();h&&q.ZERO.subTo(this,this)};q.prototype.clamp=function(){for(var b=this.s&this.DM;0<this.t&&this[this.t-1]==b;)--this.t};q.prototype.dlShiftTo=function(b,d){var e;for(e=this.t-1;0<=e;--e)d[e+b]=this[e];for(e=b-1;0<=e;--e)d[e]=
+0;d.t=this.t+b;d.s=this.s};q.prototype.drShiftTo=function(b,d){for(var e=b;e<this.t;++e)d[e-b]=this[e];d.t=Math.max(this.t-b,0);d.s=this.s};q.prototype.lShiftTo=function(b,d){var e=b%this.DB,l=this.DB-e,h=(1<<l)-1,r=Math.floor(b/this.DB),k=this.s<<e&this.DM,E;for(E=this.t-1;0<=E;--E)d[E+r+1]=this[E]>>l|k,k=(this[E]&h)<<e;for(E=r-1;0<=E;--E)d[E]=0;d[r]=k;d.t=this.t+r+1;d.s=this.s;d.clamp()};q.prototype.rShiftTo=function(b,d){d.s=this.s;var e=Math.floor(b/this.DB);if(e>=this.t)d.t=0;else{var l=b%this.DB,
+h=this.DB-l,r=(1<<l)-1;d[0]=this[e]>>l;for(var k=e+1;k<this.t;++k)d[k-e-1]|=(this[k]&r)<<h,d[k-e]=this[k]>>l;0<l&&(d[this.t-e-1]|=(this.s&r)<<h);d.t=this.t-e;d.clamp()}};q.prototype.subTo=function(b,d){for(var e=0,l=0,h=Math.min(b.t,this.t);e<h;)l+=this[e]-b[e],d[e++]=l&this.DM,l>>=this.DB;if(b.t<this.t){for(l-=b.s;e<this.t;)l+=this[e],d[e++]=l&this.DM,l>>=this.DB;l+=this.s}else{for(l+=this.s;e<b.t;)l-=b[e],d[e++]=l&this.DM,l>>=this.DB;l-=b.s}d.s=0>l?-1:0;-1>l?d[e++]=this.DV+l:0<l&&(d[e++]=l);d.t=
+e;d.clamp()};q.prototype.multiplyTo=function(b,d){var e=this.abs(),l=b.abs(),h=e.t;for(d.t=h+l.t;0<=--h;)d[h]=0;for(h=0;h<l.t;++h)d[h+e.t]=e.am(0,l[h],d,h,0,e.t);d.s=0;d.clamp();this.s!=b.s&&q.ZERO.subTo(d,d)};q.prototype.squareTo=function(b){for(var d=this.abs(),e=b.t=2*d.t;0<=--e;)b[e]=0;for(e=0;e<d.t-1;++e){var l=d.am(e,d[e],b,2*e,0,1);(b[e+d.t]+=d.am(e+1,2*d[e],b,2*e+1,l,d.t-e-1))>=d.DV&&(b[e+d.t]-=d.DV,b[e+d.t+1]=1)}0<b.t&&(b[b.t-1]+=d.am(e,d[e],b,2*e,0,1));b.s=0;b.clamp()};q.prototype.divRemTo=
+function(b,d,e){var l=b.abs();if(!(0>=l.t)){var h=this.abs();if(h.t<l.t)null!=d&&d.fromInt(0),null!=e&&this.copyTo(e);else{null==e&&(e=H());var r=H(),w=this.s;b=b.s;var E=this.DB-k(l[l.t-1]);0<E?(l.lShiftTo(E,r),h.lShiftTo(E,e)):(l.copyTo(r),h.copyTo(e));l=r.t;h=r[l-1];if(0!=h){var B=h*(1<<this.F1)+(1<l?r[l-2]>>this.F2:0),L=this.FV/B,B=(1<<this.F1)/B,pa=1<<this.F2,na=e.t,K=na-l,fa=null==d?H():d;r.dlShiftTo(K,fa);0<=e.compareTo(fa)&&(e[e.t++]=1,e.subTo(fa,e));q.ONE.dlShiftTo(l,fa);for(fa.subTo(r,r);r.t<
+l;)r[r.t++]=0;for(;0<=--K;){var Q=e[--na]==h?this.DM:Math.floor(e[na]*L+(e[na-1]+pa)*B);if((e[na]+=r.am(0,Q,e,K,0,l))<Q)for(r.dlShiftTo(K,fa),e.subTo(fa,e);e[na]<--Q;)e.subTo(fa,e)}null!=d&&(e.drShiftTo(l,d),w!=b&&q.ZERO.subTo(d,d));e.t=l;e.clamp();0<E&&e.rShiftTo(E,e);0>w&&q.ZERO.subTo(e,e)}}}};q.prototype.invDigit=function(){if(1>this.t)return 0;var b=this[0];if(0==(b&1))return 0;var d=b&3,d=d*(2-(b&15)*d)&15,d=d*(2-(b&255)*d)&255,d=d*(2-((b&65535)*d&65535))&65535,d=d*(2-b*d%this.DV)%this.DV;return 0<
+d?this.DV-d:-d};q.prototype.isEven=function(){return 0==(0<this.t?this[0]&1:this.s)};q.prototype.exp=function(b,d){if(4294967295<b||1>b)return q.ONE;var e=H(),l=H(),h=d.convert(this),r=k(b)-1;for(h.copyTo(e);0<=--r;)if(d.sqrTo(e,l),0<(b&1<<r))d.mulTo(l,h,e);else var w=e,e=l,l=w;return d.revert(e)};q.prototype.toString=function(b){if(0>this.s)return"-"+this.negate().toString(b);if(16==b)b=4;else if(8==b)b=3;else if(2==b)b=1;else if(32==b)b=5;else if(4==b)b=2;else return this.toRadix(b);var d=(1<<b)-
+1,e,l=!1,h="",r=this.t,k=this.DB-r*this.DB%b;if(0<r--)for(k<this.DB&&0<(e=this[r]>>k)&&(l=!0,h="0123456789abcdefghijklmnopqrstuvwxyz".charAt(e));0<=r;)k<b?(e=(this[r]&(1<<k)-1)<<b-k,e|=this[--r]>>(k+=this.DB-b)):(e=this[r]>>(k-=b)&d,0>=k&&(k+=this.DB,--r)),0<e&&(l=!0),l&&(h+="0123456789abcdefghijklmnopqrstuvwxyz".charAt(e));return l?h:"0"};q.prototype.negate=function(){var b=H();q.ZERO.subTo(this,b);return b};q.prototype.abs=function(){return 0>this.s?this.negate():this};q.prototype.compareTo=function(b){var d=
+this.s-b.s;if(0!=d)return d;var e=this.t,d=e-b.t;if(0!=d)return 0>this.s?-d:d;for(;0<=--e;)if(0!=(d=this[e]-b[e]))return d;return 0};q.prototype.bitLength=function(){return 0>=this.t?0:this.DB*(this.t-1)+k(this[this.t-1]^this.s&this.DM)};q.prototype.mod=function(b){var d=H();this.abs().divRemTo(b,null,d);0>this.s&&0<d.compareTo(q.ZERO)&&b.subTo(d,d);return d};q.prototype.modPowInt=function(b,d){var e;e=256>b||d.isEven()?new Ra(d):new L(d);return this.exp(b,e)};q.ZERO=Ba(0);q.ONE=Ba(1);xb.prototype.convert=
+Fc;xb.prototype.revert=Fc;xb.prototype.mulTo=function(b,d,e){b.multiplyTo(d,e)};xb.prototype.sqrTo=function(b,d){b.squareTo(d)};ka.prototype.convert=function(b){if(0>b.s||b.t>2*this.m.t)return b.mod(this.m);if(0>b.compareTo(this.m))return b;var d=H();b.copyTo(d);this.reduce(d);return d};ka.prototype.revert=function(b){return b};ka.prototype.reduce=function(b){b.drShiftTo(this.m.t-1,this.r2);b.t>this.m.t+1&&(b.t=this.m.t+1,b.clamp());this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);for(this.m.multiplyLowerTo(this.q3,
+this.m.t+1,this.r2);0>b.compareTo(this.r2);)b.dAddOffset(1,this.m.t+1);for(b.subTo(this.r2,b);0<=b.compareTo(this.m);)b.subTo(this.m,b)};ka.prototype.mulTo=function(b,d,e){b.multiplyTo(d,e);this.reduce(e)};ka.prototype.sqrTo=function(b,d){b.squareTo(d);this.reduce(d)};var la=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,
+313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],qb=67108864/la[la.length-1];q.prototype.chunkSize=function(b){return Math.floor(Math.LN2*
+this.DB/Math.log(b))};q.prototype.toRadix=function(b){null==b&&(b=10);if(0==this.signum()||2>b||36<b)return"0";var d=this.chunkSize(b),d=Math.pow(b,d),e=Ba(d),l=H(),h=H(),r="";for(this.divRemTo(e,l,h);0<l.signum();)r=(d+h.intValue()).toString(b).substr(1)+r,l.divRemTo(e,l,h);return h.intValue().toString(b)+r};q.prototype.fromRadix=function(b,d){this.fromInt(0);null==d&&(d=10);for(var e=this.chunkSize(d),l=Math.pow(d,e),h=!1,r=0,k=0,E=0;E<b.length;++E){var B=Ja(b,E);0>B?"-"==b.charAt(E)&&0==this.signum()&&
+(h=!0):(k=d*k+B,++r>=e&&(this.dMultiply(l),this.dAddOffset(k,0),k=r=0))}0<r&&(this.dMultiply(Math.pow(d,r)),this.dAddOffset(k,0));h&&q.ZERO.subTo(this,this)};q.prototype.fromNumber=function(b,d,e){if("number"==typeof d)if(2>b)this.fromInt(1);else for(this.fromNumber(b,e),this.testBit(b-1)||this.bitwiseTo(q.ONE.shiftLeft(b-1),Y,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(d);)this.dAddOffset(2,0),this.bitLength()>b&&this.subTo(q.ONE.shiftLeft(b-1),this);else{e=[];var l=b&7;e.length=
+(b>>3)+1;d.nextBytes(e);e[0]=0<l?e[0]&(1<<l)-1:0;this.fromString(e,256)}};q.prototype.bitwiseTo=function(b,d,e){var l,h,r=Math.min(b.t,this.t);for(l=0;l<r;++l)e[l]=d(this[l],b[l]);if(b.t<this.t){h=b.s&this.DM;for(l=r;l<this.t;++l)e[l]=d(this[l],h);e.t=this.t}else{h=this.s&this.DM;for(l=r;l<b.t;++l)e[l]=d(h,b[l]);e.t=b.t}e.s=d(this.s,b.s);e.clamp()};q.prototype.changeBit=function(b,d){var e=q.ONE.shiftLeft(b);this.bitwiseTo(e,d,e);return e};q.prototype.addTo=function(b,d){for(var e=0,l=0,h=Math.min(b.t,
+this.t);e<h;)l+=this[e]+b[e],d[e++]=l&this.DM,l>>=this.DB;if(b.t<this.t){for(l+=b.s;e<this.t;)l+=this[e],d[e++]=l&this.DM,l>>=this.DB;l+=this.s}else{for(l+=this.s;e<b.t;)l+=b[e],d[e++]=l&this.DM,l>>=this.DB;l+=b.s}d.s=0>l?-1:0;0<l?d[e++]=l:-1>l&&(d[e++]=this.DV+l);d.t=e;d.clamp()};q.prototype.dMultiply=function(b){this[this.t]=this.am(0,b-1,this,0,0,this.t);++this.t;this.clamp()};q.prototype.dAddOffset=function(b,d){if(0!=b){for(;this.t<=d;)this[this.t++]=0;for(this[d]+=b;this[d]>=this.DV;)this[d]-=
+this.DV,++d>=this.t&&(this[this.t++]=0),++this[d]}};q.prototype.multiplyLowerTo=function(b,d,e){var l=Math.min(this.t+b.t,d);e.s=0;for(e.t=l;0<l;)e[--l]=0;var h;for(h=e.t-this.t;l<h;++l)e[l+this.t]=this.am(0,b[l],e,l,0,this.t);for(h=Math.min(b.t,d);l<h;++l)this.am(0,b[l],e,l,0,d-l);e.clamp()};q.prototype.multiplyUpperTo=function(b,d,e){--d;var l=e.t=this.t+b.t-d;for(e.s=0;0<=--l;)e[l]=0;for(l=Math.max(d-this.t,0);l<b.t;++l)e[this.t+l-d]=this.am(d-l,b[l],e,0,0,this.t+l-d);e.clamp();e.drShiftTo(1,e)};
+q.prototype.modInt=function(b){if(0>=b)return 0;var d=this.DV%b,e=0>this.s?b-1:0;if(0<this.t)if(0==d)e=this[0]%b;else for(var l=this.t-1;0<=l;--l)e=(d*e+this[l])%b;return e};q.prototype.millerRabin=function(b){var d=this.subtract(q.ONE),e=d.getLowestSetBit();if(0>=e)return!1;var l=d.shiftRight(e);b=b+1>>1;b>la.length&&(b=la.length);for(var h=H(),r=0;r<b;++r){h.fromInt(la[Math.floor(Math.random()*la.length)]);var k=h.modPow(l,this);if(0!=k.compareTo(q.ONE)&&0!=k.compareTo(d)){for(var E=1;E++<e&&0!=
+k.compareTo(d);)if(k=k.modPowInt(2,this),0==k.compareTo(q.ONE))return!1;if(0!=k.compareTo(d))return!1}}return!0};q.prototype.clone=function(){var b=H();this.copyTo(b);return b};q.prototype.intValue=function(){if(0>this.s){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]};q.prototype.byteValue=function(){return 0==this.t?this.s:this[0]<<24>>24};q.prototype.shortValue=function(){return 0==
+this.t?this.s:this[0]<<16>>16};q.prototype.signum=function(){return 0>this.s?-1:0>=this.t||1==this.t&&0>=this[0]?0:1};q.prototype.toByteArray=function(){var b=this.t,d=[];d[0]=this.s;var e=this.DB-b*this.DB%8,l,h=0;if(0<b--)for(e<this.DB&&(l=this[b]>>e)!=(this.s&this.DM)>>e&&(d[h++]=l|this.s<<this.DB-e);0<=b;)if(8>e?(l=(this[b]&(1<<e)-1)<<8-e,l|=this[--b]>>(e+=this.DB-8)):(l=this[b]>>(e-=8)&255,0>=e&&(e+=this.DB,--b)),0!=(l&128)&&(l|=-256),0==h&&(this.s&128)!=(l&128)&&++h,0<h||l!=this.s)d[h++]=l;
+return d};q.prototype.equals=function(b){return 0==this.compareTo(b)};q.prototype.min=function(b){return 0>this.compareTo(b)?this:b};q.prototype.max=function(b){return 0<this.compareTo(b)?this:b};q.prototype.and=function(b){var d=H();this.bitwiseTo(b,fa,d);return d};q.prototype.or=function(b){var d=H();this.bitwiseTo(b,Y,d);return d};q.prototype.xor=function(b){var d=H();this.bitwiseTo(b,Q,d);return d};q.prototype.andNot=function(b){var d=H();this.bitwiseTo(b,X,d);return d};q.prototype.not=function(){for(var b=
+H(),d=0;d<this.t;++d)b[d]=this.DM&~this[d];b.t=this.t;b.s=~this.s;return b};q.prototype.shiftLeft=function(b){var d=H();0>b?this.rShiftTo(-b,d):this.lShiftTo(b,d);return d};q.prototype.shiftRight=function(b){var d=H();0>b?this.lShiftTo(-b,d):this.rShiftTo(b,d);return d};q.prototype.getLowestSetBit=function(){for(var b=0;b<this.t;++b)if(0!=this[b]){var d=b*this.DB,b=this[b];if(0==b)b=-1;else{var e=0;0==(b&65535)&&(b>>=16,e+=16);0==(b&255)&&(b>>=8,e+=8);0==(b&15)&&(b>>=4,e+=4);0==(b&3)&&(b>>=2,e+=2);
+0==(b&1)&&++e;b=e}return d+b}return 0>this.s?this.t*this.DB:-1};q.prototype.bitCount=function(){for(var b=0,d=this.s&this.DM,e=0;e<this.t;++e){for(var l=this[e]^d,h=0;0!=l;)l&=l-1,++h;b+=h}return b};q.prototype.testBit=function(b){var d=Math.floor(b/this.DB);return d>=this.t?0!=this.s:0!=(this[d]&1<<b%this.DB)};q.prototype.setBit=function(b){return this.changeBit(b,Y)};q.prototype.clearBit=function(b){return this.changeBit(b,X)};q.prototype.flipBit=function(b){return this.changeBit(b,Q)};q.prototype.add=
+function(b){var d=H();this.addTo(b,d);return d};q.prototype.subtract=function(b){var d=H();this.subTo(b,d);return d};q.prototype.multiply=function(b){var d=H();this.multiplyTo(b,d);return d};q.prototype.divide=function(b){var d=H();this.divRemTo(b,d,null);return d};q.prototype.remainder=function(b){var d=H();this.divRemTo(b,null,d);return d};q.prototype.divideAndRemainder=function(b){var d=H(),e=H();this.divRemTo(b,d,e);return[d,e]};q.prototype.modPow=function(b,d){var e=b.bitLength(),l,h=Ba(1),r;
+if(0>=e)return h;l=18>e?1:48>e?3:144>e?4:768>e?5:6;r=8>e?new Ra(d):d.isEven()?new ka(d):new L(d);var w=[],E=3,B=l-1,q=(1<<l)-1;w[1]=r.convert(this);if(1<l)for(e=H(),r.sqrTo(w[1],e);E<=q;)w[E]=H(),r.mulTo(e,w[E-2],w[E]),E+=2;for(var pa=b.t-1,na,fa=!0,K=H(),e=k(b[pa])-1;0<=pa;){e>=B?na=b[pa]>>e-B&q:(na=(b[pa]&(1<<e+1)-1)<<B-e,0<pa&&(na|=b[pa-1]>>this.DB+e-B));for(E=l;0==(na&1);)na>>=1,--E;0>(e-=E)&&(e+=this.DB,--pa);if(fa)w[na].copyTo(h),fa=!1;else{for(;1<E;)r.sqrTo(h,K),r.sqrTo(K,h),E-=2;0<E?r.sqrTo(h,
+K):(E=h,h=K,K=E);r.mulTo(K,w[na],h)}for(;0<=pa&&0==(b[pa]&1<<e);)r.sqrTo(h,K),E=h,h=K,K=E,0>--e&&(e=this.DB-1,--pa)}return r.revert(h)};q.prototype.modInverse=function(b){var d=b.isEven();if(this.isEven()&&d||0==b.signum())return q.ZERO;for(var e=b.clone(),l=this.clone(),h=Ba(1),r=Ba(0),k=Ba(0),E=Ba(1);0!=e.signum();){for(;e.isEven();)e.rShiftTo(1,e),d?(h.isEven()&&r.isEven()||(h.addTo(this,h),r.subTo(b,r)),h.rShiftTo(1,h)):r.isEven()||r.subTo(b,r),r.rShiftTo(1,r);for(;l.isEven();)l.rShiftTo(1,l),
+d?(k.isEven()&&E.isEven()||(k.addTo(this,k),E.subTo(b,E)),k.rShiftTo(1,k)):E.isEven()||E.subTo(b,E),E.rShiftTo(1,E);0<=e.compareTo(l)?(e.subTo(l,e),d&&h.subTo(k,h),r.subTo(E,r)):(l.subTo(e,l),d&&k.subTo(h,k),E.subTo(r,E))}if(0!=l.compareTo(q.ONE))return q.ZERO;if(0<=E.compareTo(b))return E.subtract(b);if(0>E.signum())E.addTo(b,E);else return E;return 0>E.signum()?E.add(b):E};q.prototype.pow=function(b){return this.exp(b,new xb)};q.prototype.gcd=function(b){var d=0>this.s?this.negate():this.clone();
+b=0>b.s?b.negate():b.clone();if(0>d.compareTo(b)){var e=d,d=b;b=e}var e=d.getLowestSetBit(),l=b.getLowestSetBit();if(0>l)return d;e<l&&(l=e);for(0<l&&(d.rShiftTo(l,d),b.rShiftTo(l,b));0<d.signum();)0<(e=d.getLowestSetBit())&&d.rShiftTo(e,d),0<(e=b.getLowestSetBit())&&b.rShiftTo(e,b),0<=d.compareTo(b)?(d.subTo(b,d),d.rShiftTo(1,d)):(b.subTo(d,b),b.rShiftTo(1,b));0<l&&b.lShiftTo(l,b);return b};q.prototype.isProbablePrime=function(b){var d,e=this.abs();if(1==e.t&&e[0]<=la[la.length-1]){for(d=0;d<la.length;++d)if(e[0]==
+la[d])return!0;return!1}if(e.isEven())return!1;for(d=1;d<la.length;){for(var l=la[d],h=d+1;h<la.length&&l<qb;)l*=la[h++];for(l=e.modInt(l);d<h;)if(0==l%la[d++])return!1}return e.millerRabin(b)};q.prototype.square=function(){var b=H();this.squareTo(b);return b};q.prototype.IsNegative=function(){return-1==this.compareTo(q.ZERO)?!0:!1};q.op_Equality=function(b,d){return 0==b.compareTo(d)?!0:!1};q.op_Inequality=function(b,d){return 0!=b.compareTo(d)?!0:!1};q.op_GreaterThan=function(b,d){return 0<b.compareTo(d)?
+!0:!1};q.op_LessThan=function(b,d){return 0>b.compareTo(d)?!0:!1};q.op_Addition=function(b,d){return(new q(b)).add(new q(d))};q.op_Subtraction=function(b,d){return(new q(b)).subtract(new q(d))};q.Int128Mul=function(b,d){return(new q(b)).multiply(new q(d))};q.op_Division=function(b,d){return b.divide(d)};q.prototype.ToDouble=function(){return parseFloat(this.toString())};if("undefined"==typeof Yb)var Yb=function(b,d){var e;if("undefined"==typeof Object.getOwnPropertyNames)for(e in d.prototype){if("undefined"==
+typeof b.prototype[e]||b.prototype[e]==Object.prototype[e])b.prototype[e]=d.prototype[e]}else for(var l=Object.getOwnPropertyNames(d.prototype),h=0;h<l.length;h++)"undefined"==typeof Object.getOwnPropertyDescriptor(b.prototype,l[h])&&Object.defineProperty(b.prototype,l[h],Object.getOwnPropertyDescriptor(d.prototype,l[h]));for(e in d)"undefined"==typeof b[e]&&(b[e]=d[e]);b.$baseCtor=d};h.Path=function(){return[]};h.Paths=function(){return[]};h.DoublePoint=function(){var b=arguments;this.Y=this.X=0;
+1==b.length?(this.X=b[0].X,this.Y=b[0].Y):2==b.length&&(this.X=b[0],this.Y=b[1])};h.DoublePoint0=function(){this.Y=this.X=0};h.DoublePoint1=function(b){this.X=b.X;this.Y=b.Y};h.DoublePoint2=function(b,d){this.X=b;this.Y=d};h.PolyNode=function(){this.m_Parent=null;this.m_polygon=new h.Path;this.m_endtype=this.m_jointype=this.m_Index=0;this.m_Childs=[];this.IsOpen=!1};h.PolyNode.prototype.IsHoleNode=function(){for(var b=!0,d=this.m_Parent;null!==d;)b=!b,d=d.m_Parent;return b};h.PolyNode.prototype.ChildCount=
+function(){return this.m_Childs.length};h.PolyNode.prototype.Contour=function(){return this.m_polygon};h.PolyNode.prototype.AddChild=function(b){var d=this.m_Childs.length;this.m_Childs.push(b);b.m_Parent=this;b.m_Index=d};h.PolyNode.prototype.GetNext=function(){return 0<this.m_Childs.length?this.m_Childs[0]:this.GetNextSiblingUp()};h.PolyNode.prototype.GetNextSiblingUp=function(){return null===this.m_Parent?null:this.m_Index==this.m_Parent.m_Childs.length-1?this.m_Parent.GetNextSiblingUp():this.m_Parent.m_Childs[this.m_Index+
+1]};h.PolyNode.prototype.Childs=function(){return this.m_Childs};h.PolyNode.prototype.Parent=function(){return this.m_Parent};h.PolyNode.prototype.IsHole=function(){return this.IsHoleNode()};h.PolyTree=function(){this.m_AllPolys=[];h.PolyNode.call(this)};h.PolyTree.prototype.Clear=function(){for(var b=0,d=this.m_AllPolys.length;b<d;b++)this.m_AllPolys[b]=null;this.m_AllPolys.length=0;this.m_Childs.length=0};h.PolyTree.prototype.GetFirst=function(){return 0<this.m_Childs.length?this.m_Childs[0]:null};
+h.PolyTree.prototype.Total=function(){return this.m_AllPolys.length};Yb(h.PolyTree,h.PolyNode);h.Math_Abs_Int64=h.Math_Abs_Int32=h.Math_Abs_Double=function(b){return Math.abs(b)};h.Math_Max_Int32_Int32=function(b,d){return Math.max(b,d)};h.Cast_Int32=S||$a||Wb?function(b){return b|0}:function(b){return~~b};h.Cast_Int64=Za?function(b){return-2147483648>b||2147483647<b?0>b?Math.ceil(b):Math.floor(b):~~b}:La&&"function"==typeof Number.toInteger?function(b){return Number.toInteger(b)}:pb||jb?function(b){return parseInt(b,
+10)}:S?function(b){return-2147483648>b||2147483647<b?0>b?Math.ceil(b):Math.floor(b):b|0}:function(b){return 0>b?Math.ceil(b):Math.floor(b)};h.Clear=function(b){b.length=0};h.PI=3.141592653589793;h.PI2=6.283185307179586;h.IntPoint=function(){var b;b=arguments;var d=b.length;this.Y=this.X=0;2==d?(this.X=b[0],this.Y=b[1]):1==d?b[0]instanceof h.DoublePoint?(b=b[0],this.X=h.Clipper.Round(b.X),this.Y=h.Clipper.Round(b.Y)):(b=b[0],this.X=b.X,this.Y=b.Y):this.Y=this.X=0};h.IntPoint.op_Equality=function(b,
+d){return b.X==d.X&&b.Y==d.Y};h.IntPoint.op_Inequality=function(b,d){return b.X!=d.X||b.Y!=d.Y};h.IntPoint0=function(){this.Y=this.X=0};h.IntPoint1=function(b){this.X=b.X;this.Y=b.Y};h.IntPoint1dp=function(b){this.X=h.Clipper.Round(b.X);this.Y=h.Clipper.Round(b.Y)};h.IntPoint2=function(b,d){this.X=b;this.Y=d};h.IntRect=function(){var b=arguments,d=b.length;4==d?(this.left=b[0],this.top=b[1],this.right=b[2],this.bottom=b[3]):1==d?(this.left=b[0].left,this.top=b[0].top,this.right=b[0].right,this.bottom=
+b[0].bottom):this.bottom=this.right=this.top=this.left=0};h.IntRect0=function(){this.bottom=this.right=this.top=this.left=0};h.IntRect1=function(b){this.left=b.left;this.top=b.top;this.right=b.right;this.bottom=b.bottom};h.IntRect4=function(b,d,e,l){this.left=b;this.top=d;this.right=e;this.bottom=l};h.ClipType={ctIntersection:0,ctUnion:1,ctDifference:2,ctXor:3};h.PolyType={ptSubject:0,ptClip:1};h.PolyFillType={pftEvenOdd:0,pftNonZero:1,pftPositive:2,pftNegative:3};h.JoinType={jtSquare:0,jtRound:1,
+jtMiter:2};h.EndType={etOpenSquare:0,etOpenRound:1,etOpenButt:2,etClosedLine:3,etClosedPolygon:4};h.EdgeSide={esLeft:0,esRight:1};h.Direction={dRightToLeft:0,dLeftToRight:1};h.TEdge=function(){this.Bot=new h.IntPoint;this.Curr=new h.IntPoint;this.Top=new h.IntPoint;this.Delta=new h.IntPoint;this.Dx=0;this.PolyTyp=h.PolyType.ptSubject;this.Side=h.EdgeSide.esLeft;this.OutIdx=this.WindCnt2=this.WindCnt=this.WindDelta=0;this.PrevInSEL=this.NextInSEL=this.PrevInAEL=this.NextInAEL=this.NextInLML=this.Prev=
+this.Next=null};h.IntersectNode=function(){this.Edge2=this.Edge1=null;this.Pt=new h.IntPoint};h.MyIntersectNodeSort=function(){};h.MyIntersectNodeSort.Compare=function(b,d){return d.Pt.Y-b.Pt.Y};h.LocalMinima=function(){this.Y=0;this.Next=this.RightBound=this.LeftBound=null};h.Scanbeam=function(){this.Y=0;this.Next=null};h.OutRec=function(){this.Idx=0;this.IsOpen=this.IsHole=!1;this.PolyNode=this.BottomPt=this.Pts=this.FirstLeft=null};h.OutPt=function(){this.Idx=0;this.Pt=new h.IntPoint;this.Prev=
+this.Next=null};h.Join=function(){this.OutPt2=this.OutPt1=null;this.OffPt=new h.IntPoint};h.ClipperBase=function(){this.m_CurrentLM=this.m_MinimaList=null;this.m_edges=[];this.PreserveCollinear=this.m_HasOpenPaths=this.m_UseFullRange=!1;this.m_CurrentLM=this.m_MinimaList=null;this.m_HasOpenPaths=this.m_UseFullRange=!1};h.ClipperBase.horizontal=-9007199254740992;h.ClipperBase.Skip=-2;h.ClipperBase.Unassigned=-1;h.ClipperBase.tolerance=1E-20;h.ClipperBase.loRange=47453132;h.ClipperBase.hiRange=0xfffffffffffff;
+h.ClipperBase.near_zero=function(b){return b>-h.ClipperBase.tolerance&&b<h.ClipperBase.tolerance};h.ClipperBase.IsHorizontal=function(b){return 0===b.Delta.Y};h.ClipperBase.prototype.PointIsVertex=function(b,d){var e=d;do{if(h.IntPoint.op_Equality(e.Pt,b))return!0;e=e.Next}while(e!=d);return!1};h.ClipperBase.prototype.PointOnLineSegment=function(b,d,e,l){return l?b.X==d.X&&b.Y==d.Y||b.X==e.X&&b.Y==e.Y||b.X>d.X==b.X<e.X&&b.Y>d.Y==b.Y<e.Y&&q.op_Equality(q.Int128Mul(b.X-d.X,e.Y-d.Y),q.Int128Mul(e.X-
+d.X,b.Y-d.Y)):b.X==d.X&&b.Y==d.Y||b.X==e.X&&b.Y==e.Y||b.X>d.X==b.X<e.X&&b.Y>d.Y==b.Y<e.Y&&(b.X-d.X)*(e.Y-d.Y)==(e.X-d.X)*(b.Y-d.Y)};h.ClipperBase.prototype.PointOnPolygon=function(b,d,e){for(var l=d;;){if(this.PointOnLineSegment(b,l.Pt,l.Next.Pt,e))return!0;l=l.Next;if(l==d)break}return!1};h.ClipperBase.prototype.SlopesEqual=h.ClipperBase.SlopesEqual=function(){var b=arguments,d=b.length,e,l,G;if(3==d)return d=b[0],e=b[1],b[2]?q.op_Equality(q.Int128Mul(d.Delta.Y,e.Delta.X),q.Int128Mul(d.Delta.X,e.Delta.Y)):
+h.Cast_Int64(d.Delta.Y*e.Delta.X)==h.Cast_Int64(d.Delta.X*e.Delta.Y);if(4==d)return d=b[0],e=b[1],l=b[2],b[3]?q.op_Equality(q.Int128Mul(d.Y-e.Y,e.X-l.X),q.Int128Mul(d.X-e.X,e.Y-l.Y)):0===h.Cast_Int64((d.Y-e.Y)*(e.X-l.X))-h.Cast_Int64((d.X-e.X)*(e.Y-l.Y));d=b[0];e=b[1];l=b[2];G=b[3];return b[4]?q.op_Equality(q.Int128Mul(d.Y-e.Y,l.X-G.X),q.Int128Mul(d.X-e.X,l.Y-G.Y)):0===h.Cast_Int64((d.Y-e.Y)*(l.X-G.X))-h.Cast_Int64((d.X-e.X)*(l.Y-G.Y))};h.ClipperBase.SlopesEqual3=function(b,d,e){return e?q.op_Equality(q.Int128Mul(b.Delta.Y,
+d.Delta.X),q.Int128Mul(b.Delta.X,d.Delta.Y)):h.Cast_Int64(b.Delta.Y*d.Delta.X)==h.Cast_Int64(b.Delta.X*d.Delta.Y)};h.ClipperBase.SlopesEqual4=function(b,d,e,l){return l?q.op_Equality(q.Int128Mul(b.Y-d.Y,d.X-e.X),q.Int128Mul(b.X-d.X,d.Y-e.Y)):0===h.Cast_Int64((b.Y-d.Y)*(d.X-e.X))-h.Cast_Int64((b.X-d.X)*(d.Y-e.Y))};h.ClipperBase.SlopesEqual5=function(b,d,e,l,G){return G?q.op_Equality(q.Int128Mul(b.Y-d.Y,e.X-l.X),q.Int128Mul(b.X-d.X,e.Y-l.Y)):0===h.Cast_Int64((b.Y-d.Y)*(e.X-l.X))-h.Cast_Int64((b.X-d.X)*
+(e.Y-l.Y))};h.ClipperBase.prototype.Clear=function(){this.DisposeLocalMinimaList();for(var b=0,d=this.m_edges.length;b<d;++b){for(var e=0,l=this.m_edges[b].length;e<l;++e)this.m_edges[b][e]=null;h.Clear(this.m_edges[b])}h.Clear(this.m_edges);this.m_HasOpenPaths=this.m_UseFullRange=!1};h.ClipperBase.prototype.DisposeLocalMinimaList=function(){for(;null!==this.m_MinimaList;){var b=this.m_MinimaList.Next;this.m_MinimaList=null;this.m_MinimaList=b}this.m_CurrentLM=null};h.ClipperBase.prototype.RangeTest=
+function(b,d){if(d.Value)(b.X>h.ClipperBase.hiRange||b.Y>h.ClipperBase.hiRange||-b.X>h.ClipperBase.hiRange||-b.Y>h.ClipperBase.hiRange)&&h.Error("Coordinate outside allowed range in RangeTest().");else if(b.X>h.ClipperBase.loRange||b.Y>h.ClipperBase.loRange||-b.X>h.ClipperBase.loRange||-b.Y>h.ClipperBase.loRange)d.Value=!0,this.RangeTest(b,d)};h.ClipperBase.prototype.InitEdge=function(b,d,e,l){b.Next=d;b.Prev=e;b.Curr.X=l.X;b.Curr.Y=l.Y;b.OutIdx=-1};h.ClipperBase.prototype.InitEdge2=function(b,d){b.Curr.Y>=
+b.Next.Curr.Y?(b.Bot.X=b.Curr.X,b.Bot.Y=b.Curr.Y,b.Top.X=b.Next.Curr.X,b.Top.Y=b.Next.Curr.Y):(b.Top.X=b.Curr.X,b.Top.Y=b.Curr.Y,b.Bot.X=b.Next.Curr.X,b.Bot.Y=b.Next.Curr.Y);this.SetDx(b);b.PolyTyp=d};h.ClipperBase.prototype.FindNextLocMin=function(b){for(var d;;){for(;h.IntPoint.op_Inequality(b.Bot,b.Prev.Bot)||h.IntPoint.op_Equality(b.Curr,b.Top);)b=b.Next;if(b.Dx!=h.ClipperBase.horizontal&&b.Prev.Dx!=h.ClipperBase.horizontal)break;for(;b.Prev.Dx==h.ClipperBase.horizontal;)b=b.Prev;for(d=b;b.Dx==
+h.ClipperBase.horizontal;)b=b.Next;if(b.Top.Y!=b.Prev.Bot.Y){d.Prev.Bot.X<b.Bot.X&&(b=d);break}}return b};h.ClipperBase.prototype.ProcessBound=function(b,d){var e=b,l=b,G;b.Dx==h.ClipperBase.horizontal&&(G=d?b.Prev.Bot.X:b.Next.Bot.X,b.Bot.X!=G&&this.ReverseHorizontal(b));if(l.OutIdx!=h.ClipperBase.Skip)if(d){for(;l.Top.Y==l.Next.Bot.Y&&l.Next.OutIdx!=h.ClipperBase.Skip;)l=l.Next;if(l.Dx==h.ClipperBase.horizontal&&l.Next.OutIdx!=h.ClipperBase.Skip){for(G=l;G.Prev.Dx==h.ClipperBase.horizontal;)G=G.Prev;
+G.Prev.Top.X==l.Next.Top.X?d||(l=G.Prev):G.Prev.Top.X>l.Next.Top.X&&(l=G.Prev)}for(;b!=l;)b.NextInLML=b.Next,b.Dx==h.ClipperBase.horizontal&&b!=e&&b.Bot.X!=b.Prev.Top.X&&this.ReverseHorizontal(b),b=b.Next;b.Dx==h.ClipperBase.horizontal&&b!=e&&b.Bot.X!=b.Prev.Top.X&&this.ReverseHorizontal(b);l=l.Next}else{for(;l.Top.Y==l.Prev.Bot.Y&&l.Prev.OutIdx!=h.ClipperBase.Skip;)l=l.Prev;if(l.Dx==h.ClipperBase.horizontal&&l.Prev.OutIdx!=h.ClipperBase.Skip){for(G=l;G.Next.Dx==h.ClipperBase.horizontal;)G=G.Next;
+G.Next.Top.X==l.Prev.Top.X?d||(l=G.Next):G.Next.Top.X>l.Prev.Top.X&&(l=G.Next)}for(;b!=l;)b.NextInLML=b.Prev,b.Dx==h.ClipperBase.horizontal&&b!=e&&b.Bot.X!=b.Next.Top.X&&this.ReverseHorizontal(b),b=b.Prev;b.Dx==h.ClipperBase.horizontal&&b!=e&&b.Bot.X!=b.Next.Top.X&&this.ReverseHorizontal(b);l=l.Prev}if(l.OutIdx==h.ClipperBase.Skip){b=l;if(d){for(;b.Top.Y==b.Next.Bot.Y;)b=b.Next;for(;b!=l&&b.Dx==h.ClipperBase.horizontal;)b=b.Prev}else{for(;b.Top.Y==b.Prev.Bot.Y;)b=b.Prev;for(;b!=l&&b.Dx==h.ClipperBase.horizontal;)b=
+b.Next}b==l?l=d?b.Next:b.Prev:(b=d?l.Next:l.Prev,e=new h.LocalMinima,e.Next=null,e.Y=b.Bot.Y,e.LeftBound=null,e.RightBound=b,e.RightBound.WindDelta=0,l=this.ProcessBound(e.RightBound,d),this.InsertLocalMinima(e))}return l};h.ClipperBase.prototype.AddPath=function(b,d,e){e||d!=h.PolyType.ptClip||h.Error("AddPath: Open paths must be subject.");var l=b.length-1;if(e)for(;0<l&&h.IntPoint.op_Equality(b[l],b[0]);)--l;for(;0<l&&h.IntPoint.op_Equality(b[l],b[l-1]);)--l;if(e&&2>l||!e&&1>l)return!1;for(var G=
+[],r=0;r<=l;r++)G.push(new h.TEdge);var k=!0;try{for(G[1].Curr.X=b[1].X,G[1].Curr.Y=b[1].Y,function(){var d={Value:this.m_UseFullRange},e=this.RangeTest(b[0],d);this.m_UseFullRange=d.Value;return e}.call(this),function(){var d={Value:this.m_UseFullRange},e=this.RangeTest(b[l],d);this.m_UseFullRange=d.Value;return e}.call(this),this.InitEdge(G[0],G[1],G[l],b[0]),this.InitEdge(G[l],G[0],G[l-1],b[l]),r=l-1;1<=r;--r)(function(){var d={Value:this.m_UseFullRange},e=this.RangeTest(b[r],d);this.m_UseFullRange=
+d.Value;return e}).call(this),this.InitEdge(G[r],G[r+1],G[r-1],b[r])}catch(q){return!1}var E=G[0];e||(E.Prev.OutIdx=h.ClipperBase.Skip);for(var B=E,L=E;;)if(h.IntPoint.op_Equality(B.Curr,B.Next.Curr)){if(B==B.Next)break;B==E&&(E=B.Next);L=B=this.RemoveEdge(B)}else{if(B.Prev==B.Next)break;else if(e&&h.ClipperBase.SlopesEqual(B.Prev.Curr,B.Curr,B.Next.Curr,this.m_UseFullRange)&&(!this.PreserveCollinear||!this.Pt2IsBetweenPt1AndPt3(B.Prev.Curr,B.Curr,B.Next.Curr))){B==E&&(E=B.Next);B=this.RemoveEdge(B);
+L=B=B.Prev;continue}B=B.Next;if(B==L)break}if(!e&&B==B.Next||e&&B.Prev==B.Next)return!1;e||(this.m_HasOpenPaths=!0);B=E;do this.InitEdge2(B,d),B=B.Next,k&&B.Curr.Y!=E.Curr.Y&&(k=!1);while(B!=E);if(k){if(e)return!1;B.Prev.OutIdx=h.ClipperBase.Skip;B.Prev.Bot.X<B.Prev.Top.X&&this.ReverseHorizontal(B.Prev);d=new h.LocalMinima;d.Next=null;d.Y=B.Bot.Y;d.LeftBound=null;d.RightBound=B;d.RightBound.Side=h.EdgeSide.esRight;for(d.RightBound.WindDelta=0;B.Next.OutIdx!=h.ClipperBase.Skip;)B.NextInLML=B.Next,
+B.Bot.X!=B.Prev.Top.X&&this.ReverseHorizontal(B),B=B.Next;this.InsertLocalMinima(d);this.m_edges.push(G);return!0}this.m_edges.push(G);for(k=null;;){B=this.FindNextLocMin(B);if(B==k)break;else null==k&&(k=B);d=new h.LocalMinima;d.Next=null;d.Y=B.Bot.Y;B.Dx<B.Prev.Dx?(d.LeftBound=B.Prev,d.RightBound=B,G=!1):(d.LeftBound=B,d.RightBound=B.Prev,G=!0);d.LeftBound.Side=h.EdgeSide.esLeft;d.RightBound.Side=h.EdgeSide.esRight;d.LeftBound.WindDelta=e?d.LeftBound.Next==d.RightBound?-1:1:0;d.RightBound.WindDelta=
+-d.LeftBound.WindDelta;B=this.ProcessBound(d.LeftBound,G);E=this.ProcessBound(d.RightBound,!G);d.LeftBound.OutIdx==h.ClipperBase.Skip?d.LeftBound=null:d.RightBound.OutIdx==h.ClipperBase.Skip&&(d.RightBound=null);this.InsertLocalMinima(d);G||(B=E)}return!0};h.ClipperBase.prototype.AddPaths=function(b,d,e){for(var l=!1,h=0,k=b.length;h<k;++h)this.AddPath(b[h],d,e)&&(l=!0);return l};h.ClipperBase.prototype.Pt2IsBetweenPt1AndPt3=function(b,d,e){return h.IntPoint.op_Equality(b,e)||h.IntPoint.op_Equality(b,
+d)||h.IntPoint.op_Equality(e,d)?!1:b.X!=e.X?d.X>b.X==d.X<e.X:d.Y>b.Y==d.Y<e.Y};h.ClipperBase.prototype.RemoveEdge=function(b){b.Prev.Next=b.Next;b.Next.Prev=b.Prev;var d=b.Next;b.Prev=null;return d};h.ClipperBase.prototype.SetDx=function(b){b.Delta.X=b.Top.X-b.Bot.X;b.Delta.Y=b.Top.Y-b.Bot.Y;b.Dx=0===b.Delta.Y?h.ClipperBase.horizontal:b.Delta.X/b.Delta.Y};h.ClipperBase.prototype.InsertLocalMinima=function(b){if(null===this.m_MinimaList)this.m_MinimaList=b;else if(b.Y>=this.m_MinimaList.Y)b.Next=this.m_MinimaList,
+this.m_MinimaList=b;else{for(var d=this.m_MinimaList;null!==d.Next&&b.Y<d.Next.Y;)d=d.Next;b.Next=d.Next;d.Next=b}};h.ClipperBase.prototype.PopLocalMinima=function(){null!==this.m_CurrentLM&&(this.m_CurrentLM=this.m_CurrentLM.Next)};h.ClipperBase.prototype.ReverseHorizontal=function(b){var d=b.Top.X;b.Top.X=b.Bot.X;b.Bot.X=d};h.ClipperBase.prototype.Reset=function(){this.m_CurrentLM=this.m_MinimaList;if(null!=this.m_CurrentLM)for(var b=this.m_MinimaList;null!=b;){var d=b.LeftBound;null!=d&&(d.Curr.X=
+d.Bot.X,d.Curr.Y=d.Bot.Y,d.Side=h.EdgeSide.esLeft,d.OutIdx=h.ClipperBase.Unassigned);d=b.RightBound;null!=d&&(d.Curr.X=d.Bot.X,d.Curr.Y=d.Bot.Y,d.Side=h.EdgeSide.esRight,d.OutIdx=h.ClipperBase.Unassigned);b=b.Next}};h.Clipper=function(b){"undefined"==typeof b&&(b=0);this.m_PolyOuts=null;this.m_ClipType=h.ClipType.ctIntersection;this.m_IntersectNodeComparer=this.m_IntersectList=this.m_SortedEdges=this.m_ActiveEdges=this.m_Scanbeam=null;this.m_ExecuteLocked=!1;this.m_SubjFillType=this.m_ClipFillType=
+h.PolyFillType.pftEvenOdd;this.m_GhostJoins=this.m_Joins=null;this.StrictlySimple=this.ReverseSolution=this.m_UsingPolyTree=!1;h.ClipperBase.call(this);this.m_SortedEdges=this.m_ActiveEdges=this.m_Scanbeam=null;this.m_IntersectList=[];this.m_IntersectNodeComparer=h.MyIntersectNodeSort.Compare;this.m_UsingPolyTree=this.m_ExecuteLocked=!1;this.m_PolyOuts=[];this.m_Joins=[];this.m_GhostJoins=[];this.ReverseSolution=0!==(1&b);this.StrictlySimple=0!==(2&b);this.PreserveCollinear=0!==(4&b)};h.Clipper.ioReverseSolution=
+1;h.Clipper.ioStrictlySimple=2;h.Clipper.ioPreserveCollinear=4;h.Clipper.prototype.Clear=function(){0!==this.m_edges.length&&(this.DisposeAllPolyPts(),h.ClipperBase.prototype.Clear.call(this))};h.Clipper.prototype.DisposeScanbeamList=function(){for(;null!==this.m_Scanbeam;){var b=this.m_Scanbeam.Next;this.m_Scanbeam=null;this.m_Scanbeam=b}};h.Clipper.prototype.Reset=function(){h.ClipperBase.prototype.Reset.call(this);this.m_SortedEdges=this.m_ActiveEdges=this.m_Scanbeam=null;this.DisposeAllPolyPts();
+for(var b=this.m_MinimaList;null!==b;)this.InsertScanbeam(b.Y),b=b.Next};h.Clipper.prototype.InsertScanbeam=function(b){if(null===this.m_Scanbeam)this.m_Scanbeam=new h.Scanbeam,this.m_Scanbeam.Next=null,this.m_Scanbeam.Y=b;else if(b>this.m_Scanbeam.Y){var d=new h.Scanbeam;d.Y=b;d.Next=this.m_Scanbeam;this.m_Scanbeam=d}else{for(var e=this.m_Scanbeam;null!==e.Next&&b<=e.Next.Y;)e=e.Next;b!=e.Y&&(d=new h.Scanbeam,d.Y=b,d.Next=e.Next,e.Next=d)}};h.Clipper.prototype.Execute=function(){var b=arguments,
+d=b.length,e=b[1]instanceof h.PolyTree;if(4!=d||e){if(4==d&&e){e=b[0];d=b[1];l=b[2];b=b[3];if(this.m_ExecuteLocked)return!1;this.m_ExecuteLocked=!0;this.m_SubjFillType=l;this.m_ClipFillType=b;this.m_ClipType=e;this.m_UsingPolyTree=!0;(b=this.ExecuteInternal())&&this.BuildResult2(d);this.m_ExecuteLocked=!1;return b}if(2==d&&!e||2==d&&e)return e=b[0],d=b[1],this.Execute(e,d,h.PolyFillType.pftEvenOdd,h.PolyFillType.pftEvenOdd)}else{var e=b[0],d=b[1],l=b[2],b=b[3];if(this.m_ExecuteLocked)return!1;this.m_HasOpenPaths&&
+h.Error("Error: PolyTree struct is need for open path clipping.");this.m_ExecuteLocked=!0;h.Clear(d);this.m_SubjFillType=l;this.m_ClipFillType=b;this.m_ClipType=e;this.m_UsingPolyTree=!1;(b=this.ExecuteInternal())&&this.BuildResult(d);this.m_ExecuteLocked=!1;return b}};h.Clipper.prototype.FixHoleLinkage=function(b){if(null!==b.FirstLeft&&(b.IsHole==b.FirstLeft.IsHole||null===b.FirstLeft.Pts)){for(var d=b.FirstLeft;null!==d&&(d.IsHole==b.IsHole||null===d.Pts);)d=d.FirstLeft;b.FirstLeft=d}};h.Clipper.prototype.ExecuteInternal=
+function(){try{this.Reset();if(null===this.m_CurrentLM)return!1;var b=this.PopScanbeam();do{this.InsertLocalMinimaIntoAEL(b);h.Clear(this.m_GhostJoins);this.ProcessHorizontals(!1);if(null===this.m_Scanbeam)break;var d=this.PopScanbeam();if(!this.ProcessIntersections(b,d))return!1;this.ProcessEdgesAtTopOfScanbeam(d);b=d}while(null!==this.m_Scanbeam||null!==this.m_CurrentLM);for(var b=0,e=this.m_PolyOuts.length;b<e;b++){var l=this.m_PolyOuts[b];null===l.Pts||l.IsOpen||(l.IsHole^this.ReverseSolution)==
+0<this.Area(l)&&this.ReversePolyPtLinks(l.Pts)}this.JoinCommonEdges();b=0;for(e=this.m_PolyOuts.length;b<e;b++)l=this.m_PolyOuts[b],null===l.Pts||l.IsOpen||this.FixupOutPolygon(l);this.StrictlySimple&&this.DoSimplePolygons();return!0}finally{h.Clear(this.m_Joins),h.Clear(this.m_GhostJoins)}};h.Clipper.prototype.PopScanbeam=function(){var b=this.m_Scanbeam.Y;this.m_Scanbeam=this.m_Scanbeam.Next;return b};h.Clipper.prototype.DisposeAllPolyPts=function(){for(var b=0,d=this.m_PolyOuts.length;b<d;++b)this.DisposeOutRec(b);
+h.Clear(this.m_PolyOuts)};h.Clipper.prototype.DisposeOutRec=function(b){var d=this.m_PolyOuts[b];null!==d.Pts&&this.DisposeOutPts(d.Pts);this.m_PolyOuts[b]=null};h.Clipper.prototype.DisposeOutPts=function(b){if(null!==b)for(b.Prev.Next=null;null!==b;)b=b.Next};h.Clipper.prototype.AddJoin=function(b,d,e){var l=new h.Join;l.OutPt1=b;l.OutPt2=d;l.OffPt.X=e.X;l.OffPt.Y=e.Y;this.m_Joins.push(l)};h.Clipper.prototype.AddGhostJoin=function(b,d){var e=new h.Join;e.OutPt1=b;e.OffPt.X=d.X;e.OffPt.Y=d.Y;this.m_GhostJoins.push(e)};
+h.Clipper.prototype.InsertLocalMinimaIntoAEL=function(b){for(;null!==this.m_CurrentLM&&this.m_CurrentLM.Y==b;){var d=this.m_CurrentLM.LeftBound,e=this.m_CurrentLM.RightBound;this.PopLocalMinima();var l=null;null===d?(this.InsertEdgeIntoAEL(e,null),this.SetWindingCount(e),this.IsContributing(e)&&(l=this.AddOutPt(e,e.Bot))):(null==e?(this.InsertEdgeIntoAEL(d,null),this.SetWindingCount(d),this.IsContributing(d)&&(l=this.AddOutPt(d,d.Bot))):(this.InsertEdgeIntoAEL(d,null),this.InsertEdgeIntoAEL(e,d),
+this.SetWindingCount(d),e.WindCnt=d.WindCnt,e.WindCnt2=d.WindCnt2,this.IsContributing(d)&&(l=this.AddLocalMinPoly(d,e,d.Bot))),this.InsertScanbeam(d.Top.Y));null!=e&&(h.ClipperBase.IsHorizontal(e)?this.AddEdgeToSEL(e):this.InsertScanbeam(e.Top.Y));if(null!=d&&null!=e){if(null!==l&&h.ClipperBase.IsHorizontal(e)&&0<this.m_GhostJoins.length&&0!==e.WindDelta)for(var G=0,k=this.m_GhostJoins.length;G<k;G++){var w=this.m_GhostJoins[G];this.HorzSegmentsOverlap(w.OutPt1.Pt,w.OffPt,e.Bot,e.Top)&&this.AddJoin(w.OutPt1,
+l,w.OffPt)}0<=d.OutIdx&&null!==d.PrevInAEL&&d.PrevInAEL.Curr.X==d.Bot.X&&0<=d.PrevInAEL.OutIdx&&h.ClipperBase.SlopesEqual(d.PrevInAEL,d,this.m_UseFullRange)&&0!==d.WindDelta&&0!==d.PrevInAEL.WindDelta&&(G=this.AddOutPt(d.PrevInAEL,d.Bot),this.AddJoin(l,G,d.Top));if(d.NextInAEL!=e&&(0<=e.OutIdx&&0<=e.PrevInAEL.OutIdx&&h.ClipperBase.SlopesEqual(e.PrevInAEL,e,this.m_UseFullRange)&&0!==e.WindDelta&&0!==e.PrevInAEL.WindDelta&&(G=this.AddOutPt(e.PrevInAEL,e.Bot),this.AddJoin(l,G,e.Top)),l=d.NextInAEL,null!==
+l))for(;l!=e;)this.IntersectEdges(e,l,d.Curr,!1),l=l.NextInAEL}}};h.Clipper.prototype.InsertEdgeIntoAEL=function(b,d){if(null===this.m_ActiveEdges)b.PrevInAEL=null,b.NextInAEL=null,this.m_ActiveEdges=b;else if(null===d&&this.E2InsertsBeforeE1(this.m_ActiveEdges,b))b.PrevInAEL=null,b.NextInAEL=this.m_ActiveEdges,this.m_ActiveEdges=this.m_ActiveEdges.PrevInAEL=b;else{for(null===d&&(d=this.m_ActiveEdges);null!==d.NextInAEL&&!this.E2InsertsBeforeE1(d.NextInAEL,b);)d=d.NextInAEL;b.NextInAEL=d.NextInAEL;
+null!==d.NextInAEL&&(d.NextInAEL.PrevInAEL=b);b.PrevInAEL=d;d.NextInAEL=b}};h.Clipper.prototype.E2InsertsBeforeE1=function(b,d){return d.Curr.X==b.Curr.X?d.Top.Y>b.Top.Y?d.Top.X<h.Clipper.TopX(b,d.Top.Y):b.Top.X>h.Clipper.TopX(d,b.Top.Y):d.Curr.X<b.Curr.X};h.Clipper.prototype.IsEvenOddFillType=function(b){return b.PolyTyp==h.PolyType.ptSubject?this.m_SubjFillType==h.PolyFillType.pftEvenOdd:this.m_ClipFillType==h.PolyFillType.pftEvenOdd};h.Clipper.prototype.IsEvenOddAltFillType=function(b){return b.PolyTyp==
+h.PolyType.ptSubject?this.m_ClipFillType==h.PolyFillType.pftEvenOdd:this.m_SubjFillType==h.PolyFillType.pftEvenOdd};h.Clipper.prototype.IsContributing=function(b){var d,e;b.PolyTyp==h.PolyType.ptSubject?(d=this.m_SubjFillType,e=this.m_ClipFillType):(d=this.m_ClipFillType,e=this.m_SubjFillType);switch(d){case h.PolyFillType.pftEvenOdd:if(0===b.WindDelta&&1!=b.WindCnt)return!1;break;case h.PolyFillType.pftNonZero:if(1!=Math.abs(b.WindCnt))return!1;break;case h.PolyFillType.pftPositive:if(1!=b.WindCnt)return!1;
+break;default:if(-1!=b.WindCnt)return!1}switch(this.m_ClipType){case h.ClipType.ctIntersection:switch(e){case h.PolyFillType.pftEvenOdd:case h.PolyFillType.pftNonZero:return 0!==b.WindCnt2;case h.PolyFillType.pftPositive:return 0<b.WindCnt2;default:return 0>b.WindCnt2}case h.ClipType.ctUnion:switch(e){case h.PolyFillType.pftEvenOdd:case h.PolyFillType.pftNonZero:return 0===b.WindCnt2;case h.PolyFillType.pftPositive:return 0>=b.WindCnt2;default:return 0<=b.WindCnt2}case h.ClipType.ctDifference:if(b.PolyTyp==
+h.PolyType.ptSubject)switch(e){case h.PolyFillType.pftEvenOdd:case h.PolyFillType.pftNonZero:return 0===b.WindCnt2;case h.PolyFillType.pftPositive:return 0>=b.WindCnt2;default:return 0<=b.WindCnt2}else switch(e){case h.PolyFillType.pftEvenOdd:case h.PolyFillType.pftNonZero:return 0!==b.WindCnt2;case h.PolyFillType.pftPositive:return 0<b.WindCnt2;default:return 0>b.WindCnt2}case h.ClipType.ctXor:if(0===b.WindDelta)switch(e){case h.PolyFillType.pftEvenOdd:case h.PolyFillType.pftNonZero:return 0===b.WindCnt2;
+case h.PolyFillType.pftPositive:return 0>=b.WindCnt2;default:return 0<=b.WindCnt2}}return!0};h.Clipper.prototype.SetWindingCount=function(b){for(var d=b.PrevInAEL;null!==d&&(d.PolyTyp!=b.PolyTyp||0===d.WindDelta);)d=d.PrevInAEL;if(null===d)b.WindCnt=0===b.WindDelta?1:b.WindDelta,b.WindCnt2=0,d=this.m_ActiveEdges;else{if(0===b.WindDelta&&this.m_ClipType!=h.ClipType.ctUnion)b.WindCnt=1;else if(this.IsEvenOddFillType(b))if(0===b.WindDelta){for(var e=!0,l=d.PrevInAEL;null!==l;)l.PolyTyp==d.PolyTyp&&0!==
+l.WindDelta&&(e=!e),l=l.PrevInAEL;b.WindCnt=e?0:1}else b.WindCnt=b.WindDelta;else 0>d.WindCnt*d.WindDelta?1<Math.abs(d.WindCnt)?b.WindCnt=0>d.WindDelta*b.WindDelta?d.WindCnt:d.WindCnt+b.WindDelta:b.WindCnt=0===b.WindDelta?1:b.WindDelta:b.WindCnt=0===b.WindDelta?0>d.WindCnt?d.WindCnt-1:d.WindCnt+1:0>d.WindDelta*b.WindDelta?d.WindCnt:d.WindCnt+b.WindDelta;b.WindCnt2=d.WindCnt2;d=d.NextInAEL}if(this.IsEvenOddAltFillType(b))for(;d!=b;)0!==d.WindDelta&&(b.WindCnt2=0===b.WindCnt2?1:0),d=d.NextInAEL;else for(;d!=
+b;)b.WindCnt2+=d.WindDelta,d=d.NextInAEL};h.Clipper.prototype.AddEdgeToSEL=function(b){null===this.m_SortedEdges?(this.m_SortedEdges=b,b.PrevInSEL=null,b.NextInSEL=null):(b.NextInSEL=this.m_SortedEdges,b.PrevInSEL=null,this.m_SortedEdges=this.m_SortedEdges.PrevInSEL=b)};h.Clipper.prototype.CopyAELToSEL=function(){var b=this.m_ActiveEdges;for(this.m_SortedEdges=b;null!==b;)b.PrevInSEL=b.PrevInAEL,b=b.NextInSEL=b.NextInAEL};h.Clipper.prototype.SwapPositionsInAEL=function(b,d){if(b.NextInAEL!=b.PrevInAEL&&
+d.NextInAEL!=d.PrevInAEL){if(b.NextInAEL==d){var e=d.NextInAEL;null!==e&&(e.PrevInAEL=b);var l=b.PrevInAEL;null!==l&&(l.NextInAEL=d);d.PrevInAEL=l;d.NextInAEL=b;b.PrevInAEL=d;b.NextInAEL=e}else d.NextInAEL==b?(e=b.NextInAEL,null!==e&&(e.PrevInAEL=d),l=d.PrevInAEL,null!==l&&(l.NextInAEL=b),b.PrevInAEL=l,b.NextInAEL=d,d.PrevInAEL=b,d.NextInAEL=e):(e=b.NextInAEL,l=b.PrevInAEL,b.NextInAEL=d.NextInAEL,null!==b.NextInAEL&&(b.NextInAEL.PrevInAEL=b),b.PrevInAEL=d.PrevInAEL,null!==b.PrevInAEL&&(b.PrevInAEL.NextInAEL=
+b),d.NextInAEL=e,null!==d.NextInAEL&&(d.NextInAEL.PrevInAEL=d),d.PrevInAEL=l,null!==d.PrevInAEL&&(d.PrevInAEL.NextInAEL=d));null===b.PrevInAEL?this.m_ActiveEdges=b:null===d.PrevInAEL&&(this.m_ActiveEdges=d)}};h.Clipper.prototype.SwapPositionsInSEL=function(b,d){if(null!==b.NextInSEL||null!==b.PrevInSEL)if(null!==d.NextInSEL||null!==d.PrevInSEL){if(b.NextInSEL==d){var e=d.NextInSEL;null!==e&&(e.PrevInSEL=b);var l=b.PrevInSEL;null!==l&&(l.NextInSEL=d);d.PrevInSEL=l;d.NextInSEL=b;b.PrevInSEL=d;b.NextInSEL=
+e}else d.NextInSEL==b?(e=b.NextInSEL,null!==e&&(e.PrevInSEL=d),l=d.PrevInSEL,null!==l&&(l.NextInSEL=b),b.PrevInSEL=l,b.NextInSEL=d,d.PrevInSEL=b,d.NextInSEL=e):(e=b.NextInSEL,l=b.PrevInSEL,b.NextInSEL=d.NextInSEL,null!==b.NextInSEL&&(b.NextInSEL.PrevInSEL=b),b.PrevInSEL=d.PrevInSEL,null!==b.PrevInSEL&&(b.PrevInSEL.NextInSEL=b),d.NextInSEL=e,null!==d.NextInSEL&&(d.NextInSEL.PrevInSEL=d),d.PrevInSEL=l,null!==d.PrevInSEL&&(d.PrevInSEL.NextInSEL=d));null===b.PrevInSEL?this.m_SortedEdges=b:null===d.PrevInSEL&&
+(this.m_SortedEdges=d)}};h.Clipper.prototype.AddLocalMaxPoly=function(b,d,e){this.AddOutPt(b,e);0==d.WindDelta&&this.AddOutPt(d,e);b.OutIdx==d.OutIdx?(b.OutIdx=-1,d.OutIdx=-1):b.OutIdx<d.OutIdx?this.AppendPolygon(b,d):this.AppendPolygon(d,b)};h.Clipper.prototype.AddLocalMinPoly=function(b,d,e){var l,G;h.ClipperBase.IsHorizontal(d)||b.Dx>d.Dx?(l=this.AddOutPt(b,e),d.OutIdx=b.OutIdx,b.Side=h.EdgeSide.esLeft,d.Side=h.EdgeSide.esRight,G=b,b=G.PrevInAEL==d?d.PrevInAEL:G.PrevInAEL):(l=this.AddOutPt(d,e),
+b.OutIdx=d.OutIdx,b.Side=h.EdgeSide.esRight,d.Side=h.EdgeSide.esLeft,G=d,b=G.PrevInAEL==b?b.PrevInAEL:G.PrevInAEL);null!==b&&0<=b.OutIdx&&h.Clipper.TopX(b,e.Y)==h.Clipper.TopX(G,e.Y)&&h.ClipperBase.SlopesEqual(G,b,this.m_UseFullRange)&&0!==G.WindDelta&&0!==b.WindDelta&&(e=this.AddOutPt(b,e),this.AddJoin(l,e,G.Top));return l};h.Clipper.prototype.CreateOutRec=function(){var b=new h.OutRec;b.Idx=-1;b.IsHole=!1;b.IsOpen=!1;b.FirstLeft=null;b.Pts=null;b.BottomPt=null;b.PolyNode=null;this.m_PolyOuts.push(b);
+b.Idx=this.m_PolyOuts.length-1;return b};h.Clipper.prototype.AddOutPt=function(b,d){var e=b.Side==h.EdgeSide.esLeft;if(0>b.OutIdx){var l=this.CreateOutRec();l.IsOpen=0===b.WindDelta;var G=new h.OutPt;l.Pts=G;G.Idx=l.Idx;G.Pt.X=d.X;G.Pt.Y=d.Y;G.Next=G;G.Prev=G;l.IsOpen||this.SetHoleState(b,l);b.OutIdx=l.Idx}else{var l=this.m_PolyOuts[b.OutIdx],k=l.Pts;if(e&&h.IntPoint.op_Equality(d,k.Pt))return k;if(!e&&h.IntPoint.op_Equality(d,k.Prev.Pt))return k.Prev;G=new h.OutPt;G.Idx=l.Idx;G.Pt.X=d.X;G.Pt.Y=d.Y;
+G.Next=k;G.Prev=k.Prev;G.Prev.Next=G;k.Prev=G;e&&(l.Pts=G)}return G};h.Clipper.prototype.SwapPoints=function(b,d){var e=new h.IntPoint(b.Value);b.Value.X=d.Value.X;b.Value.Y=d.Value.Y;d.Value.X=e.X;d.Value.Y=e.Y};h.Clipper.prototype.HorzSegmentsOverlap=function(b,d,e,l){return b.X>e.X==b.X<l.X?!0:d.X>e.X==d.X<l.X?!0:e.X>b.X==e.X<d.X?!0:l.X>b.X==l.X<d.X?!0:b.X==e.X&&d.X==l.X?!0:b.X==l.X&&d.X==e.X?!0:!1};h.Clipper.prototype.InsertPolyPtBetween=function(b,d,e){var l=new h.OutPt;l.Pt.X=e.X;l.Pt.Y=e.Y;
+d==b.Next?(b.Next=l,d.Prev=l,l.Next=d,l.Prev=b):(d.Next=l,b.Prev=l,l.Next=b,l.Prev=d);return l};h.Clipper.prototype.SetHoleState=function(b,d){for(var e=!1,l=b.PrevInAEL;null!==l;)0<=l.OutIdx&&0!=l.WindDelta&&(e=!e,null===d.FirstLeft&&(d.FirstLeft=this.m_PolyOuts[l.OutIdx])),l=l.PrevInAEL;e&&(d.IsHole=!0)};h.Clipper.prototype.GetDx=function(b,d){return b.Y==d.Y?h.ClipperBase.horizontal:(d.X-b.X)/(d.Y-b.Y)};h.Clipper.prototype.FirstIsBottomPt=function(b,d){for(var e=b.Prev;h.IntPoint.op_Equality(e.Pt,
+b.Pt)&&e!=b;)e=e.Prev;for(var l=Math.abs(this.GetDx(b.Pt,e.Pt)),e=b.Next;h.IntPoint.op_Equality(e.Pt,b.Pt)&&e!=b;)e=e.Next;for(var G=Math.abs(this.GetDx(b.Pt,e.Pt)),e=d.Prev;h.IntPoint.op_Equality(e.Pt,d.Pt)&&e!=d;)e=e.Prev;for(var k=Math.abs(this.GetDx(d.Pt,e.Pt)),e=d.Next;h.IntPoint.op_Equality(e.Pt,d.Pt)&&e!=d;)e=e.Next;e=Math.abs(this.GetDx(d.Pt,e.Pt));return l>=k&&l>=e||G>=k&&G>=e};h.Clipper.prototype.GetBottomPt=function(b){for(var d=null,e=b.Next;e!=b;)e.Pt.Y>b.Pt.Y?(b=e,d=null):e.Pt.Y==b.Pt.Y&&
+e.Pt.X<=b.Pt.X&&(e.Pt.X<b.Pt.X?(d=null,b=e):e.Next!=b&&e.Prev!=b&&(d=e)),e=e.Next;if(null!==d)for(;d!=e;)for(this.FirstIsBottomPt(e,d)||(b=d),d=d.Next;h.IntPoint.op_Inequality(d.Pt,b.Pt);)d=d.Next;return b};h.Clipper.prototype.GetLowermostRec=function(b,d){null===b.BottomPt&&(b.BottomPt=this.GetBottomPt(b.Pts));null===d.BottomPt&&(d.BottomPt=this.GetBottomPt(d.Pts));var e=b.BottomPt,l=d.BottomPt;return e.Pt.Y>l.Pt.Y?b:e.Pt.Y<l.Pt.Y?d:e.Pt.X<l.Pt.X?b:e.Pt.X>l.Pt.X?d:e.Next==e?d:l.Next==l?b:this.FirstIsBottomPt(e,
+l)?b:d};h.Clipper.prototype.Param1RightOfParam2=function(b,d){do if(b=b.FirstLeft,b==d)return!0;while(null!==b);return!1};h.Clipper.prototype.GetOutRec=function(b){for(b=this.m_PolyOuts[b];b!=this.m_PolyOuts[b.Idx];)b=this.m_PolyOuts[b.Idx];return b};h.Clipper.prototype.AppendPolygon=function(b,d){var e=this.m_PolyOuts[b.OutIdx],l=this.m_PolyOuts[d.OutIdx],G;G=this.Param1RightOfParam2(e,l)?l:this.Param1RightOfParam2(l,e)?e:this.GetLowermostRec(e,l);var k=e.Pts,w=k.Prev,E=l.Pts,B=E.Prev;b.Side==h.EdgeSide.esLeft?
+(d.Side==h.EdgeSide.esLeft?(this.ReversePolyPtLinks(E),E.Next=k,k.Prev=E,w.Next=B,B.Prev=w,e.Pts=B):(B.Next=k,k.Prev=B,E.Prev=w,w.Next=E,e.Pts=E),k=h.EdgeSide.esLeft):(d.Side==h.EdgeSide.esRight?(this.ReversePolyPtLinks(E),w.Next=B,B.Prev=w,E.Next=k,k.Prev=E):(w.Next=E,E.Prev=w,k.Prev=B,B.Next=k),k=h.EdgeSide.esRight);e.BottomPt=null;G==l&&(l.FirstLeft!=e&&(e.FirstLeft=l.FirstLeft),e.IsHole=l.IsHole);l.Pts=null;l.BottomPt=null;l.FirstLeft=e;G=b.OutIdx;w=d.OutIdx;b.OutIdx=-1;d.OutIdx=-1;for(E=this.m_ActiveEdges;null!==
+E;){if(E.OutIdx==w){E.OutIdx=G;E.Side=k;break}E=E.NextInAEL}l.Idx=e.Idx};h.Clipper.prototype.ReversePolyPtLinks=function(b){if(null!==b){var d,e;d=b;do e=d.Next,d.Next=d.Prev,d=d.Prev=e;while(d!=b)}};h.Clipper.SwapSides=function(b,d){var e=b.Side;b.Side=d.Side;d.Side=e};h.Clipper.SwapPolyIndexes=function(b,d){var e=b.OutIdx;b.OutIdx=d.OutIdx;d.OutIdx=e};h.Clipper.prototype.IntersectEdges=function(b,d,e,l){var G=!l&&null===b.NextInLML&&b.Top.X==e.X&&b.Top.Y==e.Y;l=!l&&null===d.NextInLML&&d.Top.X==
+e.X&&d.Top.Y==e.Y;var k=0<=b.OutIdx,w=0<=d.OutIdx;if(0===b.WindDelta||0===d.WindDelta)0===b.WindDelta&&0===d.WindDelta?(G||l)&&k&&w&&this.AddLocalMaxPoly(b,d,e):b.PolyTyp==d.PolyTyp&&b.WindDelta!=d.WindDelta&&this.m_ClipType==h.ClipType.ctUnion?0===b.WindDelta?w&&(this.AddOutPt(b,e),k&&(b.OutIdx=-1)):k&&(this.AddOutPt(d,e),w&&(d.OutIdx=-1)):b.PolyTyp!=d.PolyTyp&&(0!==b.WindDelta||1!=Math.abs(d.WindCnt)||this.m_ClipType==h.ClipType.ctUnion&&0!==d.WindCnt2?0!==d.WindDelta||1!=Math.abs(b.WindCnt)||this.m_ClipType==
+h.ClipType.ctUnion&&0!==b.WindCnt2||(this.AddOutPt(d,e),w&&(d.OutIdx=-1)):(this.AddOutPt(b,e),k&&(b.OutIdx=-1))),G&&(0>b.OutIdx?this.DeleteFromAEL(b):h.Error("Error intersecting polylines")),l&&(0>d.OutIdx?this.DeleteFromAEL(d):h.Error("Error intersecting polylines"));else{if(b.PolyTyp==d.PolyTyp)if(this.IsEvenOddFillType(b)){var E=b.WindCnt;b.WindCnt=d.WindCnt;d.WindCnt=E}else b.WindCnt=0===b.WindCnt+d.WindDelta?-b.WindCnt:b.WindCnt+d.WindDelta,d.WindCnt=0===d.WindCnt-b.WindDelta?-d.WindCnt:d.WindCnt-
+b.WindDelta;else this.IsEvenOddFillType(d)?b.WindCnt2=0===b.WindCnt2?1:0:b.WindCnt2+=d.WindDelta,this.IsEvenOddFillType(b)?d.WindCnt2=0===d.WindCnt2?1:0:d.WindCnt2-=b.WindDelta;var B,q,L;b.PolyTyp==h.PolyType.ptSubject?(B=this.m_SubjFillType,L=this.m_ClipFillType):(B=this.m_ClipFillType,L=this.m_SubjFillType);d.PolyTyp==h.PolyType.ptSubject?(q=this.m_SubjFillType,E=this.m_ClipFillType):(q=this.m_ClipFillType,E=this.m_SubjFillType);switch(B){case h.PolyFillType.pftPositive:B=b.WindCnt;break;case h.PolyFillType.pftNegative:B=
+-b.WindCnt;break;default:B=Math.abs(b.WindCnt)}switch(q){case h.PolyFillType.pftPositive:q=d.WindCnt;break;case h.PolyFillType.pftNegative:q=-d.WindCnt;break;default:q=Math.abs(d.WindCnt)}if(k&&w)G||l||0!==B&&1!=B||0!==q&&1!=q||b.PolyTyp!=d.PolyTyp&&this.m_ClipType!=h.ClipType.ctXor?this.AddLocalMaxPoly(b,d,e):(this.AddOutPt(b,e),this.AddOutPt(d,e),h.Clipper.SwapSides(b,d),h.Clipper.SwapPolyIndexes(b,d));else if(k){if(0===q||1==q)this.AddOutPt(b,e),h.Clipper.SwapSides(b,d),h.Clipper.SwapPolyIndexes(b,
+d)}else if(w){if(0===B||1==B)this.AddOutPt(d,e),h.Clipper.SwapSides(b,d),h.Clipper.SwapPolyIndexes(b,d)}else if(!(0!==B&&1!=B||0!==q&&1!=q||G||l)){switch(L){case h.PolyFillType.pftPositive:k=b.WindCnt2;break;case h.PolyFillType.pftNegative:k=-b.WindCnt2;break;default:k=Math.abs(b.WindCnt2)}switch(E){case h.PolyFillType.pftPositive:w=d.WindCnt2;break;case h.PolyFillType.pftNegative:w=-d.WindCnt2;break;default:w=Math.abs(d.WindCnt2)}if(b.PolyTyp!=d.PolyTyp)this.AddLocalMinPoly(b,d,e);else if(1==B&&
+1==q)switch(this.m_ClipType){case h.ClipType.ctIntersection:0<k&&0<w&&this.AddLocalMinPoly(b,d,e);break;case h.ClipType.ctUnion:0>=k&&0>=w&&this.AddLocalMinPoly(b,d,e);break;case h.ClipType.ctDifference:(b.PolyTyp==h.PolyType.ptClip&&0<k&&0<w||b.PolyTyp==h.PolyType.ptSubject&&0>=k&&0>=w)&&this.AddLocalMinPoly(b,d,e);break;case h.ClipType.ctXor:this.AddLocalMinPoly(b,d,e)}else h.Clipper.SwapSides(b,d)}G!=l&&(G&&0<=b.OutIdx||l&&0<=d.OutIdx)&&(h.Clipper.SwapSides(b,d),h.Clipper.SwapPolyIndexes(b,d));
+G&&this.DeleteFromAEL(b);l&&this.DeleteFromAEL(d)}};h.Clipper.prototype.DeleteFromAEL=function(b){var d=b.PrevInAEL,e=b.NextInAEL;if(null!==d||null!==e||b==this.m_ActiveEdges)null!==d?d.NextInAEL=e:this.m_ActiveEdges=e,null!==e&&(e.PrevInAEL=d),b.NextInAEL=null,b.PrevInAEL=null};h.Clipper.prototype.DeleteFromSEL=function(b){var d=b.PrevInSEL,e=b.NextInSEL;if(null!==d||null!==e||b==this.m_SortedEdges)null!==d?d.NextInSEL=e:this.m_SortedEdges=e,null!==e&&(e.PrevInSEL=d),b.NextInSEL=null,b.PrevInSEL=
+null};h.Clipper.prototype.UpdateEdgeIntoAEL=function(b){null===b.Value.NextInLML&&h.Error("UpdateEdgeIntoAEL: invalid call");var d=b.Value.PrevInAEL,e=b.Value.NextInAEL;b.Value.NextInLML.OutIdx=b.Value.OutIdx;null!==d?d.NextInAEL=b.Value.NextInLML:this.m_ActiveEdges=b.Value.NextInLML;null!==e&&(e.PrevInAEL=b.Value.NextInLML);b.Value.NextInLML.Side=b.Value.Side;b.Value.NextInLML.WindDelta=b.Value.WindDelta;b.Value.NextInLML.WindCnt=b.Value.WindCnt;b.Value.NextInLML.WindCnt2=b.Value.WindCnt2;b.Value=
+b.Value.NextInLML;b.Value.Curr.X=b.Value.Bot.X;b.Value.Curr.Y=b.Value.Bot.Y;b.Value.PrevInAEL=d;b.Value.NextInAEL=e;h.ClipperBase.IsHorizontal(b.Value)||this.InsertScanbeam(b.Value.Top.Y)};h.Clipper.prototype.ProcessHorizontals=function(b){for(var d=this.m_SortedEdges;null!==d;)this.DeleteFromSEL(d),this.ProcessHorizontal(d,b),d=this.m_SortedEdges};h.Clipper.prototype.GetHorzDirection=function(b,d,e,l){b.Bot.X<b.Top.X?(e.Value=b.Bot.X,l.Value=b.Top.X,d.Value=h.Direction.dLeftToRight):(e.Value=b.Top.X,
+l.Value=b.Bot.X,d.Value=h.Direction.dRightToLeft)};h.Clipper.prototype.PrepareHorzJoins=function(b,d){var e=this.m_PolyOuts[b.OutIdx].Pts;b.Side!=h.EdgeSide.esLeft&&(e=e.Prev);for(var l=0,G=this.m_GhostJoins.length;l<G;++l){var k=this.m_GhostJoins[l];this.HorzSegmentsOverlap(k.OutPt1.Pt,k.OffPt,b.Bot,b.Top)&&this.AddJoin(k.OutPt1,e,k.OffPt)}d&&(h.IntPoint.op_Equality(e.Pt,b.Top)?this.AddGhostJoin(e,b.Bot):this.AddGhostJoin(e,b.Top))};h.Clipper.prototype.ProcessHorizontal=function(b,d){var e,l,k;(function(){e=
+{Value:e};l={Value:l};k={Value:k};var d=this.GetHorzDirection(b,e,l,k);e=e.Value;l=l.Value;k=k.Value;return d}).call(this);for(var r=b,w=null;null!==r.NextInLML&&h.ClipperBase.IsHorizontal(r.NextInLML);)r=r.NextInLML;for(null===r.NextInLML&&(w=this.GetMaximaPair(r));;){for(var E=b==r,B=this.GetNextInAEL(b,e);null!==B&&!(B.Curr.X==b.Top.X&&null!==b.NextInLML&&B.Dx<b.NextInLML.Dx);){var q=this.GetNextInAEL(B,e);if(e==h.Direction.dLeftToRight&&B.Curr.X<=k||e==h.Direction.dRightToLeft&&B.Curr.X>=l){0<=
+b.OutIdx&&0!=b.WindDelta&&this.PrepareHorzJoins(b,d);if(B==w&&E){e==h.Direction.dLeftToRight?this.IntersectEdges(b,B,B.Top,!1):this.IntersectEdges(B,b,B.Top,!1);0<=w.OutIdx&&h.Error("ProcessHorizontal error");return}if(e==h.Direction.dLeftToRight){var L=new h.IntPoint(B.Curr.X,b.Curr.Y);this.IntersectEdges(b,B,L,!0)}else L=new h.IntPoint(B.Curr.X,b.Curr.Y),this.IntersectEdges(B,b,L,!0);this.SwapPositionsInAEL(b,B)}else if(e==h.Direction.dLeftToRight&&B.Curr.X>=k||e==h.Direction.dRightToLeft&&B.Curr.X<=
+l)break;B=q}0<=b.OutIdx&&0!==b.WindDelta&&this.PrepareHorzJoins(b,d);if(null!==b.NextInLML&&h.ClipperBase.IsHorizontal(b.NextInLML))(function(){b={Value:b};var d=this.UpdateEdgeIntoAEL(b);b=b.Value;return d}).call(this),0<=b.OutIdx&&this.AddOutPt(b,b.Bot),function(){e={Value:e};l={Value:l};k={Value:k};var d=this.GetHorzDirection(b,e,l,k);e=e.Value;l=l.Value;k=k.Value;return d}.call(this);else break}null!==b.NextInLML?0<=b.OutIdx?(r=this.AddOutPt(b,b.Top),function(){b={Value:b};var d=this.UpdateEdgeIntoAEL(b);
+b=b.Value;return d}.call(this),0!==b.WindDelta&&(w=b.PrevInAEL,q=b.NextInAEL,null!==w&&w.Curr.X==b.Bot.X&&w.Curr.Y==b.Bot.Y&&0!==w.WindDelta&&0<=w.OutIdx&&w.Curr.Y>w.Top.Y&&h.ClipperBase.SlopesEqual(b,w,this.m_UseFullRange)?(q=this.AddOutPt(w,b.Bot),this.AddJoin(r,q,b.Top)):null!==q&&q.Curr.X==b.Bot.X&&q.Curr.Y==b.Bot.Y&&0!==q.WindDelta&&0<=q.OutIdx&&q.Curr.Y>q.Top.Y&&h.ClipperBase.SlopesEqual(b,q,this.m_UseFullRange)&&(q=this.AddOutPt(q,b.Bot),this.AddJoin(r,q,b.Top)))):function(){b={Value:b};var d=
+this.UpdateEdgeIntoAEL(b);b=b.Value;return d}.call(this):null!==w?0<=w.OutIdx?(e==h.Direction.dLeftToRight?this.IntersectEdges(b,w,b.Top,!1):this.IntersectEdges(w,b,b.Top,!1),0<=w.OutIdx&&h.Error("ProcessHorizontal error")):(this.DeleteFromAEL(b),this.DeleteFromAEL(w)):(0<=b.OutIdx&&this.AddOutPt(b,b.Top),this.DeleteFromAEL(b))};h.Clipper.prototype.GetNextInAEL=function(b,d){return d==h.Direction.dLeftToRight?b.NextInAEL:b.PrevInAEL};h.Clipper.prototype.IsMinima=function(b){return null!==b&&b.Prev.NextInLML!=
+b&&b.Next.NextInLML!=b};h.Clipper.prototype.IsMaxima=function(b,d){return null!==b&&b.Top.Y==d&&null===b.NextInLML};h.Clipper.prototype.IsIntermediate=function(b,d){return b.Top.Y==d&&null!==b.NextInLML};h.Clipper.prototype.GetMaximaPair=function(b){var d=null;h.IntPoint.op_Equality(b.Next.Top,b.Top)&&null===b.Next.NextInLML?d=b.Next:h.IntPoint.op_Equality(b.Prev.Top,b.Top)&&null===b.Prev.NextInLML&&(d=b.Prev);return null===d||-2!=d.OutIdx&&(d.NextInAEL!=d.PrevInAEL||h.ClipperBase.IsHorizontal(d))?
+d:null};h.Clipper.prototype.ProcessIntersections=function(b,d){if(null==this.m_ActiveEdges)return!0;try{this.BuildIntersectList(b,d);if(0==this.m_IntersectList.length)return!0;if(1==this.m_IntersectList.length||this.FixupIntersectionOrder())this.ProcessIntersectList();else return!1}catch(e){this.m_SortedEdges=null,this.m_IntersectList.length=0,h.Error("ProcessIntersections error")}this.m_SortedEdges=null;return!0};h.Clipper.prototype.BuildIntersectList=function(b,d){if(null!==this.m_ActiveEdges){var e=
+this.m_ActiveEdges;for(this.m_SortedEdges=e;null!==e;)e.PrevInSEL=e.PrevInAEL,e.NextInSEL=e.NextInAEL,e.Curr.X=h.Clipper.TopX(e,d),e=e.NextInAEL;for(var l=!0;l&&null!==this.m_SortedEdges;){l=!1;for(e=this.m_SortedEdges;null!==e.NextInSEL;){var k=e.NextInSEL,r=new h.IntPoint;e.Curr.X>k.Curr.X?(r={Value:r},l=this.IntersectPoint(e,k,r),r=r.Value,!l&&e.Curr.X>k.Curr.X+1&&h.Error("Intersection error"),r.Y>b&&(r.Y=b,Math.abs(e.Dx)>Math.abs(k.Dx)?r.X=h.Clipper.TopX(k,b):r.X=h.Clipper.TopX(e,b)),l=new h.IntersectNode,
+l.Edge1=e,l.Edge2=k,l.Pt.X=r.X,l.Pt.Y=r.Y,this.m_IntersectList.push(l),this.SwapPositionsInSEL(e,k),l=!0):e=k}if(null!==e.PrevInSEL)e.PrevInSEL.NextInSEL=null;else break}this.m_SortedEdges=null}};h.Clipper.prototype.EdgesAdjacent=function(b){return b.Edge1.NextInSEL==b.Edge2||b.Edge1.PrevInSEL==b.Edge2};h.Clipper.IntersectNodeSort=function(b,d){return d.Pt.Y-b.Pt.Y};h.Clipper.prototype.FixupIntersectionOrder=function(){this.m_IntersectList.sort(this.m_IntersectNodeComparer);this.CopyAELToSEL();for(var b=
+this.m_IntersectList.length,d=0;d<b;d++){if(!this.EdgesAdjacent(this.m_IntersectList[d])){for(var e=d+1;e<b&&!this.EdgesAdjacent(this.m_IntersectList[e]);)e++;if(e==b)return!1;var l=this.m_IntersectList[d];this.m_IntersectList[d]=this.m_IntersectList[e];this.m_IntersectList[e]=l}this.SwapPositionsInSEL(this.m_IntersectList[d].Edge1,this.m_IntersectList[d].Edge2)}return!0};h.Clipper.prototype.ProcessIntersectList=function(){for(var b=0,d=this.m_IntersectList.length;b<d;b++){var e=this.m_IntersectList[b];
+this.IntersectEdges(e.Edge1,e.Edge2,e.Pt,!0);this.SwapPositionsInAEL(e.Edge1,e.Edge2)}this.m_IntersectList.length=0};Za=function(b){return 0>b?Math.ceil(b-.5):Math.round(b)};La=function(b){return 0>b?Math.ceil(b-.5):Math.floor(b+.5)};$a=function(b){return 0>b?-Math.round(Math.abs(b)):Math.round(b)};jb=function(b){if(0>b)return b-=.5,-2147483648>b?Math.ceil(b):b|0;b+=.5;return 2147483647<b?Math.floor(b):b|0};h.Clipper.Round=S?Za:Ib?$a:Wb?jb:La;h.Clipper.TopX=function(b,d){return d==b.Top.Y?b.Top.X:
+b.Bot.X+h.Clipper.Round(b.Dx*(d-b.Bot.Y))};h.Clipper.prototype.IntersectPoint=function(b,d,e){e.Value=new h.IntPoint;var l,k;if(h.ClipperBase.SlopesEqual(b,d,this.m_UseFullRange)||b.Dx==d.Dx)return d.Bot.Y>b.Bot.Y?(e.Value.X=d.Bot.X,e.Value.Y=d.Bot.Y):(e.Value.X=b.Bot.X,e.Value.Y=b.Bot.Y),!1;if(0===b.Delta.X)e.Value.X=b.Bot.X,h.ClipperBase.IsHorizontal(d)?e.Value.Y=d.Bot.Y:(k=d.Bot.Y-d.Bot.X/d.Dx,e.Value.Y=h.Clipper.Round(e.Value.X/d.Dx+k));else if(0===d.Delta.X)e.Value.X=d.Bot.X,h.ClipperBase.IsHorizontal(b)?
+e.Value.Y=b.Bot.Y:(l=b.Bot.Y-b.Bot.X/b.Dx,e.Value.Y=h.Clipper.Round(e.Value.X/b.Dx+l));else{l=b.Bot.X-b.Bot.Y*b.Dx;k=d.Bot.X-d.Bot.Y*d.Dx;var r=(k-l)/(b.Dx-d.Dx);e.Value.Y=h.Clipper.Round(r);Math.abs(b.Dx)<Math.abs(d.Dx)?e.Value.X=h.Clipper.Round(b.Dx*r+l):e.Value.X=h.Clipper.Round(d.Dx*r+k)}if(e.Value.Y<b.Top.Y||e.Value.Y<d.Top.Y){if(b.Top.Y>d.Top.Y)return e.Value.Y=b.Top.Y,e.Value.X=h.Clipper.TopX(d,b.Top.Y),e.Value.X<b.Top.X;e.Value.Y=d.Top.Y;Math.abs(b.Dx)<Math.abs(d.Dx)?e.Value.X=h.Clipper.TopX(b,
+e.Value.Y):e.Value.X=h.Clipper.TopX(d,e.Value.Y)}return!0};h.Clipper.prototype.ProcessEdgesAtTopOfScanbeam=function(b){for(var d=this.m_ActiveEdges;null!==d;){var e=this.IsMaxima(d,b);e&&(e=this.GetMaximaPair(d),e=null===e||!h.ClipperBase.IsHorizontal(e));if(e){var l=d.PrevInAEL;this.DoMaxima(d);d=null===l?this.m_ActiveEdges:l.NextInAEL}else this.IsIntermediate(d,b)&&h.ClipperBase.IsHorizontal(d.NextInLML)?(function(){d={Value:d};var b=this.UpdateEdgeIntoAEL(d);d=d.Value;return b}.call(this),0<=d.OutIdx&&
+this.AddOutPt(d,d.Bot),this.AddEdgeToSEL(d)):(d.Curr.X=h.Clipper.TopX(d,b),d.Curr.Y=b),this.StrictlySimple&&(l=d.PrevInAEL,0<=d.OutIdx&&0!==d.WindDelta&&null!==l&&0<=l.OutIdx&&l.Curr.X==d.Curr.X&&0!==l.WindDelta&&(e=this.AddOutPt(l,d.Curr),l=this.AddOutPt(d,d.Curr),this.AddJoin(e,l,d.Curr))),d=d.NextInAEL}this.ProcessHorizontals(!0);for(d=this.m_ActiveEdges;null!==d;){if(this.IsIntermediate(d,b)){e=null;0<=d.OutIdx&&(e=this.AddOutPt(d,d.Top));(function(){d={Value:d};var b=this.UpdateEdgeIntoAEL(d);
+d=d.Value;return b}).call(this);var l=d.PrevInAEL,k=d.NextInAEL;null!==l&&l.Curr.X==d.Bot.X&&l.Curr.Y==d.Bot.Y&&null!==e&&0<=l.OutIdx&&l.Curr.Y>l.Top.Y&&h.ClipperBase.SlopesEqual(d,l,this.m_UseFullRange)&&0!==d.WindDelta&&0!==l.WindDelta?(l=this.AddOutPt(l,d.Bot),this.AddJoin(e,l,d.Top)):null!==k&&k.Curr.X==d.Bot.X&&k.Curr.Y==d.Bot.Y&&null!==e&&0<=k.OutIdx&&k.Curr.Y>k.Top.Y&&h.ClipperBase.SlopesEqual(d,k,this.m_UseFullRange)&&0!==d.WindDelta&&0!==k.WindDelta&&(l=this.AddOutPt(k,d.Bot),this.AddJoin(e,
+l,d.Top))}d=d.NextInAEL}};h.Clipper.prototype.DoMaxima=function(b){var d=this.GetMaximaPair(b);if(null===d)0<=b.OutIdx&&this.AddOutPt(b,b.Top),this.DeleteFromAEL(b);else{for(var e=b.NextInAEL;null!==e&&e!=d;)this.IntersectEdges(b,e,b.Top,!0),this.SwapPositionsInAEL(b,e),e=b.NextInAEL;-1==b.OutIdx&&-1==d.OutIdx?(this.DeleteFromAEL(b),this.DeleteFromAEL(d)):0<=b.OutIdx&&0<=d.OutIdx?this.IntersectEdges(b,d,b.Top,!1):0===b.WindDelta?(0<=b.OutIdx&&(this.AddOutPt(b,b.Top),b.OutIdx=-1),this.DeleteFromAEL(b),
+0<=d.OutIdx&&(this.AddOutPt(d,b.Top),d.OutIdx=-1),this.DeleteFromAEL(d)):h.Error("DoMaxima error")}};h.Clipper.ReversePaths=function(b){for(var d=0,e=b.length;d<e;d++)b[d].reverse()};h.Clipper.Orientation=function(b){return 0<=h.Clipper.Area(b)};h.Clipper.prototype.PointCount=function(b){if(null===b)return 0;var d=0,e=b;do d++,e=e.Next;while(e!=b);return d};h.Clipper.prototype.BuildResult=function(b){h.Clear(b);for(var d=0,e=this.m_PolyOuts.length;d<e;d++){var l=this.m_PolyOuts[d];if(null!==l.Pts){var l=
+l.Pts.Prev,k=this.PointCount(l);if(!(2>k)){for(var r=Array(k),w=0;w<k;w++)r[w]=l.Pt,l=l.Prev;b.push(r)}}}};h.Clipper.prototype.BuildResult2=function(b){b.Clear();for(var d=0,e=this.m_PolyOuts.length;d<e;d++){var l=this.m_PolyOuts[d],k=this.PointCount(l.Pts);if(!(l.IsOpen&&2>k||!l.IsOpen&&3>k)){this.FixHoleLinkage(l);var r=new h.PolyNode;b.m_AllPolys.push(r);l.PolyNode=r;r.m_polygon.length=k;for(var l=l.Pts.Prev,w=0;w<k;w++)r.m_polygon[w]=l.Pt,l=l.Prev}}d=0;for(e=this.m_PolyOuts.length;d<e;d++)l=this.m_PolyOuts[d],
+null!==l.PolyNode&&(l.IsOpen?(l.PolyNode.IsOpen=!0,b.AddChild(l.PolyNode)):null!==l.FirstLeft&&null!=l.FirstLeft.PolyNode?l.FirstLeft.PolyNode.AddChild(l.PolyNode):b.AddChild(l.PolyNode))};h.Clipper.prototype.FixupOutPolygon=function(b){var d=null;b.BottomPt=null;for(var e=b.Pts;;){if(e.Prev==e||e.Prev==e.Next){this.DisposeOutPts(e);b.Pts=null;return}if(h.IntPoint.op_Equality(e.Pt,e.Next.Pt)||h.IntPoint.op_Equality(e.Pt,e.Prev.Pt)||h.ClipperBase.SlopesEqual(e.Prev.Pt,e.Pt,e.Next.Pt,this.m_UseFullRange)&&
+(!this.PreserveCollinear||!this.Pt2IsBetweenPt1AndPt3(e.Prev.Pt,e.Pt,e.Next.Pt)))d=null,e.Prev.Next=e.Next,e=e.Next.Prev=e.Prev;else if(e==d)break;else null===d&&(d=e),e=e.Next}b.Pts=e};h.Clipper.prototype.DupOutPt=function(b,d){var e=new h.OutPt;e.Pt.X=b.Pt.X;e.Pt.Y=b.Pt.Y;e.Idx=b.Idx;d?(e.Next=b.Next,e.Prev=b,b.Next.Prev=e,b.Next=e):(e.Prev=b.Prev,e.Next=b,b.Prev.Next=e,b.Prev=e);return e};h.Clipper.prototype.GetOverlap=function(b,d,e,l,h,k){b<d?e<l?(h.Value=Math.max(b,e),k.Value=Math.min(d,l)):
+(h.Value=Math.max(b,l),k.Value=Math.min(d,e)):e<l?(h.Value=Math.max(d,e),k.Value=Math.min(b,l)):(h.Value=Math.max(d,l),k.Value=Math.min(b,e));return h.Value<k.Value};h.Clipper.prototype.JoinHorz=function(b,d,e,l,k,r){var w=b.Pt.X>d.Pt.X?h.Direction.dRightToLeft:h.Direction.dLeftToRight;l=e.Pt.X>l.Pt.X?h.Direction.dRightToLeft:h.Direction.dLeftToRight;if(w==l)return!1;if(w==h.Direction.dLeftToRight){for(;b.Next.Pt.X<=k.X&&b.Next.Pt.X>=b.Pt.X&&b.Next.Pt.Y==k.Y;)b=b.Next;r&&b.Pt.X!=k.X&&(b=b.Next);d=
+this.DupOutPt(b,!r);h.IntPoint.op_Inequality(d.Pt,k)&&(b=d,b.Pt.X=k.X,b.Pt.Y=k.Y,d=this.DupOutPt(b,!r))}else{for(;b.Next.Pt.X>=k.X&&b.Next.Pt.X<=b.Pt.X&&b.Next.Pt.Y==k.Y;)b=b.Next;r||b.Pt.X==k.X||(b=b.Next);d=this.DupOutPt(b,r);h.IntPoint.op_Inequality(d.Pt,k)&&(b=d,b.Pt.X=k.X,b.Pt.Y=k.Y,d=this.DupOutPt(b,r))}if(l==h.Direction.dLeftToRight){for(;e.Next.Pt.X<=k.X&&e.Next.Pt.X>=e.Pt.X&&e.Next.Pt.Y==k.Y;)e=e.Next;r&&e.Pt.X!=k.X&&(e=e.Next);l=this.DupOutPt(e,!r);h.IntPoint.op_Inequality(l.Pt,k)&&(e=l,
+e.Pt.X=k.X,e.Pt.Y=k.Y,l=this.DupOutPt(e,!r))}else{for(;e.Next.Pt.X>=k.X&&e.Next.Pt.X<=e.Pt.X&&e.Next.Pt.Y==k.Y;)e=e.Next;r||e.Pt.X==k.X||(e=e.Next);l=this.DupOutPt(e,r);h.IntPoint.op_Inequality(l.Pt,k)&&(e=l,e.Pt.X=k.X,e.Pt.Y=k.Y,l=this.DupOutPt(e,r))}w==h.Direction.dLeftToRight==r?(b.Prev=e,e.Next=b,d.Next=l,l.Prev=d):(b.Next=e,e.Prev=b,d.Prev=l,l.Next=d);return!0};h.Clipper.prototype.JoinPoints=function(b,d,e){var l=b.OutPt1,k;new h.OutPt;var r=b.OutPt2,w;new h.OutPt;if((w=b.OutPt1.Pt.Y==b.OffPt.Y)&&
+h.IntPoint.op_Equality(b.OffPt,b.OutPt1.Pt)&&h.IntPoint.op_Equality(b.OffPt,b.OutPt2.Pt)){for(k=b.OutPt1.Next;k!=l&&h.IntPoint.op_Equality(k.Pt,b.OffPt);)k=k.Next;k=k.Pt.Y>b.OffPt.Y;for(w=b.OutPt2.Next;w!=r&&h.IntPoint.op_Equality(w.Pt,b.OffPt);)w=w.Next;if(k==w.Pt.Y>b.OffPt.Y)return!1;k?(k=this.DupOutPt(l,!1),w=this.DupOutPt(r,!0),l.Prev=r,r.Next=l,k.Next=w,w.Prev=k):(k=this.DupOutPt(l,!0),w=this.DupOutPt(r,!1),l.Next=r,r.Prev=l,k.Prev=w,w.Next=k);b.OutPt1=l;b.OutPt2=k;return!0}if(w){for(k=l;l.Prev.Pt.Y==
+l.Pt.Y&&l.Prev!=k&&l.Prev!=r;)l=l.Prev;for(;k.Next.Pt.Y==k.Pt.Y&&k.Next!=l&&k.Next!=r;)k=k.Next;if(k.Next==l||k.Next==r)return!1;for(w=r;r.Prev.Pt.Y==r.Pt.Y&&r.Prev!=w&&r.Prev!=k;)r=r.Prev;for(;w.Next.Pt.Y==w.Pt.Y&&w.Next!=r&&w.Next!=l;)w=w.Next;if(w.Next==r||w.Next==l)return!1;var q,B;q={Value:q};B={Value:B};d=this.GetOverlap(l.Pt.X,k.Pt.X,r.Pt.X,w.Pt.X,q,B);q=q.Value;B=B.Value;if(!d)return!1;d=new h.IntPoint;l.Pt.X>=q&&l.Pt.X<=B?(d.X=l.Pt.X,d.Y=l.Pt.Y,e=l.Pt.X>k.Pt.X):r.Pt.X>=q&&r.Pt.X<=B?(d.X=
+r.Pt.X,d.Y=r.Pt.Y,e=r.Pt.X>w.Pt.X):k.Pt.X>=q&&k.Pt.X<=B?(d.X=k.Pt.X,d.Y=k.Pt.Y,e=k.Pt.X>l.Pt.X):(d.X=w.Pt.X,d.Y=w.Pt.Y,e=w.Pt.X>r.Pt.X);b.OutPt1=l;b.OutPt2=r;return this.JoinHorz(l,k,r,w,d,e)}for(k=l.Next;h.IntPoint.op_Equality(k.Pt,l.Pt)&&k!=l;)k=k.Next;if(q=k.Pt.Y>l.Pt.Y||!h.ClipperBase.SlopesEqual(l.Pt,k.Pt,b.OffPt,this.m_UseFullRange)){for(k=l.Prev;h.IntPoint.op_Equality(k.Pt,l.Pt)&&k!=l;)k=k.Prev;if(k.Pt.Y>l.Pt.Y||!h.ClipperBase.SlopesEqual(l.Pt,k.Pt,b.OffPt,this.m_UseFullRange))return!1}for(w=
+r.Next;h.IntPoint.op_Equality(w.Pt,r.Pt)&&w!=r;)w=w.Next;if(B=w.Pt.Y>r.Pt.Y||!h.ClipperBase.SlopesEqual(r.Pt,w.Pt,b.OffPt,this.m_UseFullRange)){for(w=r.Prev;h.IntPoint.op_Equality(w.Pt,r.Pt)&&w!=r;)w=w.Prev;if(w.Pt.Y>r.Pt.Y||!h.ClipperBase.SlopesEqual(r.Pt,w.Pt,b.OffPt,this.m_UseFullRange))return!1}if(k==l||w==r||k==w||d==e&&q==B)return!1;q?(k=this.DupOutPt(l,!1),w=this.DupOutPt(r,!0),l.Prev=r,r.Next=l,k.Next=w,w.Prev=k):(k=this.DupOutPt(l,!0),w=this.DupOutPt(r,!1),l.Next=r,r.Prev=l,k.Prev=w,w.Next=
+k);b.OutPt1=l;b.OutPt2=k;return!0};h.Clipper.GetBounds=function(b){for(var d=0,e=b.length;d<e&&0==b[d].length;)d++;if(d==e)return new h.IntRect(0,0,0,0);var l=new h.IntRect;l.left=b[d][0].X;l.right=l.left;l.top=b[d][0].Y;for(l.bottom=l.top;d<e;d++)for(var k=0,r=b[d].length;k<r;k++)b[d][k].X<l.left?l.left=b[d][k].X:b[d][k].X>l.right&&(l.right=b[d][k].X),b[d][k].Y<l.top?l.top=b[d][k].Y:b[d][k].Y>l.bottom&&(l.bottom=b[d][k].Y);return l};h.Clipper.prototype.GetBounds2=function(b){var d=b,e=new h.IntRect;
+e.left=b.Pt.X;e.right=b.Pt.X;e.top=b.Pt.Y;e.bottom=b.Pt.Y;for(b=b.Next;b!=d;)b.Pt.X<e.left&&(e.left=b.Pt.X),b.Pt.X>e.right&&(e.right=b.Pt.X),b.Pt.Y<e.top&&(e.top=b.Pt.Y),b.Pt.Y>e.bottom&&(e.bottom=b.Pt.Y),b=b.Next;return e};h.ClipperBase.prototype.PointInPolygon=h.Clipper.prototype.PointInPolygon=function(){var b=arguments,d=b.length;if(2==d){for(var d=b[0],e=b[1],b=0,l=e;;){var h=e.Pt.X,k=e.Pt.Y,w=e.Next.Pt.X,E=e.Next.Pt.Y;if(E==d.Y&&(w==d.X||k==d.Y&&w>d.X==h<d.X))return-1;if(k<d.Y!=E<d.Y)if(h>=
+d.X)if(w>d.X)b=1-b;else{h=(h-d.X)*(E-d.Y)-(w-d.X)*(k-d.Y);if(0==h)return-1;0<h==E>k&&(b=1-b)}else if(w>d.X){h=(h-d.X)*(E-d.Y)-(w-d.X)*(k-d.Y);if(0==h)return-1;0<h==E>k&&(b=1-b)}e=e.Next;if(l==e)break}return b}if(3==d){d=b[0];e=b[1];l=b[2];k=e;b=!1;if(l){do k.Pt.Y>d.Y!=k.Prev.Pt.Y>d.Y&&q.op_LessThan(new q(d.X-k.Pt.X),q.op_Division(q.Int128Mul(k.Prev.Pt.X-k.Pt.X,d.Y-k.Pt.Y),new q(k.Prev.Pt.Y-k.Pt.Y)))&&(b=!b),k=k.Next;while(k!=e)}else{do k.Pt.Y>d.Y!=k.Prev.Pt.Y>d.Y&&d.X-k.Pt.X<(k.Prev.Pt.X-k.Pt.X)*
+(d.Y-k.Pt.Y)/(k.Prev.Pt.Y-k.Pt.Y)&&(b=!b),k=k.Next;while(k!=e)}return b}};h.Clipper.prototype.Poly2ContainsPoly1=function(b,d){var e=b;do{var l=this.PointInPolygon(e.Pt,d);if(0<=l)return 0!=l;e=e.Next}while(e!=b);return!0};h.Clipper.prototype.FixupFirstLefts1=function(b,d){for(var e=0,l=this.m_PolyOuts.length;e<l;e++){var h=this.m_PolyOuts[e];null!==h.Pts&&h.FirstLeft==b&&this.Poly2ContainsPoly1(h.Pts,d.Pts)&&(h.FirstLeft=d)}};h.Clipper.prototype.FixupFirstLefts2=function(b,d){for(var e=0,l=this.m_PolyOuts,
+h=l.length,k=l[e];e<h;e++,k=l[e])k.FirstLeft==b&&(k.FirstLeft=d)};h.Clipper.ParseFirstLeft=function(b){for(;null!=b&&null==b.Pts;)b=b.FirstLeft;return b};h.Clipper.prototype.JoinCommonEdges=function(){for(var b=0,d=this.m_Joins.length;b<d;b++){var e=this.m_Joins[b],l=this.GetOutRec(e.OutPt1.Idx),k=this.GetOutRec(e.OutPt2.Idx);if(null!=l.Pts&&null!=k.Pts){var r;r=l==k?l:this.Param1RightOfParam2(l,k)?k:this.Param1RightOfParam2(k,l)?l:this.GetLowermostRec(l,k);if(this.JoinPoints(e,l,k))if(l==k){l.Pts=
+e.OutPt1;l.BottomPt=null;k=this.CreateOutRec();k.Pts=e.OutPt2;this.UpdateOutPtIdxs(k);if(this.m_UsingPolyTree){r=0;for(var w=this.m_PolyOuts.length;r<w-1;r++){var q=this.m_PolyOuts[r];null!=q.Pts&&h.Clipper.ParseFirstLeft(q.FirstLeft)==l&&q.IsHole!=l.IsHole&&this.Poly2ContainsPoly1(q.Pts,e.OutPt2)&&(q.FirstLeft=k)}}this.Poly2ContainsPoly1(k.Pts,l.Pts)?(k.IsHole=!l.IsHole,k.FirstLeft=l,this.m_UsingPolyTree&&this.FixupFirstLefts2(k,l),(k.IsHole^this.ReverseSolution)==0<this.Area(k)&&this.ReversePolyPtLinks(k.Pts)):
+this.Poly2ContainsPoly1(l.Pts,k.Pts)?(k.IsHole=l.IsHole,l.IsHole=!k.IsHole,k.FirstLeft=l.FirstLeft,l.FirstLeft=k,this.m_UsingPolyTree&&this.FixupFirstLefts2(l,k),(l.IsHole^this.ReverseSolution)==0<this.Area(l)&&this.ReversePolyPtLinks(l.Pts)):(k.IsHole=l.IsHole,k.FirstLeft=l.FirstLeft,this.m_UsingPolyTree&&this.FixupFirstLefts1(l,k))}else k.Pts=null,k.BottomPt=null,k.Idx=l.Idx,l.IsHole=r.IsHole,r==k&&(l.FirstLeft=k.FirstLeft),k.FirstLeft=l,this.m_UsingPolyTree&&this.FixupFirstLefts2(k,l)}}};h.Clipper.prototype.UpdateOutPtIdxs=
+function(b){var d=b.Pts;do d.Idx=b.Idx,d=d.Prev;while(d!=b.Pts)};h.Clipper.prototype.DoSimplePolygons=function(){for(var b=0;b<this.m_PolyOuts.length;){var d=this.m_PolyOuts[b++],e=d.Pts;if(null!==e){do{for(var l=e.Next;l!=d.Pts;){if(h.IntPoint.op_Equality(e.Pt,l.Pt)&&l.Next!=e&&l.Prev!=e){var k=e.Prev,r=l.Prev;e.Prev=r;r.Next=e;l.Prev=k;k.Next=l;d.Pts=e;k=this.CreateOutRec();k.Pts=l;this.UpdateOutPtIdxs(k);this.Poly2ContainsPoly1(k.Pts,d.Pts)?(k.IsHole=!d.IsHole,k.FirstLeft=d):this.Poly2ContainsPoly1(d.Pts,
+k.Pts)?(k.IsHole=d.IsHole,d.IsHole=!k.IsHole,k.FirstLeft=d.FirstLeft,d.FirstLeft=k):(k.IsHole=d.IsHole,k.FirstLeft=d.FirstLeft);l=e}l=l.Next}e=e.Next}while(e!=d.Pts)}}};h.Clipper.Area=function(b){var d=b.length;if(3>d)return 0;for(var e=0,h=0,k=d-1;h<d;++h)e+=(b[k].X+b[h].X)*(b[k].Y-b[h].Y),k=h;return.5*-e};h.Clipper.prototype.Area=function(b){var d=b.Pts;if(null==d)return 0;var e=0;do e+=(d.Prev.Pt.X+d.Pt.X)*(d.Prev.Pt.Y-d.Pt.Y),d=d.Next;while(d!=b.Pts);return.5*e};h.Clipper.SimplifyPolygon=function(b,
+d){var e=[],l=new h.Clipper(0);l.StrictlySimple=!0;l.AddPath(b,h.PolyType.ptSubject,!0);l.Execute(h.ClipType.ctUnion,e,d,d);return e};h.Clipper.SimplifyPolygons=function(b,d){"undefined"==typeof d&&(d=h.PolyFillType.pftEvenOdd);var e=[],l=new h.Clipper(0);l.StrictlySimple=!0;l.AddPaths(b,h.PolyType.ptSubject,!0);l.Execute(h.ClipType.ctUnion,e,d,d);return e};h.Clipper.DistanceSqrd=function(b,d){var e=b.X-d.X,h=b.Y-d.Y;return e*e+h*h};h.Clipper.DistanceFromLineSqrd=function(b,d,e){var h=d.Y-e.Y;e=e.X-
+d.X;d=h*d.X+e*d.Y;d=h*b.X+e*b.Y-d;return d*d/(h*h+e*e)};h.Clipper.SlopesNearCollinear=function(b,d,e,l){return h.Clipper.DistanceFromLineSqrd(d,b,e)<l};h.Clipper.PointsAreClose=function(b,d,e){var h=b.X-d.X;b=b.Y-d.Y;return h*h+b*b<=e};h.Clipper.ExcludeOp=function(b){var d=b.Prev;d.Next=b.Next;b.Next.Prev=d;d.Idx=0;return d};h.Clipper.CleanPolygon=function(b,d){"undefined"==typeof d&&(d=1.415);var e=b.length;if(0==e)return[];for(var l=Array(e),k=0;k<e;++k)l[k]=new h.OutPt;for(k=0;k<e;++k)l[k].Pt=
+b[k],l[k].Next=l[(k+1)%e],l[k].Next.Prev=l[k],l[k].Idx=0;k=d*d;for(l=l[0];0==l.Idx&&l.Next!=l.Prev;)h.Clipper.PointsAreClose(l.Pt,l.Prev.Pt,k)?(l=h.Clipper.ExcludeOp(l),e--):h.Clipper.PointsAreClose(l.Prev.Pt,l.Next.Pt,k)?(h.Clipper.ExcludeOp(l.Next),l=h.Clipper.ExcludeOp(l),e-=2):h.Clipper.SlopesNearCollinear(l.Prev.Pt,l.Pt,l.Next.Pt,k)?(l=h.Clipper.ExcludeOp(l),e--):(l.Idx=1,l=l.Next);3>e&&(e=0);for(var r=Array(e),k=0;k<e;++k)r[k]=new h.IntPoint(l.Pt),l=l.Next;return r};h.Clipper.CleanPolygons=
+function(b,d){for(var e=Array(b.length),l=0,k=b.length;l<k;l++)e[l]=h.Clipper.CleanPolygon(b[l],d);return e};h.Clipper.Minkowski=function(b,d,e,l){var k=l?1:0,r=b.length,w=d.length;l=[];if(e)for(e=0;e<w;e++){for(var q=Array(r),B=0,L=b.length,H=b[B];B<L;B++,H=b[B])q[B]=new h.IntPoint(d[e].X+H.X,d[e].Y+H.Y);l.push(q)}else for(e=0;e<w;e++){q=Array(r);B=0;L=b.length;for(H=b[B];B<L;B++,H=b[B])q[B]=new h.IntPoint(d[e].X-H.X,d[e].Y-H.Y);l.push(q)}b=[];for(e=0;e<=w-2+k;e++)for(B=0;B<=r-1;B++)d=[],d.push(l[e%
+w][B%r]),d.push(l[(e+1)%w][B%r]),d.push(l[(e+1)%w][(B+1)%r]),d.push(l[e%w][(B+1)%r]),h.Clipper.Orientation(d)||d.reverse(),b.push(d);k=new h.Clipper(0);k.AddPaths(b,h.PolyType.ptSubject,!0);k.Execute(h.ClipType.ctUnion,l,h.PolyFillType.pftNonZero,h.PolyFillType.pftNonZero);return l};h.Clipper.MinkowskiSum=function(b,d,e){return h.Clipper.Minkowski(b,d,!0,e)};h.Clipper.MinkowskiDiff=function(b,d,e){return h.Clipper.Minkowski(b,d,!1,e)};h.Clipper.PolyTreeToPaths=function(b){var d=[];h.Clipper.AddPolyNodeToPaths(b,
+h.Clipper.NodeType.ntAny,d);return d};h.Clipper.AddPolyNodeToPaths=function(b,d,e){var l=!0;switch(d){case h.Clipper.NodeType.ntOpen:return;case h.Clipper.NodeType.ntClosed:l=!b.IsOpen}0<b.m_polygon.length&&l&&e.push(b.m_polygon);l=0;b=b.Childs();for(var k=b.length,r=b[l];l<k;l++,r=b[l])h.Clipper.AddPolyNodeToPaths(r,d,e)};h.Clipper.OpenPathsFromPolyTree=function(b){for(var d=new h.Paths,e=0,l=b.ChildCount();e<l;e++)b.Childs()[e].IsOpen&&d.push(b.Childs()[e].m_polygon);return d};h.Clipper.ClosedPathsFromPolyTree=
+function(b){var d=new h.Paths;h.Clipper.AddPolyNodeToPaths(b,h.Clipper.NodeType.ntClosed,d);return d};Yb(h.Clipper,h.ClipperBase);h.Clipper.NodeType={ntAny:0,ntOpen:1,ntClosed:2};h.ClipperOffset=function(b,d){"undefined"==typeof b&&(b=2);"undefined"==typeof d&&(d=h.ClipperOffset.def_arc_tolerance);this.m_destPolys=new h.Paths;this.m_srcPoly=new h.Path;this.m_destPoly=new h.Path;this.m_normals=[];this.m_StepsPerRad=this.m_miterLim=this.m_cos=this.m_sin=this.m_sinA=this.m_delta=0;this.m_lowest=new h.IntPoint;
+this.m_polyNodes=new h.PolyNode;this.MiterLimit=b;this.ArcTolerance=d;this.m_lowest.X=-1};h.ClipperOffset.two_pi=6.28318530717959;h.ClipperOffset.def_arc_tolerance=.25;h.ClipperOffset.prototype.Clear=function(){h.Clear(this.m_polyNodes.Childs());this.m_lowest.X=-1};h.ClipperOffset.Round=h.Clipper.Round;h.ClipperOffset.prototype.AddPath=function(b,d,e){var l=b.length-1;if(!(0>l)){var k=new h.PolyNode;k.m_jointype=d;k.m_endtype=e;if(e==h.EndType.etClosedLine||e==h.EndType.etClosedPolygon)for(;0<l&&
+h.IntPoint.op_Equality(b[0],b[l]);)l--;k.m_polygon.push(b[0]);var r=0;d=0;for(var w=1;w<=l;w++)h.IntPoint.op_Inequality(k.m_polygon[r],b[w])&&(r++,k.m_polygon.push(b[w]),b[w].Y>k.m_polygon[d].Y||b[w].Y==k.m_polygon[d].Y&&b[w].X<k.m_polygon[d].X)&&(d=r);if(!(e==h.EndType.etClosedPolygon&&2>r||e!=h.EndType.etClosedPolygon&&0>r)&&(this.m_polyNodes.AddChild(k),e==h.EndType.etClosedPolygon))if(0>this.m_lowest.X)this.m_lowest=new h.IntPoint(0,d);else if(b=this.m_polyNodes.Childs()[this.m_lowest.X].m_polygon[this.m_lowest.Y],
+k.m_polygon[d].Y>b.Y||k.m_polygon[d].Y==b.Y&&k.m_polygon[d].X<b.X)this.m_lowest=new h.IntPoint(this.m_polyNodes.ChildCount()-1,d)}};h.ClipperOffset.prototype.AddPaths=function(b,d,e){for(var h=0,k=b.length;h<k;h++)this.AddPath(b[h],d,e)};h.ClipperOffset.prototype.FixOrientations=function(){if(0<=this.m_lowest.X&&!h.Clipper.Orientation(this.m_polyNodes.Childs()[this.m_lowest.X].m_polygon))for(var b=0;b<this.m_polyNodes.ChildCount();b++){var d=this.m_polyNodes.Childs()[b];(d.m_endtype==h.EndType.etClosedPolygon||
+d.m_endtype==h.EndType.etClosedLine&&h.Clipper.Orientation(d.m_polygon))&&d.m_polygon.reverse()}else for(b=0;b<this.m_polyNodes.ChildCount();b++)d=this.m_polyNodes.Childs()[b],d.m_endtype!=h.EndType.etClosedLine||h.Clipper.Orientation(d.m_polygon)||d.m_polygon.reverse()};h.ClipperOffset.GetUnitNormal=function(b,d){var e=d.X-b.X,l=d.Y-b.Y;if(0==e&&0==l)return new h.DoublePoint(0,0);var k=1/Math.sqrt(e*e+l*l);return new h.DoublePoint(l*k,-(e*k))};h.ClipperOffset.prototype.DoOffset=function(b){this.m_destPolys=
+[];this.m_delta=b;if(h.ClipperBase.near_zero(b))for(var d=0;d<this.m_polyNodes.ChildCount();d++){var e=this.m_polyNodes.Childs()[d];e.m_endtype==h.EndType.etClosedPolygon&&this.m_destPolys.push(e.m_polygon)}else{this.m_miterLim=2<this.MiterLimit?2/(this.MiterLimit*this.MiterLimit):.5;var d=0>=this.ArcTolerance?h.ClipperOffset.def_arc_tolerance:this.ArcTolerance>Math.abs(b)*h.ClipperOffset.def_arc_tolerance?Math.abs(b)*h.ClipperOffset.def_arc_tolerance:this.ArcTolerance,l=3.14159265358979/Math.acos(1-
+d/Math.abs(b));this.m_sin=Math.sin(h.ClipperOffset.two_pi/l);this.m_cos=Math.cos(h.ClipperOffset.two_pi/l);this.m_StepsPerRad=l/h.ClipperOffset.two_pi;0>b&&(this.m_sin=-this.m_sin);for(d=0;d<this.m_polyNodes.ChildCount();d++){e=this.m_polyNodes.Childs()[d];this.m_srcPoly=e.m_polygon;var k=this.m_srcPoly.length;if(!(0==k||0>=b&&(3>k||e.m_endtype!=h.EndType.etClosedPolygon))){this.m_destPoly=[];if(1==k)if(e.m_jointype==h.JoinType.jtRound)for(var e=1,k=0,r=1;r<=l;r++){this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[0].X+
+e*b),h.ClipperOffset.Round(this.m_srcPoly[0].Y+k*b)));var w=e,e=e*this.m_cos-this.m_sin*k,k=w*this.m_sin+k*this.m_cos}else for(k=e=-1,r=0;4>r;++r)this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[0].X+e*b),h.ClipperOffset.Round(this.m_srcPoly[0].Y+k*b))),0>e?e=1:0>k?k=1:e=-1;else{for(r=this.m_normals.length=0;r<k-1;r++)this.m_normals.push(h.ClipperOffset.GetUnitNormal(this.m_srcPoly[r],this.m_srcPoly[r+1]));e.m_endtype==h.EndType.etClosedLine||e.m_endtype==h.EndType.etClosedPolygon?
+this.m_normals.push(h.ClipperOffset.GetUnitNormal(this.m_srcPoly[k-1],this.m_srcPoly[0])):this.m_normals.push(new h.DoublePoint(this.m_normals[k-2]));if(e.m_endtype==h.EndType.etClosedPolygon)for(w=k-1,r=0;r<k;r++)w=this.OffsetPoint(r,w,e.m_jointype);else if(e.m_endtype==h.EndType.etClosedLine){w=k-1;for(r=0;r<k;r++)w=this.OffsetPoint(r,w,e.m_jointype);this.m_destPolys.push(this.m_destPoly);this.m_destPoly=[];w=this.m_normals[k-1];for(r=k-1;0<r;r--)this.m_normals[r]=new h.DoublePoint(-this.m_normals[r-
+1].X,-this.m_normals[r-1].Y);this.m_normals[0]=new h.DoublePoint(-w.X,-w.Y);w=0;for(r=k-1;0<=r;r--)w=this.OffsetPoint(r,w,e.m_jointype)}else{w=0;for(r=1;r<k-1;++r)w=this.OffsetPoint(r,w,e.m_jointype);e.m_endtype==h.EndType.etOpenButt?(r=k-1,w=new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[r].X+this.m_normals[r].X*b),h.ClipperOffset.Round(this.m_srcPoly[r].Y+this.m_normals[r].Y*b)),this.m_destPoly.push(w),w=new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[r].X-this.m_normals[r].X*b),h.ClipperOffset.Round(this.m_srcPoly[r].Y-
+this.m_normals[r].Y*b)),this.m_destPoly.push(w)):(r=k-1,w=k-2,this.m_sinA=0,this.m_normals[r]=new h.DoublePoint(-this.m_normals[r].X,-this.m_normals[r].Y),e.m_endtype==h.EndType.etOpenSquare?this.DoSquare(r,w):this.DoRound(r,w));for(r=k-1;0<r;r--)this.m_normals[r]=new h.DoublePoint(-this.m_normals[r-1].X,-this.m_normals[r-1].Y);this.m_normals[0]=new h.DoublePoint(-this.m_normals[1].X,-this.m_normals[1].Y);w=k-1;for(r=w-1;0<r;--r)w=this.OffsetPoint(r,w,e.m_jointype);e.m_endtype==h.EndType.etOpenButt?
+(w=new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[0].X-this.m_normals[0].X*b),h.ClipperOffset.Round(this.m_srcPoly[0].Y-this.m_normals[0].Y*b)),this.m_destPoly.push(w),w=new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[0].X+this.m_normals[0].X*b),h.ClipperOffset.Round(this.m_srcPoly[0].Y+this.m_normals[0].Y*b)),this.m_destPoly.push(w)):(this.m_sinA=0,e.m_endtype==h.EndType.etOpenSquare?this.DoSquare(0,1):this.DoRound(0,1))}}this.m_destPolys.push(this.m_destPoly)}}}};h.ClipperOffset.prototype.Execute=
+function(){var b=arguments;if(b[0]instanceof h.PolyTree)if(d=b[0],e=b[1],d.Clear(),this.FixOrientations(),this.DoOffset(e),b=new h.Clipper(0),b.AddPaths(this.m_destPolys,h.PolyType.ptSubject,!0),0<e)b.Execute(h.ClipType.ctUnion,d,h.PolyFillType.pftPositive,h.PolyFillType.pftPositive);else if(e=h.Clipper.GetBounds(this.m_destPolys),l=new h.Path,l.push(new h.IntPoint(e.left-10,e.bottom+10)),l.push(new h.IntPoint(e.right+10,e.bottom+10)),l.push(new h.IntPoint(e.right+10,e.top-10)),l.push(new h.IntPoint(e.left-
+10,e.top-10)),b.AddPath(l,h.PolyType.ptSubject,!0),b.ReverseSolution=!0,b.Execute(h.ClipType.ctUnion,d,h.PolyFillType.pftNegative,h.PolyFillType.pftNegative),1==d.ChildCount()&&0<d.Childs()[0].ChildCount())for(b=d.Childs()[0],d.Childs()[0]=b.Childs()[0],e=1;e<b.ChildCount();e++)d.AddChild(b.Childs()[e]);else d.Clear();else{var d=b[0],e=b[1];h.Clear(d);this.FixOrientations();this.DoOffset(e);b=new h.Clipper(0);b.AddPaths(this.m_destPolys,h.PolyType.ptSubject,!0);if(0<e)b.Execute(h.ClipType.ctUnion,
+d,h.PolyFillType.pftPositive,h.PolyFillType.pftPositive);else{var e=h.Clipper.GetBounds(this.m_destPolys),l=new h.Path;l.push(new h.IntPoint(e.left-10,e.bottom+10));l.push(new h.IntPoint(e.right+10,e.bottom+10));l.push(new h.IntPoint(e.right+10,e.top-10));l.push(new h.IntPoint(e.left-10,e.top-10));b.AddPath(l,h.PolyType.ptSubject,!0);b.ReverseSolution=!0;b.Execute(h.ClipType.ctUnion,d,h.PolyFillType.pftNegative,h.PolyFillType.pftNegative);0<d.length&&d.splice(0,1)}}};h.ClipperOffset.prototype.OffsetPoint=
+function(b,d,e){this.m_sinA=this.m_normals[d].X*this.m_normals[b].Y-this.m_normals[b].X*this.m_normals[d].Y;if(5E-5>this.m_sinA&&-5E-5<this.m_sinA)return d;1<this.m_sinA?this.m_sinA=1:-1>this.m_sinA&&(this.m_sinA=-1);if(0>this.m_sinA*this.m_delta)this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[b].X+this.m_normals[d].X*this.m_delta),h.ClipperOffset.Round(this.m_srcPoly[b].Y+this.m_normals[d].Y*this.m_delta))),this.m_destPoly.push(new h.IntPoint(this.m_srcPoly[b])),this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[b].X+
+this.m_normals[b].X*this.m_delta),h.ClipperOffset.Round(this.m_srcPoly[b].Y+this.m_normals[b].Y*this.m_delta)));else switch(e){case h.JoinType.jtMiter:e=1+(this.m_normals[b].X*this.m_normals[d].X+this.m_normals[b].Y*this.m_normals[d].Y);e>=this.m_miterLim?this.DoMiter(b,d,e):this.DoSquare(b,d);break;case h.JoinType.jtSquare:this.DoSquare(b,d);break;case h.JoinType.jtRound:this.DoRound(b,d)}return b};h.ClipperOffset.prototype.DoSquare=function(b,d){var e=Math.tan(Math.atan2(this.m_sinA,this.m_normals[d].X*
+this.m_normals[b].X+this.m_normals[d].Y*this.m_normals[b].Y)/4);this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[b].X+this.m_delta*(this.m_normals[d].X-this.m_normals[d].Y*e)),h.ClipperOffset.Round(this.m_srcPoly[b].Y+this.m_delta*(this.m_normals[d].Y+this.m_normals[d].X*e))));this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[b].X+this.m_delta*(this.m_normals[b].X+this.m_normals[b].Y*e)),h.ClipperOffset.Round(this.m_srcPoly[b].Y+this.m_delta*(this.m_normals[b].Y-
+this.m_normals[b].X*e))))};h.ClipperOffset.prototype.DoMiter=function(b,d,e){e=this.m_delta/e;this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[b].X+(this.m_normals[d].X+this.m_normals[b].X)*e),h.ClipperOffset.Round(this.m_srcPoly[b].Y+(this.m_normals[d].Y+this.m_normals[b].Y)*e)))};h.ClipperOffset.prototype.DoRound=function(b,d){for(var e=Math.atan2(this.m_sinA,this.m_normals[d].X*this.m_normals[b].X+this.m_normals[d].Y*this.m_normals[b].Y),e=h.Cast_Int32(h.ClipperOffset.Round(this.m_StepsPerRad*
+Math.abs(e))),l=this.m_normals[d].X,k=this.m_normals[d].Y,r,w=0;w<e;++w)this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[b].X+l*this.m_delta),h.ClipperOffset.Round(this.m_srcPoly[b].Y+k*this.m_delta))),r=l,l=l*this.m_cos-this.m_sin*k,k=r*this.m_sin+k*this.m_cos;this.m_destPoly.push(new h.IntPoint(h.ClipperOffset.Round(this.m_srcPoly[b].X+this.m_normals[b].X*this.m_delta),h.ClipperOffset.Round(this.m_srcPoly[b].Y+this.m_normals[b].Y*this.m_delta)))};h.Error=function(b){try{throw Error(b);
+}catch(d){alert(d.message)}};h.JS={};h.JS.AreaOfPolygon=function(b,d){d||(d=1);return h.Clipper.Area(b)/(d*d)};h.JS.AreaOfPolygons=function(b,d){d||(d=1);for(var e=0,l=0;l<b.length;l++)e+=h.Clipper.Area(b[l]);return e/(d*d)};h.JS.BoundsOfPath=function(b,d){return h.JS.BoundsOfPaths([b],d)};h.JS.BoundsOfPaths=function(b,d){d||(d=1);var e=h.Clipper.GetBounds(b);e.left/=d;e.bottom/=d;e.right/=d;e.top/=d;return e};h.JS.Clean=function(b,d){if(!(b instanceof Array))return[];var e=b[0]instanceof Array;b=
+h.JS.Clone(b);if("number"!=typeof d||null===d)return h.Error("Delta is not a number in Clean()."),b;if(0===b.length||1==b.length&&0===b[0].length||0>d)return b;e||(b=[b]);for(var l=b.length,k,r,w,q,B,L,H,K=[],fa=0;fa<l;fa++)if(r=b[fa],k=r.length,0!==k)if(3>k)w=r,K.push(w);else{w=r;q=d*d;B=r[0];for(H=L=1;H<k;H++)(r[H].X-B.X)*(r[H].X-B.X)+(r[H].Y-B.Y)*(r[H].Y-B.Y)<=q||(w[L]=r[H],B=r[H],L++);B=r[L-1];(r[0].X-B.X)*(r[0].X-B.X)+(r[0].Y-B.Y)*(r[0].Y-B.Y)<=q&&L--;L<k&&w.splice(L,k-L);w.length&&K.push(w)}!e&&
+K.length?K=K[0]:e||0!==K.length?e&&0===K.length&&(K=[[]]):K=[];return K};h.JS.Clone=function(b){if(!(b instanceof Array)||0===b.length)return[];if(1==b.length&&0===b[0].length)return[[]];var d=b[0]instanceof Array;d||(b=[b]);var e=b.length,h,k,r,w,q=Array(e);for(k=0;k<e;k++){h=b[k].length;w=Array(h);for(r=0;r<h;r++)w[r]={X:b[k][r].X,Y:b[k][r].Y};q[k]=w}d||(q=q[0]);return q};h.JS.Lighten=function(b,d){if(!(b instanceof Array))return[];if("number"!=typeof d||null===d)return h.Error("Tolerance is not a number in Lighten()."),
+h.JS.Clone(b);if(0===b.length||1==b.length&&0===b[0].length||0>d)return h.JS.Clone(b);b[0]instanceof Array||(b=[b]);var e,l,k,r,w,q,B,L,H,K,fa,Q,Y,S,X,da=b.length,la=d*d,ka=[];for(e=0;e<da;e++)if(k=b[e],q=k.length,0!=q){for(r=0;1E6>r;r++){w=[];q=k.length;k[q-1].X!=k[0].X||k[q-1].Y!=k[0].Y?(fa=1,k.push({X:k[0].X,Y:k[0].Y}),q=k.length):fa=0;K=[];for(l=0;l<q-2;l++){B=k[l];H=k[l+1];L=k[l+2];S=B.X;X=B.Y;B=L.X-S;Q=L.Y-X;if(0!==B||0!==Q)Y=((H.X-S)*B+(H.Y-X)*Q)/(B*B+Q*Q),1<Y?(S=L.X,X=L.Y):0<Y&&(S+=B*Y,X+=
+Q*Y);B=H.X-S;Q=H.Y-X;L=B*B+Q*Q;L<=la&&(K[l+1]=1,l++)}w.push({X:k[0].X,Y:k[0].Y});for(l=1;l<q-1;l++)K[l]||w.push({X:k[l].X,Y:k[l].Y});w.push({X:k[q-1].X,Y:k[q-1].Y});fa&&k.pop();if(K.length)k=w;else break}q=w.length;w[q-1].X==w[0].X&&w[q-1].Y==w[0].Y&&w.pop();2<w.length&&ka.push(w)}b[0]instanceof Array||(ka=ka[0]);"undefined"==typeof ka&&(ka=[[]]);return ka};h.JS.PerimeterOfPath=function(b,d,e){if("undefined"==typeof b)return 0;var h=Math.sqrt,k=0,r,w,q,B,L=b.length;if(2>L)return 0;for(d&&(b[L]=b[0],
+L++);--L;)r=b[L],q=r.X,r=r.Y,w=b[L-1],B=w.X,w=w.Y,k+=h((q-B)*(q-B)+(r-w)*(r-w));d&&b.pop();return k/e};h.JS.PerimeterOfPaths=function(b,d,e){e||(e=1);for(var k=0,q=0;q<b.length;q++)k+=h.JS.PerimeterOfPath(b[q],d,e);return k};h.JS.ScaleDownPath=function(b,d){var e,h;d||(d=1);for(e=b.length;e--;)h=b[e],h.X/=d,h.Y/=d};h.JS.ScaleDownPaths=function(b,d){var e,h,k;d||(d=1);for(e=b.length;e--;)for(h=b[e].length;h--;)k=b[e][h],k.X/=d,k.Y/=d};h.JS.ScaleUpPath=function(b,d){var e,h,k=Math.round;d||(d=1);for(e=
+b.length;e--;)h=b[e],h.X=k(h.X*d),h.Y=k(h.Y*d)};h.JS.ScaleUpPaths=function(b,d){var e,h,k,r=Math.round;d||(d=1);for(e=b.length;e--;)for(h=b[e].length;h--;)k=b[e][h],k.X=r(k.X*d),k.Y=r(k.Y*d)};h.ExPolygons=function(){return[]};h.ExPolygon=function(){this.holes=this.outer=null};h.JS.AddOuterPolyNodeToExPolygons=function(b,d){var e=new h.ExPolygon;e.outer=b.Contour();var k=b.Childs(),q=k.length;e.holes=Array(q);var r,w,L,B,H;for(w=0;w<q;w++)for(r=k[w],e.holes[w]=r.Contour(),L=0,B=r.Childs(),H=B.length;L<
+H;L++)r=B[L],h.JS.AddOuterPolyNodeToExPolygons(r,d);d.push(e)};h.JS.ExPolygonsToPaths=function(b){var d,e,k,q,r=new h.Paths;d=0;for(k=b.length;d<k;d++)for(r.push(b[d].outer),e=0,q=b[d].holes.length;e<q;e++)r.push(b[d].holes[e]);return r};h.JS.PolyTreeToExPolygons=function(b){var d=new h.ExPolygons,e,k,q;e=0;k=b.Childs();for(q=k.length;e<q;e++)b=k[e],h.JS.AddOuterPolyNodeToExPolygons(b,d);return d}})();
+var CindyJS=function(){function q(k){if(0===oa)return console.error("Waiting for "+k+" after we finished waiting."),function(){};0>oa&&(oa=0);++oa;return function(){--oa;0>oa&&console.error("Wait count mismatch: "+k);if(0===oa)for(var q=0,H=ib.length;q<H;)ib[q++].startup()}}function H(k){var q=H.newInstance(k);0>=oa?q.startup():!1!==k.autostart&&ib.push(q);return q}var oa=-1,ib=[];"undefined"===typeof document||"undefined"===typeof window||"undefined"===typeof document.addEventListener||"undefined"!==
+typeof window.cindyDontWait&&!0===window.cindyDontWait||document.addEventListener("DOMContentLoaded",q("DOMContentLoaded"));var Ia=null,Ja=null,Ba={};H.getBaseDir=function(){if(null!==Ia)return Ia;for(var k=document.getElementsByTagName("script"),q=0;q<k.length;++q){var H=k[q],Q=H.src;if(Q){var X=/Cindy\.js$/.exec(Q);if(X)return Ia=Q.substr(0,X.index),console.log("Will load extensions from "+Ia),Ja=H,Ia}}console.error("Could not find <script> tag for Cindy.js");return Ia=Ja=!1};H.addNewScript=function(k,
+q){q||console.error.bind(console);var Y=H.getBaseDir();if(!1===Y)return!1;var Q=document.createElement("script");Q.src=Y+k;var Y=Ja.nextSibling,X=Ja.parentElement;Y?X.insertBefore(Q,Y):X.appendChild(Q);return Q};H.loadScript=function(k,q,Y,Q){if(window[k])return Y(),!0;Q||(Q=console.error.bind(console));var X=Ba[k];if(!X){X=H.addNewScript(q,Q);if(!1===X)return Q("Can't load additional components."),!1;Ba[k]=X}X.addEventListener("load",Y);X.addEventListener("error",Q);return null};H._autoLoadingPlugin=
+{};H.autoLoadPlugin=function(k,q,Y){if(H._pluginRegistry[k])return Y(),!0;var Q=H._autoLoadingPlugin[k];if(!Q){q||(q=k+"-plugin.js");Q=H._autoLoadingPlugin[k]=[];k=H.addNewScript(q);if(!1===k)return!1;k.addEventListener("error",console.error.bind(console))}Q.push(Y);return null};var k={ctype:"undefined"};H.waitFor=q;H._pluginRegistry={};H.instances=[];H.registerPlugin=function(k,q,Y){if(1!==k)return console.error("Plugin API version "+k+" not supported"),!1;H._pluginRegistry[q]=Y;(H._autoLoadingPlugin[q]||
+[]).forEach(function(k){k()})};var Ra=0;H.dumpState=function(k){k=H.instances[k||0].saveState();console.log(JSON.stringify(k))};H.debugState=function(k){H.instances.map(function(k){var q=k.config,q=JSON.parse(JSON.stringify(q)),L=k.saveState();console.log(JSON.stringify(L));for(var H in L)q[H]=L[H];k.shutdown();return q}).forEach(function(k){H(k)})};H.newInstance=function(q){function H(){ga.width=W=ga.clientWidth;ga.height=V=ga.clientHeight;z.setTransform(1,0,0,1,0,0);x.setMat(25,0,0,25,250.5,250.5);
+if(yb)for(var a=0;a<yb.length;a++){var g=yb[a],c=Object.keys(g)[0];"scale"===c&&(Jb=g.scale,x[c](g.scale));if("translate"===c)x[c](g.translate[0],g.translate[1]);"scaleAndOrigin"===c&&(Jb=g[c][0]/25,x[c].apply(null,g[c]));"visibleRect"===c&&(x[c].apply(null,g[c]),Jb=x.drawingstate.initialmatrix.a/25)}x.createnewbackup();x.greset();a=1;"undefined"!==typeof window&&window.devicePixelRatio&&(a=window.devicePixelRatio);g=z.webkitBackingStorePixelRatio||z.mozBackingStorePixelRatio||z.msBackingStorePixelRatio||
+z.oBackingStorePixelRatio||z.backingStorePixelRatio||1;a!==g&&(a/=g,ga.width=W*a,ga.height=V*a,z.scale(a,a))}function Y(a){var g;if("canvas"!==a.tagName.toLowerCase())for(g=a,ga=document.createElement("canvas");g.firstChild;)g.removeChild(g.firstChild);else{ga=a;g=document.createElement("div");var c=null,p=null;Array.prototype.slice.call(ga.attributes).forEach(function(a){"width"===a.name?c=a.value:"height"===a.name?p=a.value:g.setAttributeNodeNS(ga.removeAttributeNode(a))});null===c||g.style.width||
+(g.style.width=c+"px");null===p||g.style.height||(g.style.height=p+"px");ga.parentNode.replaceChild(g,ga)}g.classList.add("CindyJS-widget");a=ga.style;a.position="absolute";a.border="none";a.margin=a.padding=a.left=a.top="0px";a.width=a.height="100%";a="static";window.getComputedStyle&&(a=window.getComputedStyle(g).getPropertyValue("position"),a=String(a||"static"));"static"===a&&(g.style.position="relative");g.appendChild(ga);return ga}function Q(){$b=!0;if(0===Kb){if(q.exclusive)for(b=va.instances.length;0<
+b;)va.instances[--b].shutdown();void 0!==q.csconsole&&(ha=q.csconsole);ha=null===ha?new Ya:!0===ha?new jb:"string"===typeof ha?new pb(ha):"object"===typeof ha&&"function"===typeof ha.appendChild?new pb(ha):new Ya;sa=[100,100];var a=null;yb=q.transform;if(q.ports&&0<q.ports.length){b=q.ports[0];(a=b.element)||(a=document.getElementById(b.id));var a=Y(a),g=a.parentNode.style;"window"===b.fill?(g.width="100vw",g.height="100vh"):"parent"===b.fill?(g.width="100%",g.height="100%"):b.width&&b.height&&(g.width=
+b.width+"px",g.height=b.height+"px");b.background&&(a.style.backgroundColor=b.background);void 0!==b.transform&&(yb=b.transform);Sa(b.grid)&&0<b.grid&&(Ta=b.grid);Sa(b.tgrid)&&0<b.tgrid&&(ac=b.tgrid);b.snap&&(bc=!0);b.axes&&(zb=!0)}a||(a=q.canvas,a||"undefined"===typeof document||(a=document.getElementById(q.canvasname))&&(a=Y(a)));a&&(ga=a,z=a.getContext("2d"),H(),z.setLineDash||(z.setLineDash=function(){}),(q.animation?q.animation.controls:q.animcontrols)&&Ba(q),q.animation&&Sa(q.animation.speed)&&
+(void 0===q.animation.accuracy&&q.cinderella&&q.cinderella.version&&2===q.cinderella.version[0]&&9===q.cinderella.version[1]&&1875>q.cinderella.version[2]?oa(.5*q.animation.speed):oa(q.animation.speed)),q.animation&&Sa(q.animation.accuracy)&&(Lb=q.animation.accuracy));q.statusbar&&(cc="string"===typeof q.statusbar?document.getElementById(q.statusbar):q.statusbar);var c=q.scripts,p=null;"string"===typeof c&&c.search(/\*/)&&(p=c);"object"!==typeof c&&(c=null);"move keydown mousedown mouseup mousedrag mousemove mouseclick init tick draw simulationstep simulationstart simulationstop ondrop".split(" ").forEach(function(a){var g;
+if(null!==c&&c[a])g=c[a];else{g=a+"script";if(q[g])g=document.getElementById(q[g]);else if(p){if(g=document.getElementById(p.replace(/\*/,a)),!g)return}else return;g=g.text}g=Ma(g,!1);"error"===g.ctype?console.error("Error compiling "+a+" script: "+g.message):ia[a]=g});Sa(q.grid)&&0<q.grid&&(Ta=q.grid);q.snap&&(bc=!0);u={};var b=0;ab={};q.geometry||(q.geometry=[]);Hd(q.geometry);q.behavior||(q.behavior=[]);"function"===typeof dc&&dc(q.behavior);for(var d in q.images)b=X(q.images[d]),b!==k&&(ab[d]=
+b);qa.canvas=a;if(q.oninit)q.oninit(qa);va.instances.push(qa);q.use&&q.use.forEach(function(a){t.use$1([v.wrap(a)],{})});Mc.convexhull3d$1&&h("quickhull3d","quickhull3d/quickhull3d.nocache.js");Ia()}}function X(a){var g;"string"===typeof a?(g=new Image,g.src=a):g=a;if(!g.tagName)return console.error("Not a valid image element",g),k;var c={img:g,width:NaN,height:NaN,ready:!0,live:!1,generation:0,whenReady:ka};a=g.tagName.toLowerCase();var p=[];if("img"===a)g.complete?(c.width=g.width,c.height=g.height):
+(c.ready=!1,g.addEventListener("load",function(){c.width=g.width;c.height=g.height;c.ready=!0;c.whenReady=ka;p.forEach(ka);b()}),c.whenReady=p.push.bind(p));else if("video"===a)c.live=!0,g.readyState>=g.HAVE_METADATA?(c.width=g.videoWidth,c.height=g.videoHeight):(c.ready=!1,g.addEventListener("loadedmetadata",function(){c.width=g.videoWidth;c.height=g.videoHeight;c.ready=!0;c.whenReady=ka;p.forEach(ka);b()}),c.whenReady=p.push.bind(p));else if("canvas"===a)c.width=g.width,c.height=g.height;else return console.error("Not a valid image element",
+a,g),k;return{ctype:"image",value:c}}function Ba(a){function g(a,c){var g=document.createElement("button"),p=document.createElement("img");g.appendChild(p);k.appendChild(g);Ab(p,a);g.addEventListener("click",c);Na[a]=function(a){a?g.classList.add("CindyJS-active"):g.classList.remove("CindyJS-active")}}function c(a){if(h){var c=e.getBoundingClientRect();oa(f*(a.clientX-c.left-e.clientLeft+.5)/c.width+b)}}var p=document.createElement("div");p.className="CindyJS-animcontrols";ga.parentNode.appendChild(p);
+var b=0,d=1,f=1;a.animation&&a.animation.speedRange&&Sa(a.animation.speedRange[0])&&Sa(a.animation.speedRange[1])&&(b=a.animation.speedRange[0],d=a.animation.speedRange[1],f=d-b);var e=document.createElement("div");e.className="CindyJS-animspeed";p.appendChild(e);var m=document.createElement("div");e.appendChild(m);K(e,"mousedown",function(a){h=!0;c(a)});K(e,"mousemove",c);K(ga.parentNode,"mouseup",function(a){h=!1},!0);var k=document.createElement("div");k.className="CindyJS-animbuttons";p.appendChild(k);
+g("play",S);g("pause",Za);g("stop",Ja);Na.stop(!0);fc=function(a){a=(a-b)/f;a=Math.max(0,Math.min(1,a));a=.1*Math.round(1E3*a);m.style.width=a+"%"};var h=!1}function oa(a){Nc=a;fc&&fc(a)}function ka(a){return a()}function h(a,g){var c=null;q.plugins&&(c=q.plugins[a]);c||(c=va._pluginRegistry[a]);c?t.use$1([v.wrap(a)],{}):(++Oc,va.autoLoadPlugin(a,g,function(){t.use$1([v.wrap(a)],{});Ia()}))}function Ia(){0===--Oc&&(A(ia.init),(q.animation||q).autoplay&&S(),qa.canvas&&la(qa.canvas,q))}function da(){null!==
+Bb&&(ma.set(Bb.state),Object.keys(Bb.speeds).forEach(function(a){var g=u.csnames[a];"undefined"!==typeof g.behavior&&(a=Bb.speeds[a],g.behavior.vx=a[0],g.behavior.vy=a[1],g.behavior.vz=a[2],g.behavior.fx=0,g.behavior.fy=0,g.behavior.fz=0)}),Id())}function S(){if(!Ua){if(Nb){var a=bb.backup;a.set(ma);for(var g={},c=0;c<u.points.length;c++){var p=u.points[c];"undefined"!==typeof p.behavior&&(g[p.name]=[p.behavior.vx,p.behavior.vy,p.behavior.vz])}Bb={state:a,speeds:g};Cb=0;Nb=!1;Na.stop(!1)}else Na.pause(!1);
+gc=Date.now();Na.play(!0);"function"===typeof dc&&hc&&Jd();Ua=!0;A(ia.simulationstart);b()}}function Za(){Ua&&(Na.play(!1),Na.pause(!0),Ua=!1)}function Ja(){Nb||(Ua?(A(ia.simulationstop),Ua=!1,Na.play(!1)):Na.pause(!1),Na.stop(!0),Nb=!0,da())}function La(){if(!ic){ic=!0;for(var a=va.instances.length;0<a;)if(va.instances[--a]===qa){va.instances.splice(a,1);break}for(a=kb.length;0<a;)try{kb[--a]()}catch(g){console.error(g)}}}function $a(a){this["in"]=function(a,c){console.log(a);c?this.append(this.createTextNode("span",
+"blue",a)):this.append(this.createTextNode("p","blue",a))};this.out=function(a,c){console.log(a);c?this.append(this.createTextNode("span","red",a)):this.append(this.createTextNode("p","red",a))};this.err=function(a,c){console.log(a);c?this.append(this.createTextNode("span","red",a)):this.append(this.createTextNode("p","red",a))};this.createTextNode=function(a,c,p){return"undefined"!==typeof document?(a=document.createElement(a),a.appendChild(document.createTextNode(p)),a.style.color=c,a):p+"\n"}}
+function jb(){var a=this,g,c=document.createElement("div"),p;c.innerHTML='<div id="console" style="border-top: 1px solid #333333; bottom: 0px; position: absolute; width: 100%;"><div id="log" style="height: 150px; overflow-y: auto;"></div><input id="cmd" type="text" style="box-sizing: border-box; height: 30px; width: 100%;"></div>';document.body.appendChild(c);g=document.getElementById("cmd");p=document.getElementById("log");g.onkeydown=function(c){13===c.keyCode&&""!==g.value&&(a["in"](g.value),c=
+t.parse$1([v.wrap(g.value)],[]),c=A(c),console.log(w(c)),"undefined"!==c.ctype&&ha.out(w(c)),g.value="",p.scrollTop=p.scrollHeight)};this.append=function(a){p.appendChild(a)};this.clear=function(){p.innerHTML=""}}function pb(a){var g=a;"string"===typeof a&&(g=document.getElementById(a));this.append=function(a){g.appendChild(a)};this.clear=function(){g.innerHTML=""}}function Ya(){this.append=function(a){};this.clear=function(){}}function K(a,g,c,p){void 0===p&&(p=!1);kb.push(function(){a.removeEventListener(g,
+c,p)});a.addEventListener(g,c,p)}function la(a,g){function c(c){var g=a.getBoundingClientRect();c=x.to(c.clientX-g.left-a.clientLeft+.5,c.clientY-g.top-a.clientTop+.5);U.prevx=U.x;U.prevy=U.y;U.x=c[0];U.y=c[1];sa[0]=U.x;sa[1]=U.y;b()}function p(a){U.down=!1;aa=void 0;lb();A(ia.mouseup);sb("mouseup");b();a.preventDefault()}var ba=null;"undefined"!==typeof MutationObserver&&(ba=MutationObserver);ba||"undefined"===typeof WebKitMutationObserver||(ba=WebKitMutationObserver);ba?(ba=new ba(function(c){document.body.contains(a)||
+La()}),ba.observe(document.documentElement,{childList:!0,subtree:!0}),kb.push(function(){ba.disconnect()})):(K(a,"DOMNodeRemovedFromDocument",La),K(a,"DOMNodeRemoved",La));!0===g.keylistener?K(document,"keydown",function(a){l(a);return!1}):ia.keydown&&(a.setAttribute("tabindex","0"),K(a,"mousedown",function(){a.focus()}),K(a,"keydown",function(a){9!==a.keyCode&&(l(a),a.preventDefault())}));K(a,"mousedown",function(a){U.button=a.which;c(a);A(ia.mousedown);sb("mousedown");U.down=!0;a.preventDefault()});
+K(a,"mouseup",function(a){U.down=!1;aa=void 0;lb();A(ia.mouseup);sb("mouseup");b();a.preventDefault()});K(a,"mousemove",function(a){c(a);U.down?A(ia.mousedrag):A(ia.mousemove);sb("mousemove");a.preventDefault()});K(a,"click",function(a){c(a);A(ia.mouseclick);a.preventDefault()});K(a,"dragenter",function(a){a.preventDefault()});K(a,"dragover",function(a){a.preventDefault()});K(a,"drop",function(c){function g(a,c,R){ba[a]=f.turnIntoCSList([c,v.string(R||c.ctype),v.string(p[a].type),v.string(p[a].name)]);
+0===--d&&(a=m,jc=f.turnIntoCSList(ba),kc=a,A(ia.ondrop),kc=jc=k,b())}c.preventDefault();var p=c.dataTransfer.files,ba=Array(p.length),d=p.length,e=c.currentTarget.getBoundingClientRect(),m=f.realVector(x.to(c.clientX-e.left-a.clientLeft+.5,c.clientY-e.top-a.clientTop+.5));Array.prototype.forEach.call(p,function(a,c){var p=new FileReader;/^text\//.test(a.type)?(p.onload=function(){var a=v.string(p.result);g(c,a)},p.readAsText(a)):/^image\//.test(a.type)?(p.onload=function(){var a=new Image;a.onload=
+function(){g(c,X(a))};a.src=p.result},p.readAsDataURL(a)):g(c,k)})});K(a,"touchstart",function(a){c(a.targetTouches[0]);A(ia.mousedown);U.down=!0;sb("mousedown");a.preventDefault()},!1);K(a,"touchmove",function(a){c(a.targetTouches[0]);U.down?A(ia.mousedrag):A(ia.mousemove);sb("mousemove");a.preventDefault()},!0);K(a,"touchend",p,!1);"undefined"!==typeof document&&document.body&&K(document.body,"touchcancel",p,!1);"undefined"!==typeof window&&K(window,"resize",function(){Ob(function(){H();b()})},
+!1);ib(a.parentNode);b()}function qb(a,g){var c=document.createElement("div");c.setAttribute("style",g);a.appendChild(c);return c}function ib(a){function g(){p.scrollLeft=p.scrollTop=ba.scrollLeft=ba.scrollTop=1E5}function c(){if(d!==a.clientWidth||f!==a.clientHeight)d=a.clientWidth,f=a.clientHeight,e||(e=!0,Ob(function(){e=!1;H();b()}));g()}if("undefined"!==typeof document){var p=qb(a,"position: absolute; transition: 0s; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;");
+qb(p,"position: absolute; transition: 0s; left: 0; top: 0; width: 100000px; height: 100000px");var ba=qb(a,"position: absolute; transition: 0s; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;");qb(ba,"position: absolute; transition: 0s; left: 0; top: 0; width: 200%; height: 200%");g();var d=a.clientWidth,f=a.clientHeight,e=!1;p.addEventListener("scroll",c);ba.addEventListener("scroll",c)}}function b(){lc||(lc=Ob(d))}function d(){lc=null;if(!ic){if(Ua){var a=
+Date.now(),g=Math.min(50,a-gc)*Nc*Kd;gc=a;a=Cb+g;hc&&"undefined"!==typeof ra&&ra.tick(g);Cb=a;Ua&&A(ia.tick)}e();Ua&&b()}}function e(){x.reset();z.save();z.clearRect(0,0,W,V);var a=x.drawingstate.matrix,g,c,p,b,d;if(0!==Ta){z.beginPath();z.strokeStyle="rgba(0,0,0,0.1)";z.lineWidth=1;z.lineCap="butt";g=Ta*a.a;for(b=Math.ceil(-a.tx/g);(d=b*g+a.tx)<W;){if(b||!zb)z.moveTo(d,0),z.lineTo(d,V);b++}for(b=Math.floor(a.ty/g);(d=b*g-a.ty)<V;){if(b||!zb)z.moveTo(0,d),z.lineTo(W,d);b++}z.stroke()}if(0!==ac){z.beginPath();
+z.strokeStyle="rgba(0,0,0,0.1)";z.lineWidth=1;z.lineCap="butt";g=ac*a.a;var e=Math.sqrt(3);c=a.ty/e;p=(V+a.ty)/e;for(b=Math.ceil(-(a.tx+p)/g);(d=b*g+a.tx)+c<W;)z.moveTo(d+c,0),z.lineTo(d+p,V),b++;for(b=Math.ceil(-(a.tx-c)/g);(d=b*g+a.tx)-p<W;)z.moveTo(d-c,0),z.lineTo(d-p,V),b++;g*=.5*e;for(b=Math.floor(a.ty/g);(d=b*g-a.ty)<V;){if(b||!zb)z.moveTo(0,d),z.lineTo(W,d);b++}z.stroke()}zb&&(z.beginPath(),z.strokeStyle="rgba(0,0,0,0.2)",z.lineWidth=3,z.lineCap="butt",z.lineJoin="miter",z.miterLimit=10,z.beginPath(),
+z.moveTo(0,-a.ty),z.lineTo(W-6,-a.ty),z.moveTo(W-13,-5-a.ty),z.lineTo(W-3,-a.ty),z.lineTo(W-13,5-a.ty),z.moveTo(a.tx,V),z.lineTo(a.tx,6),z.moveTo(a.tx-5,13),z.lineTo(a.tx,3),z.lineTo(a.tx+5,13),z.stroke());Ld();x.greset();Md();for(a=0;a<u.polygons.length;a++)g=u.polygons[a],g.isshowing&&!1!==g.visible&&(c={color:g.color,alpha:g.alpha,fillcolor:g.fillcolor,fillalpha:g.fillalpha,size:g.size,lineJoin:v.string("miter")},D.drawpolygon([g.vertices],c,"D",!0));for(a=0;a<u.conics.length;a++)u.conics[a].isArc?
+(g=u.conics[a],g.isshowing&&!1!==g.visible&&(c={},c.color=g.color,c.alpha=g.alpha,c.size=g.size,D.drawarc(g,c,g.filled?"F":"D"))):(g=u.conics[a],g.isshowing&&!1!==g.visible&&(c={},c.color=g.color,c.alpha=g.alpha,c.size=g.size,D.drawconic(g.matrix,c)));for(a=0;a<u.lines.length;a++)a:if(g=u.lines[a],g.isshowing&&!1!==g.visible&&f._helper.isAlmostReal(g.homog))if("S"===g.kind)c={overhang:g.overhang,dashtype:g.dashtype,size:g.size,color:g.color,alpha:g.alpha,arrow:g.arrow,arrowsize:g.arrowsize,arrowposition:g.arrowposition,
+arrowshape:g.arrowshape,arrowsides:g.arrowsides},0<=m.mult(g.startpos.value[2],m.conjugate(g.endpos.value[2])).value.real?t.draw$2([g.startpos,g.endpos],c):(y.handleModifs(c,y.lineModifs),y.drawRaySegment(g.startpos,g.endpos));else if("end"===g.clip.value&&"Join"===g.type)b=u.csnames[g.args[0]],c=u.csnames[g.args[1]],t.draw$2([b.homog,c.homog],{overhang:g.overhang,dashtype:g.dashtype,size:g.size,color:g.color,alpha:g.alpha});else{if("inci"===g.clip.value){b=[1E6,0];c=[-1E6,0];d=[1E6,0];p=[-1E6,0];
+for(e=0;e<g.incidences.length;e++){var k=u.csnames[g.incidences[e]].homog,h=k.value[0],l=k.value[1],n=k.value[2];m._helper.isAlmostZero(n)||(h=m.div(h,n),l=m.div(l,n),m._helper.isAlmostReal(h)&&m._helper.isAlmostReal(l)&&(h.value.real<b[0]&&(b=[h.value.real,k]),h.value.real>c[0]&&(c=[h.value.real,k]),l.value.real<d[0]&&(d=[l.value.real,k]),l.value.real>p[0]&&(p=[l.value.real,k])))}c[0]-b[0]>p[0]-d[0]?(b=b[1],c=c[1]):(b=d[1],c=p[1]);if(b!==c){t.draw$2([b,c],{dashtype:g.dashtype,size:g.size,color:g.color,
+alpha:g.alpha,overhang:g.overhang});break a}}t.draw$1([g.homog],{dashtype:g.dashtype,size:g.size,color:g.color,alpha:g.alpha})}for(a=0;a<u.points.length;a++)g=u.points[a],g.isshowing&&!1!==g.visible&&f._helper.isAlmostReal(g.homog)&&(c=g.color,g.behavior&&(c=g.color),t.draw$1([g.homog],{size:g.size,color:c,alpha:g.alpha}),g.labeled&&!g.tmp&&(c=g.printname||g.name||"P",p=g.labelpos||{x:3,y:3},b=g.textsize||ja.textsize,d=!0===g.textbold,e=!0===g.textitalics,k=g.text_fontfamily||ja.fontFamily,h=p.x*
+p.x+p.y*p.y,l=1,0<h&&(l=1+g.size.value.real/Math.sqrt(h)),D.drawtext([g.homog,v.wrap(c)],{x_offset:v.wrap(l*p.x),y_offset:v.wrap(l*p.y),size:v.wrap(b),bold:v.wrap(d),italics:v.wrap(e),family:v.wrap(k)})));for(a=0;a<u.texts.length;a++)Nd(u.texts[a]);z.restore()}function l(a){a=window.event?event:a;a=a.charCode?a.charCode:a.keyCode;Pc=String.fromCharCode(a);Qc=a;A(ia.keydown);b()}function G(a){var g=a.value;a=g[0].value;var c=g[1].value,g=g[2].value;return f.turnIntoCSList([a[0],m.add(a[1],c[0]),m.add(a[2],
+g[0]),c[1],m.add(c[2],g[1]),g[2]])}function r(a){var g=!0;return function(c,p){g&&(console.error("Operator "+a+" is not supported yet."),g=!1);return k}}function w(a){if("undefined"===typeof a)return"_??_";if(null===a)return"_???_";if("undefined"===a.ctype)return"___";if("number"===a.ctype)return m.niceprint(a);if("string"===a.ctype||"boolean"===a.ctype)return a.value;if("list"===a.ctype){for(var g="[",c=0;c<a.value.length;c++)g+=w(A(a.value[c])),c!==a.value.length-1&&(g+=", ");return g+"]"}return"dict"===
+a.ctype?Oa.niceprint(a):"function"===a.ctype?"FUNCTION":"infix"===a.ctype?"INFIX":"modifier"===a.ctype?a.key+"->"+w(a.value):"shape"===a.ctype?a.type:"error"===a.ctype?"Error: "+a.message:"variable"===a.ctype?w(J.getvar(a.name)):"geo"===a.ctype?a.value.name:"image"===a.ctype?"IMAGE":"_?_"}function E(a,g){var c="undefined"===a[0].ctype,p="undefined"===a[1].ctype,b=A(a[1]);if(c||p)return k;"variable"===a[0].ctype?J.setvar(a[0].name,b):"infix"===a[0].ctype?"_"===a[0].oper?D.assigntake(a[0],b):console.error("Can't use infix expression as lvalue"):
+"field"===a[0].ctype?D.assigndot(a[0],b):"function"===a[0].ctype&&"genList"===a[0].oper?"list"===b.ctype?D.assignlist(a[0].args,b.value):console.error("Expected list in rhs of assignment"):console.error("Left hand side of assignment is not a recognized lvalue");return b}function B(a,g){var c=A(a[0]),p=A(a[1]);if(c.ctype===p.ctype){if("number"===c.ctype)return v.bool(c.value.real===p.value.real&&c.value.imag===p.value.imag);if("string"===c.ctype||"boolean"===c.ctype)return v.bool(c.value===p.value);
+if("list"===c.ctype)return f.equals(c,p);if("geo"===c.ctype)return v.bool(c.value===p.value)}return{ctype:"boolean",value:!1}}function Ec(a,g){return v.not(B(a,g))}function pa(a,g){var c=C(a[0]),p=C(a[1]);return"number"===c.ctype&&"number"===p.ctype?{ctype:"boolean",value:m._helper.isAlmostEqual(c,p)}:"string"===c.ctype&&"string"===p.ctype||"boolean"===c.ctype&&"boolean"===p.ctype?{ctype:"boolean",value:c.value===p.value}:"list"===c.ctype&&"list"===p.ctype?f.almostequals(c,p):{ctype:"boolean",value:!1}}
+function na(a,g){var c=C(a[0]),p=C(a[1]);return"boolean"===c.ctype&&"boolean"===p.ctype?{ctype:"boolean",value:c.value&&p.value}:k}function Gc(a,g){var c=C(a[0]),p=C(a[1]);return"boolean"===c.ctype&&"boolean"===p.ctype?{ctype:"boolean",value:c.value||p.value}:k}function Hc(a,g){var c=a[0];"void"!==c.ctype&&(c=C(c));var p=C(a[1]),b=v.add(c,p);"Angle"===c.usage&&"Angle"===p.usage&&(b=v.withUsage(b,"Angle"));return b}function Xb(a,g){var c=a[0];"void"!==c.ctype&&(c=C(c));var p=C(a[1]),b=v.sub(c,p);"Angle"===
+c.usage&&"Angle"===p.usage&&(b=v.withUsage(b,"Angle"));return b}function Ic(a,g){var c=C(a[0]),p=C(a[1]),b=v.mult(c,p);"Angle"!==c.usage||p.usage?"Angle"!==p.usage||c.usage||(b=v.withUsage(b,"Angle")):b=v.withUsage(b,"Angle");return b}function Jc(a,g){var c=C(a[0]),p=C(a[1]);"number"===p.ctype&&m._helper.isZero(p)&&ha.err("WARNING: Division by zero!");var b=v.div(c,p);"Angle"!==c.usage||p.usage?"Angle"!==p.usage||c.usage||(b=v.withUsage(b,"Angle")):b=v.withUsage(b,"Angle");return b}function Kc(a,
+g){var c=C(a[0]),p=C(a[1]);return"number"===c.ctype&&"number"===p.ctype?m.pow(c,p):k}function Lc(a,g){var c=M(a[0]),p=M(a[1]);if(c!==k&&p!==k){var b=f.cross(c,p);"Point"===c.usage&&"Point"===p.usage&&(b=v.withUsage(b,"Line"));"Line"===c.usage&&"Line"===p.usage&&(b=v.withUsage(b,"Point"));return b}return k}function Zb(a){var g=a.length;if(0===g)return[];if(1===g)return[0];if(2===g)return a[0][0]+a[1][1]<=a[0][1]+a[1][0]?[0,1]:[1,0];if(4<g)return Od(a);for(var c=Pd[g],p=Number.POSITIVE_INFINITY,b=c[0],
+d=0;d<c.length;++d){for(var f=c[d],e=0,m=0;m<g;++m)e+=a[m][f[m]];e<p&&(p=e,b=f)}return b}function Od(a){function g(){return{matched:-1,prev:-1,start:-1,cost:0,used:!1,leaf:!1}}function c(a){for(var g=0;g<d;++g)0<h[a][g]||k[g].used||(k[g].used=!0,c(k[g].matched))}function p(a){for(var c=0;c<d;++c)0<h[c][a]||m[c].used||(m[c].used=!0,p(m[c].matched))}var b=Math.abs,d=a.length,f,e,m=Array(d),k=Array(d),h=Array(d);for(f=0;f<d;++f)h[f]=Array(d);for(f=0;f<d;++f)for(m[f]=g(),k[f]=g(),m[f].cost=a[f][0],e=
+1;e<d;++e)m[f].cost>a[f][e]&&(m[f].cost=a[f][e]);for(;;){for(f=0;f<d;++f)for(e=0;e<d;++e)h[f][e]=a[f][e]-m[f].cost-k[e].cost,h[f][e]<1E-14*(b(a[f][e])+b(m[f].cost)+b(k[e].cost))&&(h[f][e]=0);for(f=0;f<d;++f)m[f].matched=k[f].matched=-1;for(var l=0;;){for(f=0;f<d;++f)m[f].used=m[f].leaf=k[f].used=k[f].leaf=!1,-1===m[f].matched&&(m[f].start=f,m[f].used=m[f].leaf=!0,m[f].prev=-1);for(var n=!1,q=!1;!q;){for(f=0;f<d;++f)if(m[f].leaf)for(m[f].leaf=!1,e=0;e<d;++e)if(!(k[e].used||0<h[f][e])&&m[f].matched!==
+e&&(k[e].prev=f,k[e].start=m[f].start,k[e].used=k[e].leaf=!0,-1===k[e].matched)){m[k[e].start].prev=e;n=!0;break}if(n)break;q=!0;for(e=0;e<d;++e)k[e].leaf&&(k[e].leaf=!1,f=k[e].matched,m[f].used||(m[f].prev=e,m[f].start=k[e].start,m[f].used=m[f].leaf=!0,q=!1))}if(!n)break;for(n=0;n<d;++n)if(-1===m[n].matched&&-1!==m[n].prev){e=m[n].prev;do f=k[e].prev,k[e].matched=f,m[f].matched=e,e=m[f].prev;while(f!==n);++l}}if(l===d)break;for(f=0;f<d;++f)m[f].used=m[f].leaf=k[f].used=k[f].leaf=!1;for(f=0;f<d;++f)-1===
+m[f].matched&&c(f);for(e=0;e<d;++e)-1===k[e].matched&&p(e);for(f=0;f<d;++f)-1===m[f].matched||m[f].used||k[m[f].matched].used||(m[f].used=!0);l=Number.POSITIVE_INFINITY;for(f=0;f<d;++f)if(!m[f].used)for(e=0;e<d;++e)k[e].used||l>h[f][e]&&(l=h[f][e]);for(f=0;f<d;++f)m[f].used||(m[f].cost+=l),k[f].used&&(k[f].cost-=l)}a=Array(d);for(f=0;f<d;++f)e=m[f].matched,a[f]=e;return a}function mc(a,g){var c=A(a[0]),p=C(a[1]);"string"!==c.ctype&&(c=f.asList(c));if("number"===p.ctype){p=Math.floor(p.value.real);
+0>p&&(p=c.value.length+p+1);if(0<p&&p<c.value.length+1)return"list"===c.ctype?c.value[p-1]:{ctype:"string",value:c.value.charAt(p-1)};ha.err("WARNING: Index out of range!");return k}if("list"===p.ctype){for(var b=[],d=0;d<p.value.length;d++){var e=C(p.value[d]);b[d]=mc([c,e],[])}return f.turnIntoCSList(b)}return k}function Rc(a,g){var c=A(a[0]),p=A(a[1]);if("shape"===c.ctype&&"shape"===p.ctype)return D.shapeconcat(c,p);c=f.asList(c);p=f.asList(p);return"list"===c.ctype&&"list"===p.ctype?f.concat(c,
+p):k}function Sc(a,g){var c=A(a[0]),p=A(a[1]);return"list"===c.ctype&&"list"===p.ctype?f.set(f.common(c,p)):"shape"===c.ctype&&"shape"===p.ctype?D.shapecommon(c,p):k}function Tc(a,g){var c=A(a[0]),p=A(a[1]);return"list"===c.ctype&&"list"===p.ctype?f.remove(c,p):"shape"===c.ctype&&"shape"===p.ctype?D.shaperemove(c,p):k}function Uc(a,g){var c=A(a[0]),p=A(a[1]);return"list"===c.ctype?f.append(c,p):k}function Vc(a,g){var c=A(a[0]),p=A(a[1]);return"list"===p.ctype?f.prepend(c,p):k}function nc(a,g){a|=
+0;g|=0;if(0===a&&0===g)return 0;for(;0!==g;){var c=a;a=g;g=c%g|0}return a}function Qd(a){return 1===a?0:1}function Wc(a,g,c,p,b,d,f){if(-1!==g.indexOf("\n")){var e=Infinity,m=-Infinity,k=Infinity,h=-Infinity;g.split("\n").forEach(function(g){g=Wc(a,g,c,p,b,d);e>g.left&&(e=g.left);m<g.right&&(m=g.right);k>g.top&&(k=g.top);h<g.bottom&&(h=g.bottom);p+=f});return{left:e,right:m,top:k,bottom:h}}var l=a.measureText(g);a.fillText(g,c-l.width*b,p);return{left:c-l.width*b,right:c+l.width*(1-b),top:p-.84*d,
+bottom:p+.36*d}}function cb(a){return"image"===a.ctype?a.value:"string"===a.ctype&&ab.hasOwnProperty(a.value)?ab[a.value].value:null}function Xc(a){return a.replace(/[^A-Za-z0-9 \u0080-\uffff]/ig,"\\$&")}function ea(a,g,c){var p=a;g&&(p=p+" at "+g.row+":"+g.col);c&&(p=p+": \u2018"+c+"\u2019");p=Error(p);p.name="CindyScriptParseError";p.description=a;p.location=g;p.text=c;return p}function mb(a){this.input=a;this.re=new RegExp(Yc,"g");for(var g=[],c=a.indexOf("\n")+1;c;)g.push(c),c=a.indexOf("\n",
+c)+1;g.push(a.length);this.bols=g;this.bol=this.pos=0;this.line=1}function Pb(a){var g=a[a.length-2],c=a[a.length-3],p=a[a.length-1];if(c){if(c.isSuperscript&&g.precedence<=c.precedence)throw ea("Operator not allowed after superscript",g.start,g.text);if(p){if(!g.op.infix)throw ea("Operator may not be used infix",g.start,g.text);}else if(!g.op.postfix)throw ea("Operator may not be used postfix",g.start,g.text);}else if(p){if(!g.op.prefix)throw ea("Operator may not be used prefix",g.start,g.text);
+}else if(!g.op.bare)throw ea("Operator without operands",g.start,g.text);g.ctype="infix";g.oper=g.op.sym;g.args=[c,p];a.splice(a.length-3,3,g)}function Zc(a,g,c,p){a.length&1||a.push(null);for(c=wa[c];3<=a.length&&a[a.length-2].precedence<=c.precedence;)Pb(a);a.push({op:c,precedence:c.precedence+(c.rassoc?1:0),start:g.start,end:g.end,text:g.text,rawtext:g.rawtext});c="";for(var b=g.text,d=0;d<b.length;++d)c+="0123456789+-".charAt(p.indexOf(b.charAt(d)));g.ctype="number";g.value={real:+c,imag:0};a.push(g);
+Pb(a)}function $c(a,g){var c=[],p;a:for(;;)switch(p=a.next(),p.toktype){case "OP":var b=wa[p.text];"_"!==b.sym||!c.length||c.length&1||"OP"!==c[c.length-1].toktype||":="!==c[c.length-1].op.sym||(c.pop(),b=wa[":=_"],p.text=b.sym);p.op=b;p.precedence=b.precedence;for(c.length&1||c.push(null);3<=c.length&&c[c.length-2].precedence<=p.precedence;)Pb(c);b.rassoc&&p.precedence++;c.push(p);break;case "ID":p.ctype="variable";p.name=p.text;if(c.length&1)throw ea("Missing operator",p.start,p.text);c.push(p);
+break;case "NUM":p.ctype="number";p.value={real:+p.text,imag:0};if(c.length&1)throw ea("Missing operator",p.start,p.text);c.push(p);break;case "STR":p.ctype="string";p.value=p.raw.substring(1,p.raw.length-1);if(c.length&1)throw ea("Missing operator",p.start,p.text);c.push(p);break;case "SUB":Zc(c,p,"_","\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u208a\u208b");break;case "SUP":Zc(c,p,"^","\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b");c[c.length-1].isSuperscript=
+!0;break;case "BRA":b="[](){}||".indexOf(p.text);if(p.text===g||b&1)break a;var b="[](){}||".charAt(b+1),d=$c(a,b),f=d.closedBy;if(f.text!==b)throw ea("Opening "+p.text+" at "+p.start.row+":"+p.start.col+" closed by "+(f.text||"EOF")+" at "+f.start.row+":"+f.start.col);f=p.text+f.text;b=[];if(d=d.expr){for(;d&&"infix"===d.ctype&&","===d.oper;)b.push(d.args[0]),d=d.args[1];b.push(d)}if(c.length&1){if("{}"===f)throw ea("{\u2026} reserved for future use",p.start);d=c[c.length-1];if("variable"!==d.ctype)throw ea("Function name must be an identifier",
+d.start);if(2<c.length&&c[c.length-2].precedence<ad)throw ea("Function call in indexing construct must be enclosed in parentheses",p.start);d.ctype="function";p=d.args=[];for(var f=d.modifs={},e=0;e<b.length;++e){var m=b[e];if(m&&"infix"===m.ctype&&"->"===m.oper){var k=m.args[0];if("variable"!==k.ctype)throw ea("Modifier name must be an identifier",m.start);f[k.name]=m.args[1]}else p.push(m)}d.oper=d.name.toLowerCase()+"$"+d.args.length}else if("||"===f)if(1===b.length)c.push({ctype:"function",oper:"abs_infix",
+args:b,modifs:{}});else if(2===b.length)c.push({ctype:"function",oper:"dist_infix",args:b,modifs:{}});else throw ea("Don't support |\u2026| with "+b.length+" arguments",p.start);else{if("{}"===f)throw ea("{\u2026} reserved for future use",p.start);"[]"!==f&&1===b.length?c.push({ctype:"paren",args:b}):0===b.length?c.push({ctype:"list",value:[]}):c.push({ctype:"function",oper:"genList",args:b,modifs:{}})}break;case "EOF":break a}for(c.length&1||c.push(null);3<=c.length;)Pb(c);return{expr:c[0],closedBy:p}}
+function Db(a){this.usedFunctions={};this.usedVariables={}}function A(a){if(void 0===a)return k;if("infix"===a.ctype)return a.impl(a.args,{},a);if("variable"===a.ctype)return A(J.getvar(a.name));if("function"===a.ctype)return D.evaluate(a.oper,a.args,a.modifs);if("void"===a.ctype)return k;if("field"===a.ctype){var g=A(a.obj);return"geo"===g.ctype?xa.getField(g.value,a.key):"list"===g.ctype?f.getField(g,a.key):k}return a}function C(a){a=A(a);if("geo"===a.ctype){var g=a.value;if("P"===g.kind)return xa.getField(g,
+"xy");if("V"===g.kind)return g.value}return a}function M(a){a=A(a);if("geo"===a.ctype){var g=a.value;if("P"===g.kind||"L"===g.kind)return xa.getField(g,"homog")}return f._helper.isNumberVecN(a,3)?a:f._helper.isNumberVecN(a,2)?(g=f.turnIntoCSList([a.value[0],a.value[1],m.real(1)]),a.usage&&(g=v.withUsage(g,a.usage)),g):k}function Ma(a){var g=new Db;g.usedFunctions=Mc;g.infixmap=P;a=g.parse(a);for(var c in g.usedVariables)J.create(c);return a}function bd(){this._path=[];this._defs=["<defs>"];this._imgcache=
+[];this._body=[];this._saveStack=[""];this._clipIndex=0;this._stroke=this._fill="#000";this._strokeOpacity=this._fillOpacity=null;this.height=this.width=0;this.lineWidth=1;this.lineCap="butt";this.lineJoin="miter";this.miterLimit=10;this.globalAlpha=1}function cd(){this._body=[];this._yPos=this._xPos=NaN;this._extGState={Af255:"<< /ca 1 >>",As255:"<< /CA 1 >>"};this._objects=[["%PDF-1.4\n"]];this._offset=this._objects[0][0].length;this._nextIndex=5;this._imgcache=[];this._xobjects={};this._pathUsed=
+-1;this._fillAlpha=this._strokeAlpha=this._globalAlpha=1;this.height=this.width=0;this.lineWidth=1;this.lineCap="butt";this.lineJoin="miter";this.miterLimit=10}function dd(a,g){var c=a.width,p=a.height,b=document.createElement("canvas");b.setAttribute("width",c);b.setAttribute("height",p);b.setAttribute("style","display:none;");var d=qa.canvas;d.parentNode.insertBefore(b,d.nextSibling);try{return b.getContext("2d").drawImage(a,0,0,c,p),b.toDataURL(g||"image/png")}finally{b.parentNode.removeChild(b)}}
+function Rd(a){a=a.replace(RegExp("[^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/]+","g"),"");var g=new Uint8Array(3*a.length>>2),c,p,b,d,f,e;for(p=c=0;c+3<a.length;c+=4)b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c)),d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c+1)),f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c+2)),e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c+
+3)),g[p++]=b<<2|d>>4,g[p++]=d<<4|f>>2,g[p++]=f<<6|e;switch(a.length-c){case 0:break;case 2:b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c));d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c+1));g[p++]=b<<2|d>>4;break;case 3:b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c));d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c+1));f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c+
+2));g[p++]=b<<2|d>>4;g[p++]=d<<4|f>>2;break;default:throw Error("Malformed Base64 input: "+(a.length-c)+" chars left: "+a.substr(c));}if(p!==g.length)throw Error("Failed assertion: "+p+" should be "+g.length);return g}function Sd(a){function g(c){return(a[c]<<24|a[c+1]<<16|a[c+2]<<8|a[c+3])>>>0}if(57>a.length)throw Error("Too short to be a PNG file");if(2303741511!==g(0)||218765834!==g(4))throw Error("PNG signature missing");for(var c=[],p=8;p<a.length;){if(p+12>a.length)throw Error("Incomplete chunk at offset 0x"+
+p.toString(16));var b=g(p);if(2147483648<=b)throw Error("Chunk too long");var d=p+12+b;if(d>a.length)throw Error("Incomplete chunk at offset 0x"+p.toString(16));var f=a.subarray(p+4,p+8),f=String.fromCharCode.apply(String,f);c.push({len:b,type:f,data:a.subarray(p+8,p+8+b),crc:g(p+8+b)});p=d}return c}function Qb(a,g){var c;if(c=/^rgba\(([0-9]+), *([0-9]+), *([0-9]+), *([0-9]+)\)$/.exec(a))g(+c[1],+c[2],+c[3],+c[4]);else if(c=/^rgb\(([0-9]+), *([0-9]+), *([0-9]+)\)$/.exec(a))g(+c[1],+c[2],+c[3],1);
+else throw Error("Can't handle color style "+a);}function Td(a){var g=1;Object.keys(ab).forEach(function(c){var p=ab[c].value.img;if(void 0===p.cachedDataURL&&p.src)if("data:"===p.src.substr(0,5))p.cachedDataURL=p.src;else{++g;p.cachedDataURL=null;var b=new XMLHttpRequest;b.responseType="blob";b.onreadystatechange=function(){if(b.readyState===XMLHttpRequest.DONE)if(200===b.status){var c=new FileReader;c.onloadend=function(){p.cachedDataURL=c.result;console.log("Cached data for image "+p.src);0===
+--g&&a()};c.readAsDataURL(b.response)}else console.error("Failed to load "+p.src+": "+b.statusText),0===--g&&a()};b.open("GET",p.src,!0);b.send()}});0===--g&&a()}function nb(a,g,c){for(c||(c="0");a.length<g;)a=c+a;return a}function ed(){null!==Eb&&(window.URL.revokeObjectURL(Eb),Eb=null)}function fd(a,g){Td(function(){var c=z;try{z=new a;z.width=W;z.height=V;e();var p=z.toBlob();ed();Eb=window.URL.createObjectURL(p);g.location.href=Eb}finally{z=c}})}function Fb(a){var g=null,c=1E6,p;console.log("getElementAtMouse");
+for(var b=0;b<u.gslp.length;b++){var d=u.gslp[b];if(!d.pinned&&!1!==d.visible&&!0!==d.tmp){var e,k,h,l=x.drawingstate.matrix.sdet;if("P"===d.kind){var n=f.normalizeZ(d.homog);if(!f._helper.isAlmostReal(n))continue;e=n.value[0].value.real-a.x;k=n.value[1].value.real-a.y;h=Math.sqrt(e*e+k*k);d.narrow&h>20/l&&(h=1E4)}else if("C"===d.kind)k=u.csnames[d.args[0]],h=0,"undefined"!==typeof d.radius&&(h=d.radius.value.real),e=m.div(k.homog.value[0],k.homog.value[2]).value.real,k=m.div(k.homog.value[1],k.homog.value[2]).value.real,
+e-=a.x,k-=a.y,h=Math.sqrt(e*e+k*k)-h,k=e=0,0>h&&(h=-h),h+=30/l;else if("L"===d.kind||"S"===d.kind)e=d.homog,h=m,k=h.add(h.mult(e.value[0],h.conjugate(e.value[0])),h.mult(e.value[1],h.conjugate(e.value[1]))),k=f.scaldiv(h.sqrt(k),e),h=k.value[0].value.real*a.x+k.value[1].value.real*a.y+k.value[2].value.real,e=k.value[0].value.real*h,k=k.value[1].value.real*h,0>h&&(h=-h),h+=1;h<c+.2/l&&(c=h,g=d,p={x:e,y:k})}}return null===g?null:{mover:g,offset:p,prev:{x:a.x,y:a.y}}}function Pa(){return"P"+Ud++}function sb(a){var g=
+F[oc].actions;g[tb].event===a&&g[tb]["do"]()&&(b(),tb===g.length-1?(ta=[],tb=Qa=0):tb++)}function pc(a){return a&&.5>Math.abs(a.offset.x)&&.5>Math.abs(a.offset.y)&&!a.mover.tmp}function gd(a){return pc(a)&&"P"===a.mover.kind}function hd(a){return pc(a)&&("L"===a.mover.kind||"S"===a.mover.kind)}function qc(a){aa={mover:a,offset:{x:0,y:0},prev:{x:U.x,y:U.y}}}function ob(){var a=Fb(U);gd(a)?ta[Qa]=a.mover:(ta[Qa]={type:"Free",name:Pa(),labeled:!0,pos:[sa[0],sa[1],1]},Da(ta[Qa]));Qa++}function id(){var a=
+Fb(U);return hd(a)?(ta[Qa]=a.mover,Qa++,!0):!1}function jd(){var a=Fb(U),g;(g=hd(a))||(g=pc(a)&&"C"===a.mover.kind);return g?(ta[Qa]=a.mover,Qa++,!0):!1}function ub(){var a=Fb(U);if(gd(a))for(Gb.args[1]=a.mover.name,a=0;a<u.gslp.length;a++){var g=u.gslp[a];!0===g.tmp&&kd(g.name)}else for(a=0;a<u.gslp.length;a++)g=u.gslp[a],!0===g.tmp&&(g.tmp=!1)}function Rb(a){var g={type:"Free",name:Pa(),labeled:!0,pos:[sa[0],sa[1],1],tmp:!0},g=Da(g);Gb=Da({type:a,name:Pa(),labeled:!0,args:[ta[0].name,g.name]});
+qc(g)}function Vd(a){for(var g in a)null!==a[g]&&(ja[g]=a[g])}function Hd(a){Object.keys(n).forEach(function(a){var c=n[a];db(c.signature||"_helper"===a,a+" has no signature");void 0!==c.updatePosition&&void 0===c.stateSize&&(c.stateSize=0)});u.gslp=[];u.csnames={};u.points=[];u.lines=[];u.conics=[];u.texts=[];u.free=[];u.polygons=[];a.forEach(ld);md()}function nd(a){"undefined"===typeof a.tracedim&&(a.tracedim=1);"undefined"===typeof a.tracelength&&(a.tracelength=100);"undefined"===typeof a.traceskip&&
+(a.traceskip=1);a._traces=Array(a.tracelength);a._traces_index=0;a._traces_tick=0}function Wd(a){void 0===a.size&&(a.size=ja.pointSize);a.size=m.real(a.size);!a.movable||a.pinned?(a.color=f.realVector(a.color||ja.pointColor),a.color=f.scalmult(m.real(ja.dimDependent),a.color)):a.color=f.realVector(a.color||ja.pointColor);void 0===a.alpha&&(a.alpha=ja.alpha);a.alpha=m.real(a.alpha);a.drawtrace&&nd(a)}function Sb(a){void 0===a.size&&(a.size=ja.lineSize);a.size=m.real(a.size);a.color=f.realVector(a.color||
+ja.lineColor);void 0===a.alpha&&(a.alpha=ja.alpha);a.alpha=m.real(a.alpha);a.clip=v.string(a.clip||ja.clip);void 0===a.overhang&&(a.overhang=ja.overhangLine);a.overhang=m.real(a.overhang);a.dashtype&&(a.dashtype=v.wrap(a.dashtype))}function Xd(a){void 0===a.overhang&&(a.overhang=ja.overhangSeg);a.arrow&&(a.arrow=v.bool(a.arrow));a.arrowsize&&(a.arrowsize=m.real(a.arrowsize));a.arrowposition&&(a.arrowposition=m.real(a.arrowposition));a.arrowshape&&(a.arrowshape=v.string(a.arrowshape));a.arrowsides&&
+(a.arrowsides=v.string(a.arrowsides));Sb(a);a.clip=v.string("end")}function Yd(a){a.size=void 0!==a.textsize?a.textsize:void 0!==a.size?a.size:ja.textsize;a.size=m.real(+a.size)}function Zd(a){a.filled=void 0!==a.filled?v.bool(a.filled):v.bool(!0);a.fillcolor=void 0===a.fillcolor?k:f.realVector(a.fillcolor);void 0===a.fillalpha&&(a.fillalpha=0);a.fillalpha=m.real(a.fillalpha);Sb(a)}function Da(a){a=ld(a);md();return a}function ld(a){var g;if(void 0!==u.csnames[a.name])return console.log("Element name '"+
+a.name+"' already exists"),g=u.csnames[a.name],n[g.type].isMovable&&Ea(g,a.pos,"homog"),{ctype:"geo",value:g};if(g=od[a.type]){var c=g(a),p=null;for(g=0;g<c.length;++g)p=Da(c[g]);return p}var b=n[a.type],c=!1;if(!b)return console.error(a),console.error("Operation "+a.type+" not implemented yet"),null;if("**"!==b.signature)if(!Array.isArray(b.signature)&&"*"===b.signature.charAt(1))c=!0,a.args.forEach(function(c){if(u.csnames[c].kind!==b.signature.charAt(0))return console.error("Not all elements in set are of same type: "+
+a.name+" expects "+b.signature+" but "+c+" is of kind "+u.csnames[c].kind),"undefined"!==typeof window&&window.alert("Not all elements in set are of same type: "+a.name),null});else if(b.signature.length!==(a.args?a.args.length:0))return console.error("Wrong number of arguments for "+a.name+" of type "+a.type),"undefined"!==typeof window&&window.alert("Wrong number of arguments for "+a.name),null;if(a.args)for(g=0;g<a.args.length;++g){if(!u.csnames.hasOwnProperty(a.args[g]))return console.log("Dropping "+
+a.name+" due to missing argument "+a.args[g]),null;if("**"!==b.signature&&!c&&(p=u.csnames[a.args[g]].kind,b.signature[g]!==p&&("S"!==p||"L"!==b.signature[g])))return window.alert("Wrong argument kind "+p+" as argument "+g+" to element "+a.name+" of type "+a.type),null}b.signatureConstraints&&!b.signatureConstraints(a)&&window.alert("signature constraints violated for element "+a.name);u.gslp.push(a);u.csnames[a.name]=a;g=ya.length;a.kind=b.kind;a.stateIdx=g;g+=b.stateSize;a.incidences=[];a.isshowing=
+!0;a.movable=!1;b.isMovable&&(a.movable=!0,u.free.push(a));"P"===a.kind&&(u.points.push(a),Wd(a));"L"===a.kind&&(u.lines.push(a),Sb(a));"C"===a.kind&&(u.conics.push(a),Sb(a));"S"===a.kind&&(u.lines.push(a),Xd(a));"Text"===a.kind&&(u.texts.push(a),Yd(a));"Poly"===a.kind&&(u.polygons.push(a),Zd(a));$d(g);ma=Fa=ya;eb=!0;b.initialize&&(ua=za=a.stateIdx,a.param=b.initialize(a),db(za===a.stateIdx+b.stateSize,"State fully initialized"));ua=za=a.stateIdx;b.updatePosition(a,!1);db(ua===a.stateIdx+b.stateSize,
+"State fully consumed");db(za===a.stateIdx+b.stateSize,"State fully updated");eb=!1;ma=bb["in"];ma.set(ya);Fa=bb.out;rc(a,b);Tb={};fb(a);return u.csnames[a.name]}function kd(a){var g,c;console.log("Remove element "+a);delete u.csnames[a];for(g=0;g<u.gslp.length;g++)c=u.gslp[g],c.name===a&&(console.log("Removed element from gslp "+a),u.gslp.splice(g,1));for(g=0;g<u.free.length;g++)c=u.free[g],c.name===a&&(console.log("Removed element from free "+a),u.free.splice(g,1));for(g=0;g<u.points.length;g++)c=
+u.points[g],c.name===a&&(console.log("Removed element from points "+a),u.points.splice(g,1));for(g=0;g<u.lines.length;g++)c=u.lines[g],c.name===a&&(console.log("Removed element from lines "+a),u.lines.splice(g,1));for(g=0;g<u.conics.length;g++)c=u.conics[g],c.name===a&&(console.log("Removed element from conics "+a),u.conics.splice(g,1));Tb={}}function pd(a,g){var c=u.csnames[g.args[0]].homog,p=u.csnames[g.args[1]].homog,b=a.homog,d=m.div(c.value[0],c.value[2]),c=m.div(c.value[1],c.value[2]),f=m.div(p.value[0],
+p.value[2]),p=m.div(p.value[1],p.value[2]),e=m.div(b.value[0],b.value[2]),b=m.div(b.value[1],b.value[2]);return m._helper.isAlmostReal(d)&&m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(f)&&m._helper.isAlmostReal(p)&&m._helper.isAlmostReal(e)&&m._helper.isAlmostReal(b)?(d=d.value.real,c=c.value.real,f=f.value.real,p=p.value.real,e=e.value.real,b=b.value.real,d=Math.sqrt((d-f)*(d-f)+(c-p)*(c-p))-Math.sqrt((d-e)*(d-e)+(c-b)*(c-b))-Math.sqrt((f-e)*(f-e)+(p-b)*(p-b)),1E-15>d*d):!1}function rc(a,g){a.isshowing=
+!0;if(a.args)for(var c=0;c<a.args.length;c++)if(!u.csnames[a.args[c]].isshowing){a.isshowing=!1;return}g.visiblecheck&&g.visiblecheck(a)}function Nd(a){a._bbox=null;if(a.isshowing&&!1!==a.visible){var g={size:a.size},c=a.homog,p=a.text,b=n[a.type].getText,p=b?b(a):p.replace(/@[$#]"([^"\\]|\\.)*"/g,function(a){var c,g;try{if(c=JSON.parse(a.substring(2)),g=u.csnames[c],!g)return"?"}catch(p){return"?"}switch(a.charAt(1)){case "$":return g.printname||c;case "#":return"V"!==g.kind?"?":w(g.value)}}),b=
+null;if(a.html)var d=a._textCache||{text:!1},f=a.html,e=f.parentNode,m=e.parentNode,b=function(c,g,p,b,ba){d.invisible&&m.style.removeProperty("display");if(c!==d.text||g!==d.font||p!==d.x||b!==d.y||ba!==d.align){g!==d.font&&(f.style.font=g,f.style.lineHeight=ja.lineHeight);c!==d.text&&!1!==c&&!1===qd(f,c,g)&&(c=!1);m.style.left=p+"px";m.style.top=b+"px";if(ba||e.style.transform)e.style.transform="translateX("+-100*ba+"%)";a._textCache={text:c,font:g,x:p,y:b,align:ba}}};p=v.string(p);a.dock&&(a.dock.to?
+c=u.csnames[a.dock.to].homog:rd.hasOwnProperty(a.dock.corner)&&(c=t.screenbounds$0([],{}),c=c.value[rd[a.dock.corner]]),g.offset=a.dock.offset);a.align&&(g.align=v.string(a.align));c&&(a._bbox=D.drawtext([c,p],g,b))}else a.html&&(a.html.parentNode.parentNode.style.display="none",a._textCache={invisible:!0})}function Md(){function a(){var a=e++/c._traces.length,g=c._traces[f];g&&(a*=p*a*a,t.draw$1([g],{size:m.real(b),color:c.color,alpha:m.real(a)}));b*=d}for(var g=0;g<u.points.length;g++){var c=u.points[g];
+if(c.drawtrace){c._traces_tick===c.traceskip?(c._traces[c._traces_index]=c.homog,c._traces_index=(c._traces_index+1)%c._traces.length,c._traces_tick=0):c._traces_tick++;var p=c.alpha.value.real,b=c.size.value.real,d=1;1!==c.tracedim&&(b*=c.tracedim,d=Math.pow(c.tracedim,-1/c._traces.length));var f,e=0;for(f=c._traces_index;f<c._traces.length;++f)a();for(f=0;f<c._traces_index;++f)a()}}}function db(a,g){var c="Assertion failed: "+g;if(!a)throw console.log(c),La(),"undefined"!==typeof alert&&alert(c),
+Error(c);}function $d(a){if(a!==ya.length){var g,c,p=sc.length;gb.length<a*p?(g=2*a,gb=new Float64Array(p*g)):g=gb.length/p|0;for(c=0;c<p;++c)bb[sc[c]]=gb.subarray(c*g,c*g+a);a=ya;ma=bb["in"];Fa=bb.out;ya=bb.good;ya.set(a)}}function lb(){ya.set(ma);sd(!1);for(var a=ya.length,g=Math.abs,c=0;c<a;c+=2)g(ya[c])>1E12*g(ya[c+1])&&(ya[c+1]=0)}function Ub(){if(vb)Ga=!0;else throw td;}function ud(a,g,c,p,b){return v.add(p,v.mult(c,v.sub(b,p)))}function Ld(){I&&(I.currentMouseAndScripts=[]);tc=!0;Ga=!1;ma.set(ya);
+if(aa){var a=aa.mover,g=f.realVector([U.x+aa.offset.x,U.y+aa.offset.y,1]);uc(a,g,"mouse");aa.prev.x=U.x;aa.prev.y=U.y}A(ia.move);A(ia.draw);Ga||lb();tc=!1;I&&(I.fullLog.push(f.turnIntoCSList([f.turnIntoCSList(I.currentMouseAndScripts)])),I.length>I.logLength&&I.splice(0,I.length-I.logLength),I.currentMouseAndScripts=null,I.postMouseHooks.forEach(function(a){a()}))}function Ea(a,g,c){tc?uc(a,g,c):(lb(),Ga=!1,uc(a,g,c),lb())}function uc(a,g,c){I&&I.currentMouseAndScripts&&(I.currentMover=[]);Fa.set(ma);
+var p=1E4,b;b=Tb[a.name];if(!b){var d={},e=0;b=[];d[a.name]=a;for(var k=u.gslp,h=0;h<k.length;++h){var l=k[h],rb=l.args;if(rb)for(var q=0;q<rb.length;++q)d.hasOwnProperty(rb[q])&&(d[l.name]=l,b[e++]=l)}Tb[a.name]=b}var d=-1,e=.9,r,t,w,k=n[a.type],h=k.parameterPath||ud;ua=a.stateIdx;l=k.getParamFromState(a);ua=za=a.stateIdx;rb=k.getParamForInput(a,g,c);for(q=d+e;d!==q;){var y=q*q,x=.5/(1+y),x=m.complex(2*q*x+.5,(1-y)*x);vb=d+.5*e<=d||0===p;0===p&&console.log("tracing limit Reached");y=!1;I&&I.currentMouseAndScripts&&
+(I.currentStep=[]);try{ua=za=a.stateIdx;var z=h(a,q,x,l,rb);I&&(I.currentParam=z);x=Fa;Fa=ma;k.putParamToState(a,z);Fa=x;za=a.stateIdx;I&&(I.currentElement=a);k.updatePosition(a,!0);db(ua===a.stateIdx+k.stateSize,"State fully consumed");db(za===a.stateIdx+k.stateSize,"State fully updated");for(r=0;r<b.length;++r)t=b[r],w=n[t.type],ua=za=t.stateIdx,I&&(I.currentElement=t),w.updatePosition(t,!1),db(ua===t.stateIdx+w.stateSize,"State fully consumed"),db(za===t.stateIdx+w.stateSize,"State fully updated");
+I&&(I.currentElement=null);d=q;e*=1.25;q+=e;1<=q&&(q=1);Fa=ma;ma=x}catch(A){if(A!==td)throw A;e*=.5;q=d+e;--p;y=!0}I&&I.currentMouseAndScripts&&(I.currentMover.push(f.turnIntoCSList([f.turnIntoCSList(I.currentStep),v.wrap(y),v.wrap(d),v.wrap(q),v.wrap(I.currentParam)])),I.currentStep=null,I.currentParam=null)}sd(Ga);for(r=0;r<b.length;++r)t=b[r],w=n[t.type],rc(t,w);I&&I.currentMouseAndScripts&&(I.currentMouseAndScripts.push(f.turnIntoCSList([f.turnIntoCSList(I.currentMover),v.wrap(Ga),v.wrap(a.name),
+g,v.wrap(c),l,rb])),I.currentMover=null)}function Id(){lb();vb=!0;for(var a=u.gslp,g=0;g<a.length;g++){var c=a[g],p=n[c.type];ua=za=c.stateIdx;p.updatePosition(c,!1);rc(c,p)}a=Fa;Fa=ma;ma=a;lb()}function sd(a){var g=q.tracingStateReport;"string"===typeof g&&(document.getElementById(g).textContent=a?"BAD":"GOOD")}function ae(){return f.turnIntoCSList(I.fullLog.slice())}function be(a){var g=JSON.stringify(I.fullLog);a=new Blob([g],{type:a?"application/octet-stream":"application/json"});return window.URL.createObjectURL(a)}
+function wb(){var a=ua;ua+=2;return m.complex(ma[a],ma[a+1])}function Z(a){for(var g=Array(a),c=0;c<a;++c)g[c]=wb();return f.turnIntoCSList(g)}function Va(a){Fa[za]=a.value.real;Fa[za+1]=a.value.imag;za+=2}function T(a){for(var g=0,c=a.value.length;g<c;++g)Va(a.value[g])}function Ha(a,g){var c=Z(3),p=Z(3),c=vd(a,g,c,p);T(c[0]);T(c[1]);return f.turnIntoCSList(c)}function vd(a,g,c,p){if(eb)return[a,g];var b=f.projectiveDistMinScal(c,a),d=f.projectiveDistMinScal(c,g),e=f.projectiveDistMinScal(p,a),m=
+f.projectiveDistMinScal(p,g),h=f.projectiveDistMinScal(c,p),l=f.projectiveDistMinScal(a,g),n=b+m,q=d+e,r;n>q?(r=[g,a],n=q):r=[a,g];q=function(){};if(I&&I.currentStep){var t=[I.labelTracing2,v.wrap(I.currentElement.name),f.turnIntoCSList(r),f.turnIntoCSList([c,p]),f.realMatrix([[b,d],[e,m]]),v.wrap(n),v.wrap(h),v.wrap(l),k];I.currentStep.push(f.turnIntoCSList(t));q=function(a){I.hasOwnProperty(a)||(I[a]=v.wrap(a));t[t.length-1]=I[a]}}f._helper.isNaN(a)||f._helper.isNaN(g)?(q("Tracing failed due to NaNs."),
+Ga=!0):h>3*n&&l>3*n?q("Normal case, everything all right."):1E-5>l?1E-5>h?q("Staying inside singularity."):(q("Moved into singularity."),Ga=!0):1E-5>h?q("Moved out of singularity."):(vb?q("Reached refinement limit, giving up."):q("Need to refine."),Ub());return r}function vc(a,g,c,p){var b=Z(3),d=Z(3),e=Z(3),m=Z(3);a=ce(a,g,c,p,b,d,e,m);T(a[0]);T(a[1]);T(a[2]);T(a[3]);return f.turnIntoCSList(a)}function ce(a,g,c,p,b,d,e,m){var h=function(){};b=[b,d,e,m];a=[a,g,c,p];if(eb)return a;d=0;p=Array(4);for(c=
+0;4>c;c++)for(p[c]=Array(4),m=0;4>m;m++)e=f.projectiveDistMinScal(b[c],a[m]),p[c][m]=e;e=Zb(p);g=Array(4);for(c=0;4>c;++c)g[c]=a[e[c]],d+=p[c][e[c]];var l=1*d,n=Infinity,q=Infinity;for(c=0;4>c;c++){if(f._helper.isNaN(a[c]))return h("Tracing failed due to NaNs."),Ga=!0,g;for(m=c+1;4>m;m++)e=f.projectiveDistMinScal(b[c],b[m]),n>e&&(n=e),e=f.projectiveDistMinScal(g[c],g[m]),q>e&&(q=e)}if(I&&I.currentStep){var r=[I.labelTracing4,v.wrap(I.currentElement.name),f.turnIntoCSList(g),f.turnIntoCSList(b),f.realMatrix(p),
+v.wrap(d),v.wrap(n),v.wrap(q),k];I.currentStep.push(f.turnIntoCSList(r));h=function(a){I.hasOwnProperty(a)||(I[a]=v.wrap(a));r[r.length-1]=I[a]}}n>l&&q>l||(1E-5>q?1E-5>n?h("Staying inside singularity."):(h("Moved into singularity."),Ga=!0):1E-5>n?h("Moved out of singularity."):(vb?h("Reached refinement limit, giving up."):h("Need to refine."),Ub()));return g}function wd(a){var g=a.length,c,p;if(eb){for(c=0;c<g;++c)ua+=2*a[c].value.length,T(a[c]);return a}var b=Array(g),d=Array(g),e=Array(g),m=99,
+h=99,l=Array(g);for(c=0;c<g;++c)b[c]=Z(a[c].value.length),d[c]=f.normSquared(b[c]).value.real,e[c]=f.normSquared(a[c]).value.real,l[c]=Array(g);var n;for(c=0;c<g;++c){for(p=0;p<g;++p)n=f.sesquilinearproduct(b[c],a[p]).value,n=(n.real*n.real+n.imag*n.imag)/(d[c]*e[p]),l[c][p]=1-n;for(p=c+1;p<g;++p)n=f.sesquilinearproduct(b[c],b[p]).value,n=(n.real*n.real+n.imag*n.imag)/(d[c]*d[p]),m>1-n&&(m=1-n),n=f.sesquilinearproduct(a[c],a[p]).value,n=(n.real*n.real+n.imag*n.imag)/(e[c]*e[p]),h>1-n&&(h=1-n)}n=Zb(l);
+p=Array(g);d=0;e=!1;for(c=0;c<g;++c){var d=d+l[c][n[c]],q=p[c]=a[n[c]];T(q);e|=f._helper.isNaN(q)}e|=isNaN(d);a=function(){};if(I&&I.currentStep){var r=[I.labelTracingSesq,v.wrap(I.currentElement.name),f.turnIntoCSList(p),f.turnIntoCSList(b),f.realMatrix(l),v.wrap(d),v.wrap(m),v.wrap(h),k];I.currentStep.push(f.turnIntoCSList(r));a=function(a){I.hasOwnProperty(a)||(I[a]=v.wrap(a));r[r.length-1]=I[a]}}e?(a("Tracing failed due to NaNs."),Ga=!0):m>3*d&&h>3*d?a("Normal case, everything all right."):1E-5>
+h?1E-5>m?a("Staying inside singularity."):(a("Moved into singularity."),Ga=!0):1E-5>m?a("Moved out of singularity."):(vb?a("Reached refinement limit, giving up."):a("Need to refine."),Ub());return p}function fb(a){if(fb.hasOwnProperty(a.kind))fb[a.kind](a)}function xd(a,g){return function(){a.incidences.push(g.name);g.incidences.push(a.name)}}function yd(a,g){return{toString:function(){return"point "+a.name+" incident line "+g.name},apply:xd(a,g),holds:function(){var c=f.scaldiv(f.abs(a.homog),a.homog),
+p=f.scaldiv(f.abs(g.homog),g.homog);return 1E-13>m.abs(f.scalproduct(c,p)).value.real}}}function zd(a,g){return{toString:function(){return"point "+a.name+" incident conic "+g.name},apply:xd(a,g),holds:function(){var c=v.mult(g.matrix,a.homog),c=v.mult(a.homog,c),c=m.abs(c);1E-13>c.value.real&&(a.incidences.push(g.name),g.incidences.push(a.name))}}}function md(){if(0!==hb.length){for(var a=0;a<hb.length;++a)hb[a].apply();hb=[]}}function wc(a,g,c){var p=document.createElement("div"),d=document.createElement("img");
+d.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAPoCAQAAAC1v1zVAAAAGklEQVR42u3BMQEAAADCoPVPbQ0PoAAAgHcDC7gAAVI8ZnwAAAAASUVORK5CYII=";p.className="CindyJS-baseline";p.appendChild(d);d=document.createElement("div");d.className="CindyJS-button";p.appendChild(d);for(var f=2;f<arguments.length;++f)d.appendChild(arguments[f]);ga.parentNode.appendChild(p);a.html=arguments[arguments.length-1];p=b;if(a.script)var e=Ma(a.script),p=function(){A(e);b()};c.addEventListener(g,p);n.Text.initialize(a)}
+function Ka(){}function de(a){if(!/^Select/.test(a.type)&&!n[a.type].isMovable)return null;var g=v.unwrap,c=m.add;switch(a.kind){case "P":case "L":case "Text":return g(a.homog);case "C":return a=a.matrix.value,{xx:g(a[0].value[0]),yy:g(a[1].value[1]),zz:g(a[2].value[2]),xy:g(c(a[0].value[1],a[1].value[0])),xz:g(c(a[0].value[2],a[2].value[0])),yz:g(c(a[1].value[2],a[2].value[1]))};default:return null}}function ee(a){var g={};g.offset=v.unwrap(a.offset);a.to&&(g.to=a.to);a.corner&&(g.corner=a.corner);
+return g}function fe(a){var g={};ge.forEach(function(c){if(a.hasOwnProperty(c)){var b=v.unwrap(a[c]);null!==b&&void 0!==b&&(g[c]=b)}});if("P"===a.kind&&(!a.movable||a.pinned)&&g.color){var c=m.real(1/ja.dimDependent);g.color=v.unwrap(f.scalmult(c,a.color))}if(c=de(a))g.pos=c;a.dock&&(g.dock=ee(a.dock));return g}function he(){var a=[];u.gslp.forEach(function(g){g.tmp||a.push(fe(g))});return a}function Jd(){Aa.forEach(function(a){var g=(a.geo||[]).map(function(a){return u.csnames[a]});N[a.type].reset(a,
+g[0],g)})}function dc(a){hc=0!==a.length;Aa=[];ca=[];xc=[];N.Environment.init({});a.forEach(function(a){a.behavior?(a.name&&(a.behavior.geo=[a.name]),a=a.behavior,a.gravity&&(a.gravity=-a.gravity)):c=a.geo;var c=(a.geo||[]).map(function(a){return u.csnames[a]}),p=c[0],b=N[a.type];b?(b.init&&b.init(a,p,c),p&&(p.behavior=a,"Mass"===a.type?ca.push(p):"Spring"===a.type&&xc.push(p)),Aa.push(a)):(console.error(a),console.error("Behavior "+a.type+" not implemented yet"))})}var va=this,ha,ia={},Ua=!1,Nb=
+!0,Cb=0,Nc=.5,gc=0,Lb=10,Ad=5/360,Kd=.32/Ad/1E3*2,Jb=1,Ta=0,ac=0,bc=!1,zb=!1,ga,yb,Sa=Number.isFinite||function(a){return"number"===typeof a&&isFinite(a)},sa,z,W,V,u,ab,jc=k,kc=k,Na={play:Ka,pause:Ka,stop:Ka},fc=null,Ab=function(a,g){var c=[];Ab=function(a,g){c.push({img:a,id:g})};Ab(a,g);var p=va.getBaseDir()+"images/Icons.svg",b=new XMLHttpRequest;b.onreadystatechange=function(){if(b.readyState===XMLHttpRequest.DONE)if(200!==b.status)console.error("Failed to load CindyJS Icons.svg from "+p+": "+
+b.statusText);else{var a=b.responseXML,g=a.documentElement,d={},f,e;for(f=g.firstChild;f;f=e)e=f.nextSibling,f.nodeType===Node.ELEMENT_NODE&&"http://www.w3.org/2000/svg"===f.namespaceURI&&"g"===f.localName.toLowerCase()&&(g.removeChild(f),f.setAttribute("style","display:inline"),d[f.getAttribute("id")]=f);var m=new XMLSerializer;Ab=function(c,p){if(d.hasOwnProperty(p)){var b=d[p];g.appendChild(b);var f;try{f=m.serializeToString(a)}finally{g.removeChild(b)}c.src="data:image/svg+xml;charset=utf-8,"+
+encodeURIComponent(f)}};c.forEach(function(a){Ab(a.img,a.id)});c=null}};b.responseType="document";b.open("GET",p);b.send()},Oc=1,Bb=null,kb=[],ic=!1,qa={config:q,startup:Q,shutdown:La,evokeCS:function(a){a=Ma(a,!1);console.log(a);A(a);b()},play:S,pause:Za,stop:Ja,evalcs:function(a){return A(Ma(a,!1))},parse:function(a){return Ma(a)},niceprint:w,canvas:null},$b=!1,Kb=0;q.use&&q.use.forEach(function(a){var g=null;q.plugins&&(g=q.plugins[a]);g||(g=va._pluginRegistry[a]);g||(++Kb,console.log("Loading script for plugin "+
+a),va.loadScript(a+"-plugin",a+"-plugin.js",function(){console.log("Successfully loaded plugin "+a);0===--Kb&&$b&&Q()},function(){console.error("Failed to auto-load plugin "+a);0===--Kb&&$b&&Q()}))});jb.prototype=new $a;pb.prototype=new $a;Ya.prototype=new $a;var U={},aa,Pc="",Qc=0,Ob;Ob=q.isNode?process.nextTick:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){window.setTimeout(a,
+0)};var lc=null,ie=[0,8,1,0,"ga578a63"],m={_helper:{}};m._helper.roundingfactor=1E4;m._helper.angleroundingfactor=10;m._helper.niceround=function(a,g){return Math.round(a*g)/g};m.niceprint=function(a,g){g=g||m._helper.roundingfactor;if("Angle"===a.usage)return m._helper.niceangle(a);var c=m._helper.niceround(a.value.real,g),p=m._helper.niceround(a.value.imag,g);return 0===p?""+c:0<p?""+c+" + i*"+p:""+c+" - i*"+-p};var yc=q.angleUnit||"\u00b0",je=yc.replace(/\s+/g,""),Bd=2*Math.PI,ke=1/Bd,le={rad:Bd,
+"\u00b0":360,deg:360,degree:360,gra:400,grad:400,turn:1,cyc:1,rev:1,rot:1,"\u03c0":2,pi:2,quad:4};m._helper.niceangle=function(a){var g=le[je];if(!g)return m.niceprint(v.withUsage(a,null));if("function"===typeof g)return g(a);a=m.niceprint(m.realmult(g*ke,a),200<g?m._helper.angleroundingfactor:null);return-1===a.indexOf("i*")?a+yc:"("+a+")"+yc};m.complex=function(a,g){return{ctype:"number",value:{real:a,imag:g}}};m.real=function(a){return{ctype:"number",value:{real:a,imag:0}}};m.zero=m.real(0);m.one=
+m.real(1);m.infinity=m.complex(Infinity,Infinity);m.nan=m.complex(NaN,NaN);m._helper.input=function(a){return"object"===typeof a?m.complex(+a.r,+a.i):m.real(+a)};m.argmax=function(a,g){return a.value.real*a.value.real+a.value.imag*a.value.imag<g.value.real*g.value.real+g.value.imag*g.value.imag?g:a};m.max=function(a,g){return{ctype:"number",value:{real:Math.max(a.value.real,g.value.real),imag:Math.max(a.value.imag,g.value.imag)}}};m.min=function(a,g){return{ctype:"number",value:{real:Math.min(a.value.real,
+g.value.real),imag:Math.min(a.value.imag,g.value.imag)}}};m.add=function(a,g){return{ctype:"number",value:{real:a.value.real+g.value.real,imag:a.value.imag+g.value.imag}}};m.sub=function(a,g){return{ctype:"number",value:{real:a.value.real-g.value.real,imag:a.value.imag-g.value.imag}}};m.neg=function(a){return{ctype:"number",value:{real:-a.value.real,imag:-a.value.imag}}};m.re=function(a){return{ctype:"number",value:{real:a.value.real,imag:0}}};m.im=function(a){return{ctype:"number",value:{real:a.value.imag,
+imag:0}}};m.conjugate=function(a){return{ctype:"number",value:{real:a.value.real,imag:-a.value.imag}}};m.round=function(a){return{ctype:"number",value:{real:Math.round(a.value.real),imag:Math.round(a.value.imag)}}};m.ceil=function(a){return{ctype:"number",value:{real:Math.ceil(a.value.real),imag:Math.ceil(a.value.imag)}}};m.floor=function(a){return{ctype:"number",value:{real:Math.floor(a.value.real),imag:Math.floor(a.value.imag)}}};m.mult=function(a,g){return{ctype:"number",value:{real:a.value.real*
+g.value.real-a.value.imag*g.value.imag,imag:a.value.real*g.value.imag+a.value.imag*g.value.real}}};m.realmult=function(a,g){return{ctype:"number",value:{real:a*g.value.real,imag:a*g.value.imag}}};m.multiMult=function(a){var g=a[0];if("number"!==g.ctype)return k;for(var c=1;c<a.length;c++){if("number"!==a[c].ctype)return k;g=m.mult(g,a[c])}return g};m.abs2=function(a,g){return{ctype:"number",value:{real:a.value.real*a.value.real+a.value.imag*a.value.imag,imag:0}}};m.abs=function(a){return m.sqrt(m.abs2(a))};
+m.inv=function(a){var g=a.value.real*a.value.real+a.value.imag*a.value.imag;return{ctype:"number",value:{real:a.value.real/g,imag:-a.value.imag/g}}};m.div=function(a,g){var c=a.value.real,p=a.value.imag,b=g.value.real,d=g.value.imag,f=b*b+d*d;return{ctype:"number",value:{real:(c*b+p*d)/f,imag:(p*b-c*d)/f}}};m.eps=1E-10;m.epsbig=1E-6;m.snap=function(a){var g=a.value.real;a=a.value.imag;Math.floor(g+m.eps)!==Math.floor(g-m.eps)&&(g=Math.round(g));Math.floor(a+m.eps)!==Math.floor(a-m.eps)&&(a=Math.round(a));
+return{ctype:"number",value:{real:g,imag:a}}};m.exp=function(a){var g=Math.exp(a.value.real);return{ctype:"number",value:{real:g*Math.cos(a.value.imag),imag:g*Math.sin(a.value.imag)}}};m.cos=function(a){var g=a.value.real;a=a.value.imag;var c=Math.exp(a),p=c*Math.sin(-g),b=c*Math.cos(-g),c=Math.exp(-a);return{ctype:"number",value:{real:(b+c*Math.cos(g))/2,imag:(p+c*Math.sin(g))/2}}};m.sin=function(a){var g=a.value.real;a=a.value.imag;var c=Math.exp(a),p=c*Math.sin(-g),b=c*Math.cos(-g),c=Math.exp(-a);
+return{ctype:"number",value:{real:-(p-c*Math.sin(g))/2,imag:(b-c*Math.cos(g))/2}}};m.tan=function(a){var g=m.sin(a);a=m.cos(a);return m.div(g,a)};m.arccos=function(a){var g=m.mult(a,m.neg(a)),g=m.sqrt(m.add(m.real(1),g));a=m.add(m.mult(a,m.complex(0,1)),g);a=m.add(m.mult(m.log(a),m.complex(0,1)),m.real(.5*Math.PI));return v.withUsage(a,"Angle")};m.arcsin=function(a){var g=m.mult(a,m.neg(a)),g=m.sqrt(m.add(m.real(1),g));a=m.add(m.mult(a,m.complex(0,1)),g);a=m.mult(m.log(a),m.complex(0,-1));return v.withUsage(a,
+"Angle")};m.arctan=function(a){var g=m.log(m.add(m.mult(a,m.complex(0,-1)),m.real(1)));a=m.log(m.add(m.mult(a,m.complex(0,1)),m.real(1)));g=m.mult(m.sub(g,a),m.complex(0,.5));return v.withUsage(g,"Angle")};m.arctan2=function(a,g){var c;if(void 0===g)c=m.real(Math.atan2(a.value.imag,a.value.real));else if(m._helper.isReal(a)&&m._helper.isReal(g))c=m.real(Math.atan2(g.value.real,a.value.real));else{c=m.add(a,m.mult(m.complex(0,1),g));var p=m.sqrt(m.add(m.mult(a,a),m.mult(g,g)));c=m.mult(m.complex(0,
+-1),m.log(m.div(c,p)))}return v.withUsage(c,"Angle")};m.sqrt=function(a){var g=a.value.real,c=a.value.imag;a=Math.sqrt(Math.sqrt(g*g+c*c));g=Math.atan2(c,g);return{ctype:"number",value:{real:a*Math.cos(g/2),imag:a*Math.sin(g/2)}}};m.powRealExponent=function(a,g){var c=a.value.real,p=a.value.imag,b=Math.pow(Math.sqrt(c*c+p*p),g),c=Math.atan2(p,c);return{ctype:"number",value:{real:b*Math.cos(c*g),imag:b*Math.sin(c*g)}}};m.log=function(a){var g=a.value.real;a=a.value.imag;var c=Math.sqrt(g*g+a*a),p=
+Math.atan2(a,g);0>a&&(p+=2*Math.PI);0===a&&0>g&&(p=Math.PI);p>Math.PI&&(p-=2*Math.PI);return m.snap({ctype:"number",value:{real:Math.log(c),imag:p}})};m.pow=function(a,g){return m._helper.isZero(g)?m.one:m._helper.isZero(a)?m.zero:m._helper.isReal(g)?m.powRealExponent(a,g.value.real):m.exp(m.mult(m.log(a),g))};m.mod=function(a,g){var c=a.value.real,p=g.value.real,b=a.value.imag,d=g.value.imag,c=c-Math.floor(c/p)*p,b=b-Math.floor(b/d)*d;0===p&&(c=0);0===d&&(b=0);return m.snap({ctype:"number",value:{real:c,
+imag:b}})};m._helper.seed="NO";m._helper.seedrandom=function(a){a-=Math.floor(a);m._helper.seed=.8*a+.1};m._helper.rand=function(){if("NO"===m._helper.seed)return Math.random();var a=m._helper.seed,a=1E3*Math.sin(1E3*a),a=a-Math.floor(a);return m._helper.seed=a};m._helper.randnormal=function(){var a=m._helper.rand(),g=m._helper.rand();return Math.sqrt(-2*Math.log(a))*Math.cos(2*Math.PI*g)};m._helper.isEqual=function(a,g){return a.value.real===g.value.real&&a.value.imag===g.value.imag};m._helper.isLessThan=
+function(a,g){return a.value.real<g.value.real||a.value.real===g.value.real&&a.value.imag<g.value.imag};m._helper.compare=function(a,g){return m._helper.isLessThan(a,g)?-1:m._helper.isEqual(a,g)?0:1};m._helper.isAlmostEqual=function(a,g,c){var p=m.eps;"undefined"!==typeof c&&(p=c);c=a.value.real-g.value.real;a=a.value.imag-g.value.imag;return c<p&&c>-p&&a<p&&a>-p};m._helper.isZero=function(a){return 0===a.value.real&&0===a.value.imag};m._helper.isAlmostZero=function(a){var g=a.value.real;a=a.value.imag;
+return g<m.eps&&g>-m.eps&&a<m.eps&&a>-m.eps};m._helper.isReal=function(a){return 0===a.value.imag};m._helper.isAlmostReal=function(a){a=a.value.imag;return a<m.epsbig&&a>-m.epsbig};m._helper.isNaN=function(a){return isNaN(a.value.real)||isNaN(a.value.imag)};m._helper.isFinite=function(a){return isFinite(a.value.real)&&isFinite(a.value.imag)};m._helper.isAlmostImag=function(a){a=a.value.real;return a<m.epsbig&&a>-m.epsbig};m._helper.z3a=m.complex(-.5,.5*Math.sqrt(3));m._helper.z3b=m.complex(-.5,-.5*
+Math.sqrt(3));m._helper.cub1={ctype:"list",value:[m.one,m.one,m.one]};m._helper.cub2={ctype:"list",value:[m._helper.z3a,m.one,m._helper.z3b]};m._helper.cub3={ctype:"list",value:[m._helper.z3b,m.one,m._helper.z3a]};m.solveCubic=function(a,g,c,p){a=m._helper.solveCubicHelper(a,g,c,p);return[f.scalproduct(m._helper.cub1,a),f.scalproduct(m._helper.cub2,a),f.scalproduct(m._helper.cub3,a)]};m._helper.solveCubicHelper=function(a,g,c,p){var b=a.value.real;a=a.value.imag;var d=g.value.real;g=g.value.imag;
+var e=c.value.real,k=c.value.imag,h=p.value.real,l=p.value.imag,n=b*e-a*k;c=b*k+a*e;p=4*n-(d*d-g*g);var q=4*c-2*d*g,r=b*d-a*g,t=b*g+a*d,u=p*e-q*k-18*(r*h-t*l),q=p*k+q*e-18*(r*l+t*h);p=27*(b*b-a*a);var v=54*a*b,w=p*h-v*l,y=p*l+v*h,x=d*d-g*g,z=2*d*g,A=x*d-z*g,B=x*g+z*d,C=w+4*A,v=y+4*B;p=27*(u*e-q*k+C*h-v*l);q=27*(u*k+q*e+C*l+v*h);C=Math.sqrt(Math.sqrt(p*p+q*q));v=Math.atan2(q,p);q=C*Math.sin(v/2);p=C*Math.cos(v/2);A=-2*A+9*(r*e-t*k)-w+(p*b-q*a);B=-2*B+9*(r*k+t*e)-y+(p*a+q*b);p=Math.exp(Math.log(Math.sqrt(A*
+A+B*B))/3);e=Math.atan2(B,A);v=p*Math.sin(e/3);q=p*Math.cos(e/3);p*=p;e*=2;n=2*x-6*n;c=2*z-6*c;z=-1.5874010519681996*(d*q-g*v);d=-1.5874010519681996*(d*v+g*q);g=1.2599210498948732*p*Math.cos(e/3);e=1.2599210498948732*p*Math.sin(e/3);p=4.762203155904599*(q*b-v*a);q=4.762203155904599*(q*a+v*b);b=p*p+q*q;v=(-n*q+c*p)/b;n=(n*p+c*q)/b;c=v;v=(-z*q+d*p)/b;z=(z*p+d*q)/b;d=v;v=(-g*q+e*p)/b;g=(g*p+e*q)/b;e=v;return f.turnIntoCSList([m.complex(n,c),m.complex(z,d),m.complex(g,e)])};var f={_helper:{},turnIntoCSList:function(a){return{ctype:"list",
+value:a}}};f.EMPTY=f.turnIntoCSList([]);f.asList=function(a){return"list"===a.ctype?a:"number"===a.ctype||"boolean"===a.ctype||"geo"===a.ctype?f.turnIntoCSList([a]):f.EMPTY};f.realVector=function(a){for(var g=[],c=0;c<a.length;c++)g[c]={ctype:"number",value:{real:a[c],imag:0}};return{ctype:"list",value:g}};f._helper.unitvector=function(a,g){var c=f.zerovector(a);c.value[Math.floor(g.value.real-1)]=m.real(1);return c};f.idMatrix=function(a){for(var g=f.zeromatrix(a,a),c=m.real(1),p=0;p<a.value.real;p++)g.value[p].value[p]=
+c;return g};f._helper.flippedidMatrix=function(a){for(var g=f.zeromatrix(a,a),c=m.real(1),p=0;p<a.value.real;p++)g.value[p].value[a.value.real-p-1]=c;return g};f.println=function(a){for(var g=[],c=0;c<a.value.length;c++)if("number"===a.value[c].ctype)g[c]=m.niceprint(a.value[c]);else if("list"===a.value[c].ctype)f.println(a.value[c]);else return k;"number"===a.value[0].ctype&&console.log(g)};f.matrix=function(a){return f.turnIntoCSList(a.map(f.turnIntoCSList))};f.realMatrix=function(a){for(var g=
+a.length,c=Array(g),p=0;p<g;p++)c[p]=f.realVector(a[p]);return f.turnIntoCSList(c)};f.ex=f.realVector([1,0,0]);f.ey=f.realVector([0,1,0]);f.ez=f.realVector([0,0,1]);f.linfty=f.realVector([0,0,1]);f.ii=f.turnIntoCSList([m.complex(1,0),m.complex(0,1),m.complex(0,0)]);f.jj=f.turnIntoCSList([m.complex(1,0),m.complex(0,-1),m.complex(0,0)]);f.fundDual=f.realMatrix([[1,0,0],[0,1,0],[0,0,0]]);f.fund=f.realMatrix([[0,0,0],[0,0,0],[0,0,1]]);f.sequence=function(a,g){for(var c=[],p=0,b=Math.round(a.value.real);b<
+Math.round(g.value.real)+1;b++)c[p]={ctype:"number",value:{real:b,imag:0}},p++;return{ctype:"list",value:c}};f.pairs=function(a){for(var g=[],c=0;c<a.value.length-1;c++)for(var p=c+1;p<a.value.length;p++)g.push({ctype:"list",value:[a.value[c],a.value[p]]});return{ctype:"list",value:g}};f.triples=function(a){for(var g=[],c=0;c<a.value.length-2;c++)for(var p=c+1;p<a.value.length-1;p++)for(var b=p+1;b<a.value.length;b++)g.push({ctype:"list",value:[a.value[c],a.value[p],a.value[b]]});return{ctype:"list",
+value:g}};f.cycle=function(a){for(var g=[],c=0;c<a.value.length-1;c++)g[c]={ctype:"list",value:[a.value[c],a.value[c+1]]};g.push({ctype:"list",value:[a.value[a.value.length-1],a.value[0]]});return{ctype:"list",value:g}};f.consecutive=function(a){for(var g=[],c=0;c<a.value.length-1;c++)g[c]={ctype:"list",value:[a.value[c],a.value[c+1]]};return{ctype:"list",value:g}};f.reverse=function(a){for(var g=[],c=a.value.length-1;0<=c;c--)g.push(a.value[c]);return{ctype:"list",value:g}};f.directproduct=function(a,
+g){for(var c=[],p=0;p<a.value.length;p++)for(var b=0;b<g.value.length;b++)c.push({ctype:"list",value:[a.value[p],g.value[b]]});return{ctype:"list",value:c}};f.concat=function(a,g){for(var c=[],p=0;p<a.value.length;p++)c.push(a.value[p]);for(p=0;p<g.value.length;p++)c.push(g.value[p]);return{ctype:"list",value:c}};f.prepend=function(a,g){var c=[];c[0]=a;for(var p=0;p<g.value.length;p++)c[p+1]=g.value[p];return{ctype:"list",value:c}};f.append=function(a,g){for(var c=[],p=0;p<a.value.length;p++)c[p]=
+a.value[p];c.push(g);return{ctype:"list",value:c}};f.contains=function(a,g){for(var c=0;c<a.value.length;c++)if(D.equals(a.value[c],g).value)return{ctype:"boolean",value:!0};return{ctype:"boolean",value:!1}};f.common=function(a,g){for(var c=[],p=0,b=0;b<a.value.length;b++){for(var d=!1,f=a.value[b],e=0;e<g.value.length;e++)d=d||D.equals(f,g.value[e]).value;d&&(c[p]=a.value[b],p++)}return{ctype:"list",value:c}};f.remove=function(a,g){for(var c=[],p=0,b=0;b<a.value.length;b++){for(var d=!1,f=a.value[b],
+e=0;e<g.value.length;e++)d=d||D.equals(f,g.value[e]).value;d||(c[p]=a.value[b],p++)}return{ctype:"list",value:c}};f.sort1=function(a){a=a.value.slice();a.sort(v.compare);return f.turnIntoCSList(a)};f._helper.isEqual=function(a,g){return f.equals(a,g).value};f._helper.isLessThan=function(a,g){for(var c=a.value.length,p=g.value.length,b=0;!(b>=c||b>=p)&&v.isEqual(a.value[b],g.value[b]);)b++;return b===c&&b<p?!0:b===p&&b<c||b===c&&b===p?!1:v.isLessThan(a.value[b],g.value[b])};f._helper.compare=function(a,
+g){return f._helper.isLessThan(a,g)?-1:f._helper.isEqual(a,g)?0:1};f.equals=function(a,g){if(a.value.length!==g.value.length)return{ctype:"boolean",value:!1};for(var c=!0,p=0;p<a.value.length;p++)var b=a.value[p],d=g.value[p],c="list"===b.ctype&&"list"===d.ctype?c&&f.equals(b,d).value:c&&B([b,d],[]).value;return{ctype:"boolean",value:c}};f.almostequals=function(a,g){if(a.value.length!==g.value.length)return{ctype:"boolean",value:!1};for(var c=!0,p=0;p<a.value.length;p++)var b=a.value[p],d=g.value[p],
+c="list"===b.ctype&&"list"===d.ctype?c&&f.almostequals(b,d).value:c&&pa([b,d],[]).value;return{ctype:"boolean",value:c}};f._helper.isAlmostReal=function(a){for(var g=!0,c=0;c<a.value.length;c++)var p=a.value[c],g="list"===p.ctype?g&&f._helper.isAlmostReal(p):g&&m._helper.isAlmostReal(p);return g};f._helper.isAlmostZero=function(a){for(var g=0;g<a.value.length;g++){var c=a.value[g];if("list"===c.ctype){if(!f._helper.isAlmostZero(c))return!1}else if(!m._helper.isAlmostZero(c))return!1}return!0};f._helper.isNaN=
+function(a){for(var g=!1,c=0;c<a.value.length;c++)var p=a.value[c],g="list"===p.ctype?g||f._helper.isNaN(p):g||m._helper.isNaN(p);return g};f.set=function(a){var g=[],c=0;a=a.value.slice();a.sort(v.compare);for(var p=0;p<a.length;p++)0!==p&&B([g[g.length-1],a[p]],[]).value||(g[c]=a[p],c++);return{ctype:"list",value:g}};f.maxval=function(a){for(var g=m.zero,c=0;c<a.value.length;c++){var p=a.value[c];"number"===p.ctype&&(g=m.argmax(g,p));"list"===p.ctype&&(g=m.argmax(g,f.maxval(p)))}return g};f.maxIndex=
+function(a,g,c){var p=0;void 0!==c&&(p=c);c=p;for(var b=g(a.value[p]).value.real;p<a.value.length;++p){var d=g(a.value[p]).value.real;d>b&&(c=p,b=d)}return c};f.normalizeMax=function(a){var g=m.inv(f.maxval(a));return m._helper.isFinite(g)?f.scalmult(g,a):a};f.normalizeZ=function(a){var g=m.inv(a.value[2]);return f.scalmult(g,a)};f.dehom=function(a){a=a.value.slice();var g=a.length-1,c=m.inv(a[g]);a.length=g;for(var p=0;p<g;++p)a[p]=m.mult(c,a[p]);return f.turnIntoCSList(a)};f.normalizeAbs=function(a){var g=
+m.inv(f.abs(a));return f.scalmult(g,a)};f.max=function(a,g){if(a.value.length!==g.value.length)return k;for(var c=[],p=0;p<a.value.length;p++)c[p]=v.max(a.value[p],g.value[p]);return{ctype:"list",value:c}};f.min=function(a,g){if(a.value.length!==g.value.length)return k;for(var c=[],p=0;p<a.value.length;p++)c[p]=v.min(a.value[p],g.value[p]);return{ctype:"list",value:c}};f.scaldiv=function(a,g){if("number"!==a.ctype)return k;for(var c=[],p=0;p<g.value.length;p++){var b=g.value[p];c[p]="number"===b.ctype?
+v.div(b,a):"list"===b.ctype?f.scaldiv(a,b):k}return{ctype:"list",value:c}};f.scalmult=function(a,g){if("number"!==a.ctype)return k;for(var c=[],p=0;p<g.value.length;p++){var b=g.value[p];c[p]="number"===b.ctype?v.mult(b,a):"list"===b.ctype?f.scalmult(a,b):k}return{ctype:"list",value:c}};f.add=function(a,g){if(a.value.length!==g.value.length)return k;for(var c=[],p=0;p<a.value.length;p++){var b=a.value[p],d=g.value[p];c[p]="number"===b.ctype&&"number"===d.ctype?v.add(b,d):"list"===b.ctype&&"list"===
+d.ctype?f.add(b,d):k}return{ctype:"list",value:c}};f.sub=function(a,g){if(a.value.length!==g.value.length)return k;for(var c=[],p=0;p<a.value.length;p++){var b=a.value[p],d=g.value[p];c[p]="number"===b.ctype&&"number"===d.ctype?m.sub(b,d):"list"===b.ctype&&"list"===d.ctype?f.sub(b,d):k}return{ctype:"list",value:c}};f.abs2=function(a){for(var g=0,c=0;c<a.value.length;c++){var p=a.value[c];if("number"===p.ctype)g+=m.abs2(p).value.real;else if("list"===p.ctype)g+=f.abs2(p).value.real;else return k}return{ctype:"number",
+value:{real:g,imag:0}}};f.abs=function(a){return m.sqrt(f.abs2(a))};f.normalizeMaxXX=function(a){for(var g=-1E4,c=m.real(1),p=0;p<a.value.length;p++){var b=m.abs(a.value[p]);b.value.real>g&&(c=a.value[p],g=b.value.real)}return f.scaldiv(c,a)};f.recursive=function(a,g){for(var c=[],p=0;p<a.value.length;p++){var b=C(a.value[p]);c[p]="number"===b.ctype?m[g](b):"list"===b.ctype?f[g](b):k}return{ctype:"list",value:c}};f.re=function(a){return f.recursive(a,"re")};f.neg=function(a){return f.recursive(a,
+"neg")};f.im=function(a){return f.recursive(a,"im")};f.conjugate=function(a){return f.recursive(a,"conjugate")};f.transjugate=function(a){return f.transpose(f.conjugate(a))};f.round=function(a){return f.recursive(a,"round")};f.ceil=function(a){return f.recursive(a,"ceil")};f.floor=function(a){return f.recursive(a,"floor")};f._helper.colNumb=function(a){if("list"!==a.ctype)return-1;for(var g=-1,c=0;c<a.value.length;c++){if("list"!==a.value[c].ctype)return-1;if(0===c)g=a.value[c].value.length;else if(g!==
+a.value[c].value.length)return-1}return g};f._helper.isNumberVecN=function(a,g){if("list"!==a.ctype||a.value.length!==g)return!1;for(var c=0;c<a.value.length;c++)if("number"!==a.value[c].ctype)return!1;return!0};f.isNumberVector=function(a){if("list"!==a.ctype)return{ctype:"boolean",value:!1};for(var g=0;g<a.value.length;g++)if("number"!==a.value[g].ctype)return{ctype:"boolean",value:!1};return{ctype:"boolean",value:!0}};f.isNumberVectorN=function(a,g){if("list"!==a.ctype)return{ctype:"boolean",value:!1};
+if(a.value)for(var c=0;c<a.value.length;c++)if("number"!==a.value[c].ctype)return{ctype:"boolean",value:!1};return{ctype:"boolean",value:!0}};f.isNumberMatrix=function(a){if(-1===f._helper.colNumb(a))return{ctype:"boolean",value:!1};for(var g=0;g<a.value.length;g++)if(!f.isNumberVector(a.value[g]).value)return{ctype:"boolean",value:!1};return{ctype:"boolean",value:!0}};f.scalproduct=function(a,g){if(a.value.length!==g.value.length)return k;for(var c={ctype:"number",value:{real:0,imag:0}},p=0;p<g.value.length;p++){var b=
+a.value[p],d=g.value[p];if("number"===b.ctype&&"number"===d.ctype)c=m.add(m.mult(b,d),c);else return k}return c};f.sesquilinearproduct=function(a,g){if(a.value.length!==g.value.length)return k;for(var c=0,p=0,b=0;b<g.value.length;b++)var d=a.value[b].value,f=g.value[b].value,c=c+(d.real*f.real+d.imag*f.imag),p=p+(d.real*f.imag-d.imag*f.real);return m.complex(c,p)};f.normSquared=function(a){for(var g=0,c=0;c<a.value.length;c++)var p=a.value[c].value,g=g+(p.real*p.real+p.imag*p.imag);return m.real(g)};
+f.productMV=function(a,g){if(a.value[0].value.length!==g.value.length)return k;for(var c=[],p=0;p<a.value.length;p++){for(var b={ctype:"number",value:{real:0,imag:0}},d=a.value[p],e=0;e<g.value.length;e++){var h=d.value[e],l=g.value[e];if("number"===h.ctype&&"number"===l.ctype)b=m.add(m.mult(h,l),b);else return k}c[p]=b}return f.turnIntoCSList(c)};f.productVM=function(a,g){if(a.value.length!==g.value.length)return k;for(var c=[],p=0;p<g.value[0].value.length;p++){for(var b={ctype:"number",value:{real:0,
+imag:0}},d=0;d<a.value.length;d++){var e=a.value[d],h=g.value[d].value[p];if("number"===e.ctype&&"number"===h.ctype)b=m.add(m.mult(e,h),b);else return k}c[p]=b}return f.turnIntoCSList(c)};f.productMM=function(a,g){if(a.value[0].value.length!==g.value.length)return k;for(var c=[],p=0;p<a.value.length;p++){var b=f.productVM(a.value[p],g);c[p]=b}return f.turnIntoCSList(c)};f.mult=function(a,g){return a.value.length===g.value.length&&f.isNumberVector(a).value&&f.isNumberVector(g).value?f.scalproduct(a,
+g):f.isNumberMatrix(a).value&&g.value.length===a.value[0].value.length&&f.isNumberVector(g).value?f.productMV(a,g):f.isNumberMatrix(g).value&&a.value.length===g.value.length&&f.isNumberVector(a).value?f.productVM(a,g):f.isNumberMatrix(a).value&&f.isNumberMatrix(g)&&g.value.length===a.value[0].value.length?f.productMM(a,g):k};f.projectiveDistMinScal=function(a,g){var c=f.abs(a),p=f.abs(g);if(0===c.value.real||0===p.value.real)return 0;var b=f.conjugate(g),b=f.scalproduct(a,b),b=m._helper.isAlmostZero(b)?
+m.real(1):m.div(b,m.abs(b)),c=f.scaldiv(c,a),p=f.scaldiv(p,g),p=f.scalmult(b,p),b=f.abs(f.add(c,p)),p=f.abs(f.sub(c,p));return Math.min(b.value.real,p.value.real)};f.conicDist=function(a,g){var c=G(a),p=G(g);console.log(w(c),w(p));return f.projectiveDistMinScal(c,p)};f.crossOperator=function(a){var g=a.value[0],c=a.value[1];a=a.value[2];return f.turnIntoCSList([f.turnIntoCSList([m.zero,m.neg(a),c]),f.turnIntoCSList([a,m.zero,m.neg(g)]),f.turnIntoCSList([m.neg(c),g,m.zero])])};f.cross=function(a,g){var c=
+m.sub(m.mult(a.value[1],g.value[2]),m.mult(a.value[2],g.value[1])),p=m.sub(m.mult(a.value[2],g.value[0]),m.mult(a.value[0],g.value[2])),b=m.sub(m.mult(a.value[0],g.value[1]),m.mult(a.value[1],g.value[0]));return f.turnIntoCSList([c,p,b])};f.crossratio3harm=function(a,g,c,p,b){var d=f.det3(a,c,b),e=f.det3(g,p,b);a=f.det3(a,p,b);g=f.det3(g,c,b);d=m.mult(d,e);e=m.mult(a,g);return f.turnIntoCSList([d,e])};f.crossratio3=function(a,g,c,p,b){a=f.crossratio3harm(a,g,c,p,b);return m.div(a.value[0],a.value[1])};
+f.veronese=function(a){var g=m.mult(a.value[0],a.value[0]),c=m.mult(a.value[1],a.value[1]),p=m.mult(a.value[2],a.value[2]),b=m.mult(a.value[0],a.value[1]),d=m.mult(a.value[0],a.value[2]);a=m.mult(a.value[1],a.value[2]);return f.turnIntoSCList([g,c,p,b,d,a])};f.matrixFromVeronese=function(a){var g=a.value[0],c=a.value[1],p=a.value[2],b=m.realmult(.5,a.value[3]),d=m.realmult(.5,a.value[4]);a=m.realmult(.5,a.value[5]);return f.turnIntoCSList([f.turnIntoCSList([g,b,d]),f.turnIntoCSList([b,c,a]),f.turnIntoCSList([d,
+a,p])])};f.det2=function(a,g){var c=m.mult(a.value[0],g.value[1]);return c=m.sub(c,m.mult(a.value[1],g.value[0]))};f.det3=function(a,g,c){return m.complex(a.value[0].value.real*g.value[1].value.real*c.value[2].value.real-a.value[0].value.imag*g.value[1].value.imag*c.value[2].value.real-a.value[0].value.imag*g.value[1].value.real*c.value[2].value.imag-a.value[0].value.real*g.value[1].value.imag*c.value[2].value.imag+a.value[2].value.real*g.value[0].value.real*c.value[1].value.real-a.value[2].value.imag*
+g.value[0].value.imag*c.value[1].value.real-a.value[2].value.imag*g.value[0].value.real*c.value[1].value.imag-a.value[2].value.real*g.value[0].value.imag*c.value[1].value.imag+a.value[1].value.real*g.value[2].value.real*c.value[0].value.real-a.value[1].value.imag*g.value[2].value.imag*c.value[0].value.real-a.value[1].value.imag*g.value[2].value.real*c.value[0].value.imag-a.value[1].value.real*g.value[2].value.imag*c.value[0].value.imag-a.value[0].value.real*g.value[2].value.real*c.value[1].value.real+
+a.value[0].value.imag*g.value[2].value.imag*c.value[1].value.real+a.value[0].value.imag*g.value[2].value.real*c.value[1].value.imag+a.value[0].value.real*g.value[2].value.imag*c.value[1].value.imag-a.value[2].value.real*g.value[1].value.real*c.value[0].value.real+a.value[2].value.imag*g.value[1].value.imag*c.value[0].value.real+a.value[2].value.imag*g.value[1].value.real*c.value[0].value.imag+a.value[2].value.real*g.value[1].value.imag*c.value[0].value.imag-a.value[1].value.real*g.value[0].value.real*
+c.value[2].value.real+a.value[1].value.imag*g.value[0].value.imag*c.value[2].value.real+a.value[1].value.imag*g.value[0].value.real*c.value[2].value.imag+a.value[1].value.real*g.value[0].value.imag*c.value[2].value.imag,-a.value[0].value.imag*g.value[1].value.imag*c.value[2].value.imag+a.value[0].value.imag*g.value[1].value.real*c.value[2].value.real+a.value[0].value.real*g.value[1].value.real*c.value[2].value.imag+a.value[0].value.real*g.value[1].value.imag*c.value[2].value.real-a.value[2].value.imag*
+g.value[0].value.imag*c.value[1].value.imag+a.value[2].value.imag*g.value[0].value.real*c.value[1].value.real+a.value[2].value.real*g.value[0].value.real*c.value[1].value.imag+a.value[2].value.real*g.value[0].value.imag*c.value[1].value.real-a.value[1].value.imag*g.value[2].value.imag*c.value[0].value.imag+a.value[1].value.imag*g.value[2].value.real*c.value[0].value.real+a.value[1].value.real*g.value[2].value.real*c.value[0].value.imag+a.value[1].value.real*g.value[2].value.imag*c.value[0].value.real+
+a.value[0].value.imag*g.value[2].value.imag*c.value[1].value.imag-a.value[0].value.imag*g.value[2].value.real*c.value[1].value.real-a.value[0].value.real*g.value[2].value.real*c.value[1].value.imag-a.value[0].value.real*g.value[2].value.imag*c.value[1].value.real+a.value[2].value.imag*g.value[1].value.imag*c.value[0].value.imag-a.value[2].value.imag*g.value[1].value.real*c.value[0].value.real-a.value[2].value.real*g.value[1].value.real*c.value[0].value.imag-a.value[2].value.real*g.value[1].value.imag*
+c.value[0].value.real+a.value[1].value.imag*g.value[0].value.imag*c.value[2].value.imag-a.value[1].value.imag*g.value[0].value.real*c.value[2].value.real-a.value[1].value.real*g.value[0].value.real*c.value[2].value.imag-a.value[1].value.real*g.value[0].value.imag*c.value[2].value.real)};f.det4m=function(a){var g=a.value,c=g[0].value,p=c[0].value,b=+p.real,d=+p.imag,p=c[1].value,f=+p.real,e=+p.imag,p=c[2].value,k=+p.real,h=+p.imag,p=c[3].value,l=+p.real,n=+p.imag,c=g[1].value,p=c[0].value,q=+p.real,
+r=+p.imag,p=c[1].value,t=+p.real,u=+p.imag,p=c[2].value,v=+p.real,w=+p.imag,p=c[3].value,c=+p.real,p=+p.imag;a=b*t-d*u-f*q+e*r;var x=b*u+d*t-f*r-e*q,y=b*v-d*w-k*q+h*r,z=b*w+d*v-k*r-h*q,A=b*c-d*p-l*q+n*r,B=b*p+d*c-l*r-n*q,C=f*v-e*w-k*t+h*u,D=f*w+e*v-k*u-h*t,E=f*c-e*p-l*t+n*u,F=f*p+e*c-l*u-n*t,G=k*c-h*p-l*v+n*w,H=k*p+h*c-l*w-n*v,c=g[2].value,p=c[0].value,b=+p.real,d=+p.imag,p=c[1].value,f=+p.real,e=+p.imag,p=c[2].value,k=+p.real,h=+p.imag,p=c[3].value,l=+p.real,n=+p.imag,c=g[3].value,p=c[0].value,q=
++p.real,r=+p.imag,p=c[1].value,t=+p.real,u=+p.imag,p=c[2].value,v=+p.real,w=+p.imag,p=c[3].value,c=+p.real,p=+p.imag,g=b*t-d*u-f*q+e*r,I=b*u+d*t-f*r-e*q,J=b*v-d*w-k*q+h*r,K=b*w+d*v-k*r-h*q,L=b*c-d*p-l*q+n*r,b=b*p+d*c-l*r-n*q,d=f*v-e*w-k*t+h*u,q=f*w+e*v-k*u-h*t,r=f*c-e*p-l*t+n*u,f=f*p+e*c-l*u-n*t,e=k*c-h*p-l*v+n*w,k=k*p+h*c-l*w-n*v;return m.complex(a*e-x*k-y*r+z*f+A*d-B*q+C*L-D*b-E*J+F*K+G*g-H*I,a*k+x*e-y*f-z*r+A*q+B*d+C*b+D*L-E*K-F*J+G*I+H*g)};f.eucangle=function(a,g){var c=f.cross(a,f.linfty),p=
+f.cross(g,f.linfty),b=f.det3(f.ez,c,f.ii),c=f.det3(f.ez,c,f.jj),d=f.det3(f.ez,p,f.ii),p=f.det3(f.ez,p,f.jj),b=m.div(m.mult(b,p),m.mult(d,c)),b=m.log(b);return b=m.mult(b,m.complex(0,.5))};f.zerovector=function(a){a=Math.floor(a.value.real);for(var g=Array(a),c=0;c<a;c++)g[c]=0;return f.realVector(g)};f.zeromatrix=function(a,g){for(var c=Math.floor(a.value.real),p=Array(c),b=0;b<c;b++)p[b]=f.zerovector(g);return f.turnIntoCSList(p)};f.vandermonde=function(a){for(var g=a.value.length,c=f.zeromatrix(g,
+g),p=0;p<g;p++)for(var b=0;b<g;b++)c.value[p].value[b]=m.pow(a.value[p],m.real(b-1));return c};f.transpose=function(a){for(var g=[],c=a.value[0].value.length,b=a.value.length,d=0;d<c;d++){for(var e=[],m=0;m<b;m++)e[m]=a.value[m].value[d];g[d]=f.turnIntoCSList(e)}return f.turnIntoCSList(g)};f.column=function(a,g){for(var c=[],b=a.value.length,d=Math.floor(g.value.real-1),e=0;e<b;e++)c[e]=a.value[e].value[d];return f.turnIntoCSList(c)};f.row=function(a,g){for(var c=[],b=a.value[0].value.length,d=Math.floor(g.value.real-
+1),e=0;e<b;e++)c[e]=a.value[d].value[e];return f.turnIntoCSList(c)};f.adjoint2=function(a){var g=a.value[0].value[0],c=a.value[1].value[0],b=Array(2);b[0]=f.turnIntoCSList([a.value[1].value[1],m.neg(a.value[0].value[1])]);b[1]=f.turnIntoCSList([m.neg(c),g]);return b=f.turnIntoCSList(b)};f.adjoint3=function(a){var g,c,b,d,f,e,m,k,h,l,n,q,r,t,u,v,w;g=a.value[0].value;c=g[0].value;b=c.real;d=c.imag;c=g[1].value;f=c.real;e=c.imag;c=g[2].value;m=c.real;k=c.imag;g=a.value[1].value;c=g[0].value;h=c.real;
+l=c.imag;c=g[1].value;n=c.real;q=c.imag;c=g[2].value;r=c.real;t=c.imag;g=a.value[2].value;c=g[0].value;a=c.real;u=c.imag;c=g[1].value;v=c.real;w=c.imag;c=g[2].value;g=c.real;c=c.imag;return{ctype:"list",value:[{ctype:"list",value:[{ctype:"number",value:{real:n*g-r*v-q*c+t*w,imag:n*c-r*w-v*t+g*q}},{ctype:"number",value:{real:-f*g+m*v+e*c-k*w,imag:-f*c+m*w+v*k-g*e}},{ctype:"number",value:{real:f*r-m*n-e*t+k*q,imag:f*t-m*q-n*k+r*e}}]},{ctype:"list",value:[{ctype:"number",value:{real:-h*g+r*a+l*c-t*u,
+imag:-h*c+r*u+a*t-g*l}},{ctype:"number",value:{real:b*g-m*a-d*c+k*u,imag:b*c-m*u-a*k+g*d}},{ctype:"number",value:{real:-b*r+m*h+d*t-k*l,imag:-b*t+m*l+h*k-r*d}}]},{ctype:"list",value:[{ctype:"number",value:{real:h*v-n*a-l*w+q*u,imag:h*w-n*u-a*q+v*l}},{ctype:"number",value:{real:-b*v+f*a+d*w-e*u,imag:-b*w+f*u+a*e-v*d}},{ctype:"number",value:{real:b*n-f*h-d*q+e*l,imag:b*q-f*l-h*e+n*d}}]}]}};f.inverse=function(a){var g=a.value.length;if(g!==a.value[0].value.length)return console.log("Inverse works only for square matrices"),
+k;if(2===g)return f.scaldiv(f.det(a),f.adjoint2(a));if(3===g)return f.scaldiv(f.det(a),f.adjoint3(a));g=f.LUdecomp(a);a=a.value.length;var c=m.real(0),b=m.real(1),d=f.zerovector(m.real(a));d.value[0]=b;for(var e=Array(a),h=0;h<a;h++)e[h]=f._helper.LUsolve(g,d),d.value[h]=c,d.value[h+1]=b;e=f.turnIntoCSList(e);return e=f.transpose(e)};f.linearsolve=function(a,g){return 2===a.value.length?f.linearsolveCramer2(a,g):3===a.value.length?f.linearsolveCramer3(a,g):f.LUsolve(a,g)};f.getDiag=function(a){if(a.value.length!==
+a.value[0].value.length)return k;for(var g=Array(a.value.length),c=0;c<a.value.length;c++)g[c]=a.value[c].value[c];return f.turnIntoCSList(g)};f.getSubDiag=function(a){if(a.value.length!==a.value[0].value.length)return k;for(var g=Array(a.value.length-1),c=0;c<a.value.length-1;c++)g[c]=a.value[c+1].value[c];return f.turnIntoCSList(g)};f.eig2=function(a){var g=m.add(a.value[0].value[0],a.value[1].value[1]);a=f.det2(a.value[0],a.value[1]);var c=m.mult(g,g),b=g=m.mult(g,m.real(.5));a=m.sqrt(m.sub(m.div(c,
+m.real(4)),a));g=m.add(g,a);b=m.sub(b,a);return f.turnIntoCSList([g,b])};f.eig=function(a,g){var c=g||!0,b=a,d=m.real(b.value.length),e=d.value.real;m.real(0);var b=f._helper.QRIteration(b)[0],b=f.getDiag(b),b=f.sort1(b),d=f.idMatrix(d,d),h=Array(e),h=f.turnIntoCSList(h);if(c){for(var k,l,n,q=0,r=!1,c=0;c<e;c++)r?l=k.value[q]:(k=b.value[c],k=f.sub(a,f.scalmult(k,d)),k=f.nullSpace(k),l=k.value[0],void 0!==l&&(n=l)),void 0===l&&(l=n),1E-8>f.abs(l).value.real&&0===q&&(l=f._helper.inverseIteration(a,
+b.value[c])),h.value[c]=f._helper.isAlmostZeroVec(l)?l:f.scaldiv(f.abs(l),l),c<e-1&&((r=1E-6>m.abs(m.sub(b.value[c],b.value[c+1])).value.real)?q++:q=0);h=f.transpose(h)}return f.turnIntoCSList([b,h])};f._helper.isNormalMatrix=function(a){return 1E-10>f.abs(f.sub(a,f.transjugate(a))).value.real};f._helper.QRIteration=function(a,g){var c,b=a;c=m.real(b.value.length);var d=c.value.real,e=c.value.real;m.real(0);var k;f.idMatrix(c,c);var h=f.zeromatrix(c,c),l=f.idMatrix(c,c),n=g?g:2500,q,r,t,u=0,w=Array(e);
+for(c=0;c<n;c++){k=f._helper.getBlock(b,[e-2,e-1],[e-2,e-1]);q=f.eig2(k);k=q.value[0];q=q.value[1];f.abs(k);f.abs(q);r=b.value[e-1].value[e-1];t=m.abs(m.sub(r,k)).value.real;r=m.abs(m.sub(r,q)).value.real;q=t<r?k:q;k=f.idMatrix(m.real(e),m.real(e));q=f.scalmult(q,k);k=f.QRdecomp(f.sub(b,q));b=v.mult(k.R,k.Q);b=f.add(b,q);k.Q=f._helper.buildBlockMatrix(k.Q,f.idMatrix(m.real(u),m.real(u)));l=v.mult(l,k.Q);if(1E-48>m.abs2(b.value[b.value.length-1].value[b.value[0].value.length-2]).value.real&&1<e){w[d-
+u-1]=b.value[e-1].value[e-1];for(c=0;c<e;c++)h.value[e-1].value[c]=b.value[e-1].value[c],h.value[c].value[e-1]=b.value[c].value[e-1];b=f._helper.getBlock(b,[0,e-2],[0,e-2]);u++;e--}if(1===e){h.value[0].value[0]=b.value[0].value[0];break}if(f._helper.isUpperTriangular(b)){for(c=0;c<e;c++)h.value[c].value[c]=b.value[c].value[c];break}}return[h,l]};f.rank=function(a,g){return f.RRQRdecomp(a,g).rank};f._helper.isAlmostZeroVec=function(a){for(var g=a.value.length,c=0;c<g;c++)if(!m._helper.isAlmostZero(a.value[c]))return!1;
+return!0};f._helper.isLowerTriangular=function(a){for(var g=a.value.length,c=a.value[0].value.length,b=0;b<g;b++)for(var d=b+1;d<c;d++)if(!m._helper.isAlmostZero(a.value[b].value[d]))return!1;return!0};f._helper.isUpperTriangular=function(a){return f._helper.isLowerTriangular(f.transpose(a))};f._helper.isAlmostId=function(a){var g=a.value.length,c=m.real(g);if(g!==a.value[0].value.length)return!1;a=f.sub(a,f.idMatrix(c),c);for(c=0;c<g;c++)for(var b=0;b<g;b++)if(1E-16<m.abs(a.value[c].value[b]).value.real)return!1;
+return!0};f.nullSpace=function(a,g){var c=a.value.length,b=f.RRQRdecomp(f.transjugate(a),g),d=f.transpose(b.Q),b=c-b.rank.value.real,e=Array(b);d.value.reverse();for(var k,h=0;h<b;h++)k=d.value[h],e[h]=f.scaldiv(f.abs(k),k);e=f.turnIntoCSList(e);return 0<e.value.length?e:f.turnIntoCSList([f.zerovector(m.real(c))])};f._helper.isAlmostDiagonal=function(a){var g=a.value.length;m.real(g);m.real(0);if(g!==a.value[0].value.length)return!1;for(var c=0;c<g;c++)for(var b=0;b<g;b++)if(c!==b&&1E-16<m.abs(a.value[c].value[b]).value.real)return!1;
+return!0};f._helper.inverseIteration=function(a,g){console.log("warning: code untested");for(var c=a.value.length,b=Array(c),d=0;d<c;d++)b[d]=2*Math.random()-.5;for(var b=f.realVector(b),c=f.idMatrix(m.real(c),m.real(c)),d=m.add(g,m.real(.1*Math.random()-.5)),e=0;100>e;e++)b=f.scaldiv(f.abs(b),b),b=f.LUsolve(f.sub(a,f.scalmult(d,c)),JSON.parse(JSON.stringify(b)));return f.scaldiv(f.abs(b),b)};f._helper.toHessenberg=function(a){var g=JSON.parse(JSON.stringify(a)),c=g.value.length,b=m.real(c-1),d=m.real(c);
+m.real(1);if(f._helper.isUpperTriangular(g))return[f.idMatrix(b,b),a];var e;a=f.idMatrix(d,d);for(var k,d=1;d<c-1;d++)e=f.column(g,m.real(d)),e.value=e.value.splice(d),k=f.abs2(e).value.real,1E-16<k&&(e=f._helper.getHouseHolder(e),a=v.mult(a,e),g=v.mult(v.mult(e,g),e)),b.value.real--;return[a,g]};f._helper.swapEl=function(a,g,c){var b;"[object Array]"===Object.prototype.toString.call(a)?(b=a[g],a[g]=a[c],a[c]=b):"list"===a.ctype&&(b=a.value[g],a.value[g]=a.value[c],a.value[c]=b)};f.RRQRdecomp=function(a,
+g){var c=Math.sqrt(m.eps);void 0!==g&&(c=.1*g.value.real);var c=c*c,b,d=a.value.length,e=m.real(d),k=m.real(1),h=f._helper.unitvector(m.real(a.value.length),k),l=f.idMatrix(e,e),n=JSON.parse(JSON.stringify(a)),q=f.transpose(a),r=Array(d);for(b=0;b<d;b++)r[b]=f.abs2(q.value[b]);r=f.turnIntoCSList(r);q=Array(d);for(b=0;b<d;b++)q[b]=b;b=f.maxIndex(r,m.abs);for(var t=r.value[b],u=0,w=0;1E-16<m.abs2(t).value.real;w++){u++;f._helper.swapColumn(n,w,b);f._helper.swapEl(r,w,b);f._helper.swapEl(q,w,b);b=f._helper.getBlock(n,
+[w],[w]);b=f.column(b,k);t=f.abs2(b).value.real;1E-8<t&&(b=f._helper.getHouseHolder(b),b=f._helper.buildBlockMatrix(f.idMatrix(m.real(w),m.real(w)),b),l=v.mult(l,f.transjugate(b)),n=v.mult(b,n));for(b=w+1;b<d;b++)r.value[b]=m.sub(r.value[b],m.mult(n.value[w].value[b],m.conjugate(n.value[w].value[b])));b=f.maxIndex(r,m.abs2,w+1);t=r.value[b];if(w+2===d){m.abs(t).value.real>c&&u++;break}e=m.sub(e,k);h.value=h.value.splice(0,h.value.length-1)}return{Q:l,R:n,P:f.turnIntoCSList(q),rank:m.real(u)}};f._helper.getHouseHolder=
+function(a){var g=m.real(a.value.length);if(1E-16>f.abs2(a))return f.idMatrix(g,g);var c,b=m.real(1),d=f._helper.unitvector(m.real(a.value.length),b);c=f._helper.QRgetAlpha(a,0);c=f.sub(a,f.scalmult(c,d));c=f.scaldiv(f.abs(c),c);a=m.div(f.sesquilinearproduct(a,c),f.sesquilinearproduct(c,a));g=f.idMatrix(g,g);return g=f.sub(g,f.scalmult(m.add(b,a),f._helper.transposeMult(c,f.conjugate(c))))};f._helper.reOrderbyPivots=function(a,g){for(var c=a.value.length.length,b=f.transpose(a),c=Array(c),d=0;d<g.length;d++)c[g[d]]=
+b.value[d];c=f.turnIntoCSList(c);return f.transpose(c)};f.QRdecomp=function(a){var g,c=a.value.length,b=m.real(c);if(f._helper.isUpperTriangular(a))return{Q:f.idMatrix(b,b),R:a};var d=m.real(1),e=f._helper.unitvector(m.real(a.value.length),d),k,h=f.idMatrix(b,b);a=JSON.parse(JSON.stringify(a));for(var l=0;;l++){g=f._helper.getBlock(a,[l],[l]);g=f.column(g,d);k=f.abs2(g).value.real;1E-8<k&&(g=f._helper.getHouseHolder(g),g=f._helper.buildBlockMatrix(f.idMatrix(m.real(l),m.real(l)),g),h=v.mult(h,f.transjugate(g)),
+a=v.mult(g,a));if(l+2===c)break;b=m.sub(b,d);e.value=e.value.splice(0,e.value.length-1)}return{Q:h,R:a}};f._helper.swapColumn=function(a,g,c){for(var b,d=0;d<a.value.length;d++)b=a.value[d].value[g],a.value[d].value[g]=a.value[d].value[c],a.value[d].value[c]=b};f._helper.buildBlockMatrix=function(a,g){if(0===a.value.length)return g;if(0===g.value.length)return a;for(var c=a.value.length,b=a.value[0].value.length,d=b+g.value[0].value.length,d=f.zeromatrix(m.real(c+g.value.length),m.real(d)),e=0;e<
+a.value.length;e++)for(var k=0;k<a.value[0].value.length;k++)d.value[e].value[k]=a.value[e].value[k];for(e=0;e<g.value.length;e++)for(k=0;k<g.value[0].value.length;k++)d.value[c+e].value[b+k]=g.value[e].value[k];return d};f._helper.getBlock=function(a,g,c){a=JSON.parse(JSON.stringify(a));var b=g[0],d=c[0];g=void 0===g[1]?a.value.length:g[1];c=void 0===c[1]?a.value[0].value.length:c[1];g++;c++;a.value=a.value.slice(b,g);for(b=0;b<a.value.length;b++)a.value[b].value=a.value[b].value.slice(d,c);return a};
+f._helper.setBlock=function(a,g,c){a=JSON.parse(JSON.stringify(a));var b=c[0];c=c[1];for(var d=g.value.length,f=g.value[0].value.length,e=0;e<d;e++)for(var k=0;k<f;k++)a.value[b+e].value[c+k]=g.value[e].value[k];return a};f._helper.transposeMult=function(a,g){if(a.value.length!==g.value.length)return k;for(var c=a.value.length,b=Array(c),d=0;d<c;d++)b[d]=f.scalmult(a.value[d],g);return f.turnIntoCSList(b)};f._helper.QRgetAlpha=function(a,g){return 0>a.value[g].value.real?f.abs(a):m.neg(f.abs(a))};
+f.LUdecomp=function(a){a=JSON.parse(JSON.stringify(a));var g,c,b,d,f,e=0,k,h=a.value.length,l=h-1,n=Array(h);for(b=0;b<h;++b){f=b;d=a.value[b];k=m.abs(d.value[b]).value.real;for(c=b+1;c<h;++c)g=m.abs(a.value[c].value[b]),k<g.value.real&&(k=g.value.real,f=c);k<m.eps&&console.log("Warning: singular matrix!");n[b]=f;f!==b&&(a.value[b]=a.value[f],a.value[f]=d,d=a.value[b],e++);c=d.value[b];for(g=b+1;g<h;++g)a.value[g].value[b]=m.div(a.value[g].value[b],c);for(g=b+1;g<h;++g){f=a.value[g];for(c=b+1;c<l;++c)f.value[c]=
+m.sub(f.value[c],m.mult(f.value[b],d.value[c])),++c,f.value[c]=m.sub(f.value[c],m.mult(f.value[b],d.value[c]));c===l&&(f.value[c]=m.sub(f.value[c],m.mult(f.value[b],d.value[c])))}}return{LU:a,P:n,TransPos:e}};f.LUsolve=function(a,g){var c=f.LUdecomp(a);return f._helper.LUsolve(c,g)};f._helper.LUsolve=function(a,g){var c=JSON.parse(JSON.stringify(g)),b,d=a.LU,f=d.value.length,e=JSON.parse(JSON.stringify(c)),k=a.P,h;for(b=f-1;-1!==b;--b)e.value[b]=c.value[b];for(b=0;b<f;++b)for(c=k[b],k[b]!==b&&(h=
+e.value[b],e.value[b]=e.value[c],e.value[c]=h),h=d.value[b],c=0;c<b;++c)e.value[b]=m.sub(e.value[b],m.mult(e.value[c],h.value[c]));for(b=f-1;0<=b;--b){h=d.value[b];for(c=b+1;c<f;++c)e.value[b]=m.sub(e.value[b],m.mult(e.value[c],h.value[c]));e.value[b]=m.div(e.value[b],h.value[b])}return e};f.linearsolveCramer2=function(a,g){var c=f.column(a,m.real(1)),b=f.column(a,m.real(2)),d=f.det2(c,b);m._helper.isZero(d)&&console.log("A is not regular!");b=f.det2(g,b);b=m.div(b,d);c=f.det2(c,g);c=m.div(c,d);return f.turnIntoCSList([b,
+c])};f.linearsolveCramer3=function(a,g){var c=f.column(a,m.real(1)),b=f.column(a,m.real(2)),d=f.column(a,m.real(3)),e=f.det3(c,b,d);m._helper.isZero(e)&&console.log("A is not regular!");var k=f.det3(g,b,d),d=f.det3(c,g,d),c=f.det3(c,b,g),k=f.turnIntoCSList([k,d,c]);return k=f.scaldiv(e,k)};f.linearsolveCGNR=function(a,g){var c=f.transpose(a),b=v.mult(c,a),c=v.mult(c,g);return f.linearsolveCG(b,c)};f.linearsolveCG=function(a,g){var c,b,d,e,k,h;e=g;b=c=f.sub(g,v.mult(a,g));for(var l=Math.ceil(1.2*a.value.length),
+n=0;n<l;){n++;k=v.mult(a,b);h=d=f.scalproduct(c,c);d=m.div(d,f.scalproduct(b,k));e=f.add(e,v.mult(d,b));c=f.sub(c,v.mult(d,k));if(f.abs(c).value.real<m.eps)break;d=f.scalproduct(c,c);d=m.div(d,h);b=f.add(c,v.mult(d,b))}n>=l&&console.log("CG did not converge");return e};f.det=function(a){if(1===a.value.length)return a.value[0].value[0];if(2===a.value.length)return f.det2(a.value[0],a.value[1]);if(3===a.value.length)return f.det3(a.value[0],a.value[1],a.value[2]);if(4===a.value.length)return f.det4m(a);
+var g=a.value.length,c=m.real(1),b,d,e=JSON.parse(JSON.stringify(a)),k,h,l,n;for(a=0;a<g-1;a++){d=a;for(b=a+1;b<g;b++)m.abs(e.value[b].value[a]).value.real>m.abs(e.value[d].value[a]).value.real&&(d=b);d!==a&&(b=e.value[d],e.value[d]=e.value[a],e.value[a]=b,c=m.neg(c));k=e.value[a];for(b=a+1;b<g;b++){h=e.value[b];l=m.div(h.value[a],k.value[a]);for(d=a+1;d<g-1;d+=2)n=d+1,h.value[d]=m.sub(h.value[d],m.mult(k.value[d],l)),h.value[n]=m.sub(h.value[n],m.mult(k.value[n],l));d!==g&&(h.value[d]=m.sub(h.value[d],
+m.mult(k.value[d],l)))}if(m._helper.isZero(k.value[a]))return m.real(0);c=m.mult(c,k.value[a])}return m.mult(c,e.value[a].value[a])};f.LUdet=function(a){a=f.LUdecomp(a);for(var g=a.LU,c=g.value.length,b=g.value[0].value[0],d=1;d<c;d++)b=m.mult(b,g.value[d].value[d]);1===a.TransPos%2&&(b=m.neg(b));return b};f.getField=function(a,g){var c;if("homog"===g){if(f._helper.isNumberVecN(a,3))return a;if(f._helper.isNumberVecN(a,2))return f.turnIntoCSList([a.value[0],a.value[1],m.real(1)])}if("xy"===g){if(f._helper.isNumberVecN(a,
+2))return a;if(f._helper.isNumberVecN(a,3))return f.turnIntoCSList([m.div(a.value[0],a.value[2]),m.div(a.value[1],a.value[2])])}if("x"===g&&f.isNumberVector(a)){c=a.value.length;if(0<c&&3!==c)return a.value[0];if(3===c)return"Point"===a.usage?m.div(a.value[0],a.value[2]):a.value[0]}if("y"===g&&f.isNumberVector(a)){c=a.value.length;if(1<c&&3!==c)return a.value[1];if(3===c)return"Point"===a.usage?m.div(a.value[1],a.value[2]):a.value[1]}return"z"===g&&f.isNumberVector(a)&&(c=a.value.length,2<c)?a.value[2]:
+k};f.nil=f.turnIntoCSList([]);f.ofGeos=function(a){return f.turnIntoCSList(a.map(function(a){return{ctype:"geo",value:a}}))};var Oa={key:function(a){if("string"===a.ctype)return"s"+a.value.length+":"+a.value+";";if("number"===a.ctype)return"n"+a.value.real+","+a.value.imag+";";if("list"===a.ctype)return"l"+a.value.length+":"+a.value.map(Oa.key).join(",")+";";if("boolean"===a.ctype)return"b"+a.value+";";if("dict"===a.ctype)return a=Object.keys(a.value).sort(),"d"+a.length+":"+a.join(",")+";";"undefined"!==
+a.ctype&&ha.err("Bad dictionary key: "+w(a));return"undef"},create:function(){return{ctype:"dict",value:{}}},clone:function(a){var g=Oa.create(),c;for(c in a.value)a.value.hasOwnProperty(c)&&(g.value[c]=a.value[c]);return g},put:function(a,g,c){a.value[Oa.key(g)]={key:g,value:c}},get:function(a,g,c){return(a=a.value[Oa.key(g)])?a.value:c},niceprint:function(a){return"{"+Object.keys(a.value).sort().map(function(g){g=a.value[g];return w(g.key)+":"+w(g.value)}).join(", ")+"}"}},v={_helper:{},order:{undefined:0,
+"boolean":1,number:2,term:3,atomic:4,variable:5,geo:6,string:7,list:8},string:function(a){return{ctype:"string",value:a}},bool:function(a){return{ctype:"boolean",value:a}},not:function(a){return v.bool(!a.value)},isLessThan:function(a,g){return-1===v.compare(a,g)},isEqual:function(a,g){return 0===v.compare(a,g)},compareResults:function(a,g){return v.compare(a.result,g.result)},compare:function(a,g){if(a.ctype!==g.ctype)return v.order[a.ctype]-v.order[g.ctype];if("number"===a.ctype)return m._helper.compare(a,
+g);if("list"===a.ctype)return f._helper.compare(a,g);if("geo"===a.ctype)return a.value.name===g.value.name?0:a.value.name<g.value.name?-1:1;if("string"===a.ctype)return a.value===g.value?0:a.value<g.value?-1:1;if("boolean"===a.ctype)return a.value===g.value?0:!1===a.value?-1:1},add:function(a,g){return"void"===a.ctype&&"number"===g.ctype||"void"===a.ctype&&"list"===g.ctype?g:"number"===a.ctype&&"number"===g.ctype?m.add(a,g):"string"===a.ctype||"string"===g.ctype?{ctype:"string",value:w(a)+w(g)}:"list"===
+a.ctype&&"list"===g.ctype?f.add(a,g):k},sub:function(a,g){return"void"===a.ctype&&"number"===g.ctype?m.neg(g):"void"===a.ctype&&"list"===g.ctype?f.neg(g):"number"===a.ctype&&"number"===g.ctype?m.sub(a,g):"list"===a.ctype&&"list"===g.ctype?f.sub(a,g):k},mult:function(a,g){return"number"===a.ctype&&"number"===g.ctype?m.mult(a,g):"number"===a.ctype&&"list"===g.ctype?f.scalmult(a,g):"list"===a.ctype&&"number"===g.ctype?f.scalmult(g,a):"list"===a.ctype&&"list"===g.ctype?f.mult(a,g):k},div:function(a,g){return"number"===
+a.ctype&&"number"===g.ctype?m.div(a,g):"list"===a.ctype&&"number"===g.ctype?f.scaldiv(g,a):k},max:function(a,g){return"number"===a.ctype&&"number"===g.ctype?m.max(a,g):"list"===a.ctype&&"list"===g.ctype?f.max(a,g):k},min:function(a,g){return"number"===a.ctype&&"number"===g.ctype?m.min(a,g):"list"===a.ctype&&"list"===g.ctype?f.min(a,g):k},wrap:function(a){if("number"===typeof a)return m.real(a);if("object"===typeof a&&void 0!==a.length){for(var g=[],c=0;c<a.length;c++)g[c]=v.wrap(a[c]);return f.turnIntoCSList(g)}return"string"===
+typeof a?{ctype:"string",value:a}:"boolean"===typeof a?{ctype:"boolean",value:a}:k},unwrap:function(a){if("object"!==typeof a||null===a)return a;if(Array.isArray(a))return a.map(v.unwrap);switch(a.ctype){case "string":case "boolean":return a.value;case "number":return 0===a.value.imag?a.value.real:{r:a.value.real,i:a.value.imag};case "list":return a.value.map(v.unwrap);default:return null}},withUsage:function(a,g){return{ctype:a.ctype,value:a.value,usage:g}}},Wa={},P={};P[":"]=r(":");P["\u00b0"]=
+function(a,g){var c=C(a[0]);return"number"===c.ctype&&"void"===a[1].ctype?v.withUsage(m.realmult(Math.PI/180,c),"Angle"):k};P._=mc;P["^"]=Kc;P["\u221a"]=function(a,g){return"void"===a[0].ctype?t.sqrt$1([a[1]],g):k};P["*"]=Ic;P["\u00d7"]=Lc;P["/"]=Jc;P["+"]=Hc;P["-"]=Xb;P["!"]=function(a,g){var c=C(a[1]);return"void"===a[0].ctype&&"boolean"===c.ctype?{ctype:"boolean",value:!c.value}:k};P["=="]=B;P["~="]=pa;P["~<"]=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype&&
+m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(b)?{ctype:"boolean",value:c.value.real-b.value.real<=-m.eps}:k};P["~>"]=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype&&m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(b)?{ctype:"boolean",value:c.value.real-b.value.real>=m.eps}:k};P["=:="]=r("=:=");P[">="]=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype&&m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(b)?{ctype:"boolean",value:c.value.real>=
+b.value.real}:"string"===c.ctype&&"string"===b.ctype?{ctype:"boolean",value:c.value>=b.value}:k};P["<="]=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype&&m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(b)?{ctype:"boolean",value:c.value.real<=b.value.real}:"string"===c.ctype&&"string"===b.ctype?{ctype:"boolean",value:c.value<=b.value}:k};P["~>="]=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype&&m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(b)?
+{ctype:"boolean",value:c.value.real-b.value.real>-m.eps}:k};P["~<="]=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype&&m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(b)?{ctype:"boolean",value:c.value.real-b.value.real<m.eps}:k};P[">"]=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype&&m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(b)?{ctype:"boolean",value:c.value.real>b.value.real}:"string"===c.ctype&&"string"===b.ctype?{ctype:"boolean",
+value:c.value>b.value}:k};P["<"]=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype&&m._helper.isAlmostReal(c)&&m._helper.isAlmostReal(b)?{ctype:"boolean",value:c.value.real<b.value.real}:"string"===c.ctype&&"string"===b.ctype?{ctype:"boolean",value:c.value<b.value}:k};P["<>"]=Ec;P["\u2208"]=function(a,g){var c=A(a[0]),b=A(a[1]);return"list"===b.ctype?f.contains(b,c):k};P["\u2209"]=function(a,g){var c=A(a[0]),b=A(a[1]);return"list"===b.ctype?v.not(f.contains(b,c)):
+k};P["&"]=na;P["%"]=Gc;P["!="]=Ec;P["~!="]=function(a,g){return v.not(pa(a,g))};P[".."]=function(a,g){var c=A(a[0]),b=A(a[1]);return"number"===c.ctype&&"number"===b.ctype?f.sequence(c,b):k};P["++"]=Rc;P["--"]=Tc;P["~~"]=Sc;P[":>"]=Uc;P["<:"]=Vc;P["="]=E;P[":="]=function(a,g,c){g="undefined"===a[1].ctype;if("undefined"===a[0].ctype||g)return k;if("function"===a[0].ctype){g=a[0].oper;var b=a[0].args,d=a[1],f=1;if(Wa.hasOwnProperty(g)){f=Wa[g];if(f.definer===c)return k;f=f.generation+1}Wa[g]={oper:g,
+body:d,arglist:b,definer:c,generation:f}}"variable"===a[0].ctype&&J.setvar(a[0].name,a[1]);return k};P[":=_"]=function(a,g){if("void"!==a[1].ctype)return k;"function"===a[0].ctype&&delete Wa[a[0].oper];return k};P["::="]=r("::=");P[";"]=function(a,g){var c="void"===a[0].ctype,b="void"===a[1].ctype;if(c&&b)return k;if(!c&&b)return A(a[0]);c||b||A(a[0]);return b?k:A(a[1])};var t={},D={evaluate:function(a,g,c){if(Wa.hasOwnProperty(a)){a=Wa[a];if(void 0===a)g=k;else{var b=[];for(c=0;c<a.arglist.length;c++)b[c]=
+A(g[c]);for(c=0;c<a.arglist.length;c++)J.newvar(a.arglist[c].name),J.setvar(a.arglist[c].name,b[c]);J.pushVstack("*");g=A(a.body);J.cleanVstack();for(c=0;c<a.arglist.length;c++)J.removevar(a.arglist[c].name)}return g}if(b=t[a])return b(g,c);var d=a.lastIndexOf("$");if(-1!==d&&(d=a.substr(0,d),b=t[d]))return b(g,c);ha.err("Called undefined function "+d+" (as "+a+")");return k},equals:function(a,g){return"number"===a.ctype&&"number"===g.ctype?{ctype:"boolean",value:a.value.real===g.value.real&&a.value.imag===
+g.value.imag}:"string"===a.ctype&&"string"===g.ctype||"boolean"===a.ctype&&"boolean"===g.ctype?{ctype:"boolean",value:a.value===g.value}:"list"===a.ctype&&"list"===g.ctype?f.equals(a,g):"geo"===a.ctype&&"geo"===g.ctype?{ctype:"boolean",value:a.value===g.value}:{ctype:"boolean",value:!1}}},J={};J.vars=function(){var a={pi:m.real(Math.PI),"\u03c0":m.real(Math.PI),i:m.complex(0,1),"true":v.bool(!0),"false":v.bool(!1),"#":k,nil:f.turnIntoCSList([]),newline:v.string("\n"),tab:v.string("\t")},g=[],c;for(c in a)g[c]=
+[a[c]];return g}();J.isVariable=function(a){return this.vars.hasOwnProperty(a)};J.create=function(a){if(this.vars.hasOwnProperty(a))return this.vars[a];var g=[null];return this.vars[a]=g};J.newvar=function(a){a=this.vars[a];a.push(k);return a};J.removevar=function(a){var g=this.vars[a];0===g.length&&console.error("Removing non-existing "+a);g.pop();0===g.length&&console.warn("Removing last "+a)};J.setvar=function(a,g){var c=this.vars[a];0===c.length&&console.error("Setting non-existing variable "+
+a);void 0===g&&(console.error("Setting variable "+a+" to undefined value"),g=k);if("undefined"===g.ctype)c[c.length-1]=g;else{var b=g;null===b&&(b=k);c[c.length-1]=b}};J.undefinedWarning={};J.getvar=function(a){var g=this.vars[a];0===g.length&&console.error("Getting non-existing variable "+a);g=g[g.length-1];if(null===g){if(u.csnames.hasOwnProperty(a))return{ctype:"geo",value:u.csnames[a]};console&&console.log&&void 0===this.undefinedWarning[a]&&(this.undefinedWarning[a]=!0,console.log("Warning: Accessing undefined variable: "+
+a));return k}return g};J.dump=function(a){var g=this.vars[a];console.log("*** Dump "+a);for(a=0;a<g.length;a++)console.log(a+":> "+w(g[a]))};J.vstack=[];J.pushVstack=function(a){this.vstack.push(a)};J.popVstack=function(){this.vstack.pop()};J.cleanVstack=function(){for(var a=this.vstack;0<a.length&&"*"!==a[a.length-1];)this.removevar(a[a.length-1]),a.pop();0<a.length&&a.pop()};var xa={generalFields:{color:"color",colorhsb:"",size:"size",alpha:"alpha",fillcolor:"fillcolor",fillalpha:"fillalpha",isshowing:"isshowing",
+visible:"visible",name:"name",caption:"caption",trace:"",tracelength:"",selected:""},getGeoField:function(a,g){return"undefined"!==typeof u.csnames[a]?xa.getField(u.csnames[a],g):k},setGeoField:function(a,g,c){return"undefined"!==typeof u.csnames[a]?xa.setField(u.csnames[a],g,c):k},getField:function(a,g){var c;if("P"===a.kind){if("xy"===g)return c=f.dehom(a.homog),v.withUsage(c,"Point");if("homog"===g)return v.withUsage(a.homog,"Point");if("x"===g)return m.div(a.homog.value[0],a.homog.value[2]);if("y"===
+g)return m.div(a.homog.value[1],a.homog.value[2])}if("L"===a.kind||"S"===a.kind){if("homog"===g)return v.withUsage(a.homog,"Line");if("angle"===g)return c=f.eucangle(f.ey,a.homog),v.withUsage(c,"Angle");if("slope"===g)return m.neg(m.div(a.homog.value[0],a.homog.value[1]))}if("Tr"===a.kind&&"matrix"===g)return a.matrix;if("C"===a.kind){if("radius"===g){var b=a.matrix;c=b.value[0].value[0];var d=b.value[0].value[2],e=b.value[1].value[2],b=b.value[2].value[2];m.mult(c,c);d=m.div(d,c);e=m.div(e,c);c=
+m.div(b,c);return c=m.sqrt(m.sub(m.add(m.mult(d,d),m.mult(e,e)),c))}if("size"===g)return a.size;if("matrix"===g)return a.matrix;if("center"===g)return c=n._helper.CenterOfConic(a.matrix),c=f.dehom(c),v.withUsage(c,"Point");if("dualMatrix"===g)return f.normalizeMax(f.adjoint3(a.matrix))}if("Text"===a.kind){if("pressed"===g)return a.checkbox?v.bool(a.checkbox.checked):v.bool(!1);if(("text"===g||"currenttext"===g)&&"EditableText"===a.type)return v.string(String(a.html.value));if("xy"===g)return c=f.dehom(a.homog),
+v.withUsage(c,"Point");if("homog"===g)return v.withUsage(a.homog,"Point");if("x"===g)return m.div(a.homog.value[0],a.homog.value[2]);if("y"===g)return m.div(a.homog.value[1],a.homog.value[2])}if("trace"===g)return v.bool(!!a.drawtrace);if(xa.generalFields[g])return(c=a[xa.generalFields[g]])&&c.ctype?c:"object"!==typeof c?v.wrap(c):k;if(a.behavior){if("mass"===g&&"Mass"===a.behavior.type)return m.real(a.behavior.mass);if("radius"===g&&"Mass"===a.behavior.type)return m.real(a.behavior.radius);if("charge"===
+g&&"Mass"===a.behavior.type)return m.real(a.behavior.charge);if("friction"===g&&"Mass"===a.behavior.type)return m.real(a.behavior.friction);if("vx"===g&&"Mass"===a.behavior.type)return m.real(a.behavior.vx);if("vy"===g&&"Mass"===a.behavior.type)return m.real(a.behavior.vy);if("v"===g&&"Mass"===a.behavior.type)return f.realVector([a.behavior.vx,a.behavior.vy]);if("fx"===g&&"Mass"===a.behavior.type)return m.real(a.behavior.fx);if("fy"===g&&"Mass"===a.behavior.type)return m.real(a.behavior.fy);if("f"===
+g&&"Mass"===a.behavior.type)return f.realVector([a.behavior.fx,a.behavior.fy])}return k},setField:function(a,g,c){var b;"color"===g&&f._helper.isNumberVecN(c,3)&&(a.color=c);"size"===g&&"number"===c.ctype&&(a.size=c);"alpha"===g&&"number"===c.ctype&&(a.alpha=c);"fillcolor"===g&&f._helper.isNumberVecN(c,3)&&("EditableText"===a.type?(a.fillcolor=c.value.map(function(a){return a.value.real}),a.html.style.backgroundColor=y.makeColor(a.fillcolor,a.fillalpha)):a.fillcolor=c);"fillalpha"===g&&"number"===
+c.ctype&&(a.fillalpha=c);"visible"===g&&"boolean"===c.ctype&&(a.visible=c.value);"pinned"===g&&"boolean"===c.ctype&&(a.pinned=c.value);"printlabel"===g&&(a.printname=w(c));"trace"===g&&"boolean"===c.ctype&&(c.value&&!a.drawtrace?(a.drawtrace=!0,nd(a)):a.drawtrace=c.value);"P"===a.kind&&a.movable&&("xy"===g&&f._helper.isNumberVecN(c,2)&&Ea(a,f.turnIntoCSList([c.value[0],c.value[1],m.real(1)]),"homog"),"xy"===g&&f._helper.isNumberVecN(c,3)&&Ea(a,c,"homog"),"x"===g&&"number"===c.ctype&&Ea(a,f.turnIntoCSList([m.mult(c,
+a.homog.value[2]),a.homog.value[1],a.homog.value[2]]),"homog"),"y"===g&&"number"===c.ctype&&Ea(a,f.turnIntoCSList([a.homog.value[0],m.mult(c,a.homog.value[2]),a.homog.value[2]]),"homog"),"homog"===g&&f._helper.isNumberVecN(c,3)&&Ea(a,c,"homog"));"homog"===g&&"L"===a.kind&&a.movable&&f._helper.isNumberVecN(c,3)&&Ea(a,c,"homog");if("angle"===g&&"Through"===a.type&&"number"===c.ctype){b=m.cos(c);var d=m.sin(c);b=f.turnIntoCSList([b,d,m.real(0)]);Ea(a,b,"dir")}"slope"===g&&"Through"===a.type&&"number"===
+c.ctype&&(b=f.turnIntoCSList([m.real(1),c,m.real(0)]),Ea(a,b,"dir"));"C"===a.kind&&"radius"===g&&"CircleMr"===a.type&&"number"===c.ctype&&Ea(a,c,"radius");"Text"===a.kind&&("pressed"===g&&"boolean"===c.ctype&&a.checkbox&&(a.checkbox.checked=c.value),"text"!==g&&"currenttext"!==g||"EditableText"!==a.type||(a.html.value=w(c)),a.movable&&("xy"===g?f._helper.isNumberVecN(c,2)?a.homog=f.turnIntoCSList([c.value[0],c.value[1],m.real(1)]):f._helper.isNumberVecN(c,3)&&(a.homog=c):"homog"===g&&f._helper.isNumberVecN(c,
+3)?a.homog=c:"x"===g&&"number"===c.ctype?a.homog=f.turnIntoCSList([m.mult(c,a.homog.value[2]),a.homog.value[1],a.homog.value[2]]):"y"===g&&"number"===c.ctype&&(a.homog=f.turnIntoCSList([a.homog.value[0],m.mult(c,a.homog.value[2]),a.homog.value[2]]))));a.behavior&&("mass"===g&&"Mass"===a.behavior.type&&"number"===c.ctype&&(a.behavior.mass=c.value.real),"mass"===g&&"Sun"===a.behavior.type&&"number"===c.ctype&&(a.behavior.mass=c.value.real),"friction"===g&&"Mass"===a.behavior.type&&"number"===c.ctype&&
+(a.behavior.friction=c.value.real),"charge"===g&&"Mass"===a.behavior.type&&"number"===c.ctype&&(a.behavior.charge=c.value.real),"radius"===g&&"Mass"===a.behavior.type&&"number"===c.ctype&&(a.behavior.radius=c.value.real),"vx"===g&&"Mass"===a.behavior.type&&"number"===c.ctype&&(a.behavior.vx=c.value.real),"vy"===g&&"Mass"===a.behavior.type&&"number"===c.ctype&&(a.behavior.vy=c.value.real),"v"===g&&"Mass"===a.behavior.type&&f._helper.isNumberVecN(c,2)&&(a.behavior.vx=c.value[0].value.real,a.behavior.vy=
+c.value[1].value.real))}};t.version$0=function(a,g){var c=["CindyJS"].concat(ie);return f.turnIntoCSList(c.map(v.wrap))};t.clearconsole$0=function(a,g){ha.clear()};t.err$1=function(a,g){var c="",b;"variable"===a[0].ctype?(c=a[0].name,b=J.getvar(a[0].name)):b=a[0];b=c+" ===> "+w(A(b));ha.err(b);return k};t.errc$1=function(a,g){var c;"variable"===a[0].ctype?(c=A(J.getvar(a[0].name)),console.log(a[0].name+" ===> "+w(c))):(c=A(a[0]),console.log(" ===> "+w(c)));return k};t.print$1=function(a,g){ha.out(w(A(a[0])),
+!0);return k};t.println$1=function(a,g){ha.out(w(A(a[0])));return k};t.dump$1=function(a,g){console.log(JSON.stringify(a[0]));return k};t.repeat$2=function(a,g){return t.repeat$3([a[0],null,a[1]],g)};t.repeat$3=function(a,g){var c=C(a[0]),b="#";null!==a[1]&&"variable"===a[1].ctype&&(b=a[1].name);if("number"!==c.ctype)return k;var c=Math.round(c.value.real),d=1,f=1,e=c+1,h=!1,m=!1,l=!1,n;void 0!==g.start&&(n=A(g.start),"number"===n.ctype&&(h=!0,f=n.value.real));void 0!==g.step&&(n=A(g.step),"number"===
+n.ctype&&(l=!0,d=n.value.real));void 0!==g.stop&&(n=A(g.stop),"number"===n.ctype&&(m=!0,e=n.value.real));!h||m||l||(e=d*c+f);h||!m||l||(f=-d*(c-1)+e,e+=d);h||m||!l||(e=d*c+f);h&&m&&!l&&(d=(e-f)/(c-1),e+=d);h&&!m&&l&&(e=d*c+f);!h&&m&&l&&(f=-d*(c-1)+e,e+=d);h&&m&&l&&(e+=d);(f<=e&&0<d||f>=e&&0>d)&&h&&m&&l&&(c=Math.floor((e-f)/d));J.newvar(b);e=k;for(h=0;h<c;h++)J.setvar(b,{ctype:"number",value:{real:h*d+f,imag:0}}),e=A(a[2]);J.removevar(b);return e};t.while$2=function(a,g){for(var c=a[1],b=a[0],d=A(b),
+f=k;"list"!==d.ctype&&d.value;)f=A(c),d=A(b);return f};t.apply$2=function(a,g){return t.apply$3([a[0],null,a[1]],g)};t.apply$3=function(a,g){var c=C(a[0]);if("list"!==c.ctype)return k;var b="#";null!==a[1]&&"variable"===a[1].ctype&&(b=a[1].name);var c=c.value,d=[];J.newvar(b);for(var f=0;f<c.length;f++)J.setvar(b,c[f]),d[f]=A(a[2]);J.removevar(b);return{ctype:"list",value:d}};t.forall$2=function(a,g){return t.forall$3([a[0],null,a[1]],g)};t.forall$3=function(a,g){var c=C(a[0]);if("list"!==c.ctype)return k;
+var b="#";null!==a[1]&&"variable"===a[1].ctype&&(b=a[1].name);c=c.value;J.newvar(b);for(var d,f=0;f<c.length;f++)J.setvar(b,c[f]),d=A(a[2]);J.removevar(b);return d};t.select$2=function(a,g){return t.select$3([a[0],null,a[1]],g)};t.select$3=function(a,g){var c=C(a[0]);if("list"!==c.ctype)return k;var b="#";null!==a[1]&&"variable"===a[1].ctype&&(b=a[1].name);var c=c.value,d=[];J.newvar(b);for(var f=0,e=0;e<c.length;e++){J.setvar(b,c[e]);var h=A(a[2]);"boolean"===h.ctype&&!0===h.value&&(d[f]=c[e],f++)}J.removevar(b);
+return{ctype:"list",value:d}};t.flatten$1=function(a,g){function c(a,g){return-1===g||"list"!==a.ctype?a:[].concat.apply([],a.value.map(function(a){return c(a,g-1)}))}var b=C(a[0]);if("list"!==b.ctype)return b;var d=g.levels;void 0===d?d=1:(d=A(d),d="number"===d.ctype?d.value.real:"string"===d.ctype&&"all"===d.value?-2:1);return{ctype:"list",value:c(b,d)}};t.createvar$1=function(a,g){"variable"===a[0].ctype&&J.newvar(a[0].name);return k};t.local=function(a,g){for(var c=0;c<a.length;c++)"variable"===
+a[c].ctype&&J.newvar(a[c].name);return k};t.removevar$1=function(a,g){var c=A(a[0]);"variable"===a[0].ctype&&J.removevar(a[0].name);return c};t.release=function(a,g){if(0===a.length)return k;for(var c=A(a[a.length-1]),b=0;b<a.length;b++)"variable"===a[b].ctype&&J.removevar(a[b].name);return c};t.regional=function(a,g){for(var c=0;c<a.length;c++)if("variable"===a[c].ctype){var b=a[c].name;J.newvar(b);J.pushVstack(b)}return k};t.genList=function(a,g){return f.turnIntoCSList(a.map(A))};D.assigntake=
+function(a,g){var c=a.args[0],b=A(c),d=C(a.args[1]),e=k;if("list"===b.ctype||"string"===b.ctype)d=Math.floor(d.value.real),0>d&&(d=b.value.length+d+1),0<d&&d<=b.value.length&&("list"===b.ctype?(b=b.value.slice(),b[d-1]=A(g),e=f.turnIntoCSList(b)):(b=b.value,b=b.substring(0,d-1)+w(A(g))+b.substring(d,b.length),e=v.string(b)));E([c,e])};D.assigndot=function(a,g){var c=A(a.obj),b=a.key;"geo"===c.ctype&&b&&xa.setField(c.value,b,C(g));return k};D.assignlist=function(a,g){var c=a.length,b=g.length;b<c&&
+(c=b);for(b=0;b<c;b++)E([a[b],g[b]],[])};t.if$2=function(a,g){return t.if$3(a,g)};t.if$3=function(a,g){var c=C(a[0]);if("boolean"===c.ctype){if(!0===c.value)return A(a[1]);if(3===a.length)return A(a[2])}else ha.err("Condition for if is not boolean");return k};t.and$2=na;t.or$2=Gc;t.xor$2=function(a,g){var c=C(a[0]),b=C(a[1]);return"boolean"===c.ctype&&"boolean"===b.ctype?{ctype:"boolean",value:c.value!==b.value}:k};t.not$1=function(a,g){var c=C(a[0]);return"boolean"===c.ctype?{ctype:"boolean",value:!c.value}:
+k};D.genericListMathGen=function(a,g,c){t[a+"$1"]=function(a,b){var p=A(a[0]);if("list"!==p.ctype)return k;p=p.value;if(0===p.length)return c;for(var d=p[0],f=1;f<p.length;f++)d=g(d,p[f]);return d};var b=a+"$3";t[a+"$2"]=function(a,c){return t[b]([a[0],null,a[1]])};t[b]=function(a,b){var p=C(a[0]);if("list"!==p.ctype)return k;p=p.value;if(0===p.length)return c;var d="#";null!==a[1]&&"variable"===a[1].ctype&&(d=a[1].name);J.newvar(d);J.setvar(d,p[0]);for(var f=A(a[2]),e=1;e<p.length;e++){J.setvar(d,
+p[e]);var h=A(a[2]),f=g(f,h)}J.removevar(d);return f}};D.genericListMathGen("product",v.mult,m.real(1));D.genericListMathGen("sum",v.add,m.real(0));D.genericListMathGen("max",v.max,k);D.genericListMathGen("min",v.min,k);t.max$2=function(a,g){var c=C(a[0]);if("list"===c.ctype)return t.max$3([c,null,a[1]]);var b=C(a[1]);return t.max$1([f.turnIntoCSList([c,b])])};t.min$2=function(a,g){var c=C(a[0]);if("list"===c.ctype)return t.min$3([c,null,a[1]]);var b=C(a[1]);return t.min$1([f.turnIntoCSList([c,b])])};
+t.add$2=Hc;t.sub$2=Xb;t.mult$2=Ic;t.div$2=Jc;t.mod$2=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype?m.mod(c,b):k};t.pow$2=Kc;t.exp$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.exp(c):k};t.sin$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.sin(c):k};t.sqrt$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.sqrt(c):k};D.laguerre=function(a,g,c){if("list"!==a.ctype)return k;var b=a.value.length-1,d;for(d=0;d<=b;d++)if("number"!==a.value[d].ctype)return k;
+if("number"!==g.ctype)return k;for(var f=[1,.3141,.5926,.5358,.9793,.2385,.6264,.3383,.2795,.0288],e,h,l,n=1;n<=c;n++){h=l=m.zero;e=a.value[b];for(d=b-1;0<=d;d--)l=m.add(h,m.mult(l,g)),h=m.add(e,m.mult(h,g)),e=m.add(a.value[d],m.mult(e,g));if(m._helper.isLessThan(m.abs(e),m.real(1E-14)))break;d=m.div(h,e);h=m.mult(d,d);e=m.sub(h,m.div(m.mult(m.real(2),l),e));l=m.sqrt(m.mult(m.real(b-1),m.sub(m.mult(m.real(b),e),h)));e=m.add(d,l);d=m.sub(d,l);m._helper.isLessThan(m.abs(e),m.abs(d))&&(e=d);d=m._helper.isLessThan(m.real(1E-14),
+m.abs(e))?m.div(m.real(b),e):m.mult(m.add(m.abs(g),m.one),m.complex(Math.cos(n),Math.sin(n)));if(m._helper.isLessThan(m.abs(d),m.real(1E-14)))break;0===n%20&&n<c-19&&(d=m.mult(d,m.real(f[Math.floor(n/20)])));g=m.sub(g,d)}return g};D.quadratic_roots=function(a){if("list"!==a.ctype)return k;var g=a.value[2],c=a.value[1];a=a.value[0];if(m._helper.isZero(a))return[m.zero,m.neg(m.div(c,g))];var b=m.sqrt(m.sub(m.mult(c,c),m.mult(m.real(4),m.mult(g,a))));0<=m.re(c)&&(b=m.neg(b));return[m.div(m.sub(b,c),
+m.mult(m.real(2),g)),m.div(m.mult(m.real(2),a),m.sub(b,c))]};D.roots=function(a){var g=[],c=a,b=a.value.length-1;if(0>=b)return f.turnIntoCSList([]);if(m._helper.isZero(a.value[b]))return g=D.roots(f.turnIntoCSList(a.value.slice(0,b))),f.append(g,m.infinity);if(1===b)g[0]=m.neg(m.div(a.value[0],a.value[1]));else if(2===b)g=D.quadratic_roots(a);else{for(var d=0;d<b-2;d++){g[d]=D.laguerre(a,m.zero,200);g[d]=D.laguerre(c,g[d],1);var e=[];e[b-d]=a.value[b-d];for(var h=b-d;0<h;h--)e[h-1]=m.add(a.value[h-
+1],m.mult(e[h],g[d]));e.shift();a=f.turnIntoCSList(e)}a=D.quadratic_roots(a);g[b-2]=a[0];g[b-1]=a[1]}return f.turnIntoCSList(g)};t.roots$1=function(a,g){var c=C(a[0]);if("list"===c.ctype){for(var b=0;b<c.value.length;b++)if("number"!==c.value[b].ctype)return k;c=D.roots(c);return f.sort1(c)}return k};t.autodiff$3=function(a,g){var c="x",b;if("function"===a[0].ctype)b=Wa[a[0].oper].body,c=a[0].args[0].name;else if("function"===typeof a[0].impl)b=a[0];else return console.log("could not parse function"),
+k;var d=C(a[1]),f=C(a[2]);if(1>f.value.real)return console.log("grade cant be < 1"),k;f=m.add(f,m.real(1));return O.autodiff(b,c,d,f)};t.cos$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.cos(c):k};t.tan$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.tan(c):k};t.arccos$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.arccos(c):k};t.arcsin$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.arcsin(c):k};t.arctan$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?
+m.arctan(c):k};t.arctan2$2=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype?m.arctan2(c,b):k};t.arctan2$1=function(a,g){var c=C(a[0]);if("list"===c.ctype&&2===c.value.length){if(c=c.value,"number"===c[0].ctype&&"number"===c[1].ctype)return t.arctan2$2(c,g)}else if("number"===c.ctype)return m.arctan2(c);return k};t.log$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.log(c):k};D.recursiveGen=function(a){var g=m[a],c=f[a];t[a+"$1"]=function(a,b){var d=C(a[0]);
+return"number"===d.ctype?g(d):"list"===d.ctype?c(d):k}};D.recursiveGen("im");D.recursiveGen("re");D.recursiveGen("conjugate");D.recursiveGen("round");D.recursiveGen("ceil");D.recursiveGen("floor");D.recursiveGen("abs");t.abs_infix=t.abs$1;t.random$0=function(a,g){return m.real(m._helper.rand())};t.random$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?m.complex(c.value.real*m._helper.rand(),c.value.imag*m._helper.rand()):k};t.seedrandom$1=function(a,g){var c=C(a[0]);"number"===c.ctype&&m._helper.seedrandom(c.value.real);
+return k};t.randomnormal$0=function(a,g){return m.real(m._helper.randnormal())};t.randominteger$1=function(a,g){var c=C(a[0]);if("number"===c.ctype){var b=c.value.real|0,c=c.value.imag|0,b=b*m._helper.rand()|0,c=c*m._helper.rand()|0;return m.complex(b,c)}return k};t.randomint$1=t.randominteger$1;t.randombool$0=function(a,g){return.5<m._helper.rand()?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isreal$1=function(a,g){var c=A(a[0]);return"number"===c.ctype&&m._helper.isAlmostReal(c)?{ctype:"boolean",
+value:!0}:{ctype:"boolean",value:!1}};t.isinteger$1=function(a,g){var c=A(a[0]);return"number"===c.ctype&&m._helper.isAlmostReal(c)&&c.value.real===Math.floor(c.value.real)?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.iseven$1=function(a,g){var c=A(a[0]);return"number"===c.ctype&&m._helper.isAlmostReal(c)&&c.value.real/2===Math.floor(c.value.real/2)?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isodd$1=function(a,g){var c=A(a[0]);return"number"===c.ctype&&m._helper.isAlmostReal(c)&&
+(c.value.real-1)/2===Math.floor((c.value.real-1)/2)?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.iscomplex$1=function(a,g){return"number"===A(a[0]).ctype?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isstring$1=function(a,g){return"string"===A(a[0]).ctype?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.islist$1=function(a,g){return"list"===A(a[0]).ctype?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.ismatrix$1=function(a,g){var c=A(a[0]);return-1!==f._helper.colNumb(c)?
+{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.iscircle$1=function(a,g){var c=A(a[0]);return"geo"===c.ctype&&"C"===c.value.kind&&"Circle"===c.value.matrix.usage?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isconic$1=function(a,g){var c=A(a[0]);return"geo"===c.ctype&&"C"===c.value.kind?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isline$1=function(a,g){var c=A(a[0]);return"geo"===c.ctype&&"L"===c.value.kind?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.ispoint$1=
+function(a,g){var c=A(a[0]);return"geo"===c.ctype&&"P"===c.value.kind?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isgeometric$1=function(a,g){return"geo"===A(a[0]).ctype?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isnumbermatrix$1=function(a,g){var c=A(a[0]);return f.isNumberMatrix(c).value?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isnumbervector$1=function(a,g){var c=A(a[0]);return f.isNumberVector(c).value?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};
+t.issun$1=function(a,g){var c=A(a[0]);return"geo"===c.ctype&&void 0!==c.value.behavior&&"Sun"===c.value.behavior.type?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.ismass$1=function(a,g){var c=A(a[0]);return"geo"===c.ctype&&void 0!==c.value.behavior&&"Mass"===c.value.behavior.type?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isspring$1=function(a,g){var c=A(a[0]);return"geo"===c.ctype&&void 0!==c.value.behavior&&"Spring"===c.value.behavior.type?{ctype:"boolean",value:!0}:{ctype:"boolean",
+value:!1}};t.isbouncer$1=function(a,g){var c=A(a[0]);return"geo"===c.ctype&&void 0!==c.value.behavior&&"Bouncer"===c.value.behavior.type?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};t.isundefined$1=function(a,g){return"undefined"===A(a[0]).ctype?{ctype:"boolean",value:!0}:{ctype:"boolean",value:!1}};var Cd={ArcBy3:"Arc",CenterOfConic:"Center",ConicBy1p4l:"Conic1P4L",ConicBy4p1l:"Conic4P1L",ConicBy5lines:"Conic5L",ConicBy2Foci1P:"ConicFoci",ConicFromPrincipalDirections:"ConicPrincipleDirs",
+Free:"FreePoint",PolarOfLine:"PolarLine",PolarOfPoint:"PolarPoint",PointOnSegment:"PointOnLine",Button:"Text",ToggleButton:"Text",TrReflectionL:"TrReflection",TrReflectionP:"TrReflection",TrReflectionC:"TrReflection",TrTranslation:"TrProjection",TrSimilarity:"TrProjection",TrAffine:"TrProjection",TransformP:"Transform",TransformL:"Transform",TransformSegment:"Transform",TransformS:"Transform",TransformPolygon:"Transform",TransformArc:"Transform",TransformConic:"Transform",TransformC:"Transform",TrMoebiusP:"Transform",
+TrMoebiusL:"Transform",TrMoebiusSegment:"Transform",TrMoebiusS:"Transform",TrMoebiusPolygon:"Transform",TrMoebiusArc:"Transform",TrMoebiusCircle:"Transform",TrMoebiusC:"Transform",TrInverseMoebius:"TrInverse",Perp:"Orthogonal",Para:"Parallel",AngleBisector:"AngularBisector",IntersectLC:"IntersectionConicLine",IntersectCirCir:"IntersectionCircleCircle",OtherPointOnCircle:"PointOnCircle"};t.algorithm$1=function(a,g){var c=A(a[0]);if("geo"===c.ctype){var c=c.value,b=c.type,d=C(g.compatibility);"string"===
+d.ctype&&/^cinderella$/i.test(d.value)&&(/^Select/.test(b)&&(c=u.csnames[c.args[0]],b=c.type),Cd.hasOwnProperty(b)?b=Cd[b]:"CircleMr"===b&&(b=c.pinned?"CircleByFixedRadius":"CircleByRadius"));return v.string(b)}return k};t.inputs$1=function(a,g){var c=A(a[0]);if("geo"===c.ctype){var c=c.value,b=c.type,d=[];c.args&&(d=c.args.map(function(a){return{ctype:"geo",value:u.csnames[a]}}));if(/^Select/.test(b)||n[b].isMovable)switch(c.kind){case "P":case "L":d.push(c.homog);break;case "C":d.push(c.matrix)}return f.turnIntoCSList(d)}return k};
+t.moveto$2=function(a,g){var c=A(a[0]),b=C(a[1]);"geo"===c.ctype&&(c=c.value,f._helper.isNumberVecN(b,2)?xa.setField(c,"xy",b):f._helper.isNumberVecN(b,3)&&xa.setField(c,"homog",b));return k};t.matrixrowcolumn$1=function(a,g){var c=A(a[0]);return-1!==f._helper.colNumb(c)?f.realVector([c.value.length,c.value[0].value.length]):k};t.rowmatrix$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.turnIntoCSList([c]):k};t.columnmatrix$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.turnIntoCSList(c.value.map(function(a){return f.turnIntoCSList([a])})):
+k};t.submatrix$3=function(a,g){var c=A(a[0]),b=A(a[1]),d=A(a[2]);if("list"===c.ctype&&"number"===b.ctype&&"number"===d.ctype){var e=Math.round(b.value.real),b=Math.round(d.value.real),c=c.value.slice();0<b&&b<=c.length&&c.splice(b-1,1);var h=!0,c=c.map(function(a){if("list"!==a.ctype)h=!1;else return a=a.value.slice(),0<e&&e<=a.length&&a.splice(e-1,1),f.turnIntoCSList(a)});return h?f.turnIntoCSList(c):k}return k};t.complex$1=function(a,g){var c,b,d;d=C(a[0]);if("list"===d.ctype&&f.isNumberVector(d)){if(2===
+d.value.length)return c=d.value[0],b=d.value[1],m.complex(c.value.real-b.value.imag,b.value.real+c.value.imag);if(3===d.value.length)return c=d.value[0],b=d.value[1],d=d.value[2],c=m.div(c,d),b=m.div(b,d),m.complex(c.value.real-b.value.imag,b.value.real+c.value.imag)}return k};t.gauss$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?f.realVector([c.value.real,c.value.imag]):k};t.cross$2=Lc;t.crossratio$4=function(a,g){var c=A(a[0]),b=A(a[1]),d=A(a[2]),e=A(a[3]),h=M(c),l=M(b),n=M(d),q=M(e);return h!==
+k&&l!==k&&n!==k&&q!==k?f.crossratio3(h,l,n,q,f.ii):"number"===c.ctype&&"number"===b.ctype&&"number"===d.ctype&&"number"===e.ctype?m.div(m.mult(m.sub(c,d),m.sub(b,e)),m.mult(m.sub(c,e),m.sub(b,d))):k};t.para$2=function(a,g){var c=C(a[0]),b=C(a[1]),d=M(c),e=M(b);if(c!==k&&b!==k){var b=b.usage,h=d,m=e;if("Line"===c.usage||"Point"===b)h=e,m=d;c=f.cross(f.cross(f.linfty,m),h);return v.withUsage(c,"Line")}return k};t.perp$2=function(a,g){var c=C(a[0]),b=C(a[1]),d=M(c),e=M(b);if(c!==k&&b!==k){var h=b.usage||
+e.usage,b=d,l=e;if("Line"===(c.usage||d.usage)||"Point"===h)b=e,l=d;c=f.turnIntoCSList([l.value[0],l.value[1],m.zero]);c=f.cross(c,b);return v.withUsage(c,"Line")}return k};t.perp$1=function(a,g){var c=C(a[0]);return f._helper.isNumberVecN(c,2)?f.turnIntoCSList([m.neg(c.value[1]),c.value[0]]):k};t.parallel$2=t.para$2;t.perpendicular$2=t.perp$2;t.perpendicular$1=t.perp$1;t.meet$2=function(a,g){var c=M(a[0]),b=M(a[1]);return c!==k&&b!==k?(c=f.cross(c,b),v.withUsage(c,"Point")):k};t.join$2=function(a,
+g){var c=M(a[0]),b=M(a[1]);return c!==k&&b!==k?(c=f.cross(c,b),v.withUsage(c,"Line")):k};t.dist$2=function(a,g){var c=C(a[0]),b=C(a[1]),c=Xb([c,b],[]);return t.abs$1([c],[])};t.dist_infix=t.dist$2;t.point$1=function(a,g){var c=A(a[0]);return f._helper.isNumberVecN(c,3)||f._helper.isNumberVecN(c,2)?v.withUsage(c,"Point"):c};t.line$1=function(a,g){var c=A(a[0]);return f._helper.isNumberVecN(c,3)?v.withUsage(c,"Line"):c};t.det$3=function(a,g){var c=M(a[0]),b=M(a[1]),d=M(a[2]);if(c!==k&&b!==k&&d!==k)return f.det3(c,
+b,d)};t.det$1=function(a,g){var c=C(a[0]);if("list"===c.ctype){var b=f._helper.colNumb(c);if(-1!==b&&b===c.value.length)return f.det(c)}return k};t.eig$1=function(a,g){var c=C(a[0]);if("list"===c.ctype){var b=f._helper.colNumb(c);if(-1!==b&&b===c.value.length)return f.eig(c)}return k};t.eigenvalues$1=function(a,g){var c=C(a[0]);if("list"===c.ctype){var b=f._helper.colNumb(c);if(-1!==b&&b===c.value.length)return f.eig(c,!1).value[0]}return k};t.rank$1=function(a,g){var c=C(a[0]);if("list"===c.ctype){var b=
+f._helper.colNumb(c);if(-1!==b&&b===c.value.length)return f.rank(c,g.precision)}return k};t.kernel$1=function(a,g){var c=C(a[0]);if("list"===c.ctype){var b=f._helper.colNumb(c);if(-1!==b&&b===c.value.length)return c=f.nullSpace(c,g.precision),f.transpose(c)}return k};t.eigenvectors$1=function(a,g){var c=C(a[0]);if("list"===c.ctype){var b=f._helper.colNumb(c);if(-1!==b&&b===c.value.length)return f.eig(c).value[1]}return k};t.area$3=function(a,g){var c=M(a[0]),b=M(a[1]),d=M(a[2]);if(c!==k&&b!==k&&d!==
+k){var e=c.value[2],h=b.value[2],l=d.value[2];if(!m._helper.isAlmostZero(e)&&!m._helper.isAlmostZero(h)&&!m._helper.isAlmostZero(l))return c=f.scaldiv(e,c),b=f.scaldiv(h,b),d=f.scaldiv(l,d),c=f.det3(c,b,d),m.realmult(.5,c)}return k};t.inverse$1=function(a,g){var c=C(a[0]);if("list"===c.ctype){var b=f._helper.colNumb(c);if(-1!==b&&b===c.value.length)return f.inverse(c)}return k};t.linearsolve$2=function(a,g){var c=C(a[0]),b=C(a[1]);if("list"===c.ctype){var d=f._helper.colNumb(c);if(-1!==d&&d===c.value.length&&
+f._helper.isNumberVecN(b,d))return f.linearsolve(c,b)}return k};var Pd=[[[]],[[0]],[[0,1],[1,0]],[[0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]],[[0,1,2,3],[0,1,3,2],[0,2,1,3],[0,2,3,1],[0,3,1,2],[0,3,2,1],[1,0,2,3],[1,0,3,2],[1,2,0,3],[1,2,3,0],[1,3,0,2],[1,3,2,0],[2,0,1,3],[2,0,3,1],[2,1,0,3],[2,1,3,0],[2,3,0,1],[2,3,1,0],[3,0,1,2],[3,0,2,1],[3,1,0,2],[3,1,2,0],[3,2,0,1],[3,2,1,0]]];t.mincostmatching$1=function(a,g){var c=A(a[0]);if(f.isNumberMatrix(c)){var b=c.value.length,d=f._helper.colNumb(c),
+e=b<d?d:b,h,l,n=Array(e);for(h=0;h<e;++h)for(n[h]=Array(e),l=0;l<e;++l)n[h][l]=h<b&&l<d?c.value[h].value[l].value.real:0;c=Zb(n);e=Array(b);for(h=0;h<b;++h)l=c[h],e[h]=l<d?m.real(l+1):m.real(0);return f.turnIntoCSList(e)}return k};t.take$2=mc;t.length$1=function(a,g){var c=A(a[0]);return"list"===c.ctype||"string"===c.ctype?m.real(c.value.length):k};t.pairs$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.pairs(c):k};t.triples$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.triples(c):
+k};t.cycle$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.cycle(c):k};t.consecutive$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.consecutive(c):k};t.reverse$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.reverse(c):k};t.directproduct$2=function(a,g){var c=A(a[0]),b=A(a[1]);return"list"===c.ctype&&"list"===b.ctype?f.directproduct(c,b):k};t.concat$2=Rc;t.common$2=Sc;t.remove$2=Tc;t.append$2=Uc;t.prepend$2=Vc;t.contains$2=function(a,g){var c=A(a[0]),b=A(a[1]);return"list"===
+c.ctype?f.contains(c,b):k};t.sort$2=function(a,g){return t.sort$3([a[0],null,a[1]],g)};t.sort$3=function(a,g){var c=C(a[0]);if("list"!==c.ctype)return k;var b="#";null!==a[1]&&"variable"===a[1].ctype&&(b=a[1].name);var c=c.value,d=[];J.newvar(b);var e;for(e=0;e<c.length;e++)J.setvar(b,c[e]),d[e]={val:c[e],result:A(a[2])};J.removevar(b);d.sort(v.compareResults);b=[];for(e=0;e<c.length;e++)b[e]=d[e].val;return{ctype:"list",value:b}};t.sort$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.sort1(c):
+k};t.set$1=function(a,g){var c=A(a[0]);return"list"===c.ctype?f.set(c):k};t.combinations$2=function(a,g){function c(a,g){a===h?n.push(f.turnIntoCSList(l.slice())):g<e&&(l[a]=b.value[g],c(a+1,g+1),c(a,g+1))}var b=A(a[0]),d=A(a[1]),e,h,l,n;if("number"===d.ctype){h=d.value.real|0;if("number"===b.ctype){e=b.value.real|0;e-h<h&&(h=e-h);if(0>h)return m.real(0);if(0===h)return m.real(1);if(1===h)return b;for(var q=d=1,r=1;r<=h;++r)var t=e-h+r|0,u=r|0,v=nc(t,u)|0,t=t/v|0,u=u/v|0,v=nc(d,u)|0,d=d/v|0,u=u/v|
+0,v=nc(t,q)|0,t=t/v|0,q=q/v|0,d=d*t|0,q=q*u|0;return m.real(d/q)}if("list"===b.ctype){e=b.value.length;if(0>h||h>e)return f.turnIntoCSList([]);if(0===h)return f.turnIntoCSList([f.turnIntoCSList([])]);if(h===e)return f.turnIntoCSList([b]);n=[];l=Array(h);c(0,0);return f.turnIntoCSList(n)}}return k};t.zeromatrix$2=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===c.ctype&&"number"===b.ctype?f.zeromatrix(c,b):k};t.zerovector$1=function(a,g){var c=C(a[0]);return"number"===c.ctype?f.zerovector(c):
+k};t.transpose$1=function(a,g){var c=C(a[0]);return"list"===c.ctype&&-1!==f._helper.colNumb(c)?f.transpose(c):k};t.row$2=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===b.ctype&&"list"===c.ctype&&-1!==f._helper.colNumb(c)?f.row(c,b):k};t.column$2=function(a,g){var c=C(a[0]),b=C(a[1]);return"number"===b.ctype&&"list"===c.ctype&&-1!==f._helper.colNumb(c)?f.column(c,b):k};t.dict$0=function(a,g){var c=Oa.create(),b;for(b in g)g.hasOwnProperty(b)&&Oa.put(c,v.string(b),A(g[b]));return c};t.put$3=
+function(a,g){var c=A(a[0]),b=A(a[1]),d=A(a[2]);return"dict"===c.ctype?(c=Oa.clone(c),Oa.put(c,b,d),c):k};t.get$2=function(a,g){var c=A(a[0]),b=A(a[1]);return"dict"===c.ctype?Oa.get(c,b,k):k};t.red$1=function(a,g){var c=A(a[0]);return"number"===c.ctype?f.realVector([Math.min(1,Math.max(0,c.value.real)),0,0]):k};t.green$1=function(a,g){var c=A(a[0]);return"number"===c.ctype?f.realVector([0,Math.min(1,Math.max(0,c.value.real)),0]):k};t.blue$1=function(a,g){var c=A(a[0]);return"number"===c.ctype?f.realVector([0,
+0,Math.min(1,Math.max(0,c.value.real))]):k};t.gray$1=function(a,g){var c=A(a[0]);return"number"===c.ctype?(c=Math.min(1,Math.max(0,c.value.real)),f.realVector([c,c,c])):k};t.grey$1=t.gray$1;D.HSVtoRGB=function(a,g,c){var b,d,e,h,k,m;a&&void 0===g&&void 0===c&&(g=a.s,c=a.v,a=a.h);h=Math.floor(6*a);k=6*a-h;a=c*(1-g);m=c*(1-k*g);g=c*(1-(1-k)*g);switch(h%6){case 0:b=c;d=g;e=a;break;case 1:b=m;d=c;e=a;break;case 2:b=a;d=c;e=g;break;case 3:b=a;d=m;e=c;break;case 4:b=g;d=a;e=c;break;case 5:b=c,d=a,e=m}return f.realVector([b,
+d,e])};t.hue$1=function(a,g){var c=A(a[0]);return"number"===c.ctype?(c=c.value.real,c-=Math.floor(c),D.HSVtoRGB(c,1,1)):k};D.shapeconvert=function(a){var g,c;if("circle"===a.type){g=a.value.value[0];g=v.div(g,g.value[2]);var b=g.value[0].value.real,d=g.value[1].value.real;a=a.value.value[1].value.real;c=Array(125);var e=2*Math.PI/125;for(g=0;125>g;g++)c[g]={X:b+Math.cos(g*e)*a,Y:d+Math.sin(g*e)*a};return[c]}if("polygon"===a.type){b=[];for(g=0;g<a.value.length;g++){d=a.value[g];c=[];for(e=0;e<d.length;e++)c[e]=
+{X:d[e].X,Y:d[e].Y};b[g]=c}return b}};D.shapeop=function(a,g,c){a=D.shapeconvert(a);var b=D.shapeconvert(g);ClipperLib.JS.ScaleUpPaths(a,1E3);ClipperLib.JS.ScaleUpPaths(b,1E3);g=new ClipperLib.Clipper;g.AddPaths(a,ClipperLib.PolyType.ptSubject,!0);g.AddPaths(b,ClipperLib.PolyType.ptClip,!0);var b=a=ClipperLib.PolyFillType.pftNonZero,d=new ClipperLib.Paths;g.Execute(c,d,a,b);ClipperLib.JS.ScaleDownPaths(d,1E3);return{ctype:"shape",type:"polygon",value:d}};D.shapecommon=function(a,g){return D.shapeop(a,
+g,ClipperLib.ClipType.ctIntersection)};D.shaperemove=function(a,g){return D.shapeop(a,g,ClipperLib.ClipType.ctDifference)};D.shapeconcat=function(a,g){return D.shapeop(a,g,ClipperLib.ClipType.ctUnion)};t.key$0=function(a,g){return{ctype:"string",value:Pc}};t.keycode$0=function(a,g){return m.real(Qc)};t.mouse$0=function(a,g){return f.realVector([sa[0],sa[1]])};t.mover$0=function(a,g){if(aa&&aa.mover)return{ctype:"geo",value:aa.mover};console.log("Not moving anything at the moment");return k};t.translate$1=
+function(a,g){var c=C(a[0]);"list"===c.ctype&&f.isNumberVector(c)&&2===c.value.length&&x.translate(c.value[0].value.real,c.value[1].value.real);return k};t.rotate$1=function(a,g){var c=C(a[0]);"number"===c.ctype&&x.rotate(c.value.real);return k};t.scale$1=function(a,g){var c=C(a[0]);"number"===c.ctype&&x.scale(c.value.real);return k};t.greset$0=function(a,g){var c=Xa.stack.length;x.greset();for(var b=0;b<c;b++)z.restore();return k};t.gsave$0=function(a,g){x.gsave();z.save();return k};t.grestore$0=
+function(a,g){x.grestore();z.restore();return k};t.color$1=function(a,g){var c=C(a[0]);"list"===c.ctype&&f.isNumberVector(c).value&&x.setcolor(c);return k};t.linecolor$1=function(a,g){var c=C(a[0]);"list"===c.ctype&&f.isNumberVector(c).value&&x.setlinecolor(c);return k};t.pointcolor$1=function(a,g){var c=C(a[0]);"list"===c.ctype&&f.isNumberVector(c).value&&x.setpointcolor(c);return k};t.alpha$1=function(a,g){var c=C(a[0]);"number"===c.ctype&&x.setalpha(c);return k};t.pointsize$1=function(a,g){var c=
+C(a[0]);"number"===c.ctype&&x.setpointsize(c);return k};t.linesize$1=function(a,g){var c=C(a[0]);"number"===c.ctype&&x.setlinesize(c);return k};t.textsize$1=function(a,g){var c=C(a[0]);"number"===c.ctype&&x.settextsize(c);return k};t.playanimation$0=function(a,g){S();return k};t.pauseanimation$0=function(a,g){Za();return k};t.stopanimation$0=function(a,g){Ja();return k};t.text$1=function(a,g){var c=C(a[0]);return v.string(w(c))};t.replace$3=function(a,g){var c=A(a[0]),b=A(a[1]),d=A(a[2]);if("string"===
+c.ctype&&"string"===b.ctype&&"string"===d.ctype)return c=c.value,b=b.value.replace(/[^A-Za-z0-9]/g,"\\$&"),d=d.value.replace(/\$/g,"$$$$"),c=c.replace(new RegExp(b,"g"),d),{ctype:"string",value:c}};t.replace$2=function(a,g){function c(a,c,g){var e="";d=b=-1;for(var f=0;f<c.length;f++){var h=c[f][0],k=a.indexOf(h,g);-1!==k&&(-1===b?(e=h,b=k,d=f):k<b&&(e=h,b=k,d=f))}return e}var b,d,e,f=A(a[0]);e=A(a[1]);if("string"===f.ctype&&"list"===e.ctype){for(var f=f.value,h=[],m=0;m<e.value.length;m++){var l=
+e.value[m];"list"===l.ctype&&2===l.value.length&&"string"===l.value[0].ctype&&"string"===l.value[1].ctype&&(h[h.length]=[l.value[0].value,l.value[1].value])}b=-1;for(e=c(f,h,0);-1!==b;)f=f.substring(0,b)+h[d][1]+f.substring(b+e.length,f.length),e=b+h[d][1].length,e=c(f,h,e);return{ctype:"string",value:f}}return k};t.substring$3=function(a,g){var c=A(a[0]),b=C(a[1]),d=C(a[2]);return"string"===c.ctype&&"number"===b.ctype&&"number"===d.ctype?{ctype:"string",value:c.value.substring(Math.floor(b.value.real),
+Math.floor(d.value.real))}:k};t.tokenize$2=function(a,g){var c=A(a[0]),b=A(a[1]);if("string"===c.ctype&&"string"===b.ctype)return t.tokenize$2([c,f.turnIntoCSList([b])],g);if("string"===c.ctype&&"list"===b.ctype){c=c.value;if(0===b.value.length){b=!0;if(void 0!==g.autoconvert){var d=A(g.autoconvert);"boolean"===d.ctype&&(b=d.value)}return b&&(b=parseFloat(c),!isNaN(b))?m.real(b):v.string(c)}var d=b.value[0],e=f.turnIntoCSList(b.value.slice(1)),c=c.split(d.value);return f.turnIntoCSList(c.map(function(a){return t.tokenize$2([v.string(a),
+e],g)}))}return k};t.indexof$2=function(a,g){var c=A(a[0]),b=A(a[1]);return"string"===c.ctype&&"string"===b.ctype?(c=c.value.indexOf(b.value),m.real(c+1)):k};t.indexof$3=function(a,g){var c=A(a[0]),b=A(a[1]),d=A(a[2]);return"string"===c.ctype&&"string"===b.ctype&&"number"===d.ctype?(c=c.value.indexOf(b.value,Math.round(d.value.real)-1),m.real(c+1)):k};t.parse$1=function(a,g){var c=A(a[0]);return"string"===c.ctype?(c=Ma(c.value),A(c)):k};t.unicode$1=function(a,g){var c;c=A(a[0]);var b=16;if(g.base){var d=
+A(g.base);"number"===d.ctype&&(b=d.value.real)}if("string"===c.ctype)c=parseInt(c.value,b);else if("number"===c.ctype)c=c.value.real;else return k;"undefined"!==typeof String.fromCodePoint?c=String.fromCodePoint(c):65535>=c?c=String.fromCharCode(c):(c-=65536,c=String.fromCharCode((c>>10)+55296,(c&1023)+56320));return v.string(c)};t.international$1=function(a,g){return t.international$2([a[0],null],g)};t.international$2=function(a,g){var c=A(a[0]);if("string"!==c.ctype)return k;var b=(q.translations||
+{})[q.language||"en"]||{};if(!b.hasOwnProperty(c.value))return c;var d=b[c.value];if("string"===typeof d)return v.string(d);if(null===a[1])return c;var e=A(a[1]),e="number"===e.ctype?e.value.real:0,b=(b._pluralFormFunction||Qd)(e);return b<d.length?v.string(d[b]):c};t.currentlanguage$0=function(a,g){return v.string(q.language||"en")};D.basismap=function(a,g,c,b){var d=f.turnIntoCSList([a,g,c]),d=f.adjoint3(f.transpose(d));b=v.mult(d,b);d=f.turnIntoCSList([v.mult(b.value[0],a),v.mult(b.value[1],g),
+v.mult(b.value[2],c)]);return f.transpose(d)};t.map$8=function(a,g){var c=M(a[0]),b=M(a[1]),d=M(a[2]),e=M(a[3]),h=M(a[4]),m=M(a[5]),l=M(a[6]),n=M(a[7]);return h!==k&&m!==k&&l!==k&&n!==k&&c!==k&&b!==k&&d!==k&&e!==k?(h=D.basismap(h,m,l,n),c=D.basismap(c,b,d,e),c=v.mult(h,f.adjoint3(c)),f.normalizeMax(c)):k};t.map$6=function(a,g){var c=M(a[0]),b=M(a[1]),d=M(a[2]),e=f.realVector([0,0,1]),h=f.cross,m=h(h(d,h(e,h(c,b))),h(b,h(e,h(c,d)))),l=M(a[3]),n=M(a[4]),q=M(a[5]),e=h(h(q,h(e,h(l,n))),h(n,h(e,h(l,q))));
+return l!==k&&n!==k&&q!==k&&e!==k&&c!==k&&b!==k&&d!==k&&m!==k?(l=D.basismap(l,n,q,e),c=D.basismap(c,b,d,m),c=v.mult(l,f.adjoint3(c)),f.normalizeMax(c)):k};t.map$4=function(a,g){var c=f.ii,b=f.jj,d=M(a[0]),e=M(a[1]),h=M(a[2]),m=M(a[3]);return h!==k&&m!==k&&d!==k&&e!==k?(h=D.basismap(h,m,c,b),c=D.basismap(d,e,c,b),c=v.mult(h,f.adjoint3(c)),f.normalizeMax(c)):k};t.map$2=function(a,g){var c=f.ii,b=f.jj,d=M(a[0]),e=v.add(f.realVector([1,0,0]),d),h=M(a[1]),m=v.add(f.realVector([1,0,0]),h);return h!==k&&
+m!==k&&d!==k&&e!==k?(h=D.basismap(h,m,c,b),c=D.basismap(d,e,c,b),c=v.mult(h,f.adjoint3(c)),f.normalizeMax(c)):k};t.pointreflect$1=function(a,g){var c=f.ii,b=f.jj,d=M(a[0]),e=v.add(f.realVector([1,0,0]),d),h=v.add(f.realVector([-1,0,0]),d);return h!==k&&d!==k&&e!==k?(h=D.basismap(d,h,c,b),c=D.basismap(d,e,c,b),c=v.mult(h,f.adjoint3(c)),f.normalizeMax(c)):k};t.linereflect$1=function(a,g){var c=f.ii,b=f.jj,d=M(a[0]),e=f.realVector([Math.random(),Math.random(),Math.random()]),h=f.realVector([Math.random(),
+Math.random(),Math.random()]),e=f.cross(e,d),h=f.cross(h,d);return d!==k&&e!==k?(d=D.basismap(e,h,c,b),c=D.basismap(e,h,b,c),c=v.mult(d,f.adjoint3(c)),f.normalizeMax(c)):k};D.extractPointVec=function(a){var g={ok:!1};if("geo"===a.ctype){var c=a.value;if("P"===c.kind)return g.x=xa.getField(c,"x"),g.y=xa.getField(c,"y"),g.z=m.real(1),g.ok=!0,g}if("list"!==a.ctype)return g;var b=a.value;if(2===b.length&&(a=b[0],c=b[1],"number"===a.ctype&&"number"===c.ctype))return g.x=a,g.y=c,g.z=m.real(1),g.ok=!0,g;
+3===b.length&&(a=b[0],c=b[1],b=b[2],"number"===a.ctype&&"number"===c.ctype&&"number"===b.ctype&&(g.x=m.div(a,b),g.y=m.div(c,b),g.z=m.real(1),g.ok=!0));return g};t.polygon$1=function(a,g){var c=A(a[0]);if("list"===c.ctype){for(var b=[],d=0;d<c.value.length;d++){var e=D.extractPoint(c.value[d]);if(!e.ok)return k;b[d]={X:e.x,Y:e.y}}return{ctype:"shape",type:"polygon",value:[b]}}return k};t.circle$2=function(a,g){var c=C(a[0]),b=C(a[1]),c=D.extractPointVec(c);if(!c.ok||"number"!==b.ctype)return k;c=f.turnIntoCSList([c.x,
+c.y,c.z]);return{ctype:"shape",type:"circle",value:f.turnIntoCSList([c,b])}};t.screen$0=function(a,g){var c=x.drawingstate.initialmatrix,b=function(a,g){var b=a-c.tx,d=g+c.ty;return{X:(b*c.d-d*c.b)/c.det,Y:-(-b*c.c+d*c.a)/c.det}};return{ctype:"shape",type:"polygon",value:[[b(0,0),b(W,0),b(W,V),b(0,V)]]}};t.halfplane$2=function(a,g){var c=C(a[0]),b=C(a[1]),d=M(c),e=M(b);if(c!==k&&b!==k){var h=b.usage,b=e;if("Line"===c.usage||"Point"===h)d=e,b=c;c=f.turnIntoCSList([b.value[0],b.value[1],m.zero]);c=
+f.cross(c,d);e=f.cross(b,c);e=v.div(e,e.value[2]);d=v.div(d,d.value[2]);d=f.sub(d,e);c=f.abs(d);d=v.div(d,c);c=e.value[0].value.real;e=e.value[1].value.real;b=1E3*d.value[0].value.real;d=1E3*d.value[1].value.real;return{ctype:"shape",type:"polygon",value:[[{X:c+d/2,Y:e-b/2},{X:c+d/2+b,Y:e-b/2+d},{X:c-d/2+b,Y:e+b/2+d},{X:c-d/2,Y:e+b/2}]]}}return k};t.element$1=function(a,g){var c=A(a[0]);return"string"===c.ctype&&u.csnames.hasOwnProperty(c.value)?{ctype:"geo",value:u.csnames[c.value]}:k};D.all$1=function(a,
+g){var c=A(a[0]);return"geo"===c.ctype&&c.value.incidences?f.ofGeos(c.value.incidences.map(function(a){return u.csnames[a]}).filter(g)):f.nil};t.allpoints$0=function(a,g){return f.ofGeos(u.points)};t.allpoints$1=function(a,g){return D.all$1(a,function(a){return"P"===a.kind})};t.allmasses$0=function(a,g){return f.ofGeos(ca)};t.allmasses$1=function(a,g){return D.all$1(a,function(a){return"P"===a.kind&&a.behavior&&"Mass"===a.behavior.type})};t.allsprings$0=function(a,g){return f.ofGeos(xc)};t.allsprings$1=
+function(a,g){return D.all$1(a,function(a){return"S"===a.kind&&a.behavior&&"Spring"===a.behavior.type})};t.alllines$0=function(a,g){return f.ofGeos(u.lines)};t.alllines$1=function(a,g){return D.all$1(a,function(a){return"L"===a.kind||"S"===a.kind})};t.allsegments$0=function(a,g){return f.ofGeos(u.lines.filter(function(a){return"S"===a.kind}))};t.allsegments$1=function(a,g){return D.all$1(a,function(a){return"S"===a.kind})};t.allconics$0=function(a,g){return f.ofGeos(u.conics)};t.allconics$1=function(a,
+g){return D.all$1(a,function(a){return"C"===a.kind})};t.allcircles$0=function(a,g){return f.ofGeos(u.conics.filter(function(a){return"Circle"===a.matrix.usage}))};t.allcircles$1=function(a,g){return D.all$1(a,function(a){return"C"===a.kind&&"Circle"===a.matrix.usage})};t.allelements$0=function(a,g){return f.ofGeos(u.gslp)};t.allelements$1=function(a,g){return D.all$1(a,function(a){return!0})};t.incidences$1=t.allelements$1;t.createpoint$2=function(a,g){var c=A(a[0]),b=M(a[1]);return"string"!==c.ctype?
+(console.log("Name must be a string"),k):"list"!==b.ctype&&f.isNumberVector(b)?(console.log("Position must be a number vector"),k):Da({name:c.value,type:"Free",labeled:!0,pos:b})};t.create$3=function(a,g){var c=A(a[0]),b=A(a[1]),d=A(a[2]),e,h;if("string"===c.ctype)e=c.value;else{if("list"!==c.ctype)return console.log("Names must be a string or a list of strings"),k;if(1!==c.value.length){e=v.string(c.value.map(function(a){return a.value}).join("__"));e=t.create$3([e,b,d],g);if(e!==k)for(b=v.string(e.kind.replace(/^(.*)s$/,
+"Select$1")),d=f.turnIntoCSList([v.string(e.name)]),h=0;h<c.value.length;++h)t.create$3([c.value[h],b,d],{index:m.real(h+1)});return e}if("string"!==c.value[0].ctype)return console.log("Element of names list must be a string"),k;e=c.value[0].value}if("string"!==b.ctype)return console.log("Type must be a string"),k;if("list"!==d.ctype)return console.log("Arguments must be a list"),k;if(!n.hasOwnProperty(b.value)&&!od.hasOwnProperty(b.value))return console.log("Invalid geometric operation: '"+b.value+
+"'"),k;var c=[],l=null;for(h=0;h<d.value.length;h++){var q=d.value[h];if("string"===q.ctype)c.push(q.value);else if("geo"===q.ctype)c.push(q.value.name);else if(l=M(q),l===k)return console.log("Unknown argument type"),k}e={name:e,type:b.value,labeled:!0};l&&(e.pos=l);0<c.length&&(e.args=c);b=C(g.index);"number"===b.ctype&&(e.index=b.value.real|0);return Da(e)};t.javascript$1=function(a,g){var c=A(a[0]);"string"===c.ctype&&(new Function(c.value)).call(qa);return k};t.use$1=function(a,g){function c(a,
+c,g){t[a.toLowerCase()+"$"+c]=g}var b=A(a[0]);if("string"===b.ctype){var b=b.value,d;q.plugins&&(d=q.plugins[b]);d||(d=va._pluginRegistry[b]);if(d)return d({instance:qa,config:q,nada:k,evaluate:A,extractPoint:D.extractPoint,evaluateAndVal:C,defineFunction:c,addShutdownHook:kb.push.bind(kb),addAutoCleaningEventListener:K,getVariable:J.getvar.bind(J),getInitialMatrix:function(){return x.drawingstate.initialmatrix},setTextRenderer:function(a,c){zc=a;c&&(qd=c)},getImage:function(a,c){"string"===typeof a&&
+(a=v.string(a));var g=cb(a);if(!g)return null;!c&&g.cdyUpdate&&g.cdyUpdate();return g},getMyfunction:function(a){return Wa.hasOwnProperty(a)?Wa[a]:null}}),{ctype:"boolean",value:!0};console.log("Plugin "+b+" not found");return{ctype:"boolean",value:!1}}return k};t.format$2=function(a,g){function c(a){a=a.toFixed(f);var c;do c=a,a=a.substring(0,a.length-1);while(""!==a&&"-"!==a&&+a===+c);return""+c}function b(a){var g;return"number"===a.ctype?(g=c(a.value.real),a=c(a.value.imag),g="0"===a?g:"-"===
+a.substring(0,1)?g+" - i*"+a.substring(1):g+" + i*"+a,{ctype:"string",value:g}):"list"===a.ctype?{ctype:"list",value:a.value.map(b)}:{ctype:"string",value:w(a).toString()}}var d=C(a[0]),e=C(a[1]),f;return"number"!==d.ctype&&"list"!==d.ctype||"number"!==e.ctype?k:(f=Math.max(0,Math.min(20,Math.round(e.value.real))),b(d))};Date.now||(Date.now=function(){return(new Date).getTime()});var Dd=0;t.timestamp$0=function(a,g){return m.real(Date.now())};t.seconds$0=function(a,g){return m.real((Date.now()-Dd)/
+1E3)};t.resetclock$0=function(a,g){Dd=Date.now();return k};t.time$0=function(a,g){var c=new Date;return f.realVector([c.getHours(),c.getMinutes(),c.getSeconds(),c.getMilliseconds()])};t.date$0=function(a,g){var c=new Date;return f.realVector([c.getFullYear(),c.getMonth()+1,c.getDate()])};t.simulationtime$0=function(a,g){return m.real(Cb*Ad)};t.settimeout$2=function(a,g){function c(){A(e);b()}var d=A(a[0]),e=a[1];"number"===d.ctype&&"undefined"!==typeof window&&window.setTimeout(c,1E3*d.value.real);
+return k};D.formatForWebGL=function(a){return a.toFixed(10)};t.generateWebGL$2=function(a,g){var c=D.formatForWebGL,b=a[0],d=A(a[1]);console.log(d);if("list"!==d.ctype)return k;for(var e=[],f=0;f<d.value.length;f++)"string"===d.value[f].ctype&&e.push(d.value[f].value);console.log("***********");console.log(e);d=D.plotvars(b);console.log(d);-1===d.indexOf("a")&&-1===d.indexOf("b")&&-1===d.indexOf("c")&&-1===d.indexOf("d")&&-1===d.indexOf("e")&&-1===d.indexOf("f")&&(b=C(b));if("number"===b.ctype)return{ctype:"string",
+value:"vec2("+c(b.value.real)+","+c(b.value.imag)+")"};if("variable"===b.ctype)return{ctype:"string",value:b.name};if("string"===b.ctype||"void"===b.ctype)return b;if(2===b.args.length&&("infix"===b.ctype||"function"===b.ctype)){c=t.compileToWebGL$1([b.args[0]],{});d=t.compileToWebGL$1([b.args[1]],{});if("+"===b.oper||"add"===b.oper)return void 0===c.value||"void"===c.ctype?{ctype:"string",value:d.value}:{ctype:"string",value:"addc("+c.value+","+d.value+")"};if("*"===b.oper||"mult"===b.oper)return{ctype:"string",
+value:"multc("+c.value+","+d.value+")"};if("/"===b.oper||"div"===b.oper)return{ctype:"string",value:"divc("+c.value+","+d.value+")"};if("-"===b.oper||"sub"===b.oper)return void 0===c.value||"void"===c.ctype?{ctype:"string",value:"negc("+d.value+")"}:{ctype:"string",value:"subc("+c.value+","+d.value+")"};if("^"===b.oper||"pow"===b.oper)return{ctype:"string",value:"powc("+c.value+","+d.value+")"}}if("function"===b.ctype&&1===b.args.length){c=t.compileToWebGL$1([b.args[0]],{});if("sin$1"===b.oper)return{ctype:"string",
+value:"sinc("+c.value+")"};if("cos$1"===b.oper)return{ctype:"string",value:"cosc("+c.value+")"};if("tan$1"===b.oper)return{ctype:"string",value:"tanc("+c.value+")"};if("exp$1"===b.oper)return{ctype:"string",value:"expc("+c.value+")"};if("log$1"===b.oper)return{ctype:"string",value:"logc("+c.value+")"};if("arctan$1"===b.oper)return{ctype:"string",value:"arctanc("+c.value+")"};if("arcsin$1"===b.oper)return{ctype:"string",value:"arcsinc("+c.value+")"};if("arccos$1"===b.oper)return{ctype:"string",value:"arccosc("+
+c.value+")"};if("sqrt$1"===b.oper)return{ctype:"string",value:"sqrtc("+c.value+")"}}return k};t.compileToWebGL$1=function(a,g){var c,b;c=D.formatForWebGL;var d=a[0];b=D.plotvars(d);-1===b.indexOf("a")&&-1===b.indexOf("b")&&-1===b.indexOf("c")&&-1===b.indexOf("d")&&-1===b.indexOf("e")&&-1===b.indexOf("f")&&(d=C(d));if("number"===d.ctype)return{ctype:"string",value:"vec2("+c(d.value.real)+","+c(d.value.imag)+")"};if("variable"===d.ctype)return{ctype:"string",value:d.name};if("string"===d.ctype||"void"===
+d.ctype)return d;if(2===d.args.length&&("infix"===d.ctype||"function"===d.ctype)){c=t.compileToWebGL$1([d.args[0]],{});b=t.compileToWebGL$1([d.args[1]],{});if("+"===d.oper||"add"===d.oper)return void 0===c.value||"void"===c.ctype?{ctype:"string",value:b.value}:{ctype:"string",value:"addc("+c.value+","+b.value+")"};if("*"===d.oper||"mult"===d.oper)return{ctype:"string",value:"multc("+c.value+","+b.value+")"};if("/"===d.oper||"div"===d.oper)return{ctype:"string",value:"divc("+c.value+","+b.value+")"};
+if("-"===d.oper||"sub"===d.oper)return void 0===c.value||"void"===c.ctype?{ctype:"string",value:"negc("+b.value+")"}:{ctype:"string",value:"subc("+c.value+","+b.value+")"};if("^"===d.oper||"pow"===d.oper)return{ctype:"string",value:"powc("+c.value+","+b.value+")"}}if("function"===d.ctype&&1===d.args.length){c=t.compileToWebGL$1([d.args[0]],{});if("sin$1"===d.oper)return{ctype:"string",value:"sinc("+c.value+")"};if("cos$1"===d.oper)return{ctype:"string",value:"cosc("+c.value+")"};if("tan$1"===d.oper)return{ctype:"string",
+value:"tanc("+c.value+")"};if("exp$1"===d.oper)return{ctype:"string",value:"expc("+c.value+")"};if("log$1"===d.oper)return{ctype:"string",value:"logc("+c.value+")"};if("arctan$1"===d.oper)return{ctype:"string",value:"arctanc("+c.value+")"};if("arcsin$1"===d.oper)return{ctype:"string",value:"arcsinc("+c.value+")"};if("arccos$1"===d.oper)return{ctype:"string$1",value:"arccosc("+c.value+")"};if("sqrt$1"===d.oper)return{ctype:"string",value:"sqrtc("+c.value+")"}}return k};t.setsimulationspeed$1=function(a,
+b){var c=C(a[0]);"number"===c.ctype&&oa(c.value.real);return k};t.setsimulationaccuracy$1=function(a,b){var c=C(a[0]);"number"===c.ctype&&"undefined"!==typeof N&&"undefined"!==typeof N.env&&(N.env.accuracy=Math.max(1,c.value.real|0));return k};t.setsimulationquality$1=function(a,b){var c=C(a[0]);"number"===c.ctype&&"undefined"!==typeof N&&"undefined"!==typeof N.env&&(c=c.value.real,0===c&&(N.env.errorbound=.01,N.env.lowestdeltat=1E-5,N.env.slowdownfactor=2),1===c&&(N.env.errorbound=.001,N.env.lowestdeltat=
+1E-7,N.env.slowdownfactor=2),2===c&&(N.env.errorbound=1E-5,N.env.lowestdeltat=1E-10,N.env.slowdownfactor=4),3===c&&(N.env.errorbound=1E-6,N.env.lowestdeltat=1E-12,N.env.slowdownfactor=4));return k};var Vb=null,cc=null;t.createtool$3=function(a,b){var c,d="left",e="top",f=null;b.space&&(c=A(b.space),"number"===c.ctype&&(f=c.value.real/2));var h=null;b.toolbar&&(c=A(b.toolbar),"string"===c.ctype&&((h=document.getElementById(c.value))||console.warn("Element #"+c.value+" not found")));if(!h){if(b.reference){var m=
+A(b.reference);if("string"===m.ctype)switch(m.value){case "UR":d="right";break;case "LL":e="bottom";break;case "LR":d="right",e="bottom"}}h=document.createElement("div");h.className="CindyJS-toolbar";ga.parentNode.appendChild(h);m=A(a[1]);c=A(a[2]);"number"===m.ctype&&(h.style[d]=m.value.real+"px");"number"===c.ctype&&(h.style[e]=c.value.real+"px");null!==f&&(h.style.margin=-f+"px")}m=A(a[0]);if("string"===m.ctype)m=[[m.value]];else if("list"===m.ctype)m=m.value.map(function(a){return"string"===a.ctype?
+[a.value]:"list"===a.ctype?a.value.map(function(a){return"string"===a.ctype?a.value:null}):[null]});else return console.log("Name must be a string or a list of strings"),k;if(b.flipped&&(c=A(b.flipped),"boolean"===c.ctype&&c.value)){console.log("Flipping");var l=0;c=m.length;m.forEach(function(a){a.length>l&&(l=a.length)});for(var n=[],q=0;q<l;++q){n[q]=[];for(var r=0;r<c;++r)n[q][r]=m[r][q]||null}m=n}"bottom"===e&&m.reverse();m.forEach(function(a){"right"===d&&a.reverse();var c=document.createElement("div");
+h.appendChild(c);a.forEach(function(a){function b(){Vb&&Vb.classList.remove("CindyJS-active");Vb=d;d.classList.add("CindyJS-active");oc=a;var c=F[oc].actions;cc&&(cc.textContent=c[0].tooltip||"");ta=[];tb=Qa=0}F.hasOwnProperty(a)||(console.log("Tool '"+a+"' not implemented yet."),a=null);if(null===a){var g=document.createElement("span");g.className="CindyJS-spacer";c.appendChild(g)}else{var d=document.createElement("button"),g=document.createElement("img");g.src=va.getBaseDir()+"images/"+a+".png";
+d.appendChild(g);d.addEventListener("click",b);Vb||b();null!==f&&(d.style.margin=f+"px");c.appendChild(d)}})});return k};t.dropped$0=function(){return jc};t.droppoint$0=function(){return kc};t.parsecsv$1=function(a,b){var c=!0,d=C(b.autoconvert);"boolean"===d.ctype&&(c=d.value);var e=null,d=C(b.delimiter);"string"===d.ctype&&/^[^\"\r\n]$/.test(d.value)&&(e=d.value);d=C(a[0]);if("string"!==d.ctype)return console.log("CSV data is not a string"),k;var d=d.value,h='(?:"((?:[^"]+|"")*)"|([^]*?))(\r\n|(,)|[\r\n]|$)';
+e&&(e=e.replace(/[^A-Za-z0-9]/g,"\\$&").replace(/\$/g,"$$$$"),h=h.replace(/,/g,e));for(var h=new RegExp(h,"g"),e=[],l=[],n=null;h.lastIndex<d.length;){var q=h.exec(d),r=q[2];"string"===typeof q[1]&&(r=q[1].replace(/""/g,'"'));r=c?/^[Tt]rue$/.test(r)?v.bool(!0):/^[Ff]alse$/.test(r)?v.bool(!1):/^[\-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+|Infinity)$/.test(r)?m.real(Number(r)):v.string(r):v.string(r);e.push(r);q[4]&&h.lastIndex===d.length&&(e.push(v.string("")),q={});if(!q[4]){null===n&&(n=e.length);if(n<e.length)for(n=
+e.length,q=0;q<l.length;++q)for(r=l[q].length;r<n;++r)l[q][r]=k;else if(n>e.length)for(q=e.length;q<n;++q)e[q]=k;l.push(e);e=[]}}return f.turnIntoCSList(l.map(f.turnIntoCSList))};t.load$2=function(a,b){return t.load$3([a[0],null,a[1]],b)};t.load$3=function(a,g){function c(){if(h.readyState===XMLHttpRequest.DONE){var c;200===h.status?c=v.string(String(h.responseText)):(ha.err("Failed to load "+f+": "+h.statusText),c=k);J.newvar(d);J.setvar(d,c);A(a[2]);J.removevar(d);b()}}var d="#";null!==a[1]&&"variable"===
+a[1].ctype&&(d=a[1].name);var e=C(a[0]),f=null,h=null;"string"===e.ctype&&/^https?:\/\//.test(e.value)&&(f=e.value);return null!==f?(h=new XMLHttpRequest,h.onreadystatechange=c,h.open("GET",f),h.send(),v.bool(!0)):k};D.extractPoint=function(a){var b={ok:!1};if("geo"===a.ctype){var c=a.value;if("P"===c.kind)return b.x=xa.getField(c,"x").value.real,b.y=xa.getField(c,"y").value.real,b.ok=!0,b}if("list"!==a.ctype)return b;var d=a.value;if(2===d.length&&(a=d[0],c=d[1],"number"===a.ctype&&"number"===c.ctype))return b.x=
+a.value.real,b.y=c.value.real,b.ok=!0,b;3===d.length&&(a=d[0],c=d[1],d=d[2],"number"===a.ctype&&"number"===c.ctype&&"number"===d.ctype&&(a=m.div(a,d),c=m.div(c,d),b.x=a.value.real,b.y=c.value.real,b.ok=!0));return b};t.draw$1=function(a,b){var c=C(a[0]);if("shape"===c.ctype)D.drawshape(c,b);else if("Line"===c.usage)y.handleModifs(b,y.lineModifs),y.drawline(c);else{var d=D.extractPoint(c);if(!d.ok){if("undefined"!==typeof c.value&&2===c.value.length)return t.draw$2(c.value,b);return}null!==b&&y.handleModifs(b,
+y.pointModifs);y.drawpoint(d)}return k};t.draw$2=function(a,b){var c=C(a[0]),d=C(a[1]),c=D.extractPoint(c),d=D.extractPoint(d);if(!c.ok||!d.ok)return k;null!==b&&y.handleModifs(b,y.lineModifs);y.drawsegcore(c,d);return k};t.drawcircle$2=function(a,b){return D.drawcircle(a,b,"D")};D.arcHelper=function(a){var b={};b.startPoint=M(a[0]);b.viaPoint=M(a[1]);b.endPoint=M(a[2]);return b};t.fillcircle$2=function(a,b){return D.drawcircle(a,b,"F")};t.drawarc$3=function(a,b){var c=D.arcHelper(a);return D.drawarc(c,
+b,"D")};t.fillarc$3=function(a,b){var c=D.arcHelper(a);return D.drawarc(c,b,"F")};D.drawarc=function(a,b,c){var d=a.startPoint,e=a.viaPoint;a=a.endPoint;if(!f._helper.isAlmostReal(f.turnIntoCSList([d,e,a])))return k;y.handleModifs(b,y.conicModifs);y.preDrawCurve();b=f.det3(d,e,a);if(1E-12<Math.abs(b.value.real)){b=n._helper.ConicBy5(null,d,e,a,f.ii,f.jj);var h=n._helper.CenterOfConic(b),h=f.normalizeMax(h);b=m.real(0);var l=f.turnIntoCSList([f.turnIntoCSList([h.value[2],b,m.neg(h.value[0])]),f.turnIntoCSList([b,
+h.value[2],m.neg(h.value[1])]),f.turnIntoCSList([b,b,h.value[2]])]);b=f.normalizeZ(v.mult(l,d));f.normalizeZ(v.mult(l,e));l=f.normalizeZ(v.mult(l,a));b=-Math.atan2(b.value[1].value.real,b.value[0].value.real);l=-Math.atan2(l.value[1].value.real,l.value[0].value.real);h=f.normalizeZ(h);d=f.normalizeZ(d);e=f.normalizeZ(e);a=f.normalizeZ(a);var q=f.abs(f.sub(d,h)),r=[h.value[0].value.real,h.value[1].value.real],h=x.drawingstate.matrix,t=r[0]*h.a-r[1]*h.b+h.tx,r=r[0]*h.c-r[1]*h.d-h.ty,d=0<f.det3(d,e,
+a).value.real;z.save();z.beginPath();z.translate(t,r);z.arc(0,0,q.value.real*h.sdet,b,l,d);"F"===c&&(z.fillStyle=y.lineColor,z.closePath(),z.fill());"D"===c&&z.stroke();z.restore()}else{if("D"!==c)return k;c=D.extractPoint(d);b=D.extractPoint(e);l=D.extractPoint(a);if(!c.ok||!b.ok||!l.ok)return k;q=(c.x-l.x)*(c.x-l.x)+(c.y-l.y)*(c.y-l.y);h=(l.x-b.x)*(l.x-b.x)+(l.y-b.y)*(l.y-b.y);if(1E-12>(c.x-b.x)*(c.x-b.x)+(c.y-b.y)*(c.y-b.y)||1E-12>q||1E-12>h)return k;0>f.crossratio3(d,a,e,f.cross(f.cross(d,e),
+f.linfty),f.ii).value.real?y.drawsegcore(c,l):y.drawRaySegment(d,a)}return k};D.drawcircle=function(a,b,c){var d=C(a[0]);a=C(a[1]);var e=D.extractPoint(d);if(!e.ok||"number"!==a.ctype||!m._helper.isAlmostReal(a))return k;var d=x.drawingstate.matrix,f=e.x*d.a-e.y*d.b+d.tx,e=e.x*d.c-e.y*d.d-d.ty;y.handleModifs(b,y.conicModifs);y.preDrawCurve();z.lineJoin="miter";z.beginPath();z.arc(f,e,Math.abs(a.value.real)*d.sdet,0,2*Math.PI);z.closePath();"D"===c&&z.stroke();"F"===c&&(z.fillStyle=y.lineColor,z.fill());
+"C"===c&&z.clip();return k};t.drawconic$1=function(a,b){var c;c=C(a[0]);if("list"!==c.ctype||3!==c.value.length&&6!==c.value.length)return console.error("could not parse conic"),k;if(6===c.value.length){for(var d=0;6>d;d++)if("number"!==c.value[d].ctype)return console.error("could not parse conic"),k;var e=m.real(.5),d=c.value[0],h=c.value[2],h=m.mult(h,e),l=c.value[1],n=c.value[3],n=m.mult(n,e),q=c.value[4],q=m.mult(q,e);c=c.value[5];c=f.turnIntoCSList([f.turnIntoCSList([d,h,n]),f.turnIntoCSList([h,
+l,q]),f.turnIntoCSList([n,q,c])])}else{for(d=0;3>d;d++)for(h=0;3>h;h++)if("number"!==c.value[d].value[h].ctype)return console.error("could not parse conic"),k;f.equals(c,f.transpose(c)).value||(d=v.mult(c,m.real(.5)),c=v.mult(f.transpose(c),m.real(.5)),c=f.add(d,c))}c=f.normalizeMax(c);return D.drawconic(c,b)};D.drawconic=function(a,b){y.handleModifs(b,y.conicModifs);if(0!==y.lsize){y.preDrawCurve();for(var c=f.normalizeMax(a),d=c,e=0;2>e;e++)for(var h=0;2>h;h++)if(Math.abs(c.value[e].value[h].value.imag)>
+m.eps)return;e=f.turnIntoCSList([f.realVector([-1,-1,1]),f.realVector([1,0,0]),f.realVector([0,1,0])]);h=x.from(0,0,1);h[2]=1;var l=x.from(1,0,1);l[2]=1;var q=x.from(0,1,1);q[2]=1;var h=f.turnIntoCSList([f.realVector(h),f.realVector(l),f.realVector(q)]),h=f.transpose(h),e=v.mult(h,e),e=f.inverse(e),c=v.mult(f.transpose(e),c),c=v.mult(c,e),e=c.value[0].value[0].value.real,h=c.value[1].value[0].value.real,l=c.value[1].value[1].value.real,q=c.value[2].value[0].value.real,r=c.value[2].value[1].value.real,
+u=c.value[2].value[2].value.real,c=[[e,h,q],[h,l,r],[q,r,u]],w=1E-14>Math.abs(e*l*u-e*r*r-h*h*u+2*h*q*r-l*q*q);if(w&&"Circle"===a.usage){var A=v.mult(f.adjoint3(d),f.linfty);m.abs(A.value[2]).value.real>m.eps&&(w=!1)}var A=W>V?W:V,B=-1.5*A,C=1.5*A,D=-1.5*A,ec=1.5*A,E=1;w&&(E=0);if(E)var q=0,q=1E-14<Math.abs(e-h)?Math.atan(h/e-l)/2:Math.PI/4,F=function(a){var c=Math.cos(a);a=Math.sin(a);return[[c,-a,0],[a,c,0],[0,0,1]]}(q),F=f.realMatrix(F),e=f.transpose(F),c=v.mult(f.realMatrix(c),F),c=v.mult(e,c),
+e=c.value[0].value[0].value.real,h=c.value[1].value[0].value.real,l=c.value[1].value[1].value.real,q=c.value[2].value[0].value.real,r=c.value[2].value[1].value.real,u=c.value[2].value[2].value.real;var c=[e,h,l,q,r,u],e=function(){var a=n._helper.splitDegenConic(d);if(a!==k){var c=a[1],a=[a[0]];t.draw$1(a,b);a[0]=c;t.draw$1(a,b)}},G=function(a){"undefined"!==a&&6===a.length||console.error("this does not define a Conic");if(w)return"degenerate";a=a[0]*a[2]-a[1]*a[1];return 1E-14>Math.abs(a)?"parabola":
+1E-14<a?"ellipsoid":"hyperbola"};G(c);var H=function(a,c){return 0<a&&a<W&&0<c&&c<V},I=[],J=[],K=[],L=[],M=[],N=[],O=function(){I=[];J=[];K=[];L=[];M=[];N=[]},P=function(a,c){z.beginPath();z.moveTo(a[0],c[0]);for(var b=1;b<a.length;b++)z.lineTo(a[b],c[b]);z.stroke()},Q=function(a,c,b){var g,d,e=G(a);if(6!==a.length)console.error("Conic needs 6 Parameters");else{var p=a[0],h=a[1],k=a[2],m=a[3],l=a[4];a=a[5];var n;g=b-c;for(var ba=.1*g+c,q=b-.1*g,R=c;R<=b;R+=n){n=R<ba||R>q||100>Math.abs(b-c)?.5:0>R||
+R>V?10:3;d=-p*k*R*R-2*p*l*R-p*a+h*h*R*R+2*h*m*R+m*m;d=Math.sqrt(d);g=1/p*(-h*R-m+d);d=-1/p*(h*R+m+d);var r,Ca;E?(r=[g,R,1],Ca=[d,R,1],r=v.mult(F,f.realVector(r)),Ca=v.mult(F,f.realVector(Ca)),g=r.value[0].value.real,d=Ca.value[0].value.real,r=r.value[1].value.real,Ca=Ca.value[1].value.real):Ca=r=R;isNaN(g)||"ellipsoid"!==e?!isNaN(g)&&g>=B&&g<=C&&(I.push(g),K.push(r)):(I.push(g),K.push(r));isNaN(d)||"ellipsoid"!==e?!isNaN(d)&&d>=B&&d<=C&&(J.push(d),L.push(Ca)):(J.push(d),L.push(Ca))}}},h=function(a){var c,
+b,g;G(a);if(6!==a.length)console.error("Conic needs 6 Parameters");else{g=a[0];var d=a[1],e=a[2],f=a[3],p=a[4],h=a[5];c=-g*p+d*f;b=Math.sqrt(g*(-g*e*h+g*Math.pow(p,2)+Math.pow(d,2)*h-2*d*f*p+e*Math.pow(f,2)));e=g*e-Math.pow(d,2);1E-14<Math.abs(e)?(g=(c-b)/e,b=(c+b)/e):b=g=(-g*h+f*f)/(2*g*p-2*d*f);!isNaN(g)&&g>D&&g<ec||(g=D);!isNaN(b)&&b>D&&b<ec||(b=D);c=g<b?g:b;b=g>b?g:b;Q(a,D,c);M=I.concat(J.reverse());N=K.concat(L.reverse());P(M,N);O();Q(a,b,ec);P(I,K);if(H(I[0],K[1])||H(J[0],L[0]))z.beginPath(),
+z.moveTo(I[0],K[0]),z.lineTo(J[0],L[0]),z.stroke();P(J,L);O();Q(a,c,b);P(I,K);z.beginPath();z.moveTo(I[0],K[0]);z.lineTo(J[0],L[0]);z.stroke();z.beginPath();z.moveTo(I[I.length-1],K[K.length-1]);z.lineTo(J[J.length-1],L[L.length-1]);z.stroke();P(J,L);O()}};w?e():h(c)}};t.drawall$1=function(a,b){var c=A(a[0]);if("list"===c.ctype){y.handleModifs(b,y.pointAndLineModifs);for(var d=0;d<c.value.length;d++)t.draw$1([c.value[d]],null)}return k};t.connect$1=function(a,b){return D.drawpolygon(a,b,"D",!1)};
+t.drawpoly$1=function(a,b){return D.drawpolygon(a,b,"D",!0)};t.fillpoly$1=function(a,b){return D.drawpolygon(a,b,"F",!0)};t.drawpolygon$1=function(a,b){return D.drawpolygon(a,b,"D",!0)};t.fillpolygon$1=function(a,b){return D.drawpolygon(a,b,"F",!0)};D.drawpolygon=function(a,b,c,d){function e(){for(var a=m.value,c=0;c<a.length;c++){var b=a[c],g;for(g=0;g<b.length;g++){var d=b[g],f=d.X*h.a-d.Y*h.b+h.tx,d=d.X*h.c-d.Y*h.d-h.ty;0===g?z.moveTo(f,d):z.lineTo(f,d)}z.closePath()}}function f(){var a;for(a=
+0;a<m.value.length;a++){var c=D.extractPoint(m.value[a]);if(!c.ok)return;var b=c.x*h.a-c.y*h.b+h.tx,c=c.x*h.c-c.y*h.d-h.ty;0===a?z.moveTo(b,c):z.lineTo(b,c)}d&&z.closePath()}y.handleModifs(b,y.conicModifs);y.preDrawCurve();z.mozFillRule="evenodd";var h=x.drawingstate.matrix,m=A(a[0]);z.beginPath();"list"===m.ctype&&f();"shape"===m.ctype&&e();"D"===c&&(y.fillColor&&(z.fillStyle=y.fillColor,z.fill()),z.stroke());"F"===c&&(z.fillStyle=y.lineColor,z.fill());"C"===c&&z.clip();return k};var zc=Wc,qd=function(a,
+b,c){if(-1!==b.indexOf("\n"))for(b=b.split("\n"),a.textContent=b[0],c=1;c<b.length;++c)a.appendChild(document.createElement("br")),a.appendChild(document.createTextNode(b[c]));else a.textContent=b};D.drawtext=function(a,b,c){var d=C(a[0]);a=A(a[1]);var e=D.extractPoint(d);if(!e.ok)return null;y.handleModifs(b,y.textModifs);b=x.drawingstate.textsize;null===b&&(b=ja.textsize);null!==y.size&&(b=y.size);z.fillStyle=y.textColor;var f=x.drawingstate.matrix,d=e.x*f.a-e.y*f.b+f.tx+y.xOffset,e=e.x*f.c-e.y*
+f.d-f.ty-y.yOffset;a=w(a);f=y.bold+y.italics+Math.round(10*b)/10+"px "+y.family;z.font=f;return c?c(a,f,d,e,y.align,b):zc(z,a,d,e,y.align,b,b*ja.lineHeight)};t.drawtext$2=function(a,b){D.drawtext(a,b,null);return k};t.drawtable$2=function(a,b){var c=C(a[0]),d=C(a[1]),e=D.extractPoint(c);if(!e.ok||"list"!==d.ctype)return k;var d=d.value,c=d.length,h=-1,m;for(m=0;m<c;++m)"list"===d[m].ctype&&d[m].value.length>h&&(h=d[m].value.length);-1===h?(d=d.map(function(a){return[a]}),h=1):d=d.map(function(a){return f.asList(a).value});
+var l=100,n=null,q=!0,r=x.drawingstate.textcolor;y.handleModifs(b,{size:!0,color:function(a){f._helper.isNumberVecN(a,3)&&(r=y.makeColor([a.value[0].value.real,a.value[1].value.real,a.value[2].value.real]))},alpha:!0,bold:!0,italics:!0,family:!0,align:!0,x_offset:!0,y_offset:!0,offset:!0,width:function(a){"number"===a.ctype&&(l=a.value.real)},height:function(a){"number"===a.ctype&&(n=a.value.real)},border:function(a){"boolean"===a.ctype&&(q=a.value)}});var t=x.drawingstate.textsize;null===t&&(t=ja.textsize);
+null!==y.size&&(t=y.size);null===n&&(n=1.6*t);z.font=y.bold+y.italics+Math.round(10*t)/10+"px "+y.family;m=x.drawingstate.matrix;var u=h*l,v=c*n,t=e.x*m.a-e.y*m.b+m.tx+y.xOffset,A=e.x*m.c-e.y*m.d-m.ty-y.yOffset-v;if(q){y.preDrawCurve();z.strokeStyle=y.lineColor;z.beginPath();for(m=1;m<c;++m)z.moveTo(t,A+m*n),z.lineTo(t+u,A+m*n);for(e=1;e<h;++e)z.moveTo(t+e*l,A),z.lineTo(t+e*l,A+v);z.stroke();z.lineWidth=y.lsize+1;z.beginPath();z.rect(t,A,u,v);z.stroke()}t+=y.align*l+(1-2*y.align)*n*.3;A+=.7*n;z.fillStyle=
+r;for(m=0;m<c;++m)for(e=0;e<h;++e)u=w(d[m][e]),zc(z,u,t+e*l,A+m*n,y.align);return k};D.drawshape=function(a,b){return"polygon"===a.type?D.drawpolygon([a],b,"D",1):"circle"===a.type?D.drawcircle([a.value.value[0],a.value.value[1]],b,"D"):k};D.fillshape=function(a,b){return"polygon"===a.type?D.drawpolygon([a],b,"F",1):"circle"===a.type?D.drawcircle([a.value.value[0],a.value.value[1]],b,"F"):k};D.clipshape=function(a,b){return"polygon"===a.type?D.drawpolygon([a],b,"C",1):"circle"===a.type?D.drawcircle([a.value.value[0],
+a.value.value[1]],b,"C"):k};t.fill$1=function(a,b){var c=A(a[0]);return"shape"===c.ctype?D.fillshape(c,b):k};t.clip$1=function(a,b){var c=A(a[0]);return"shape"===c.ctype?D.clipshape(c,b):"list"===c.ctype?(c=t.polygon$1(a,[]),t.clip$1([c],[])):k};t.plot$1=function(a,b){return t.plot$2([a[0],null],b)};t.plot$2=function(a,b){function c(a){return"number"===a.ctype&&m._helper.isAlmostReal(a)}function d(a,c,b,g,e){n++;c=+c.value.real;e=+g.value.real;g=c*E.a-e*E.b+E.tx;c=c*E.c-e*E.d-E.ty;a=+a.value.real;
+e=+b.value.real;b=a*E.a-e*E.b+E.tx;a=a*E.c-e*E.d-E.ty;q?(z.lineTo(b,a),z.lineTo(g,c)):(z.beginPath(),z.moveTo(b,a),z.lineTo(g,c),q=!0)}function e(a,b,g,f,k){var n=c(g),r=c(f);if(.001>k)!h&&q&&(z.stroke(),q=!1);else if(n||r){var t=m.real((a.value.real+b.value.real)/2);J.setvar(B,t);var u=A(w),v=c(u);if(n&&r&&v){var Mb=g.value.real,r=u.value.real,v=f.value.real;if(n=1>Math.abs(Mb+v-2*r)/l){var x=m.real((a.value.real+t.value.real)/2);J.setvar(B,x);var x=A(w),y=m.real((t.value.real+b.value.real)/2);J.setvar(B,
+y);y=A(w);Mb=Math.abs(Mb+r-2*x.value.real)/l;r=Math.abs(r+v-2*y.value.real)/l;n=n&&1>Mb&&1>r}n?(d(a,t,g,u,k/2),d(t,b,u,f,k/2)):(e(a,t,g,u,k/2),e(t,b,u,f,k/2))}else e(a,t,g,u,k/2),e(t,b,u,f,k/2)}}var h=!1,l=.2/Jb,n=0,q=!1,r=-10,t=10,u=.1,v=1E3,w=a[0],B;if(null!==a[1]&&"variable"===a[1].ctype)B=a[1].name;else{var C=D.plotvars(w);B="#";-1!==C.indexOf("t")&&(B="t");-1!==C.indexOf("z")&&(B="z");-1!==C.indexOf("y")&&(B="y");-1!==C.indexOf("x")&&(B="x")}J.newvar(B);var E=x.drawingstate.matrix;y.handleModifs(b,
+{color:!0,alpha:!0,size:!0,dashpattern:!0,dashtype:!0,dashing:!0,lineCap:!0,lineJoin:!0,miterLimit:!0,connect:function(a){"boolean"===a.ctype&&(h=a.value)},start:function(a){"number"===a.ctype&&(r=a.value.real)},stop:function(a){"number"===a.ctype&&(t=a.value.real)},steps:function(a){"number"===a.ctype&&(v=a.value.real)}});z.strokeStyle=y.lineColor;z.lineWidth=y.lsize;var F,G,H,I,q=!1,C=m.real(14.32);J.setvar(B,C);H=A(w);if("number"!==H.ctype){if(f.isNumberVector(H).value&&2===H.value.length){q=!1;
+u=(t-r)/v;for(C=r;C<t;C+=u)J.setvar(B,m.real(C)),I=A(w),f.isNumberVector(I).value&&2===I.value.length&&(F=+I.value[0].value.real,G=+I.value[1].value.real,I=F*E.a-G*E.b+E.tx,F=F*E.c-G*E.d-E.ty,q?z.lineTo(I,F):(z.beginPath(),z.moveTo(I,F),q=!0));z.stroke();J.removevar(B)}return k}for(I=r;I<t+u;I+=u)C=m.real(I),J.setvar(B,C),H=A(w),C.value.real>r&&e(F,C,G,H,u),F=C,G=H;J.removevar(B);q&&z.stroke();return k};t.plotX$1=function(a,b){var c=a[0],d=D.plotvars(c),e="#";-1!==d.indexOf("t")&&(e="t");-1!==d.indexOf("z")&&
+(e="z");-1!==d.indexOf("y")&&(e="y");-1!==d.indexOf("x")&&(e="x");J.newvar(e);d=x.drawingstate.matrix;z.fillStyle=x.drawingstate.linecolor;z.lineWidth=1;z.lineCap=y.lineCap;z.lineJoin=y.lineJoin;z.miterLimit=y.miterLimit;for(var f=!1,h=-10;10>h;h+=.01){J.setvar(e,m.real(h));var l=A(c);if("number"===l.ctype){var n=+l.value.real,l=h*d.a-n*d.b+d.tx,n=h*d.c-n*d.d-d.ty;f?z.lineTo(l,n):(z.beginPath(),z.moveTo(l,n),f=!0)}}z.stroke();J.removevar(e);return k};D.plotvars=function(a){function b(a,c){var g={},
+d;for(d=a.length-1;0<=d;--d)g[a[d]]=a[d];for(d=c.length-1;0<=d;--d)g[c[d]]=c[d];d=[];for(var e in g)g.hasOwnProperty(e)&&d.push(g[e]);return d}function c(a,c){for(var b=0;b<a.length;b++)a[b]===c&&(a.splice(b,1),b--);return a}var d,e,f,h;if("variable"===a.ctype)return[a.name];if("infix"===a.ctype)return d=D.plotvars(a.args[0]),a=D.plotvars(a.args[1]),b(d,a);if("list"===a.ctype){f=a.value;e=[];for(h=0;h<f.length;h++)d=D.plotvars(f[h]),e=b(e,d);return e}if("function"===a.ctype){f=a.args;e=[];for(h=0;h<
+f.length;h++)d=D.plotvars(f[h]),e=b(e,d);"apply"!==a.oper&&"select"!==a.oper&&"forall"!==a.oper&&"sum"!==a.oper&&"product"!==a.oper&&"repeat"!==a.oper&&"min"!==a.oper&&"max"!==a.oper&&"sort"!==a.oper||"variable"!==a.args[1].ctype||(e=c(e,a.args[1].name));return e}return[]};t.clrscr$0=function(a,b){"undefined"!==typeof W&&"undefined"!==typeof V&&z.clearRect(0,0,W,V);return k};t.repaint$0=function(a,g){b();return k};t.screenbounds$0=function(a,b){var c=v.withUsage(f.realVector(x.to(0,0)),"Point"),d=
+v.withUsage(f.realVector(x.to(W,0)),"Point"),e=v.withUsage(f.realVector(x.to(W,V)),"Point"),h=v.withUsage(f.realVector(x.to(0,V)),"Point");return f.turnIntoCSList([c,d,e,h])};t.createimage$3=function(a,b){var c=A(a[0]),d=C(a[1]),e=C(a[2]);if("number"!==d.ctype||"number"!==e.ctype||"string"!==c.ctype)return k;var f=document.createElement("canvas");f.id=c.value;f.width=d.value.real;f.height=e.value.real;f.style.display="none";document.body.appendChild(f);ab[c.value]=X(f);return k};t.clearimage$1=function(a,
+b){var c=A(a[0]);if("string"!==c.ctype&&"image"!==c.ctype)return k;var c=cb(c),d=c.img;if("undefined"===typeof d||null===d)return k;var e=c.width,f=c.height;d.getContext("2d").clearRect(0,0,e,f);c.generation++;return k};t.canvas$4=function(a,b){var c=C(a[0]),d=C(a[1]),e=A(a[2]),f=a[3],h=D.extractPoint(c),m=D.extractPoint(d);if(!h.ok||!m.ok||"string"!==e.ctype&&"image"!==e.ctype)return k;e=cb(e);if(!e||!e.img.getContext)return k;var d=e.img,l=e.width,c=e.height,n=m.x-h.x,q=m.y-h.y,r=h.x-q*c/l,t=h.y+
+n*c/l,q=m.x-q*c/l,n=m.y+n*c/l,m=x.from(h.x,h.y,1),r=x.from(r,t,1),q=x.from(q,n,1),h=m[0],t=m[1],n=r[0],u=r[1],v=q[0],w=q[1],r=l*(t-u)/((h-n)*(t-w)-(h-v)*(t-u)),l=l*(h-n)/((t-u)*(h-v)-(t-w)*(h-n)),q=-r*h-l*t,m=(c*(t-w)-c*(t-u))/((h-n)*(t-w)-(h-v)*(t-u)),n=(c*(h-v)-c*(h-n))/((t-u)*(h-v)-(t-w)*(h-n)),c=c-m*h-n*t,d=d.getContext("2d"),h=z;z=d;z.save();z.transform(r,m,l,n,q,c);e.generation++;A(f);z.restore();z=h};t.canvas$5=function(a,b){var c=C(a[0]),d=C(a[1]),e=C(a[2]),f=A(a[3]),h=a[4],c=D.extractPoint(c),
+m=D.extractPoint(d),l=D.extractPoint(e);if(!c.ok||!m.ok||!l.ok||"string"!==f.ctype&&"image"!==f.ctype)return k;f=cb(f);if(!f||!f.img.getContext)return k;var e=f.img,n=f.width,d=f.height,q=x.from(c.x,c.y,1),r=x.from(m.x,m.y,1),m=x.from(l.x,l.y,1),c=q[0],l=q[1],t=r[0],u=r[1],v=m[0],w=m[1],m=((0-n)*(l-w)-0*(l-u))/((c-t)*(l-w)-(c-v)*(l-u)),n=((0-n)*(c-v)-0*(c-t))/((l-u)*(c-v)-(l-w)*(c-t)),r=0-m*c-n*l,q=((d-d)*(l-w)-(d-0)*(l-u))/((c-t)*(l-w)-(c-v)*(l-u)),t=((d-d)*(c-v)-(d-0)*(c-t))/((l-u)*(c-v)-(l-w)*
+(c-t)),d=d-q*c-t*l,e=e.getContext("2d"),c=z;z=e;z.save();z.transform(m,q,n,t,r,d);f.generation++;A(h);z.restore();z=c};t.screenresolution$0=function(a,b){return m.real(x.drawingstate.matrix.a)};t.layer$1=function(a,b){};t.imagesize$1=function(a,b){var c=cb(C(a[0]));return c?f.realVector([+c.width,+c.height]):k};t.imageready$1=function(a,b){var c=cb(C(a[0]));return v.bool(!(!c||!c.ready))};t.drawimage$2=function(a,b){function c(){var a=1,c=1,d=1,p=1,h=0,m=1,n=D.extractPoint(e);if(!n.ok)return k;l=
+cb(l);if(!l)return k;z.save();var q;void 0!==b.angle&&(q=A(b.angle),"number"===q.ctype&&(h=q.value.real));void 0!==b.rotation&&(q=A(b.rotation),"number"===q.ctype&&(h=q.value.real));void 0!==b.scale&&(q=C(b.scale),"number"===q.ctype&&(c=a=q.value.real),f.isNumberVector(q).value&&2===q.value.length&&(a=q.value[0].value.real,c=q.value[1].value.real));void 0!==b.scalex&&(q=A(b.scalex),"number"===q.ctype&&(a=q.value.real));void 0!==b.scaley&&(q=A(b.scaley),"number"===q.ctype&&(c=q.value.real));void 0!==
+b.flipx&&(q=A(b.flipx),"boolean"===q.ctype&&q.value&&(d=-1));void 0!==b.flipy&&(q=A(b.flipy),"boolean"===q.ctype&&q.value&&(p=-1));void 0!==b.alpha&&(q=A(b.alpha),"number"===q.ctype&&(m=q.value.real));var r=x.drawingstate.matrix,R=x.drawingstate.initialmatrix,t=l.width,u=l.height;q=n.x*r.a-n.y*r.b+r.tx;var v=n.x*r.c-n.y*r.d-r.ty,w=(n.x+1)*r.a-n.y*r.b+r.tx-q,r=(n.x+1)*r.c-n.y*r.d-r.ty-v,Ca=(n.x+1)*R.a-n.y*R.b+R.tx-(n.x*R.a-n.y*R.b+R.tx),R=(n.x+1)*R.c-n.y*R.d-R.ty-(n.x*R.c-n.y*R.d-R.ty),n=Math.sqrt(w*
+w+r*r)/Math.sqrt(Ca*Ca+R*R),w=-Math.atan2(w,r)+Math.atan2(Ca,R),r=x.drawingstate.matrix.sdet/72,a=a*r,c=c*r;1!==m&&(z.globalAlpha=m);z.translate(q,v);z.scale(a*d*n,c*p*n);z.rotate(h+w);z.translate(-q,-v);z.translate(-t/2,-u/2);a=l;a.drawTo?a.drawTo(z,q,v):z.drawImage(a.img,q,v);z.globalAlpha=1;z.restore()}function d(){var a=1,c=1,f=1,p=1,n=D.extractPoint(e),q=D.extractPoint(h),r;if(!n.ok||!q.ok)return k;l=cb(l);if(!l)return k;var t=l.width,u=l.height;if(0===m)r={},r.x=n.x-(q.y-n.y),r.y=n.y+(q.x-n.x),
+p=u/t;else if(r=D.extractPoint(m),!n.ok)return k;z.save();var v;void 0!==b.alpha&&(v=A(b.alpha),"number"===v.ctype&&(a=v.value.real));void 0!==b.aspect&&(v=A(b.aspect),"number"===v.ctype&&(p=v.value.real));void 0!==b.flipx&&(v=A(b.flipx),"boolean"===v.ctype&&v.value&&(c=-1));void 0!==b.flipy&&(v=A(b.flipy),"boolean"===v.ctype&&v.value&&(f=-1));v=x.drawingstate.matrix;1!==a&&(z.globalAlpha=a);a=n.x*v.a-n.y*v.b+v.tx;n=n.x*v.c-n.y*v.d-v.ty;z.transform(q.x*v.a-q.y*v.b+v.tx-a,q.x*v.c-q.y*v.d-v.ty-n,r.x*
+v.a-r.y*v.b+v.tx-a,r.x*v.c-r.y*v.d-v.ty-n,a,n);z.scale(1/t,-1/u*p);z.translate(t/2,-u/2);z.scale(c,f);z.translate(-t/2,u/2);z.translate(0,-u);c=l;c.drawTo?c.drawTo(z,0,0):z.drawImage(c.img,0,0);z.globalAlpha=1;z.restore()}var e,h,m,l;return 2===a.length?(e=C(a[0]),l=C(a[1]),c()):3===a.length?(e=C(a[0]),h=C(a[1]),m=0,l=C(a[2]),d()):4===a.length?(e=C(a[0]),h=C(a[1]),m=C(a[2]),l=C(a[3]),d()):k};t.drawimage$3=t.drawimage$2;t.drawimage$4=t.drawimage$2;t.allimages$0=function(){var a=[];Object.keys(ab).forEach(function(b){a.push({ctype:"string",
+value:b})});return f.turnIntoCSList(a)};t.cameravideo$0=function(){var a=null,b={video:!0,audio:!1},c=navigator.mediaDevices&&navigator.mediaDevices.getUserMedia;c?a=function(a,c){navigator.mediaDevices.getUserMedia(b).then(a,c)}:(c=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia)&&(a=function(a,d){c.call(navigator,b,a,d)});if(!a)return console.warn("getUserMedia call not supported"),k;var d=document.createElement("video");d.autoplay=!0;var e=
+X(d);console.log("Opening stream.");a(function(a){a=window.URL.createObjectURL(a);d.src=a;d.addEventListener("loadeddata",S)},function(a){console.error("Could not get user video:",String(a),a)});return e};"use strict";var me=[{key:[":"],field:["."],deg:["\u00b0"],take:["_"]},{functionCall:!0},{rassoc:!0,pow:["^"],sqrt:["\u221a"]},{mul:["*","\u2062","\u22c5","\u00b7"],cross:["\u00d7"],div:["/","\u00f7","\u2215","\u2236"]},{add:["+"],sub:["-","\u2212"],neg:["!","\u00ac"]},{seq:[".."]},{eq:["==","\u225f"],
+ne:["!=","<>","\u2260"],lt:["<"],gt:[">"],le:["<=","\u2264","\u2266"],ge:[">=","\u2265","\u2267"],aeq:["~=","\u2248"],ane:["~!=","\u2249"],alt:["~<","\u2a89"],agt:["~>","\u2a8a"],ale:["~<=","\u2a85"],age:["~>=","\u2a86"],"in":["\u2208"],nin:["\u2209"]},{and:["&","\u2227"],or:["%","\u2228"]},{rassoc:!0,prepend:["<:"]},{concat:["++","\u222a"],remove:["--","\u2216"],common:["~~","\u2229"],append:[":>"]},{rassoc:!0,assign:["="],define:[":="],undefine:[":=_"],bdefine:["::="]},{seq:[";"]},{modif:["->",
+"\u2192"]},{rassoc:!0,list:[","]}],ne=["+","-"],oe=["!","\u221a"],pe=["\u00b0",":=_"],qe=[";",","],Ac=[],wa={},ad;(function(){var a=0;me.forEach(function(b){a+=2;var c=!!b.rassoc;b.functionCall&&(ad=a);for(var d in b){var e=b[d];if("boolean"!==typeof e)for(var f={name:d,sym:e[0],symbols:e,rassoc:c,precedence:a,prefix:!1,postfix:!1,infix:!0,bare:!1},h=0;h<e.length;++h){var m=e[h];if(wa.hasOwnProperty(m))throw Error("Duplicate operator: "+m);wa[m]=f;Ac.push(m)}}});ne.forEach(function(a){wa[a].prefix=
+!0});oe.forEach(function(a){wa[a].prefix=!0;wa[a].infix=!1});pe.forEach(function(a){wa[a].postfix=!0;wa[a].infix=!1});qe.forEach(function(a){wa[a].prefix=!0;wa[a].postfix=!0;wa[a].infix=!0;wa[a].bare=!0})})();Ac.sort(function(a,b){return b.length-a.length});var re="(?:[0-9](?: [0-9])*(?: \\.(?! \\.)(?: [0-9])*)?|\\.(?: [0-9])+)(?: [Ee](?: [+-])?(?: [0-9])+)?".replace(/ /g,"[ \t]*"),se="(?:[\u207a\u207b] )?[\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079](?: [\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079])*".replace(/ /g,
+"[ \t]*"),te="(?:[\u208a\u208b] )?[\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089](?: [\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089])*".replace(/ /g,"[ \t]*"),Bc=function(a,b,c){var d,e,f=0,h="(?:[",m=b.length;for(d=0;d<m;++d)e=b.charCodeAt(d),55296<=e?(h+="]|"+b.charAt(d)+"[",f=56320):(h+=String.fromCharCode(e=f=a[e-32]+f),f+=a[b.charCodeAt(++d)-32],f!==e&&(f!==e+1&&(h+="-"),h+=String.fromCharCode(f)));return h+"]|["+c+"][\udc00-\udfff])"}([2,0,106,3,4,1,6,5,7,11,17,
+8,12,21,9,22,30,10,15,24,25,16,13,42,46,14,18,19,29,37,27,28,35,26,32,36,40,43,47,53,20,48,50,56,33,34,39,51,52,55,63,64,65,68,85,23,31,38,45,49,105,59,66,69,72,88,102,114,117,128,157,191,41,44,54,60,67,70,71,73,74,75,76,80,81,82,83,84,86,87,89,93,94,98,99,107,108,116,122,130,132,134,138,160,165,185,195,196,255,268,277,310,332,339,362,365,390,449,457,470,512,513,541,568,582,619,673,726,768,820,921,991,1164,2684,6581,8453,11171,20949],"T4(4I!)!'!&/ 0 \u0096')2$+! !\u0083$ %## !(! ! ; u \u0086.\u0088 =#!+YoA& 87C% } !5%+%) #!*! <0a,!4B1%'!&-'!1!$!33`HsG$!;!+.52'(#%#- & !$#$!*!9% 2%H''%#- & % % %B# !H *+ - & % $$!;!5%3!,(#%#- & % $$!X% 5!:! '$ #$% ! %$%$ $)W!G( / 2$!> &%C( / . $$!L! %5%;( D#!*!* 4'&*$W + !#&]F %6&]% !#% !#!(# & ! !#% # %1!#$ !/#L!S( @?$\u00817-!*''#$!$%+ ',6!:= !&!#7 \u0090 ##& ! ##D ##B ##& ! ##9 K ##^Y2*V#'$\u009d#5 4&p((+, #2*2*2, 5OC!'!Uy.D !&_)0J<#$,E'4Q/1Pv!|8:&K<9%)E>@7 )@\u0080# #$%1gT\u008e#'#=#'#( ! ! ! 0#P & !$ &$##'',& &d!9!*,b!'!#. !$$(! ! ! # 1##&$'!G%\u00a58 8 \u0084(#$%6= !&!#Q+!*/1& & & & & & & &t!\u0097%E$&%'V( z #&D${:Aj2\u0099\u00a6q\u00a9E\u00a4UZ#\u008d$2)%-8*0#_J+#b#M#(S1 # /0O2[R'$! !6>)/A?+8<!*$ .)$ D3 (-/$!$[ !$%#$#! !4 #1+ 6'#'#'1& & 7 .)c0\u00a86/'I\u00a7\u0093#\\N&6$&! . , $ ! % % \u007fM\u0092;R#Gh)d$ \u0085=4(4,a$'#'#'# \ud800!) 4 : % 9#6@\u0082\u0094?$IIX*5 ((=)<#@'(\ud801!f~N.Of\u008f1-)(\ud802!'#! E %$!#/)/10^: %)-)4nQ(%T!5# AZ?$?C( >?G)-):9*\ud803!`KJ9J\ud804#PriL3>@7M$!6F2#/! !C* 3V& ! # 9 .+8N(#%#- & % $$!;!6$\ud805eF-% !\u008987#=F-!k7x4\ud806\u0087RB!\u0095K\ud808!\u00a2\ud809e\u008a\ud80d!8\ud811!\u009c\ud81a!\u009b+0c<;F*#BH&:\ud81b\u00a0U,!l,\ud82c!%\ud82f!\"&,$++.\ud835!w m %#!#%## ) ! & S ##( & > # $ !$& \u0091#3 3 0 3 0 3 0 3 0 3 (\ud83a!\u008b\ud83b\u0098# A % !#! . # ! !(!'! ! ! % !#! ! ! ! ! % !## & # # ! . 5& $ 5\ud869!\u009f7\u008c\ud86d!\u00a1,g\ud86e!<#\u00a3\ud873!\u009e\ud87e!\u009a",
+"\ud80c\ud840-\ud868\ud86a-\ud86c\ud86f-\ud872"),ue=("#(?: [1-9])?|(?:'|"+Bc+")(?: (?:[0-9']|"+Bc+"))*").replace(/ /g,"[ \t]*"),Yc=["([ \t\n]+)|(//.*)|(/\\*)","("+re+")","("+Ac.map(Xc).join("|")+")","("+"[](){}||".split("").map(Xc).join("|")+")","("+te+")","("+se+")","("+ue+")",'("[^"]*")|($)'].join("|"),ve=new RegExp("[ \t]*".replace(/\*$/,"+"),"g"),Cc="ANY WS COMMENT START_COMMENT NUM OP BRA SUB SUP ID STR EOF".split(" ");(function(){var a=(new RegExp(Yc,"g")).exec("");if(a.hasOwnProperty(Cc.length))throw Error("RE has more groups than expected");
+if(!a.hasOwnProperty(Cc.length-1))throw Error("RE has fewer groups than expected");})();mb.prototype.advanceBy=function(a){this.advanceTo(this.pos+a)};mb.prototype.advanceTo=function(a){for(this.pos=a;this.bols[0]<=a;)this.bol=this.bols.shift(),this.line++};mb.prototype.curPos=function(){return{row:this.line,col:this.pos-this.bol,pos:this.pos}};mb.prototype.nextInternal=function(){var a=this.re.exec(this.input);if(a.index!==this.pos)throw ea("Invalid token",this.curPos(),this.input.substring(this.pos,
+a.index));var b=this.curPos();this.advanceBy(a[0].length);var c=this.curPos(),d;for(d=1;null==a[d];++d);return{start:b,end:c,raw:a[0],text:a[0].replace(ve,""),toktype:Cc[d]}};mb.prototype.next=function(){var a;do if(a=this.nextInternal(),"START_COMMENT"===a.toktype){var b=/\*\/|\/\*/g;b.lastIndex=a.start.pos+2;for(var c=1,d;0<c;)if(d=b.exec(this.input))"/*"===d[0]?++c:--c;else throw ea("Unterminated comment",a.start,a.text);this.re.lastIndex=b.lastIndex;this.advanceTo(b.lastIndex);a.end=this.curPos();
+a.raw=this.input.substring(a.start.pos,a.end.pos);a.text=a.raw;a.toktype="COMMENT"}while("WS"===a.toktype||"COMMENT"===a.toktype);return a};var we={ctype:"void"};Db.prototype.postprocess=function(a){if(null===a)return we;if(a){if("infix"===a.ctype)if(":="===a.oper){var b=a.args[0];if("function"===b.ctype)b.args.forEach(function(c){if(null===c||"variable"!==c.ctype)throw ea("Function argument must be an identifier",c.start||a.start);});else if("variable"!==b.ctype)throw ea(a.oper+" can only be used to define functions or variables",
+a.start);}else if(","===a.oper)throw ea("comma may only be used to delimit list elements",a.start);a.args&&(a.args=a.args.map(this.postprocess,this));if(a.modifs)for(var c in a.modifs)a.modifs[c]=this.postprocess(a.modifs[c]);if("paren"===a.ctype)return a.args[0];if("infix"===a.ctype){if("."===a.oper){if(!a.args[1]||"variable"!==a.args[1].ctype)throw ea("Field name must be identifier",a.start,a.text);a.ctype="field";a.obj=a.args[0];a.key=a.args[1].name;delete a.args}this.infixmap&&(a.impl=this.infixmap[a.oper])}else"variable"===
+a.ctype?this.usedVariables[a.name]=!0:"function"===a.ctype&&(this.usedFunctions[a.oper]=!0)}if("infix"===a.ctype)return{ctype:"infix",oper:String(a.oper),args:[a.args[0],a.args[1]],impl:a.impl};if("variable"===a.ctype)return{ctype:"variable",name:String(a.name)};if("number"===a.ctype)return{ctype:"number",value:{real:+a.value.real,imag:+a.value.imag}};if("string"===a.ctype)return{ctype:"string",value:String(a.value)};if("list"===a.ctype)return{ctype:"list",value:a.value};if("function"===a.ctype)return{ctype:"function",
+oper:String(a.oper),args:a.args,modifs:a.modifs};if("field"===a.ctype)return{ctype:"field",obj:a.obj,key:String(a.key)};throw Error("Unsupported AST node of type "+a.ctype);};Db.prototype.parse=function(a){try{var b=$c(new mb(a));if("EOF"!==b.closedBy.toktype)throw ea("Closing bracket never opened.",b.closedBy.start,b.closedBy.text);return this.postprocess(b.expr)}catch(c){return c.ctype="error",c}};"undefined"!==typeof process&&"undefined"!==typeof module&&"undefined"!==typeof module.exports&&"undefined"===
+typeof window&&(module.exports.Parser=Db,module.exports.Tokenizer=mb,module.exports.unicodeLetters=Bc,module.exports.parse=function(a){return(new Db).parse(a)});var Mc={},Dc;Dc=[0,0,0,0,0,0,0,0,0,0,0,0];t.playsin$1=function(a,b){var c=C(a[0]),d=0;if("number"===c.ctype){var e;void 0!==b.line&&(e=A(b.line),"number"===e.ctype&&(d=Math.floor(e.value.real),0>d&&(d=0),10<d&&(d=10)));c=c.value.real;0!==Dc[d]&&Dc[d].set({freq:c})}return k};var O={printArr:function(a){for(var b=a.value.length,c=[],d=[],e=
+!1,f=0;f<b;f++)c[f]=a.value[f].value.real,d[f]=a.value[f].value.imag,0!==d[f]&&(e=!0);console.log(c);e&&console.log(d)},zero:function(a){for(var b=[],c=m.real(0),d=0;d<a.value.real;d++)b[d]=c;return f.turnIntoCSList(b)},number:function(a,b){var c=O.zero(b);c.value[0]=a;return c},variable:function(a,b){var c=O.zero(b);c.value[0]=a;c.value[1]=m.real(1);return c},add:function(a,b){return f.add(a,b)},sub:function(a,b){return f.sub(a,b)},mult:function(a,b){if(a.value.length!==b.value.length)return console.error("dims don't fit return nada"),
+k;for(var c=a.value.length,d=O.zero(m.real(c)),e=m.real(0),f=0;f<c;f++){for(var h=0;h<=f;h++)e=m.add(e,m.mult(a.value[h],b.value[f-h]));d.value[f]=e;e=m.real(0)}return d},pow:function(a,b){if(0>b.value.real||b.value.real!==Math.floor(b.value.real))return O.root(a,b);for(var c=a,d=1;d<b.value.real;d++)c=O.mult(c,a);return c},root:function(a,b){var c=m.real(0),d=m.real(1),e=m.add(d,b),f=a.value.length,h=O.zero(m.real(f));h.value[0]=m.pow(a.value[0],b);for(var k=c,l,n,q=1;q<f;q++){n=m.real(q);for(var r=
+1;r<=q;r++)l=m.mult(e,m.real(r)),l=m.div(l,n),l=m.sub(l,d),l=m.mult(l,a.value[r]),l=m.mult(l,h.value[q-r]),k=m.add(k,l);k=m.div(k,a.value[0]);h.value[q]=k;k=c}return h},findFirstNoneZero:function(a,b,c){for(var d=Infinity,e=Infinity,f=c;f<a.value.length;f++)if(1E-12<m.abs2(a.value[f]).value.real){d=f;break}for(a=c;a<b.value.length;a++)if(1E-12<m.abs2(b.value[a]).value.real){e=a;break}return[d,e]},div:function(a,b){if(a.value.length!==b.value.length)return console.log("dims don't fit - return nada"),
+k;for(var c=a.value.length,d=m.real(0),e=O.zero(m.real(c)),f=d,h,l=0;l<c;l++){h=O.findFirstNoneZero(a,b,l);l<h[0]&&h[0]===h[1]&&Infinity!==h[0]&&(a.value.splice(l,h[0]),b.value.splice(l,h[0]),e.value.splice(l,h[0]),c-=h[0]);h=a.value[l];for(var n=0;n<l;n++)f=m.add(f,m.mult(e.value[n],b.value[l-n]));h=m.sub(h,f);h=m.div(h,b.value[0]);e.value[l]=h;f=d}return e},exp:function(a){var b=m.real(0),c=a.value.length,d=O.zero(m.real(c)),e=b,f;d.value[0]=m.exp(a.value[0]);for(var h=1;h<c;h++){for(var k=1;k<=
+h;k++)f=m.mult(m.real(k),a.value[k]),f=m.mult(f,d.value[h-k]),e=m.add(e,f);d.value[h]=m.div(e,m.real(h));e=b}return d},log:function(a){var b=m.real(0),c=a.value.length,d=O.zero(m.real(c));d.value[0]=m.log(a.value[0]);for(var e=b,f,h,k=1;k<c;k++){f=a.value[k];for(var l=1;l<k;l++)h=m.mult(m.real(l),d.value[l]),h=m.mult(h,a.value[k-l]),e=m.add(e,h);e=m.div(e,m.real(k));f=m.sub(f,e);f=m.div(f,a.value[0]);d.value[k]=f;e=b}return d},sincos:function(a){var b=m.real(0),c=a.value.length,d=O.zero(m.real(c)),
+e=O.zero(m.real(c));d.value[0]=m.sin(a.value[0]);e.value[0]=m.cos(a.value[0]);for(var f=b,h=b,k,l,n,q=1;q<c;q++){n=m.real(q);for(var r=1;r<=q;r++)l=m.mult(m.real(r),a.value[r]),k=m.mult(l,e.value[q-r]),l=m.mult(l,d.value[q-r]),h=m.add(h,k),f=m.add(f,l);h=m.div(h,n);f=m.div(f,m.neg(n));d.value[q]=h;e.value[q]=f;f=h=b}O.sinsave=d;O.cossave=e;return[d,e]},sin:function(a){return O.sincos(a)[0]},cos:function(a){return O.sincos(a)[1]},faculty:function(a){var b=[];b[0]=m.real(1);for(var c=1,d=1;d<=a.value.real;d++)c*=
+d,b[d]=m.real(c);return b=f.turnIntoCSList(b)},diff:function(a,b,c,d){var e;if("variable"===a.ctype)e=a.name!==b?O.number(A(a),d):O.variable(c,d);else if("number"===a.ctype)e=O.number(a,d);else{if("infix"===a.ctype){if("*"===a.oper)return O.mult(O.diff(a.args[0],b,c,d),O.diff(a.args[1],b,c,d));if("^"===a.oper)return O.pow(O.diff(a.args[0],b,c,d),O.diff(a.args[1],b,c,d).value[0]);if("/"===a.oper)return O.div(O.diff(a.args[0],b,c,d),O.diff(a.args[1],b,c,d));if("+"===a.oper)return O.add(O.diff(a.args[0],
+b,c,d),O.diff(a.args[1],b,c,d));if("-"===a.oper)return O.sub(O.diff(a.args[0],b,c,d),O.diff(a.args[1],b,c,d));console.log("infix not found",a.oper);return k}if("function"===a.ctype){if("exp$1"===a.oper)return O.exp(O.diff(a.args[0],b,c,d));if("log$1"===a.oper)return O.log(O.diff(a.args[0],b,c,d));if("sin$1"===a.oper)return O.sin(O.diff(a.args[0],b,c,d));if("cos$1"===a.oper)return O.cos(O.diff(a.args[0],b,c,d))}else return console.log("ctype not found",a.ctype),k}return e},adevaluate:function(a,b,
+c,d){a=O.diff(a,b,c,d);d=O.faculty(d);for(b=2;b<a.value.length;b++)a.value[b]=m.mult(a.value[b],d.value[b]);return a},autodiff:function(a,b,c,d){for(var e=[],h=c.value.length,m,k=0;k<h;k++)m=O.adevaluate(a,b,c.value[k],d),e[k]=m;return e=f.turnIntoCSList(e)}},y={handleModifs:function(a,b){y.dashing&&y.unSetDash();y.colorraw=null;y.fillcolorraw=null;y.size=null;0>=y.psize&&(y.psize=0);0>=y.lsize&&(y.lsize=0);y.overhang=1;y.dashing=!1;y.isArrow=!1;y.arrowSides="==>";y.arrowposition=1;y.headlen=10;y.arrowShape=
+y.arrowShapes.line;y.alpha=x.drawingstate.alpha;y.fillalpha=0;y.bold="";y.italics="";y.family="sans-serif";y.align=0;y.xOffset=0;y.yOffset=0;y.lineCap="round";y.lineJoin="round";y.miterLimit=10;var c,d;for(c in a){var e=a[c];e&&((d=b[c])?(!0===d&&(d=y.modifHandlers[c]),d(A(e))):console.log("Modifier not supported: "+c))}null!==y.size?y.psize=y.lsize=y.size:(y.psize=x.drawingstate.pointsize,y.lsize=x.drawingstate.linesize);y.dashing&&y.dashing(y.lsize);null!==y.colorraw?y.pointColor=y.lineColor=y.textColor=
+y.makeColor(y.colorraw):1===y.alpha?(y.pointColor=x.drawingstate.pointcolor,y.lineColor=x.drawingstate.linecolor,y.textColor=x.drawingstate.textcolor):(y.pointColor=y.makeColor(x.drawingstate.pointcolorraw),y.lineColor=y.makeColor(x.drawingstate.linecolorraw),y.textColor=y.makeColor(x.drawingstate.textcolorraw));y.black=1===y.alpha?"rgb(0,0,0)":"rgba(0,0,0,"+y.alpha+")";y.fillColor=y.fillcolorraw&&0<y.fillalpha?y.makeColor(y.fillcolorraw,y.fillalpha):null},modifHandlers:{size:function(a){"number"===
+a.ctype&&(y.size=a.value.real,0>y.size&&(y.size=0),1E3<y.size&&(y.size=1E3))},color:function(a){f.isNumberVector(a).value&&3===a.value.length&&(y.colorraw=[a.value[0].value.real,a.value[1].value.real,a.value[2].value.real])},fillcolor:function(a){f.isNumberVector(a).value&&3===a.value.length&&(y.fillcolorraw=[a.value[0].value.real,a.value[1].value.real,a.value[2].value.real])},alpha:function(a){"number"===a.ctype&&(y.alpha=a.value.real)},fillalpha:function(a){"number"===a.ctype&&(y.fillalpha=a.value.real)},
+dashpattern:function(a){if("list"===a.ctype){for(var b=[],c=0,d=0;c<a.value.length;c++)"number"===a.value[c].ctype&&(b[d++]=a.value[c].value.real);y.dashing=y.setDash.bind(null,b)}},dashtype:function(a){if("number"===a.ctype)a=Math.floor(a.value.real);else if("string"===a.ctype)a=a.value;else return;if(a=y.dashTypes[a])y.dashing=y.setDash.bind(null,a)},dashing:function(a){"number"===a.ctype&&(a=Math.floor(a.value.real),y.dashing=y.setDash.bind(null,[2*a,a]))},overhang:function(a){"number"===a.ctype&&
+(y.overhang=y.overhang*a.value.real+(1-y.overhang)*(1-a.value.real))},arrow:function(a){"boolean"===a.ctype?y.isArrow=a.value:console.error("arrow needs to be of type boolean")},arrowshape:function(a){"string"!==a.ctype?console.error("arrowshape needs to be of type string"):y.arrowShapes.hasOwnProperty(a.value)?(y.arrowShape=y.arrowShapes[a.value],y.isArrow=!0,y.arrowShape.deprecated&&(console.log("arrowshape "+a.value+" is deprecated, use "+y.arrowShape.deprecated+" instead."),y.arrowShape.deprecated=
+null)):(a=Object.keys(y.arrowShapes),a.sort(),a=a.join(", "),console.error("arrowshape needs to be one of "+a))},arrowsides:function(a){"string"!==a.ctype?console.error("arrowsides is not of type string"):"==>"!==a.value&&"<==>"!==a.value&&"<=="!==a.value?console.error("arrowsides is unknows"):(y.arrowSides=a.value,y.isArrow=!0)},arrowposition:function(a){"number"!==a.ctype?console.error("arrowposition is not of type number"):0>a.value.real?console.error("arrowposition has to be positive"):1<a.value.real?
+y.overhang=y.overhang*a.value.real+(1-y.overhang)*(1-a.value.real):(y.arrowposition=a.value.real,y.isArrow=!0)},arrowsize:function(a){"number"!==a.ctype?console.error("arrowsize is not of type number"):0>a.value.real?console.error("arrowsize has to be positive"):y.headlen*=a.value.real},bold:function(a){"boolean"===a.ctype&&a.value&&(y.bold="bold ")},italics:function(a){"boolean"===a.ctype&&a.value&&(y.italics="italic ")},family:function(a){"string"===a.ctype&&(y.family=a.value)},align:function(a){"string"===
+a.ctype&&(a=a.value,"left"===a&&(y.align=0),"right"===a&&(y.align=1),"mid"===a&&(y.align=.5))},x_offset:function(a){"number"===a.ctype&&(y.xOffset=a.value.real)},y_offset:function(a){"number"===a.ctype&&(y.yOffset=a.value.real)},offset:function(a){"list"===a.ctype&&2===a.value.length&&"number"===a.value[0].ctype&&"number"===a.value[1].ctype&&(y.xOffset=a.value[0].value.real,y.yOffset=a.value[1].value.real)},lineCap:function(a){"string"!==a.ctype||"round"!==a.value&&"square"!==a.value&&"butt"!==a.value||
+(y.lineCap=a.value)},lineJoin:function(a){"string"!==a.ctype||"round"!==a.value&&"bevel"!==a.value&&"miter"!==a.value||(y.lineJoin=a.value)},miterLimit:function(a){"number"===a.ctype&&0<a.value.real&&(y.miterLimit=Math.round(a.value.real))}},lineModifs:{size:!0,color:!0,alpha:!0,dashpattern:!0,dashtype:!0,dashing:!0,overhang:!0,arrow:!0,arrowshape:!0,arrowsides:!0,arrowposition:!0,arrowsize:!0,lineCap:!0,lineJoin:!0,miterLimit:!0},pointModifs:{size:!0,color:!0,alpha:!0}};y.pointAndLineModifs=y.lineModifs;
+y.conicModifs={size:!0,color:!0,alpha:!0,fillcolor:!0,fillalpha:!0,lineCap:!0,lineJoin:!0,miterLimit:!0};y.textModifs={size:!0,color:!0,alpha:!0,bold:!0,italics:!0,family:!0,align:!0,x_offset:!0,y_offset:!0,offset:!0};y.makeColor=function(a,b){void 0===b&&(b=y.alpha);return"rgba("+Math.floor(255*a[0])+","+Math.floor(255*a[1])+","+Math.floor(255*a[2])+","+b+")"};y.preDrawCurve=function(){z.lineWidth=y.lsize;z.lineCap=y.lineCap;z.lineJoin=y.lineJoin;z.miterLimit=y.miterLimit;z.strokeStyle=y.lineColor};
+y.arrowShapes={"default":{close:!1,fill:!1,ratio:1,deprecated:"line"},line:{close:!1,fill:!1,ratio:1},empty:{close:!0,fill:!1,ratio:1},hollow:{close:!0,fill:!1,ratio:1,deprecated:"empty"},full:{close:!0,fill:!0,ratio:1},jet:{close:!0,fill:!0,ratio:1.5},delta:{close:!0,fill:!0,ratio:1.5,deprecated:"jet"}};y.clipSegment=function(a,b){var c=b.x-a.x,d=b.y-a.y,e=y.clipLineCore(-d,c,a.x*b.y-b.x*a.y);if(2!==e.length)return[];var f=e[0],e=e[1],h=1/(c*c+d*d),m=((f.x-a.x)*c+(f.y-a.y)*d)*h,c=((e.x-a.x)*c+(e.y-
+a.y)*d)*h;0>m&&(f=a);1<m&&(f=b);0>c&&(e=a);1<c&&(e=b);return f===e?[]:[f,e]};y.drawsegcore=function(a,b){function c(a,b,c,g){var d=a-g*r+.5*t,e=b-g*t-.5*r,f=a-g*r-.5*t;g=b-g*t+.5*r;z.beginPath();y.arrowShape.fill&&(z.lineWidth=y.lsize/2);z.moveTo(d,e);z.lineTo(a,b);z.lineTo(f,g);y.arrowShape.close&&(z.fillStyle=y.lineColor,z.lineTo(a-c*r,b-c*t),z.closePath(),y.arrowShape.fill&&z.fill());z.stroke()}var d=x.drawingstate.matrix,e=a.x*d.a-a.y*d.b+d.tx,f=a.x*d.c-a.y*d.d-d.ty,h=b.x*d.a-b.y*d.b+d.tx,m=b.x*
+d.c-b.y*d.d-d.ty,k=y.overhang,l=1-k,d=k*e+l*h,n=k*f+l*m,q=k*h+l*e,k=k*m+l*f;if(0>d||d>W||0>n||n>V||0>q||q>W||0>k||k>V){k=y.clipSegment({x:d,y:n},{x:q,y:k});if(2!==k.length||.01>y.lsize)return;d=k[0].x;n=k[0].y;q=k[1].x;k=k[1].y}y.preDrawCurve();if(!y.isArrow||e===f&&h===m).01>y.lsize||(z.beginPath(),z.moveTo(d,n),z.lineTo(q,k),z.stroke());else{var e=h-e,f=m-f,h=y.headlen/Math.sqrt(e*e+f*f),r=e*h,t=f*h,m=y.arrowposition,l=1-m,f=m*d+l*q,e=m*n+l*k,h=m*q+l*d,m=m*k+l*n,l=y.arrowSides;z.beginPath();y.arrowShape.close?
+("<==>"===l||"<=="===l?(1>y.arrowposition&&(z.moveTo(d,n),z.lineTo(f,e)),z.moveTo(f+r,e+t)):z.moveTo(d,n),"==>"===l||"<==>"===l?(z.lineTo(h-r,m-t),1>y.arrowposition&&(z.moveTo(h,m),z.lineTo(q,k))):z.lineTo(q,k)):(z.moveTo(d,n),z.lineTo(q,k));z.stroke();"==>"!==l&&"<==>"!==l||c(h,m,1,y.arrowShape.ratio);"<=="!==l&&"<==>"!==l||c(f,e,-1,-y.arrowShape.ratio)}};y.drawpoint=function(a){var b=x.drawingstate.matrix,c=a.x*b.a-a.y*b.b+b.tx;a=a.x*b.c-a.y*b.d-b.ty;z.lineWidth=.3*y.psize;z.beginPath();z.arc(c,
+a,y.psize,0,2*Math.PI);z.fillStyle=y.pointColor;z.fill();z.beginPath();z.arc(c,a,1.15*y.psize,0,2*Math.PI);z.fillStyle=y.black;z.strokeStyle=y.black;z.stroke()};y.clipLineCore=function(a,b,c){var d=Math.SQRT1_2*y.lsize,e=0-d,f=W+d,h=0-d,d=V+d,m=0>e*a+h*b+c,k=0>f*a+h*b+c,l=0>e*a+d*b+c,n=0>f*a+d*b+c,q=[];m!==k&&q.push({x:(-c-b*h)/a,y:h});k!==n&&q.push({x:f,y:(-c-a*f)/b});l!==n&&q.push({x:(-c-b*d)/a,y:d});m!==l&&q.push({x:e,y:(-c-a*e)/b});return q};y.clipLine=function(a){a=f.normalizeMax(f.productVM(a,
+x.toMat()));return y.clipLineCore(a.value[0].value.real,a.value[1].value.real,a.value[2].value.real)};y.drawline=function(a){f._helper.isAlmostReal(a)&&(a=y.clipLine(a),2===a.length&&.01<=y.lsize&&(y.preDrawCurve(),z.beginPath(),z.moveTo(a[0].x,a[0].y),z.lineTo(a[1].x,a[1].y),z.stroke()))};y.drawRaySegment=function(a,b){var c=D.extractPoint(a),d=D.extractPoint(b);if(c.ok&&d.ok){var e=c.x-d.x,f=c.y-d.y,h=25E3/x.drawingstate.matrix.sdet/Math.sqrt(e*e+f*f),e=e*h,f=f*h;y.drawsegcore(c,{x:c.x+e,y:c.y+
+f});y.drawsegcore(d,{x:d.x-e,y:d.y-f})}};y.dashTypes={solid:[],dashed:[10,10],tightdash:[10,4],dotted:[1,3],dashdot:[10,5,1,5],"dashvalue.solid":[],"dashvalue.dashed":[10,10],"dashvalue.tightdash":[10,4],"dashvalue.dotted":[1,3],"dashvalue.dashdot":[10,5,1,5],0:[],1:[10,10],2:[10,4],3:[1,3],4:[10,5,1,5]};y.setDash=function(a,b){var c=Math.sqrt(b);a=a.slice();for(var d=0;d<a.length;d++)a[d]*=c;z.webkitLineDash=a;z.setLineDash(a);z.mozDash=a};y.unSetDash=function(){z.webkitLineDash=[];z.setLineDash([]);
+z.mozDash=[]};bd.prototype={set fillStyle(a){var b=this;Qb(a,function(a,d,e,f){b._fill="#"+nb(a.toString(16),2)+nb(d.toString(16),2)+nb(e.toString(16),2);b._fillOpacity=255===f?null:f})},set strokeStyle(a){var b=this;Qb(a,function(a,d,e,f){b._stroke="#"+nb(a.toString(16),2)+nb(d.toString(16),2)+nb(e.toString(16),2);b._strokeOpacity=255===f?null:f})},clearRect:function(){},beginPath:function(){this._path=[]},_pathcmd:function(){this._path.push.apply(this._path,arguments)},closePath:function(){this._pathcmd("Z")},
+moveTo:function(a,b){this._pathcmd("M",a,b)},lineTo:function(a,b){this._pathcmd("L",a,b)},bezierCurveTo:function(a,b,c,d,e,f){this._pathcmd("C",a,b,c,d,e,f)},quadraticCurveTo:function(a,b,c,d){this._pathcmd("Q",a,b,c,d)},arc:function(a,b,c,d,e,f){var h=c*Math.cos(d)+a,m=c*Math.sin(d)+b,k=c*Math.cos(e)+a,l=c*Math.sin(e)+b;e=f?d-e:e-d;e>=2*Math.PI?this._pathcmd(this._path.length?"L":"M",h,m,"A",c,c,0,0,f?1:0,a-c*Math.cos(d),b-c*Math.sin(d),"A",c,c,0,0,f?1:0,h,m):this._pathcmd(this._path.length?"L":
+"M",h,m,"A",c,c,0,e>Math.PI?1:0,f?1:0,k,l)},rect:function(a,b,c,d){this._pathcmd("M",a,b,"h",c,"v",d,"h",-c,"z")},_cmd:function(a){1!==this.globalAlpha?(this._body.push('<g opacity="'+this.globalAlpha+'">'),this._body.push(a),this._body.push("</g>")):this._body.push(a)},_attrs:function(a){var b="",c;for(c in a)null!==a[c]&&(b+=" "+c+'="'+a[c]+'"');return b},fill:function(){this._cmd("<path"+this._attrs({d:this._path.join(" "),fill:this._fill,"fill-opacity":this._fillOpacity})+"/>")},stroke:function(){this._cmd("<path"+
+this._attrs({d:this._path.join(" "),stroke:this._stroke,"stroke-opacity":this._strokeOpacity,"stroke-width":this.lineWidth,"stroke-linecap":this.lineCap,"stroke-linejoin":this.lineJoin,"stroke-miterlimit":"miter"===this.lineJoin?this.miterLimit:null})+"/>")},clip:function(){++this._clipIndex;this._body.push('<clipPath id="clip'+this._clipIndex+'"><path d="'+this._path.join(" ")+'"/></clipPath>','<g clip-path="url(#clip'+this._clipIndex+')">');this._saveStack[this._saveStack.length-1]+="</g>"},save:function(){this._saveStack.push("")},
+restore:function(){this._body.push(this._saveStack.pop());0===this._saveStack.length&&this._saveStack.push("")},_transform:function(a){this._body.push('<g transform="'+a+'">');this._saveStack[this._saveStack.length-1]+="</g>"},translate:function(a,b){this._transform("translate("+a+" "+b+")")},rotate:function(a){this._transform("rotate("+Math.PI/180*a+")")},scale:function(a,b){this._transform("scale("+a+" "+b+")")},transform:function(a,b,c,d,e,f){this._transform("matrix("+[a,b,c,d,e,f].join(" ")+")")},
+drawImage:function(a,b,c){if(3!==arguments.length)throw Error("SvgWriterContext only supports 3-argument version of drawImage");var d=this._imgcache.indexOf(a);if(-1===d){var d=this._imgcache.length,e;e=a.cachedDataURL?a.cachedDataURL:dd(a);this._defs.push('<image id="img'+d+'" x="0" y="0" width="'+a.width+'" height="'+a.height+'" xlink:href="'+e+'"/>');this._imgcache.push(a)}this._cmd('<use x="'+b+'" y="'+c+'" xlink:href="#img'+d+'"/>')},toBlob:function(){for(;1<this._saveStack.length||""!==this._saveStack[0];)this.restore();
+var a='<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="'+this.width+'px" height="'+this.height+'px">\n'+this._defs.join("\n")+'\n</defs>\n<g stroke="none" fill="none">\n'+this._body.join("\n")+"\n</g>\n</svg>\n";return new Blob([a],{type:"image/svg+xml"})}};cd.prototype={_cmd:function(){this._body.push(Array.prototype.join.call(arguments," "))},_setAlpha:function(a,b,c){var d=Math.round(255*
+a*this._globalAlpha);b+=d;this._extGState[b]="<< /"+c+" "+d/255+" >>";this._cmd("/"+b,"gs");return a},set globalAlpha(a){this._globalAlpha=a;this._setAlpha(this._strokeAlpha,"As","CA");this._setAlpha(this._fillAlpha,"Af","ca")},set fillStyle(a){var b=this;Qb(a,function(a,d,e,f){b._cmd(a/255,d/255,e/255,"rg");b._setAlpha(b._fillAlpha=f,"Af","ca")})},set strokeStyle(a){var b=this;Qb(a,function(a,d,e,f){b._cmd(a/255,d/255,e/255,"RG");b._setAlpha(b._strokeAlpha=f,"As","CA")})},set lineWidth(a){this._cmd(a,
+"w")},set lineCap(a){this._cmd({butt:0,round:1,square:2}[a],"J")},set lineJoin(a){this._cmd({miter:0,round:1,bevel:2}[a],"j")},set miterLimit(a){this._cmd(a,"M")},clearRect:function(){},beginPath:function(){this._pathUsed=!1},closePath:function(){this._cmd("h")},moveTo:function(a,b){this._cmd(this._xPos=a,this._yPos=-b,"m")},lineTo:function(a,b){this._cmd(this._xPos=a,this._yPos=-b,"l")},bezierCurveTo:function(a,b,c,d,e,f){this._cmd(a,-b,c,-d,this._xPos=e,this._yPos=-f,"c")},quadraticCurveTo:function(a,
+b,c,d){this.bezierCurveTo((2*a+this._xPos)/3,(2*b-this._yPos)/3,(c+2*a)/3,(d+2*b)/3,c,d)},_kappa:.5522847498307935,arc:function(a,b,c,d,e,f){if(0===d&&e===2*Math.PI)d=this._kappa*c,this.moveTo(a+c,b),this.bezierCurveTo(a+c,b+d,a+d,b+c,a,b+c),this.bezierCurveTo(a-d,b+c,a-c,b+d,a-c,b),this.bezierCurveTo(a-c,b-d,a-d,b-c,a,b-c),this.bezierCurveTo(a+d,b-c,a+c,b-d,a+c,b);else throw Error("PdfWriterContext.arc only supports full circles");},rect:function(a,b,c,d){this._cmd(a,-b,c,-d,"re")},_usePath:function(a){if(this._pathUsed){var b=
+this._body[this._pathUsed],c={"S + f":"B","f + S":"B","W n + S":"W S","W n + f":"W f","S + W n":"W S","f + W n":"W f","B + W n":"W B","W S + f":"W B","W f + S":"W B"}[b+" + "+a];if(!c)throw Error("Don't know how to combine '"+b+"' and '"+a+"'");this._body.splice(this._pathUsed,1);a=c}this._pathUsed=this._body.length;this._cmd(a)},fill:function(){this._usePath("f")},stroke:function(){this._usePath("S")},clip:function(){this._usePath("W n")},save:function(){this._cmd("q")},restore:function(){this._cmd("Q")},
+translate:function(a,b){this.transform(1,0,0,1,a,b)},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);this.transform(b,a,-a,b,0,0)},scale:function(a,b){this.transform(a,0,0,b,0,0)},transform:function(a,b,c,d,e,f){this._cmd(a,-b,-c,d,e,-f,"cm")},_png:function(a){if("data:image/png;base64,"!==a.substr(0,22))return{error:"Not a base64-encoded PNG file"};a=Rd(a.substr(22));var b=Sd(a);console.log("PNG chunks:",b.map(function(a){return a.type}));if("IHDR"!==b[0].type)throw Error("Image does not start with an IHDR");
+var c=b[0].data;a=(c[0]<<24|c[1]<<16|c[2]<<8|c[3])>>>0;var d=(c[4]<<24|c[5]<<16|c[6]<<8|c[7])>>>0,e=c[8],f=c[9],h=0===(f&2),m=0!==(f&4),k=c[10],l=c[11],c=c[12];if(0!==k)throw Error("Unsupported PNG compression method: "+k);if(0!==l)throw Error("Unsupported PNG filter method: "+l);if(0!==c)return{error:"Interlaced image not supported"};if(0!==(f&1))return{error:"Indexed PNG image not supported"};l=null;f=h?1:3;k=b.filter(function(a){return"IDAT"===a.type}).map(function(a){return a.data});if(m){m=window.pako;
+l=new m.Inflate;for(b=0;b<k.length;++b)l.push(k[b],b+1===k.length);if(l.err)throw Error(l.err);l=l.result;c=e>>>3;if(l.length!==d*(a*(f+1)*c+1))throw Error("Data length mismatch");for(var n=f*c,k=new Uint8Array(d*(a*n+1)),q=new Uint8Array(d*(a*c+1)),r=0,t=0,u=0,v=0;v<d;++v){k[t++]=q[u++]=l[r++];for(var w=0;w<a;++w){for(b=0;b<n;++b)k[t++]=l[r++];for(b=0;b<c;++b)q[u++]=l[r++]}}if(r!==l.length||t!==k.length||u!==q.length)throw Error("Seems we garbled our index computation somehow");q=m.deflate(q);l=
+this._strm({Type:"/XObject",Subtype:"/Image",Width:a,Height:d,ColorSpace:"/DeviceGray",BitsPerComponent:e,Filter:"/FlateDecode",DecodeParms:this._dict({Predictor:15,Colors:1,BitsPerComponent:e,Columns:a})},q).ref;k=[m.deflate(k)]}var x=0;k.forEach(function(a){x+=a.length});return this._obj([this._dict({Type:"/XObject",Subtype:"/Image",Name:"/img"+this._imgcache.length,Width:a,Height:d,ColorSpace:h?"/DeviceGray":"/DeviceRGB",SMask:l,BitsPerComponent:e,Length:x,Filter:"/FlateDecode",DecodeParms:this._dict({Predictor:15,
+Colors:f,BitsPerComponent:e,Columns:a})}),"\nstream\n"].concat(k,["\nendstream"]))},drawImage:function(a,b,c){if(3!==arguments.length)throw Error("PdfWriterContext only supports 3-argument version of drawImage");var d=this._imgcache.indexOf(a);if(-1===d){d=this._imgcache.length;this._imgcache.push(a);var e=this._png(a.cachedDataURL||"");e.hasOwnProperty("error")&&(e=this._png(dd(a)));if(e.hasOwnProperty("error"))throw Error(e.error);this._xobjects["img"+d]=e.ref}this._cmd("q");this._setAlpha(1,"Af",
+"ca");this._cmd(a.width,0,0,a.height,b,-c-a.height,"cm");this._cmd("/img"+d,"Do");this._cmd("Q")},_dict:function(a){var b="<<",c;for(c in a)b+=" /"+c+" "+a[c];return b+" >>"},_obj:function(a,b){b||(b=this._nextIndex++);Array.isArray(a)||(a=[this._dict(a)]);a.index=b;a.ref=b+" 0 R";a.offset=this._offset;var c=0;a.unshift(b+" 0 obj\n");a.push("\nendobj\n");for(var d=0;d<a.length;++d)c+=a[d].length;this._offset+=c;this._objects.push(a);return a},_strm:function(a,b,c){a.Length=b.length;return this._obj([this._dict(a),
+"\nstream\n",b,"\nendstream"],c)},toBlob:function(){var a;a="["+[0,-this.height,this.width,0].join(" ")+"]";this._obj({Type:"/Catalog",Pages:"2 0 R"},1);this._obj({Type:"/Pages",Kids:"[3 0 R]",Count:1},2);this._obj({Type:"/Page",Parent:"2 0 R",MediaBox:a,Contents:"4 0 R",Resources:this._dict({ProcSet:"[/PDF /Text /ImageB /ImageC /ImageI]",XObject:this._dict(this._xobjects),ExtGState:this._dict(this._extGState)})},3);var b=this._body.join("\n"),c=new Uint8Array(b.length);for(a=0;a<b.length;++a)c[a]=
+b.charCodeAt(a)&255;b=window.pako.deflate(c);this._strm({Filter:"/FlateDecode"},b,4);var b=this._objects,d=[];for(a=1;a<b.length;++a)d[b[a].index]=b[a];c="xref\n0 "+d.length+"\n";for(a=0;a<d.length;++a)c=d[a]?c+(nb(String(d[a].offset),10)+" 00000 n \n"):c+"0000000000 65535 f \n";a="trailer\n"+this._dict({Size:d.length,Root:"1 0 R"})+"\nstartxref\n"+this._offset+"\n%%EOF\n";b=Array.prototype.concat.apply([],b);b.push(c,a);return new Blob(b,{type:"application/pdf"})}};var Eb=null;kb.push(ed);qa.exportSVG=
+function(){fd(bd,window.open("about:blank","_blank"))};qa.exportPDF=function(){var a=window.open("about:blank","_blank");va.loadScript("pako","pako.min.js",function(){fd(cd,a)})};var oc="Move",Gb,ta=[],Qa=0,Ud=0,tb=0,F={Delete:{}};F.Delete.actions=[];F.Delete.actions[0]={};F.Delete.actions[0].event="mousedown";F.Delete.actions[0].tooltip="...";F.Delete.actions[0]["do"]=function(){aa=Fb(U);null!==aa&&kd(aa.mover.name);return!0};F.Move={};F.Move.actions=[];F.Move.actions[0]={};F.Move.actions[0].event=
+"mousedown";F.Move.actions[0].tooltip="Move free elements by dragging the mouse";F.Move.actions[0]["do"]=function(){for(var a=U,b=null,c=1E6,d,e=0;e<u.free.length;e++){var h=u.free[e];if(!h.pinned&&!1!==h.visible&&!0!==h.tmp){var k,l,n,q=x.drawingstate.matrix.sdet;if("P"===h.kind){l=f.normalizeZ(h.homog);if(!f._helper.isAlmostReal(l))continue;k=l.value[0].value.real-a.x;l=l.value[1].value.real-a.y;n=Math.sqrt(k*k+l*l);if(h.narrow&&n>("number"===typeof h.narrow?h.narrow:20)/q)continue}else if("C"===
+h.kind)l=u.csnames[h.args[0]],n=h.radius,k=m.div(l.homog.value[0],l.homog.value[2]).value.real,l=m.div(l.homog.value[1],l.homog.value[2]).value.real,k-=a.x,l-=a.y,n=Math.sqrt(k*k+l*l)-n.value.real,l=k=0,0>n&&(n=-n),n+=30/q;else if("L"===h.kind)k=h.homog,n=m,l=n.add(n.mult(k.value[0],n.conjugate(k.value[0])),n.mult(k.value[1],n.conjugate(k.value[1]))),l=f.scaldiv(n.sqrt(l),k),n=l.value[0].value.real*a.x+l.value[1].value.real*a.y+l.value[2].value.real,k=-l.value[0].value.real*n,l=-l.value[1].value.real*
+n,0>n&&(n=-n),n+=25/q;else if("Text"===h.kind){if(!h._bbox)continue;l=x.from(a.x,a.y,1);k=Math.max(0,l[0]-h._bbox.right,h._bbox.left-l[0]);l=Math.max(0,l[1]-h._bbox.bottom,h._bbox.top-l[1]);n=Math.sqrt(k*k+l*l);if(20<n)continue;n/=q;l=f.normalizeZ(h.homog);if(!f._helper.isAlmostReal(l))continue;k=l.value[0].value.real-a.x;l=l.value[1].value.real-a.y}else continue;n<c+.2/q&&(c=n,b=h,d={x:k,y:l})}}console.log("Moving "+(b?b.name:"nothing"));aa=null===b?null:{mover:b,offset:d,prev:{x:a.x,y:a.y}};return!0};
+F.Point={};F.Point.actions=[];F.Point.actions[0]={};F.Point.actions[0].event="mousedown";F.Point.actions[0].tooltip="Add a single point with the mouse";F.Point.actions[0]["do"]=function(){Da({type:"Free",name:Pa(),labeled:!0,pos:[sa[0],sa[1],1]});return!0};F.Mid={};F.Mid.actions=[];F.Mid.actions[0]={};F.Mid.actions[0].event="mousedown";F.Mid.actions[0].tooltip="Construct two points and their midpoint by dragging";F.Mid.actions[0]["do"]=function(){ob();return!0};F.Mid.actions[1]={};F.Mid.actions[1].event=
+"mousemove";F.Mid.actions[1]["do"]=function(){Rb("Mid");return!0};F.Mid.actions[2]={};F.Mid.actions[2].event="mouseup";F.Mid.actions[2]["do"]=function(){ub();return!0};F.Circle={};F.Circle.actions=[];F.Circle.actions[0]={};F.Circle.actions[0].event="mousedown";F.Circle.actions[0].tooltip="Construct two points and a circle by dragging the mouse";F.Circle.actions[0]["do"]=function(){ob();return!0};F.Circle.actions[1]={};F.Circle.actions[1].event="mousemove";F.Circle.actions[1]["do"]=function(){Rb("CircleMP");
+return!0};F.Circle.actions[2]={};F.Circle.actions[2].event="mouseup";F.Circle.actions[2]["do"]=function(){ub();return!0};F.Compass={};F.Compass.actions=[];F.Compass.actions[0]={};F.Compass.actions[0].event="mousedown";F.Compass.actions[0].tooltip="...";F.Compass.actions[0]["do"]=function(){ob();return!0};F.Compass.actions[1]={};F.Compass.actions[1].event="mousedown";F.Compass.actions[1].tooltip="...";F.Compass.actions[1]["do"]=function(){ob();return!0};F.Compass.actions[2]={};F.Compass.actions[2].event=
+"mousedown";F.Compass.actions[2].tooltip="...";F.Compass.actions[2]["do"]=function(){ob();Da({type:"Compass",name:Pa(),labeled:!0,args:[ta[0].name,ta[1].name,ta[2].name]});return!0};F.Line={};F.Line.actions=[];F.Line.actions[0]={};F.Line.actions[0].event="mousedown";F.Line.actions[0].tooltip="Construct two points and their connecting line by dragging the mouse";F.Line.actions[0]["do"]=function(){ob();return!0};F.Line.actions[1]={};F.Line.actions[1].event="mousemove";F.Line.actions[1]["do"]=function(){Rb("Join");
+return!0};F.Line.actions[2]={};F.Line.actions[2].event="mouseup";F.Line.actions[2]["do"]=function(){ub();return!0};F.Segment={};F.Segment.actions=[];F.Segment.actions[0]={};F.Segment.actions[0].event="mousedown";F.Segment.actions[0].tooltip="Draw a segment by dragging the mouse";F.Segment.actions[0]["do"]=function(){ob();return!0};F.Segment.actions[1]={};F.Segment.actions[1].event="mousemove";F.Segment.actions[1]["do"]=function(){Rb("Segment");return!0};F.Segment.actions[2]={};F.Segment.actions[2].event=
+"mouseup";F.Segment.actions[2]["do"]=function(){ub();return!0};F.Parallel={};F.Parallel.actions=[];F.Parallel.actions[0]={};F.Parallel.actions[0].event="mousedown";F.Parallel.actions[0].tooltip="Construct a parallel line by dragging a line";F.Parallel.actions[0]["do"]=function(){return id()};F.Parallel.actions[1]={};F.Parallel.actions[1].event="mousemove";F.Parallel.actions[1]["do"]=function(){var a={type:"Free",name:Pa(),labeled:!0,pos:[sa[0],sa[1],1],tmp:!0},a=Da(a);Gb=Da({type:"Para",name:Pa(),
+labeled:!0,args:[ta[0].name,a.name]});qc(a);return!0};F.Parallel.actions[2]={};F.Parallel.actions[2].event="mouseup";F.Parallel.actions[2]["do"]=function(){ub();return!0};F.Orthogonal={};F.Orthogonal.actions=[];F.Orthogonal.actions[0]={};F.Orthogonal.actions[0].event="mousedown";F.Orthogonal.actions[0].tooltip="Construct a orthogonal line by dragging a line";F.Orthogonal.actions[0]["do"]=function(){if(id()){var a={type:"Free",name:Pa(),labeled:!0,pos:[sa[0],sa[1],1],tmp:!0},a=Da(a);Gb=Da({type:"Perp",
+name:Pa(),labeled:!0,args:[ta[0].name,a.name]});qc(a);return!0}return!1};F.Orthogonal.actions[1]={};F.Orthogonal.actions[1].event="mouseup";F.Orthogonal.actions[1]["do"]=function(){ub();return!0};F.Intersection={};F.Intersection.actions=[];F.Intersection.actions[0]={};F.Intersection.actions[0].event="mousedown";F.Intersection.actions[0].tooltip="Select two elements to define their intersection";F.Intersection.actions[0]["do"]=function(){return jd()};F.Intersection.actions[1]={};F.Intersection.actions[1].event=
+"mousedown";F.Intersection.actions[1]["do"]=function(){return jd()?(Gb=Da({type:"Meet",name:Pa(),labeled:!0,args:[ta[0].name,ta[1].name]}),!0):!1};var Xa={},x={drawingstate:{}};x.drawingstate.linecolor="rgb(0,0,255)";x.drawingstate.linecolorraw=[0,0,1];x.drawingstate.pointcolor="rgb(0,255,0)";x.drawingstate.pointcolorraw=[0,1,0];x.drawingstate.textcolor="rgb(0,0,0)";x.drawingstate.textcolorraw=[0,0,0];x.drawingstate.alpha=1;x.drawingstate.pointsize=4;x.drawingstate.linesize=1;x.drawingstate.textsize=
+null;x.drawingstate.matrix={};x.drawingstate.matrix.a=25;x.drawingstate.matrix.b=0;x.drawingstate.matrix.c=0;x.drawingstate.matrix.d=25;x.drawingstate.matrix.tx=250.5;x.drawingstate.matrix.ty=250.5;x.drawingstate.matrix.det=x.drawingstate.matrix.a*x.drawingstate.matrix.d-x.drawingstate.matrix.b*x.drawingstate.matrix.c;x.drawingstate.matrix.sdet=Math.sqrt(x.drawingstate.matrix.det);x.drawingstate.initialmatrix={};x.drawingstate.initialmatrix.a=x.drawingstate.matrix.a;x.drawingstate.initialmatrix.b=
+x.drawingstate.matrix.b;x.drawingstate.initialmatrix.c=x.drawingstate.matrix.c;x.drawingstate.initialmatrix.d=x.drawingstate.matrix.d;x.drawingstate.initialmatrix.tx=x.drawingstate.matrix.tx;x.drawingstate.initialmatrix.ty=x.drawingstate.matrix.ty;x.drawingstate.initialmatrix.det=x.drawingstate.matrix.det;x.drawingstate.initialmatrix.sdet=x.drawingstate.matrix.sdet;x.clone=function(a){if(null===a||"object"!==typeof a)return a;var b=a.constructor(),c;for(c in a)b[c]=x.clone(a[c]);return b};Xa.backup=
+x.clone(x.drawingstate);Xa.stack=[];x.clone(x.drawingstate);x.reset=function(){x.drawingstate.matrix.a=x.drawingstate.initialmatrix.a;x.drawingstate.matrix.b=x.drawingstate.initialmatrix.b;x.drawingstate.matrix.c=x.drawingstate.initialmatrix.c;x.drawingstate.matrix.d=x.drawingstate.initialmatrix.d;x.drawingstate.matrix.tx=x.drawingstate.initialmatrix.tx;x.drawingstate.matrix.ty=x.drawingstate.initialmatrix.ty;x.drawingstate.matrix.det=x.drawingstate.initialmatrix.det;x.drawingstate.matrix.sdet=x.drawingstate.initialmatrix.sdet};
+x.from=function(a,b,c){a/=c;b/=c;c=x.drawingstate.matrix;return[a*c.a-b*c.b+c.tx,a*c.c-b*c.d-c.ty]};x.to=function(a,b){var c=x.drawingstate.matrix,d=a-c.tx,e=b+c.ty;return[(d*c.d-e*c.b)/c.det,-(-d*c.c+e*c.a)/c.det,1]};x.toMat=function(){var a=x.drawingstate.matrix;return f.realMatrix([[a.d,-a.b,-a.tx*a.d-a.ty*a.b],[a.c,-a.a,-a.tx*a.c-a.ty*a.a],[0,0,a.det]])};x.dumpTrafo=function(){function a(a){return Math.round(1E3*a)/1E3}var b=x.drawingstate.matrix;console.log("a:"+a(b.a)+" b:"+a(b.b)+" c:"+a(b.c)+
+" d:"+a(b.d)+" tx:"+a(b.ty)+" ty:"+a(b.tx))};x.setMat=function(a,b,c,d,e,f){var h=x.drawingstate.matrix;h.a=a;h.b=b;h.c=c;h.d=d;h.tx=e;h.ty=f;h.det=a*d-b*c;h.sdet=Math.sqrt(h.det)};x.scaleAndOrigin=function(a,b,c){x.setMat(a,0,0,a,b,c)};x.visibleRect=function(a,b,c,d){var e=c-a,f=b-d,e=W*f<V*e?W/e:V/f;x.setMat(e,0,0,e,(W-e*(a+c))/2,(V-e*(b+d))/2)};x.applyMat=function(a,b,c,d,e,f){var h=x.drawingstate.matrix;x.setMat(h.a*a+h.c*b,h.b*a+h.d*b,h.a*c+h.c*d,h.b*c+h.d*d,h.a*e+h.c*f+h.tx,h.b*e+h.d*f+h.ty)};
+x.translate=function(a,b){x.applyMat(1,0,0,1,a,b)};x.rotate=function(a){var b=Math.cos(a);a=Math.sin(a);x.applyMat(b,a,-a,b,0,0)};x.scale=function(a){x.applyMat(a,0,0,a,0,0)};x.gsave=function(){Xa.stack.push(x.clone(x.drawingstate))};x.grestore=function(){0!==Xa.stack.length&&(x.drawingstate=Xa.stack.pop())};x.greset=function(){x.drawingstate=x.clone(Xa.backup);x.drawingstate.matrix.ty-=V;x.drawingstate.initialmatrix.ty-=V;Xa.stack=[]};x.createnewbackup=function(){x.drawingstate.initialmatrix.a=x.drawingstate.matrix.a;
+x.drawingstate.initialmatrix.b=x.drawingstate.matrix.b;x.drawingstate.initialmatrix.c=x.drawingstate.matrix.c;x.drawingstate.initialmatrix.d=x.drawingstate.matrix.d;x.drawingstate.initialmatrix.tx=x.drawingstate.matrix.tx;x.drawingstate.initialmatrix.ty=x.drawingstate.matrix.ty;x.drawingstate.initialmatrix.det=x.drawingstate.matrix.det;x.drawingstate.initialmatrix.sdet=x.drawingstate.matrix.sdet;Xa.backup=x.clone(x.drawingstate)};x.makecolor=function(a,b,c){a=Math.floor(255*a);b=Math.floor(255*b);
+c=Math.floor(255*c);return 1===x.drawingstate.alpha?"rgb("+a+","+b+","+c+")":"rgba("+a+","+b+","+c+","+x.drawingstate.alpha+")"};x.setcolor=function(a){var b=a.value[0].value.real,c=a.value[1].value.real;a=a.value[2].value.real;x.drawingstate.linecolor=x.drawingstate.pointcolor=x.makecolor(b,c,a);x.drawingstate.linecolorraw=x.drawingstate.pointcolorraw=[b,c,a]};x.setlinecolor=function(a){var b=a.value[0].value.real,c=a.value[1].value.real;a=a.value[2].value.real;x.drawingstate.linecolor=x.makecolor(b,
+c,a);x.drawingstate.linecolorraw=[b,c,a]};x.settextcolor=function(a){var b=a.value[0].value.real,c=a.value[1].value.real;a=a.value[2].value.real;x.drawingstate.textcolor=x.makecolor(b,c,a);x.drawingstate.textcolorraw=[b,c,a]};x.setpointcolor=function(a){var b=a.value[0].value.real,c=a.value[1].value.real;a=a.value[2].value.real;x.drawingstate.pointcolor=x.makecolor(b,c,a);x.drawingstate.pointcolorraw=[b,c,a]};x.setalpha=function(a){x.drawingstate.alpha=a.value.real;x.drawingstate.linecolor=x.makecolor(x.drawingstate.linecolorraw[0],
+x.drawingstate.linecolorraw[1],x.drawingstate.linecolorraw[2]);x.drawingstate.pointcolor=x.makecolor(x.drawingstate.pointcolorraw[0],x.drawingstate.pointcolorraw[1],x.drawingstate.pointcolorraw[2]);x.drawingstate.textcolor=x.makecolor(x.drawingstate.textcolorraw[0],x.drawingstate.textcolorraw[1],x.drawingstate.textcolorraw[2])};x.setpointsize=function(a){x.drawingstate.pointsize=a.value.real};x.setlinesize=function(a){x.drawingstate.linesize=a.value.real};x.settextsize=function(a){x.drawingstate.textsize=
+a.value.real};var ja={clip:"none",pointColor:[1,0,0],lineColor:[0,0,1],pointSize:5,lineSize:1,alpha:1,overhangLine:1,overhangSeg:1,dimDependent:.7,fontFamily:"sans-serif",textsize:20,lineHeight:1.45};q.defaultAppearance&&Vd(q.defaultAppearance);var Tb={},rd={UL:0,UR:1,LR:2,LL:3},sc=["in","out","good","backup"],gb=new Float64Array(0),bb={};sc.forEach(function(a){bb[a]=gb});var ma=gb,Fa=gb,ya=gb,ua,za,eb,Ga,vb,tc=!1,td={toString:function(){return"RefineException"}},I=null;q.enableTraceLog&&(I={logLength:Infinity,
+fullLog:[],currentMouseAndScripts:null,currentMover:null,currentStep:null,currentElement:null,currentParam:null,labelTracing2:v.wrap("tracing2"),labelTracing4:v.wrap("tracing4"),labelTracingSesq:v.wrap("tracingSesq"),postMouseHooks:[]},"number"===typeof q.enableTraceLog&&(I.logLength=q.enableTraceLog),qa.getTraceLog=ae,qa.formatTraceLog=be,qa.addTraceHook=I.postMouseHooks.push.bind(I.postMouseHooks));Ha.stateSize=12;vc.stateSize=24;var hb=[];fb.P=function(a){u.lines.forEach(function(b){b=yd(a,b);
+b.holds()&&hb.push(b)});u.conics.forEach(function(b){b=zd(a,b);b.holds()&&hb.push(b)})};fb.L=function(a){u.points.forEach(function(b){b=yd(b,a);b.holds()&&hb.push(b)})};fb.S=fb.L;fb.C=function(a){u.points.forEach(function(b){b=zd(b,a);b.holds()&&hb.push(b)})};var n={_helper:{},RandomLine:{}};n.RandomLine.kind="L";n.RandomLine.signature=[];n.RandomLine.updatePosition=function(a){a.homog=f.realVector([Math.random()-.5,Math.random()-.5,Math.random()-.5]);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,
+"Line")};n.FreeLine={};n.FreeLine.kind="L";n.FreeLine.signature=[];n.FreeLine.isMovable=!0;n.FreeLine.initialize=function(a){a=n._helper.initializeLine(a);T(a)};n.FreeLine.getParamForInput=function(a,b,c){"mouse"===c?(a=f.cross(b,f.ez),a=f.cross(a,b)):a="homog"===c?b:f.turnIntoCSList([m.zero,m.zero,m.zero]);return f.normalizeMax(a)};n.FreeLine.getParamFromState=function(a){return Z(3)};n.FreeLine.putParamToState=function(a,b){T(b)};n.FreeLine.updatePosition=function(a){var b=Z(3);T(b);a.homog=v.withUsage(b,
+"Line")};n.FreeLine.stateSize=6;n.RandomPoint={};n.RandomPoint.kind="P";n.RandomPoint.signature=[];n.RandomPoint.updatePosition=function(a){a.homog=f.realVector([100*Math.random(),100*Math.random(),100*Math.random()]);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Point")};n.Join={};n.Join.kind="L";n.Join.signature=["P","P"];n.Join.updatePosition=function(a){a.homog=f.cross(u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,
+"Line")};n.Segment={};n.Segment.kind="S";n.Segment.signature=["P","P"];n.Segment.updatePosition=function(a){var b=u.csnames[a.args[0]],c=u.csnames[a.args[1]];n.Segment.setSegmentPos(a,f.cross(b.homog,c.homog),f.scalmult(c.homog.value[2],b.homog),f.scalmult(b.homog.value[2],c.homog))};n.Segment.setSegmentPos=function(a,b,c,d){b=f.normalizeMax(b);a.homog=v.withUsage(b,"Line");b=f.turnIntoCSList([c,d]);b=f.normalizeMax(b);a.startpos=b.value[0];a.endpos=b.value[1]};n.Meet={};n.Meet.kind="P";n.Meet.signature=
+["L","L"];n.Meet.updatePosition=function(a){a.homog=f.cross(u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Point")};n.Meet.visiblecheck=function(a){var b=!0,c=u.csnames[a.args[0]],d=u.csnames[a.args[1]];"S"===c.kind&&(b=pd(a,c));b&&"S"===d.kind&&(b=pd(a,d));a.isshowing=b};n._helper.midpoint=function(a,b){return f.normalizeMax(f.add(f.scalmult(b.value[2],a),f.scalmult(a.value[2],b)))};n.Mid={};n.Mid.kind="P";n.Mid.signature=["P",
+"P"];n.Mid.updatePosition=function(a){var b=n._helper.midpoint(u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog);a.homog=v.withUsage(b,"Point")};n.Perp={};n.Perp.kind="L";n.Perp.signature=["L","P"];n.Perp.updatePosition=function(a){var b=u.csnames[a.args[0]].homog,c=u.csnames[a.args[1]].homog,b=f.turnIntoCSList([b.value[0],b.value[1],m.zero]);a.homog=f.cross(b,c);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Line")};n.Para={};n.Para.kind="L";n.Para.signature=["L","P"];n.Para.updatePosition=
+function(a){var b=u.csnames[a.args[1]].homog;a.homog=f.cross(f.cross(f.linfty,u.csnames[a.args[0]].homog),b);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Line")};n.Horizontal={};n.Horizontal.kind="L";n.Horizontal.signature=["P"];n.Horizontal.updatePosition=function(a){a.homog=f.cross(f.ex,u.csnames[a.args[0]].homog);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Line")};n.HorizontalLine={};n.HorizontalLine.kind="L";n.HorizontalLine.signature=[];n.HorizontalLine.isMovable=
+!0;n.HorizontalLine.initialize=function(a){a=n._helper.initializeLine(a);a=f.turnIntoCSList([m.zero,a.value[1],a.value[2]]);a=f.normalizeMax(a);T(a)};n.HorizontalLine.getParamForInput=function(a,b,c){if("mouse"===c)b=f.cross(b,f.ex);else if("homog"===c){if(0!==b.value[0].real||0!==b.value[0].imag)b=f.turnIntoCSList([m.zero,b.value[1],b.value[2]])}else b=f.turnIntoCSList([m.zero,m.zero,m.zero]);return f.normalizeMax(b)};n.HorizontalLine.getParamFromState=function(a){return Z(3)};n.HorizontalLine.putParamToState=
+function(a,b){T(b)};n.HorizontalLine.updatePosition=function(a){var b=Z(3);T(b);a.homog=v.withUsage(b,"Line")};n.HorizontalLine.stateSize=6;n.Vertical={};n.Vertical.kind="L";n.Vertical.signature=["P"];n.Vertical.updatePosition=function(a){a.homog=f.cross(f.ey,u.csnames[a.args[0]].homog);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Line")};n.VerticalLine={};n.VerticalLine.kind="L";n.VerticalLine.signature=[];n.VerticalLine.isMovable=!0;n.VerticalLine.initialize=function(a){a=n._helper.initializeLine(a);
+a=f.turnIntoCSList([a.value[0],m.zero,a.value[2]]);a=f.normalizeMax(a);T(a)};n.VerticalLine.getParamForInput=function(a,b,c){if("mouse"===c)b=f.cross(b,f.ey);else if("homog"===c){if(0!==b.value[1].real||0!==b.value[1].imag)b=f.turnIntoCSList([b.value[0],m.zero,b.value[2]])}else b=f.turnIntoCSList([m.zero,m.zero,m.zero]);return f.normalizeMax(b)};n.VerticalLine.getParamFromState=function(a){return Z(3)};n.VerticalLine.putParamToState=function(a,b){T(b)};n.VerticalLine.updatePosition=function(a){var b=
+Z(3);T(b);a.homog=v.withUsage(b,"Line")};n.VerticalLine.stateSize=6;n.LineByFixedAngle={};n.LineByFixedAngle.kind="L";n.LineByFixedAngle.signature=["L","P"];n.LineByFixedAngle.initialize=function(a){var b=m._helper.input(a.angle),c=m.cos(b),b=m.sin(b);a.rot=f.turnIntoCSList([f.turnIntoCSList([b,c,m.zero]),f.turnIntoCSList([m.neg(c),b,m.zero]),f.turnIntoCSList([m.zero,m.zero,m.zero])])};n.LineByFixedAngle.updatePosition=function(a){var b=u.csnames[a.args[1]],c=f.productMV(a.rot,u.csnames[a.args[0]].homog);
+a.homog=f.cross(b.homog,c);a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Line")};n.Through={};n.Through.kind="L";n.Through.signature=["P"];n.Through.isMovable=!0;n.Through.initialize=function(a){a=a.dir?v.wrap(a.dir):f.realVector([a.pos[1],-a.pos[0],0]);T(a)};n.Through.getParamForInput=function(a,b,c){a="dir"===c||"mouse"===c?f.cross(u.csnames[a.args[0]].homog,b):"homog"===c?b:f.turnIntoCSList([m.zero,m.zero,m.zero]);a=f.cross(f.linfty,a);return f.normalizeMax(a)};n.Through.getParamFromState=
+function(a){return Z(3)};n.Through.putParamToState=function(a,b){T(b)};n.Through.updatePosition=function(a){var b=Z(3);T(b);b=f.cross(u.csnames[a.args[0]].homog,b);b=f.normalizeMax(b);a.homog=v.withUsage(b,"Line")};n.Through.stateSize=6;n.Free={};n.Free.kind="P";n.Free.signature=[];n.Free.isMovable=!0;n.Free.initialize=function(a){a=n._helper.initializePoint(a);T(a)};n.Free.getParamForInput=function(a,b,c){if("mouse"===c&&bc&&0!==Ta){b=f.normalizeZ(b);a=b.value[0].value.real;c=b.value[1].value.real;
+var d=Math.round(a/Ta)*Ta,e=Math.round(c/Ta)*Ta;.2>Math.abs(d-a)&&.2>Math.abs(e-c)&&(b=f.realVector([d,e,1]))}return f.normalizeMax(b)};n.Free.getParamFromState=function(a){return Z(3)};n.Free.putParamToState=function(a,b){T(b)};n.Free.updatePosition=function(a){var b=Z(3);T(b);a.homog=v.withUsage(b,"Point")};n.Free.stateSize=6;n._helper.projectPointToLine=function(a,b){var c=f.turnIntoCSList([b.value[0],b.value[1],m.zero]),c=f.cross(c,a);return f.normalizeMax(f.cross(c,b))};n.PointOnLine={};n.PointOnLine.kind=
+"P";n.PointOnLine.signature=["L"];n.PointOnLine.isMovable=!0;n.PointOnLine.initialize=function(a){var b=n._helper.initializePoint(a);a=u.csnames[a.args[0]].homog;var b=n._helper.projectPointToLine(b,a),b=f.normalizeMax(b),c=f.cross(f.linfty,b);f.normalizeMax(c);T(b);T(a);eb=!1};n.PointOnLine.updatePosition=function(a,b){var c,d=u.csnames[a.args[0]].homog;c=Z(3);Z(3);if(!b){ua=a.stateIdx;var e=ma;ma=ya;var h=Z(3),m=Z(3);ma=e;e=f.cross(m,d);f._helper.isAlmostZero(e)&&(e=f.cross(f.linfty,d));h=n._helper.CircleMP(e,
+h);h=n._helper.IntersectLC(d,h);e=n._helper.pointReflection(e,c);c=vd(h[0],h[1],c,e)[0]}c=f.normalizeMax(c);T(c);T(d);a.homog=v.withUsage(c,"Point")};n.PointOnLine.getParamForInput=function(a,b,c){return b=n._helper.projectPointToLine(b,u.csnames[a.args[0]].homog)};n.PointOnLine.getParamFromState=function(a){return Z(3)};n.PointOnLine.putParamToState=function(a,b){return T(b)};n.PointOnLine.stateSize=12;n.PointOnCircle={};n.PointOnCircle.kind="P";n.PointOnCircle.signature=["C"];n.PointOnCircle.isMovable=
+!0;n.PointOnCircle.initialize=function(a){var b=u.csnames[a.args[0]];a=f.normalizeZ(n._helper.initializePoint(a));var c=f.normalizeZ(n._helper.CenterOfConic(b.matrix)),d=f.sub(a,c),d=f.turnIntoCSList([d.value[1],m.neg(d.value[0]),m.zero]),c=f.cross(a,c),b=n._helper.IntersectLC(c,b.matrix),c=f.projectiveDistMinScal(a,b[0]);f.projectiveDistMinScal(a,b[1])<c?(a=b[1],b=b[0]):(a=b[0],b=b[1]);T(d);T(a);T(b);eb=!1};n.PointOnCircle.putParamToState=function(a,b){T(b)};n.PointOnCircle.getParamFromState=function(a){return Z(3)};
+n.PointOnCircle.getParamForInput=function(a,b,c){c=f.normalizeZ(n._helper.CenterOfConic(u.csnames[a.args[0]].matrix));b=f.sub(b,c);ua=a.stateIdx;a=Z(3);var d=f.normalizeZ(Z(3));c=f.sub(d,c);0>m.sub(m.mult(a.value[0],c.value[1]),m.mult(a.value[1],c.value[0])).value.real&&(b=f.neg(b));return f.turnIntoCSList([b.value[1],m.neg(b.value[0]),m.zero])};n.PointOnCircle.parameterPath=function(a,b,c,d,e){d=f.normalizeAbs(d);e=f.normalizeAbs(e);var h=f.scalproduct(d,e);if(0<=h.value.real)return ud(a,b,c,d,e);
+a=f.turnIntoCSList([m.sub(d.value[1],e.value[1]),m.sub(e.value[0],d.value[0]),m.zero]);h=f.scalproduct(d,a);0>h.value.real&&(a=f.neg(a));0>b?(b=2*b+1,c=b*b,h=.25/(1+c),c=m.complex(2*b*h+.25,(1-c)*h)):(b=2*b-1,c=b*b,h=.25/(1+c),c=m.complex(2*b*h+.75,(1-c)*h));var k=m.sub(m.real(1),c);b=m.mult(c,c);h=m.mult(k,k);c=m.mult(c,k);d=f.scalmult(h,d);d=f.add(d,f.scalmult(c,a));return d=f.add(d,f.scalmult(b,e))};n.PointOnCircle.updatePosition=function(a){var b=Z(3);T(b);var c=u.csnames[a.args[0]],b=f.productMV(c.matrix,
+b),c=n._helper.IntersectLC(b,c.matrix),c=Ha(c[0],c[1]),b=f.normalizeMax(c.value[0]);a.homog=v.withUsage(b,"Point");a.antipodalPoint=c.value[1]};n.PointOnCircle.stateSize=6+Ha.stateSize;n.OtherPointOnCircle={};n.OtherPointOnCircle.kind="P";n.OtherPointOnCircle.signature=["P"];n.OtherPointOnCircle.signatureConstraints=function(a){return"PointOnCircle"===u.csnames[a.args[0]].type};n.OtherPointOnCircle.updatePosition=function(a){var b=u.csnames[a.args[0]].antipodalPoint,b=f.normalizeMax(b);a.homog=v.withUsage(b,
+"Point")};n.PointOnSegment={};n.PointOnSegment.kind="P";n.PointOnSegment.signature=["S"];n.PointOnSegment.isMovable=!0;n.PointOnSegment.initialize=function(a){var b=n._helper.initializePoint(a);a=n.PointOnSegment.getParamForInput(a,b);Va(a)};n.PointOnSegment.getParamForInput=function(a,b){var c=u.csnames[a.args[0]],d=c.homog,d=f.turnIntoCSList([d.value[0],d.value[1],m.zero]),e=f.sub(c.startpos,c.endpos),c=f.crossratio3(e,c.startpos,c.endpos,b,d);0>c.value.real&&(c=m.complex(0,c.value.imag));1<c.value.real&&
+(c=m.complex(1,c.value.imag));return c};n.PointOnSegment.getParamFromState=function(a){return wb()};n.PointOnSegment.putParamToState=function(a,b){Va(b)};n.PointOnSegment.updatePosition=function(a){var b=wb();Va(b);var c=u.csnames[a.args[0]],d=c.startpos,c=f.sub(c.endpos,d),b=f.add(d,f.scalmult(b,c)),b=f.normalizeMax(b);a.homog=v.withUsage(b,"Point")};n.PointOnSegment.stateSize=2;n._helper.CenterOfConic=function(a){a=f.adjoint3(a);return{ctype:"list",value:[a.value[2].value[0],a.value[2].value[1],
+a.value[2].value[2]]}};n.CenterOfConic={};n.CenterOfConic.kind="P";n.CenterOfConic.signature=["C"];n.CenterOfConic.updatePosition=function(a){var b=n._helper.CenterOfConic(u.csnames[a.args[0]].matrix);a.homog=b;a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Point")};n._helper.CircleMP=function(a,b){var c=a.value[0],d=a.value[1],e=m.neg(a.value[2]),h=m.zero,c=f.turnIntoCSList([f.turnIntoCSList([e,h,c]),f.turnIntoCSList([h,e,d]),f.turnIntoCSList([c,d,h])]),e=v.mult(v.mult(b,c),b),d=v.mult(v.mult(b,
+f.fund),b),e=v.mult(e,f.fund),c=v.mult(d,c);return f.sub(e,c)};n.CircleMP={};n.CircleMP.kind="C";n.CircleMP.signature=["P","P"];n.CircleMP.updatePosition=function(a){a.matrix=n._helper.CircleMP(u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog);a.matrix=f.normalizeMax(a.matrix);a.matrix=v.withUsage(a.matrix,"Circle")};n.CircleMr={};n.CircleMr.kind="C";n.CircleMr.signature=["P"];n.CircleMr.isMovable=!0;n.CircleMr.initialize=function(a){Va(m.real(a.radius))};n.CircleMr.getParamForInput=function(a,
+b,c){if("radius"===c)return b;a=u.csnames[a.args[0]].homog;a=f.normalizeZ(a);b=f.normalizeZ(b);b=f.sub(a,b);return b=f.abs(b)};n.CircleMr.getParamFromState=function(a){return wb()};n.CircleMr.putParamToState=function(a,b){Va(b)};n.CircleMr.updatePosition=function(a){var b=wb();Va(b);var c=u.csnames[a.args[0]].homog,d=m.mult(c.value[2],b),d=m.mult(d,d);if(!m._helper.isFinite(d)&&!m._helper.isNaN(d))return f.fund;c=n._helper.ScaledCircleMrr(c,d);a.matrix=v.withUsage(c,"Circle");a.radius=b};n.CircleMr.stateSize=
+2;n._helper.ScaledCircleMrr=function(a,b){var c=a.value[0],d=a.value[1],e=m.neg(a.value[2]),e=f.scalmult(e,f.turnIntoCSList([c,d,e])).value,c=f.turnIntoCSList([c,d]),c=m.sub(f.scalproduct(c,c),b),e=n._helper.buildConicMatrix([e[2],m.zero,e[2],e[0],e[1],c]);return f.normalizeMax(e)};n.Compass={};n.Compass.kind="C";n.Compass.signature=["P","P","P"];n.Compass.updatePosition=function(a){var b=u.csnames[a.args[0]].homog,c=u.csnames[a.args[1]].homog,d=u.csnames[a.args[2]].homog,e=b.value[2],h=c.value[2],
+k=d.value[2],b=f.scalmult(m.mult(h,k),b),c=f.scalmult(m.mult(e,k),c),d=f.scalmult(m.mult(e,h),d),b=f.sub(c,b),d=n._helper.ScaledCircleMrr(d,f.scalproduct(b,b));a.matrix=v.withUsage(d,"Circle")};n._helper.getConicType=function(a){if(1E-16>m.abs(f.det(a)).value.real)return"degenerate";var b=m.mult(a.value[0].value[0],a.value[1].value[1]),b=m.sub(b,m.pow(a.value[0].value[1],m.real(2))),b=b.value.real;return 1E-16>Math.abs(b)?"parabola":1E-16<b?"ellipsoid":"hyperbola"};n._helper.ConicBy5=function(a,b,
+c,d,e,h){a=f.turnIntoCSList([f.cross(c,d)]);var k=f.turnIntoCSList([f.cross(b,e)]);b=f.turnIntoCSList([f.cross(b,c)]);d=f.turnIntoCSList([f.cross(d,e)]);return n._helper.conicFromTwoDegenerates(a,k,b,d,h)};n._helper.conicFromTwoDegenerates=function(a,b,c,d,e){a=v.mult(f.transpose(b),a);c=v.mult(f.transpose(d),c);a=f.add(a,f.transpose(a));c=f.add(c,f.transpose(c));d=v.mult(v.mult(e,a),e);e=v.mult(v.mult(e,c),e);c=v.mult(d,c);e=v.mult(e,a);return f.sub(c,e)};n.ConicBy5={};n.ConicBy5.kind="C";n.ConicBy5.signature=
+["P","P","P","P","P"];n.ConicBy5.updatePosition=function(a){var b=n._helper.ConicBy5(a,u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[4]].homog);a.matrix=b;a.matrix=f.normalizeMax(a.matrix);a.matrix=v.withUsage(a.matrix,"Conic")};n._helper.buildConicMatrix=function(a){var b=a[1],c=a[2],d=a[3],e=a[4],h=a[5];return f.turnIntoCSList([f.turnIntoCSList([a[0],b,d]),f.turnIntoCSList([b,c,e]),f.turnIntoCSList([d,e,h])])};n._helper.splitDegenConic=
+function(a){var b=f.adjoint3(a),c=0,d,e,h=m.abs2(b.value[0].value[0]).value.real;for(d=1;3>d;d++)e=m.abs2(b.value[d].value[d]).value.real,e>h&&(c=d,h=e);d=m.sqrt(m.mult(m.real(-1),b.value[c].value[c]));if(1E-16>m.abs2(d).value.real)return a=f.turnIntoCSList([m.zero,m.zero,m.zero]),[a,a];c=m.real(c+1);e=f.column(b,c);e=f.scaldiv(d,e);d=e.value[0];h=e.value[1];e=e.value[2];d=f.turnIntoCSList([f.turnIntoCSList([m.real(0),e,m.mult(m.real(-1),h)]),f.turnIntoCSList([m.mult(m.real(-1),e),m.real(0),d]),f.turnIntoCSList([h,
+m.mult(m.real(-1),d),m.real(0)])]);a=f.add(a,d);var k=0;for(d=h=b=0;3>d;d++)for(c=0;3>c;c++)e=m.abs2(a.value[d].value[c]).value.real,e>h&&(k=d,b=c,h=e);d=a.value[k];a=f.transpose(a);a=a.value[b];d=f.normalizeMax(d);a=f.normalizeMax(a);d=v.withUsage(d,"Line");a=v.withUsage(a,"Line");return[d,a]};n.SelectConic={};n.SelectConic.kind="C";n.SelectConic.signature=["Cs"];n.SelectConic.initialize=function(a){if(void 0!==a.index)return a.index-1;var b=m._helper.input(a.pos.xx),c=m._helper.input(a.pos.yy),
+d=m._helper.input(a.pos.zz),e=m.realmult(.5,m._helper.input(a.pos.xy)),h=m.realmult(.5,m._helper.input(a.pos.xz)),k=m.realmult(.5,m._helper.input(a.pos.yz)),b=f.turnIntoCSList([f.turnIntoCSList([b,e,h]),f.turnIntoCSList([e,c,k]),f.turnIntoCSList([h,k,d])]);a=u.csnames[a.args[0]].results;c=f.conicDist(b,a[0]);d=0;for(e=1;e<a.length;++e)h=f.conicDist(b,a[e]),h<c&&(c=h,d=e);return d};n.SelectConic.updatePosition=function(a){a.matrix=u.csnames[a.args[0]].results[a.param];a.matrix=f.normalizeMax(a.matrix);
+a.matrix=v.withUsage(a.matrix,"Conic")};n._helper.ConicBy4p1l=function(a,b,c,d,e,h){var k=f.scalproduct(b,h),l=f.scalproduct(c,h),q=f.scalproduct(d,h),r=f.scalproduct(e,h),t=f.det3(c,d,e),u=f.det3(b,c,e),v=f.det3(b,d,e),w=f.det3(b,c,d),x=m.mult,l=m.sqrt(x(x(l,r),x(t,u))),k=m.sqrt(x(x(k,q),x(v,w))),q=f.cross(f.cross(b,d),h);h=f.cross(f.cross(c,e),h);q=f.scalmult(l,q);k=f.scalmult(k,h);h=f.normalizeMax(f.add(q,k));k=f.normalizeMax(f.sub(q,k));k=Ha(h,k);h=n._helper.ConicBy5(a,b,c,d,e,k.value[0]);a=n._helper.ConicBy5(a,
+b,c,d,e,k.value[1]);return[f.normalizeMax(h),f.normalizeMax(a)]};n.ConicBy4p1l={};n.ConicBy4p1l.kind="Cs";n.ConicBy4p1l.signature=["P","P","P","P","L"];n.ConicBy4p1l.updatePosition=function(a){var b=n._helper.ConicBy4p1l(a,u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[4]].homog);a.results=b};n.ConicBy4p1l.stateSize=Ha.stateSize;n._helper.ConicBy3p2l=function(a,b,c,d,e){function h(a,b,c,d){return m.sub(m.mult(a,d),m.mult(b,
+c))}var k=f.cross(a,b),l=f.cross(d,e);d=f.cross(d,k);e=f.cross(e,k);k=f.turnIntoCSList([d,e,l]);c=f.productVM(c,f.adjoint3(k));l=f.adjoint3(f.turnIntoCSList([f.scalmult(c.value[0],d),f.scalmult(c.value[1],e),f.scalmult(c.value[2],l)]));c=f.transpose(l);d=m.mult;e=f.productMV(c,a);a=e.value[0];e=e.value[1];k=f.productMV(c,b);b=k.value[0];var k=k.value[1],n=m.sqrt(d(a,e)),q=m.sqrt(d(b,k)),r,t=Array(4);for(r=0;4>r;++r){var u=(r&2)-1,v=d(m.real(((r&1)<<1)-1),n),w=d(m.real(u),q),x=h(e,v,k,w),y=h(b,w,a,
+v),u=h(a,e,b,k),z=m.add(m.add(h(b,k,a,e),h(k,w,e,v)),h(w,b,v,a)),v=d(x,x),w=d(y,y),A=d(z,z),B=d(x,y),x=d(x,z),y=d(y,z),B=m.sub(B,d(m.real(.5),d(u,u))),u=f.turnIntoCSList([f.turnIntoCSList([v,B,x]),f.turnIntoCSList([B,w,y]),f.turnIntoCSList([x,y,A])]),u=f.productMM(l,f.productMM(u,c)),u=f.turnIntoCSList([u.value[0].value[0],u.value[0].value[1],u.value[0].value[2],u.value[1].value[1],u.value[1].value[2],u.value[2].value[2]]);t[r]=u}return t};n.ConicBy3p2l={};n.ConicBy3p2l.kind="Cs";n.ConicBy3p2l.signature=
+["P","P","P","L","L"];n.ConicBy3p2l.updatePosition=function(a){for(var b=n._helper.ConicBy3p2l(u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[4]].homog),b=wd(b),c=Array(4),d=0;4>d;++d){var e=b[d].value;c[d]=f.turnIntoCSList([f.turnIntoCSList([e[0],e[1],e[2]]),f.turnIntoCSList([e[1],e[3],e[4]]),f.turnIntoCSList([e[2],e[4],e[5]])])}a.results=c};n.ConicBy3p2l.stateSize=48;n.ConicBy2p3l={};n.ConicBy2p3l.kind="Cs";n.ConicBy2p3l.signature=
+["P","P","L","L","L"];n.ConicBy2p3l.updatePosition=function(a){for(var b=n._helper.ConicBy3p2l(u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[4]].homog,u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog),b=wd(b),c=Array(4),d=0;4>d;++d){var e=b[d].value,e=f.turnIntoCSList([f.turnIntoCSList([e[0],e[1],e[2]]),f.turnIntoCSList([e[1],e[3],e[4]]),f.turnIntoCSList([e[2],e[4],e[5]])]);c[d]=f.normalizeMax(f.adjoint3(e))}a.results=c};n.ConicBy2p3l.stateSize=48;n.ConicBy1p4l={};n.ConicBy1p4l.kind=
+"Cs";n.ConicBy1p4l.signature=["P","L","L","L","L"];n.ConicBy1p4l.updatePosition=function(a){var b=n._helper.ConicBy4p1l(a,u.csnames[a.args[1]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[4]].homog,u.csnames[a.args[0]].homog),c=b[0],b=b[1],c=f.adjoint3(c),b=f.adjoint3(b),b=[c,b];a.results=b};n.ConicBy1p4l.stateSize=Ha.stateSize;n.ConicParabolaPL={};n.ConicParabolaPL.kind="C";n.ConicParabolaPL.signature=["P","L"];n.ConicParabolaPL.updatePosition=function(a){var b=u.csnames[a.args[0]].homog.value,
+c=u.csnames[a.args[1]].homog.value,d=m.mult,e=m.neg,h=m.add,k=m.sub,l=b[0],q=b[1],r=b[2],t=c[0],b=c[1],c=c[2],w=d(r,r),x=d(t,t),y=d(b,b),z=d(r,c),A=e(r),r=h(x,y),y=d(w,y),x=d(w,x),e=d(e(w),d(t,b)),t=d(A,h(d(l,r),d(z,t))),b=d(A,h(d(q,r),d(z,b))),d=k(d(h(d(l,l),d(q,q)),r),d(w,d(c,c))),d=n._helper.buildConicMatrix([y,e,x,t,b,d]),d=f.normalizeMax(d);a.matrix=v.withUsage(d,"Conic")};n.ConicBy2Foci1P={};n.ConicBy2Foci1P.kind="Cs";n.ConicBy2Foci1P.signature=["P","P","P"];n.ConicBy2Foci1P.updatePosition=
+function(a){var b=u.csnames[a.args[0]].homog,c=u.csnames[a.args[1]].homog,d=u.csnames[a.args[2]].homog,e=f.ii,h=f.jj,k=f.normalizeMax(f.cross(b,d)),l=f.normalizeMax(f.cross(c,d)),q=f.normalizeMax(f.cross(d,e)),d=f.normalizeMax(f.cross(d,h)),l=n._helper.coHarmonic(q,d,k,l),k=f.normalizeMax(l[0]),l=f.normalizeMax(l[1]),e=f.turnIntoCSList([e]),q=f.turnIntoCSList([h]),d=f.turnIntoCSList([b]),r=f.turnIntoCSList([c]),h=n._helper.conicFromTwoDegenerates(e,q,d,r,k),h=f.normalizeMax(h),e=n._helper.conicFromTwoDegenerates(e,
+q,d,r,l),e=f.normalizeMax(e),h=f.normalizeMax(f.adjoint3(h)),e=f.normalizeMax(f.adjoint3(e));"ellipsoid"!==n._helper.getConicType(h)&&(k=h,h=e,e=k);f.almostequals(b,c).value&&(b=m.real(3),e=f.zeromatrix(b,b));a.results=[h,e]};n.ConicBy2Pol1P={};n.ConicBy2Pol1P.kind="C";n.ConicBy2Pol1P.signature=["P","L","P","L","P"];n.ConicBy2Pol1P.updatePosition=function(a){var b=u.csnames[a.args[0]].homog,c=u.csnames[a.args[1]].homog,d=u.csnames[a.args[2]].homog,e=u.csnames[a.args[3]].homog,h=u.csnames[a.args[4]].homog,
+k=f.scalproduct,l=f.scalmult,n=f.sub,q=f.productMM,r=m.realmult,t=f.transpose,w=f.turnIntoCSList,x=n(l(k(c,b),h),l(r(2,k(c,h)),b)),y=n(l(k(e,d),h),l(r(2,k(e,h)),d)),z=w([f.cross(b,h)]),h=w([f.cross(d,h)]),y=q(t(z),w([f.cross(b,y)])),w=q(t(h),w([f.cross(d,x)])),q=q(t(z),h),b=k(b,e),c=k(d,c),d=f.add(l(c,y),l(b,w)),d=n(d,l(r(2,m.mult(b,c)),q)),d=f.add(d,t(d)),d=f.normalizeMax(d),d=v.withUsage(d,"Conic");a.matrix=d};n.ConicBy2Pol1L={};n.ConicBy2Pol1L.kind="C";n.ConicBy2Pol1L.signature=["P","L","P","L",
+"L"];n.ConicBy2Pol1L.updatePosition=function(a){var b=u.csnames[a.args[0]].homog,c=u.csnames[a.args[1]].homog,d=u.csnames[a.args[2]].homog,e=u.csnames[a.args[3]].homog,h=u.csnames[a.args[4]].homog,k=f.scalproduct,l=f.scalmult,n=f.productMM,q=m.mult,r=f.transpose,t=f.turnIntoCSList,w=k(c,b),x=k(c,d),y=k(e,b),z=k(e,d),A=k(h,b),k=k(h,d),B=t([f.sub(l(q(y,k),c),l(q(x,A),e))]),b=f.add(n(r(t([l(q(y,x),h)])),t([f.sub(f.add(l(m.sub(q(w,k),q(x,A)),e),l(m.sub(q(z,A),q(y,k)),c)),l(f.det3(c,e,h),f.cross(b,d)))])),
+n(r(B),B)),b=f.add(b,r(b)),b=f.normalizeMax(b),b=v.withUsage(b,"Conic");a.matrix=b};n._helper.conic1Pol3Inc=function(a,b,c,d,e){var h=f.scalproduct,k=f.scalmult,l=f.productMM,n=f.cross,q=m.realmult,r=m.mult,t=f.transpose,u=f.turnIntoCSList,v=f.det3,w=v(a,c,d),x=u([n(c,e)]),y=u([n(a,e)]),z=u([n(c,d)]),A=h(b,a),B=h(b,c);b=h(b,e);n=u([n(d,f.sub(k(A,e),k(q(2,b),a)))]);x=k(w,l(t(x),n));a=q(2,m.add(r(v(a,d,e),B),r(w,b)));a=m.sub(r(v(c,d,e),A),a);x=f.add(x,k(a,l(t(y),z)));x=f.add(x,t(x));return x=f.normalizeMax(x)};
+n.ConicBy1Pol3P={};n.ConicBy1Pol3P.kind="C";n.ConicBy1Pol3P.signature=["P","L","P","P","P"];n.ConicBy1Pol3P.updatePosition=function(a){var b=n._helper.conic1Pol3Inc(u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[4]].homog),b=v.withUsage(b,"Conic");a.matrix=b};n.ConicBy1Pol3L={};n.ConicBy1Pol3L.kind="C";n.ConicBy1Pol3L.signature=["P","L","L","L","L"];n.ConicBy1Pol3L.updatePosition=function(a){var b=n._helper.conic1Pol3Inc(u.csnames[a.args[1]].homog,
+u.csnames[a.args[0]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[4]].homog),b=f.normalizeMax(f.adjoint3(b)),b=v.withUsage(b,"Conic");a.matrix=b};n._helper.coHarmonic=function(a,b,c,d){var e=f.realVector([100*Math.random(),100*Math.random(),1]),h=f.det3(e,c,a),k=f.det3(e,c,b);c=f.det3(e,d,a);d=f.det3(e,d,b);d=m.sqrt(m.mult(d,k));h=m.sqrt(m.mult(c,h));a=v.mult(a,d);h=v.mult(b,h);b=f.add(a,h);a=f.sub(a,h);return[b,a]};n.ConicInSquare={};n.ConicInSquare.kind="C";n.ConicInSquare.signature=
+["P","P","P","P"];n.ConicInSquare.updatePosition=function(a){var b=D.basismap(u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog),c=m.one,c=n._helper.buildConicMatrix([c,c,c,m.real(-3),c,c]),b=f.adjoint3(b),b=f.productMM(f.productMM(f.transpose(b),c),b),b=f.normalizeMax(b);a.matrix=v.withUsage(b,"Conic")};n.ConicBy5lines={};n.ConicBy5lines.kind="C";n.ConicBy5lines.signature=["L","L","L","L","L"];n.ConicBy5lines.updatePosition=function(a){var b=
+n._helper.ConicBy5(a,u.csnames[a.args[0]].homog,u.csnames[a.args[1]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[4]].homog),b=f.adjoint3(b);a.matrix=b;a.matrix=f.normalizeMax(a.matrix);a.matrix=v.withUsage(a.matrix,"Conic")};n.ConicFromPrincipalDirections={};n.ConicFromPrincipalDirections.kind="C";n.ConicFromPrincipalDirections.signature=["P","P","P"];n.ConicFromPrincipalDirections.updatePosition=function(a){var b=u.csnames[a.args[0]].homog,c=u.csnames[a.args[1]].homog,
+d=u.csnames[a.args[2]].homog,e=n._helper.pointReflection(b,c),h=f.cross(c,b),b=f.turnIntoCSList([h.value[0],h.value[1],m.zero]),h=f.turnIntoCSList([h]),c=f.turnIntoCSList([f.cross(c,b)]),e=f.turnIntoCSList([f.cross(e,b)]);a.matrix=n._helper.conicFromTwoDegenerates(h,h,c,e,d);a.matrix=f.normalizeMax(a.matrix);a.matrix=v.withUsage(a.matrix,"Conic")};n.CircleBy3={};n.CircleBy3.kind="C";n.CircleBy3.signature=["P","P","P"];n.CircleBy3.updatePosition=function(a){var b=n._helper.ConicBy5(a,u.csnames[a.args[0]].homog,
+u.csnames[a.args[1]].homog,f.ii,f.jj,u.csnames[a.args[2]].homog);a.matrix=f.normalizeMax(b);a.matrix=v.withUsage(a.matrix,"Circle")};n.ArcBy3={};n.ArcBy3.kind="C";n.ArcBy3.signature=["P","P","P"];n.ArcBy3.updatePosition=function(a){n.CircleBy3.updatePosition(a);a.startPoint=u.csnames[a.args[0]].homog;a.viaPoint=u.csnames[a.args[1]].homog;a.endPoint=u.csnames[a.args[2]].homog};n.ArcBy3.initialize=function(a){a.startPoint=u.csnames[a.args[0]].homog;a.viaPoint=u.csnames[a.args[1]].homog;a.endPoint=u.csnames[a.args[2]].homog;
+a.isArc=!0};n.PolarOfPoint={};n.PolarOfPoint.kind="L";n.PolarOfPoint.signature=["P","C"];n.PolarOfPoint.updatePosition=function(a){var b=v.mult(u.csnames[a.args[1]].matrix,u.csnames[a.args[0]].homog),b=f.normalizeMax(b);a.homog=v.withUsage(b,"Line")};n.PolarOfLine={};n.PolarOfLine.kind="P";n.PolarOfLine.signature=["L","C"];n.PolarOfLine.updatePosition=function(a){var b=u.csnames[a.args[0]],c=f.adjoint3(u.csnames[a.args[1]].matrix),b=v.mult(c,b.homog),b=f.normalizeMax(b);a.homog=v.withUsage(b,"Point")};
+n.AngleBisector={};n.AngleBisector.kind="Ls";n.AngleBisector.signature=["L","L","P"];n.AngleBisector.updatePosition=function(a){var b=u.csnames[a.args[0]].homog,c=u.csnames[a.args[1]].homog,d=u.csnames[a.args[2]].homog,e=f.add,h=f.sub,k=f.abs,l=f.cross,m=f.scalmult,n=f.normalizeMax,q=f._helper.isAlmostZero,r=f.linfty,t=m(k(l(l(r,c),r)),b),b=m(k(l(l(r,b),r)),c),h=h(t,b),e=e(t,b);q(h)&&(h=l(l(l(r,e),r),d));q(e)&&(e=l(l(l(r,h),r),d));a.results=Ha(n(h),n(e))};n.AngleBisector.stateSize=Ha.stateSize;n._helper.IntersectLC=
+function(a,b){var c=m,d=f.crossOperator(a),e=f.transpose(d),e=v.mult(e,v.mult(b,d)),h=f.maxIndex(a,m.abs2),k,l,n,q;0===h?(h=e.value[1].value[1],k=e.value[1].value[2],l=e.value[2].value[1],n=e.value[2].value[2],q=a.value[0]):1===h?(h=e.value[0].value[0],k=e.value[0].value[2],l=e.value[2].value[0],n=e.value[2].value[2],q=a.value[1]):(h=e.value[0].value[0],k=e.value[0].value[1],l=e.value[1].value[0],n=e.value[1].value[1],q=a.value[2]);c=c.div(c.sqrt(c.sub(c.mult(k,l),c.mult(h,n))),q);c=f.add(e,f.scalmult(c,
+d));h=f.maxIndex(c,f.abs2);d=c.value[h];d=f.normalizeMax(d);d=v.withUsage(d,"Point");c=f.transpose(c);h=f.maxIndex(c,f.abs2);c=c.value[h];c=f.normalizeMax(c);c=v.withUsage(c,"Point");return[d,c]};n.IntersectLC={};n.IntersectLC.kind="Ps";n.IntersectLC.signature=["L","C"];n.IntersectLC.updatePosition=function(a){var b=n._helper.IntersectLC(u.csnames[a.args[0]].homog,u.csnames[a.args[1]].matrix);a.results=Ha(b[0],b[1])};n.IntersectLC.stateSize=Ha.stateSize;n.OtherIntersectionCL={};n.OtherIntersectionCL.kind=
+"P";n.OtherIntersectionCL.signature=["C","L","P"];n.OtherIntersectionCL.updatePosition=function(a){var b=u.csnames[a.args[2]].homog,c=n._helper.IntersectLC(u.csnames[a.args[1]].homog,u.csnames[a.args[0]].matrix),d=c[0],c=c[1],e=f.projectiveDistMinScal(d,b),b=f.projectiveDistMinScal(c,b);a.homog=e<b?c:d;a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Point")};n.IntersectCirCir={};n.IntersectCirCir.kind="Ps";n.IntersectCirCir.signature=["C","C"];n.IntersectCirCir.updatePosition=function(a){var b=
+u.csnames[a.args[0]].matrix,c=u.csnames[a.args[1]].matrix,d=f.scalmult(c.value[0].value[0],b.value[2]),c=f.scalmult(b.value[0].value[0],c.value[2]),d=f.sub(d,c),d=f.turnIntoCSList([d.value[0],d.value[1],m.realmult(.5,d.value[2])]),d=f.normalizeMax(d),b=n._helper.IntersectLC(d,b);a.results=Ha(b[0],b[1])};n.IntersectCirCir.stateSize=Ha.stateSize;n.OtherIntersectionCC={};n.OtherIntersectionCC.kind="P";n.OtherIntersectionCC.signature=["C","C","P"];n.OtherIntersectionCC.updatePosition=function(a){var b=
+u.csnames[a.args[0]].matrix,c=u.csnames[a.args[1]].matrix,d=u.csnames[a.args[2]].homog,e=f.scalmult(c.value[0].value[0],b.value[2]),c=f.scalmult(b.value[0].value[0],c.value[2]),e=f.sub(e,c),e=f.turnIntoCSList([e.value[0],e.value[1],m.realmult(.5,e.value[2])]),e=f.normalizeMax(e),e=n._helper.IntersectLC(e,b),b=e[0],e=e[1],c=f.projectiveDistMinScal(b,d),d=f.projectiveDistMinScal(e,d);a.homog=c<d?e:b;a.homog=f.normalizeMax(a.homog);a.homog=v.withUsage(a.homog,"Point")};n._helper.IntersectConicConic=
+function(a,b){var c=a.value[0],d=a.value[1],e=a.value[2],h=b.value[0],k=b.value[1],l=b.value[2],q=f.det3(c,d,e),r=m.add(m.add(f.det3(c,d,l),f.det3(c,k,e)),f.det3(h,d,e)),c=m.add(m.add(f.det3(c,k,l),f.det3(h,d,l)),f.det3(h,k,e)),h=f.det3(h,k,l),l=m.abs2(q).value.real,k=m.abs2(h).value.real;l<k&&(l=a,a=b,b=l,l=h,h=q,q=l,l=c,c=r,r=l,l=k);1E-24>l?(q=a,c=b):(r=m.solveCubic(q,r,c,h),c=m.abs2(m.sub(r[0],r[1])).value.real,h=m.abs2(m.sub(r[0],r[2])).value.real,k=m.abs2(m.sub(r[1],r[2])).value.real,c>h?(q=
+r[1],r=c>k?r[0]:r[2]):(q=r[2],r=h>k?r[0]:r[1]),q=f.add(f.scalmult(q,a),b),c=f.add(f.scalmult(r,a),b));r=n._helper.splitDegenConic(q);q=r[0];r=r[1];c=n._helper.splitDegenConic(c);k=c[0];h=c[1];c=f.cross(q,k);k=f.cross(r,k);q=f.cross(q,h);r=f.cross(r,h);c=f.normalizeMax(c);k=f.normalizeMax(k);q=f.normalizeMax(q);r=f.normalizeMax(r);c=v.withUsage(c,"Point");k=v.withUsage(k,"Point");q=v.withUsage(q,"Point");r=v.withUsage(r,"Point");return[c,k,q,r]};n.IntersectConicConic={};n.IntersectConicConic.kind=
+"Ps";n.IntersectConicConic.signature=["C","C"];n.IntersectConicConic.updatePosition=function(a){var b=n._helper.IntersectConicConic(u.csnames[a.args[0]].matrix,u.csnames[a.args[1]].matrix),b=vc(b[0],b[1],b[2],b[3]);a.results=b};n.IntersectConicConic.stateSize=vc.stateSize;n.SelectP={};n.SelectP.kind="P";n.SelectP.signature=["Ps"];n.SelectP.initialize=function(a){if(void 0!==a.index)return a.index-1;var b=u.csnames[a.args[0]].results.value;a=n._helper.initializePoint(a);for(var c=f.projectiveDistMinScal(a,
+b[0]),d=0,e=1;e<b.length;++e){var h=f.projectiveDistMinScal(a,b[e]);h<c&&(c=h,d=e)}return d};n.SelectP.updatePosition=function(a){a.homog=u.csnames[a.args[0]].results.value[a.param]};n.SelectL={};n.SelectL.kind="L";n.SelectL.signature=["Ls"];n.SelectL.initialize=function(a){if(void 0!==a.index)return a.index-1;var b=u.csnames[a.args[0]].results.value;a=n._helper.initializeLine(a);for(var c=f.projectiveDistMinScal(a,b[0]),d=0,e=1;e<b.length;++e){var h=f.projectiveDistMinScal(a,b[e]);h<c&&(c=h,d=e)}return d};
+n.SelectL.updatePosition=function(a){a.homog=u.csnames[a.args[0]].results.value[a.param];a.homog=v.withUsage(a.homog,"Line")};n._helper.moebiusStep=function(a,b,c){var d=m.add,e=m.sub,f=m.mult,h=a.value[0],k=a.value[1];a=a.value[2];var l=b.value[0],n=b.value[1];b=b.value[2];var q=c.value[0],r=c.value[1],t=c.value[2];c=e(f(b,q),f(l,t));var u=e(f(b,r),f(n,t)),q=e(f(h,t),f(a,q)),r=e(f(k,t),f(a,r));return[e(f(h,c),f(k,u)),d(f(k,c),f(h,u)),f(a,c),f(a,u),e(f(l,q),f(n,r)),d(f(n,q),f(l,r)),f(b,q),f(b,r)]};
+n.TrMoebius={};n.TrMoebius.kind="Mt";n.TrMoebius.signature="PPPPPP".split("");n.TrMoebius.updatePosition=function(a){var b=m.neg,c=n._helper.moebiusStep(u.csnames[a.args[0]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[4]].homog),d=n._helper.moebiusStep(u.csnames[a.args[1]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[5]].homog),d=f.normalizeMax(f.matrix([[d[0],b(d[1]),d[4],b(d[5])],[d[1],d[0],d[5],d[4]],[d[2],b(d[3]),d[6],b(d[7])],[d[3],d[2],d[7],d[6]]])),c=f.normalizeMax(f.matrix([[c[6],
+b(c[4])],[c[7],b(c[5])],[b(c[2]),c[0]],[b(c[3]),c[1]]])),e=f.productMM(d,c),c=e.value[0].value[0],d=e.value[1].value[0],h=e.value[0].value[1],k=e.value[1].value[1],l=e.value[2].value[0],q=e.value[3].value[0],r=e.value[2].value[1],e=e.value[3].value[1];a.mat1=f.normalizeMax(f.matrix([[b(l),q,b(r)],[q,l,e],[c,b(d),h]]));a.mat2=f.normalizeMax(f.matrix([[b(q),b(l),b(e)],[b(l),q,b(r)],[d,c,k]]))};n.TrMoebiusP={};n.TrMoebiusP.kind="P";n.TrMoebiusP.signature=["Mt","P"];n.TrMoebiusP.updatePosition=function(a){var b=
+u.csnames[a.args[0]],c=u.csnames[a.args[1]].homog,d=f.productMV(b.mat1,c),b=f.productMV(b.mat2,c);a.homog=f.normalizeMax(f.cross(d,b));a.homog=v.withUsage(a.homog,"Point")};n._helper.TrMoebiusP=function(a,b){var c=f.productMV(b.mat1,a),d=f.productMV(b.mat2,a);return f.normalizeMax(f.cross(c,d))};n.TrMoebiusL={};n.TrMoebiusL.kind="C";n.TrMoebiusL.signature=["Mt","L"];n.TrMoebiusL.updatePosition=function(a){var b=u.csnames[a.args[0]],c=u.csnames[a.args[1]].homog,d=function(){var a=f.realVector([Math.random()-
+.5,Math.random()-.5,Math.random()-.5]);return f.normalizeMax(a)},e=f.cross(d(),c),h=f.cross(d(),c),c=f.cross(d(),c),e=n._helper.TrMoebiusP(e,b),h=n._helper.TrMoebiusP(h,b),b=n._helper.TrMoebiusP(c,b);a.matrix=f.normalizeMax(n._helper.ConicBy5(null,e,h,b,f.ii,f.jj));a.matrix=v.withUsage(a.matrix,"Circle")};n.TrMoebiusS={};n.TrMoebiusS.kind="C";n.TrMoebiusS.signature=["Mt","S"];n.TrMoebiusS.updatePosition=function(a){var b=u.csnames[a.args[0]],c=u.csnames[a.args[1]],d=c.startpos,c=c.endpos,e=f.add(d,
+c),d=n._helper.TrMoebiusP(d,b),e=n._helper.TrMoebiusP(e,b),b=n._helper.TrMoebiusP(c,b);a.startPoint=d;a.viaPoint=e;a.endPoint=b;a.isArc=!0;a.matrix=f.normalizeMax(n._helper.ConicBy5(null,d,e,b,f.ii,f.jj));a.matrix=v.withUsage(a.matrix,"Circle")};n.TrMoebiusC={};n.TrMoebiusC.kind="C";n.TrMoebiusC.signature=["Mt","C"];n.TrMoebiusC.updatePosition=function(a){var b=u.csnames[a.args[0]],c=u.csnames[a.args[1]].matrix;if("Circle"!==c.usage)console.log("applying Moebius transform to conics is not implemented yet"),
+b=m.real(3),a.matrix=f.zeromatrix(b,b);else{var d=function(){var a=f.realVector([Math.random()-.5,Math.random()-.5,Math.random()-.5]);return f.normalizeMax(a)},e=n._helper.IntersectLC(d(),c),d=n._helper.IntersectLC(d(),c),c=e[1],d=d[1],e=n._helper.TrMoebiusP(e[0],b),c=n._helper.TrMoebiusP(c,b),b=n._helper.TrMoebiusP(d,b);a.matrix=f.normalizeMax(n._helper.ConicBy5(null,e,c,b,f.ii,f.jj))}a.matrix=v.withUsage(a.matrix,"Circle")};n.TrMoebiusArc={};n.TrMoebiusArc.kind="C";n.TrMoebiusArc.signature=["Mt",
+"C"];n.TrMoebiusArc.updatePosition=function(a){var b=u.csnames[a.args[0]],c=u.csnames[a.args[1]],d=c.viaPoint,e=c.endPoint,c=n._helper.TrMoebiusP(c.startPoint,b),d=n._helper.TrMoebiusP(d,b),b=n._helper.TrMoebiusP(e,b);a.startPoint=c;a.viaPoint=d;a.endPoint=b;a.isArc=!0;a.matrix=f.normalizeMax(n._helper.ConicBy5(null,c,d,b,f.ii,f.jj));a.matrix=v.withUsage(a.matrix,"Circle")};n._helper.trBuildMatrix=function(a,b){var c=b(0),d=b(1),e=f.productMM(d,f.adjoint3(c));a.matrix=f.normalizeMax(e);e=f.transpose(f.productMM(c,
+f.adjoint3(d)));a.dualMatrix=f.normalizeMax(e)};n.TrProjection={};n.TrProjection.kind="Tr";n.TrProjection.signature="PPPPPPPP".split("");n.TrProjection.updatePosition=function(a){n._helper.trBuildMatrix(a,function(b){return D.basismap(u.csnames[a.args[0+b]].homog,u.csnames[a.args[2+b]].homog,u.csnames[a.args[4+b]].homog,u.csnames[a.args[6+b]].homog)})};n.TrAffine={};n.TrAffine.kind="Tr";n.TrAffine.signature="PPPPPP".split("");n.TrAffine.updatePosition=function(a){var b=m.mult,c=f.scalmult,d=f.turnIntoCSList,
+e=f.transpose,h=f.normalizeMax,k=f.productMM,l=f.adjoint3,n=d([u.csnames[a.args[0]].homog,u.csnames[a.args[2]].homog,u.csnames[a.args[4]].homog]),q=d([u.csnames[a.args[1]].homog,u.csnames[a.args[3]].homog,u.csnames[a.args[5]].homog]),r=e(n),e=e(q),t=r.value[2].value,v=e.value[2].value,w=[b(t[0],v[2]),b(t[1],v[0]),b(t[2],v[1])],r=l(r).value;a.matrix=h(k(e,d([c(b(w[0],v[1]),r[0]),c(b(w[1],v[2]),r[1]),c(b(w[2],v[0]),r[2])])));r=n.value;a.dualMatrix=h(k(l(q),d([c(b(t[2],w[1]),r[0]),c(b(t[0],w[2]),r[1]),
+c(b(t[1],w[0]),r[2])])))};n.TrSimilarity={};n.TrSimilarity.kind="Tr";n.TrSimilarity.signature=["P","P","P","P"];n.TrSimilarity.updatePosition=function(a){n._helper.trBuildMatrix(a,function(b){return D.basismap(u.csnames[a.args[0+b]].homog,u.csnames[a.args[2+b]].homog,f.ii,f.jj)})};n.TrTranslation={};n.TrTranslation.kind="Tr";n.TrTranslation.signature=["P","P"];n.TrTranslation.updatePosition=function(a){var b=u.csnames[a.args[0]].homog,c=u.csnames[a.args[1]].homog,d=f.cross(b,c).value,b=m.mult(b.value[2],
+c.value[2]),c=f.turnIntoCSList,e=m.neg,h=m.zero,d=c([c([b,h,d[1]]),c([h,b,e(d[0])]),c([h,h,b])]),d=f.normalizeMax(d);a.matrix=d;b=e(d.value[0].value[0]);d=c([c([b,h,h]),c([h,b,h]),c([d.value[0].value[2],d.value[1].value[2],b])]);a.dualMatrix=d};n.TrReflectionP={};n.TrReflectionP.kind="Tr";n.TrReflectionP.signature=["P"];n.TrReflectionP.updatePosition=function(a){var b=u.csnames[a.args[0]].homog.value,c=m.realmult(-.5,b[2]),d=m.zero,b=f.turnIntoCSList([f.turnIntoCSList([c,d,b[0]]),f.turnIntoCSList([d,
+c,b[1]]),f.turnIntoCSList([d,d,m.neg(c)])]),b=f.normalizeMax(b);a.matrix=b;a.dualMatrix=f.transpose(b)};n.TrReflectionL={};n.TrReflectionL.kind="Tr";n.TrReflectionL.signature=["L"];n.TrReflectionL.updatePosition=function(a){var b=m.mult,c=m.realmult,d=m.zero,e=u.csnames[a.args[0]].homog.value,h=e[0],k=e[1],e=e[2],l=b(h,h),n=b(k,k),q=c(-.5,m.sub(l,n)),r=b(h,k),b=f.turnIntoCSList([f.turnIntoCSList([m.neg(q),r,b(h,e)]),f.turnIntoCSList([r,q,b(k,e)]),f.turnIntoCSList([d,d,c(-.5,m.add(l,n))])]),b=f.normalizeMax(b);
+a.matrix=b;a.dualMatrix=f.transpose(b)};n.TrReflectionS={};n.TrReflectionS.kind="Tr";n.TrReflectionS.signature=["S"];n.TrReflectionS.updatePosition=n.TrReflectionL.updatePosition;n.TrReflectionC={};n.TrReflectionC.kind="Rc";n.TrReflectionC.signature=["C"];n.TrReflectionC.updatePosition=function(a){var b=u.csnames[a.args[0]].matrix;if("Circle"!==b.usage)console.log("reflection in general conics is not defined"),a.sclRsq=m.zero,a.matrix=f.fund;else{var c=m.add,d=m.mult,e=b.value[2].value,h=e[0],k=e[1],
+e=e[2],l=b.value[0].value[0];a.sclRsq=m.sub(c(d(h,h),d(k,k)),d(l,e))}a.dualMatrix=a.matrix=b};n._helper.ReflectC=function(a,b){var c=m.add,d=m.sub,e=m.mult,h=f.scalmult,k=a.matrix,l=k.value[0].value[0],n=k.value[2].value,q=n[1],r=n[2],t=b.value[0].value[0],u=b.value[2].value,w=u[1],x=u[2],c=d(m.realmult(2,c(e(n[0],u[0]),e(q,w))),c(e(l,x),e(t,r)));return v.withUsage(f.normalizeMax(f.sub(h(c,k),h(a.sclRsq,b))),"Circle")};n.ReflectCC={};n.ReflectCC.kind="C";n.ReflectCC.signature=["Rc","C"];n.ReflectCC.updatePosition=
+function(a){var b=u.csnames[a.args[1]];"Circle"!==b.matrix.usage?(console.log("reflecting general conics in circles is not defined"),a.matrix=v.withUsage(f.fund,"Circle")):a.matrix=n._helper.ReflectC(u.csnames[a.args[0]],b.matrix)};n.ReflectCL={};n.ReflectCL.kind="C";n.ReflectCL.signature=["Rc","L"];n.ReflectCL.updatePosition=function(a){var b=m.zero,c=u.csnames[a.args[1]].homog.value,b=n._helper.buildConicMatrix([b,b,b,c[0],c[1],m.realmult(2,c[2])]);a.matrix=n._helper.ReflectC(u.csnames[a.args[0]],
+b)};n._helper.ReflectCP=function(a,b){var c=b.matrix,d=c.value[2].value,d=f.turnIntoCSList([d[0],d[1],m.neg(c.value[0].value[0])]),e=f.cross;return f.normalizeMax(e(f.productMV(c,a),e(d,a)))};n.ReflectCP={};n.ReflectCP.kind="P";n.ReflectCP.signature=["Rc","P"];n.ReflectCP.updatePosition=function(a){a.homog=v.withUsage(n._helper.ReflectCP(u.csnames[a.args[1]].homog,u.csnames[a.args[0]]),"Point")};n.ReflectCArc={};n.ReflectCArc.kind="C";n.ReflectCArc.signature=["Rc","C"];n.ReflectCArc.updatePosition=
+function(a){var b=u.csnames[a.args[0]],c=u.csnames[a.args[1]],d=c.viaPoint,e=c.endPoint,f=n._helper.ReflectCP(c.startPoint,b),d=n._helper.ReflectCP(d,b),e=n._helper.ReflectCP(e,b);a.startPoint=f;a.viaPoint=d;a.endPoint=e;a.isArc=!0;a.matrix=n._helper.ReflectC(b,c.matrix)};n.ReflectCS={};n.ReflectCS.kind="C";n.ReflectCS.signature=["Rc","S"];n.ReflectCS.updatePosition=function(a){var b=u.csnames[a.args[0]],c=u.csnames[a.args[1]],d=c.startpos,e=c.endpos,f=n._helper.midpoint(d,e),d=n._helper.ReflectCP(d,
+b),f=n._helper.ReflectCP(f,b),e=n._helper.ReflectCP(e,b);a.startPoint=d;a.viaPoint=f;a.endPoint=e;a.isArc=!0;e=m.zero;c=c.homog.value;c=n._helper.buildConicMatrix([e,e,e,c[0],c[1],m.realmult(2,c[2])]);a.matrix=n._helper.ReflectC(b,c)};n.TrInverse={};n.TrInverse.kind="Tr";n.TrInverse.signature=["Tr"];n.TrInverse.updatePosition=function(a){var b=u.csnames[a.args[0]];a.dualMatrix=f.transpose(b.matrix);a.matrix=f.transpose(b.dualMatrix)};n.TransformC={};n.TransformC.kind="C";n.TransformC.signature=["Tr",
+"C"];n.TransformC.updatePosition=function(a){var b=u.csnames[a.args[0]].dualMatrix,b=f.productMM(f.productMM(b,u.csnames[a.args[1]].matrix),f.transpose(b)),b=f.normalizeMax(b);a.matrix=v.withUsage(b,"Conic")};n.TransformArc={};n.TransformArc.kind="C";n.TransformArc.signature=["Tr","C"];n.TransformArc.updatePosition=function(a){var b=u.csnames[a.args[0]].matrix,c=u.csnames[a.args[1]],d=c.viaPoint,e=c.endPoint,c=f.normalizeMax(f.productMV(b,c.startPoint)),d=f.normalizeMax(f.productMV(b,d)),b=f.normalizeMax(f.productMV(b,
+e));a.startPoint=c;a.viaPoint=d;a.endPoint=b;a.isArc=!0;a.matrix=f.normalizeMax(n._helper.ConicBy5(null,c,d,b,f.ii,f.jj));a.matrix=v.withUsage(a.matrix,"Circle")};n.TransformP={};n.TransformP.kind="P";n.TransformP.signature=["Tr","P"];n.TransformP.updatePosition=function(a){a.homog=f.normalizeMax(f.productMV(u.csnames[a.args[0]].matrix,u.csnames[a.args[1]].homog));a.homog=v.withUsage(a.homog,"Point")};n.TransformL={};n.TransformL.kind="L";n.TransformL.signature=["Tr","L"];n.TransformL.updatePosition=
+function(a){a.homog=f.normalizeMax(f.productMV(u.csnames[a.args[0]].dualMatrix,u.csnames[a.args[1]].homog));a.homog=v.withUsage(a.homog,"Line")};n.TransformS={};n.TransformS.kind="S";n.TransformS.signature=["Tr","S"];n.TransformS.updatePosition=function(a){var b=u.csnames[a.args[0]],c=u.csnames[a.args[1]];n.Segment.setSegmentPos(a,f.productMV(b.dualMatrix,c.homog),f.productMV(b.matrix,c.startpos),f.productMV(b.matrix,c.endpos))};n.TransformPolygon={};n.TransformPolygon.kind="Poly";n.TransformPolygon.signature=
+["Tr","Poly"];n.TransformPolygon.updatePosition=function(a){var b=u.csnames[a.args[0]].matrix;a.vertices=f.turnIntoCSList(u.csnames[a.args[1]].vertices.value.map(function(a){a=f.normalizeMax(f.productMV(b,a));return a=v.withUsage(a,"Point")}))};n._helper.pointReflection=function(a,b){return f.normalizeMax(f.sub(f.scalmult(m.realmult(2,b.value[2]),a),f.scalmult(a.value[2],b)))};n._helper.conicOtherIntersection=function(a,b,c){var d=f.productMV(a,c);a=f.scalproduct(c,d);d=f.scalproduct(b,d);d=m.realmult(-2,
+d);b=f.scalmult(a,b);c=f.scalmult(d,c);c=f.add(b,c);return c=f.normalizeMax(c)};n.Dist={};n.Dist.kind="V";n.Dist.signature=["P","P"];n.Dist.updatePosition=function(a){var b=u.csnames[a.args[1]].homog;a.value=f.abs(f.sub(f.normalizeZ(u.csnames[a.args[0]].homog),f.normalizeZ(b)))};n.Angle={};n.Angle.kind="V";n.Angle.signature=["L","L","P"];n.Angle.initialize=function(a){void 0===a.angle&&(a.angle=.5*Math.PI);Va(m._helper.input(a.angle))};n.Angle.updatePosition=function(a){var b=u.csnames[a.args[1]].homog,
+c=u.csnames[a.args[2]].homog,d=f.cross(u.csnames[a.args[0]].homog,f.linfty),b=f.cross(b,f.linfty),c=f.crossratio3(d,b,f.ii,f.jj,c),c=m.mult(m.complex(0,.5),m.log(c)),d=(wb().value.real-c.value.real)/Math.PI,b=Math.round(d);!eb&&.01<Math.abs(b-d)&&Ub();c=m.complex(b*Math.PI+c.value.real,c.value.imag);Va(c);a.value=v.withUsage(c,"Angle")};n.Angle.stateSize=2;n.Text={};n.Text.kind="Text";n.Text.signature="**";n.Text.isMovable=!0;n.Text.updatePosition=Ka;n.Text.initialize=function(a){a.text=String(a.text);
+a.pos&&(a.homog=n._helper.initializePoint(a));a.dock&&(a.dock.offset=a.dock.offset&&2===a.dock.offset.length?f.realVector([+a.dock.offset[0],+a.dock.offset[1]]):f.realVector([0,0]))};n.Text.getParamForInput=function(a,b,c){return n.Free.getParamForInput(a,b,c)};n.Text.getParamFromState=function(a){return a.homog};n.Text.putParamToState=function(a,b){a.homog=b};n.Calculation={};n.Calculation.kind="Text";n.Calculation.signature="**";n.Calculation.isMovable=!0;n.Calculation.updatePosition=Ka;n.Calculation.initialize=
+function(a){n.Text.initialize(a);a.calculation=Ma(a.text)};n.Calculation.getText=function(a){return w(A(a.calculation))};n.Calculation.getParamForInput=n.Text.getParamForInput;n.Calculation.getParamFromState=n.Text.getParamFromState;n.Calculation.putParamToState=n.Text.putParamToState;n.Equation={};n.Equation.kind="Text";n.Equation.isMovable=!0;n.Equation.signature="**";n.Equation.updatePosition=Ka;n.Equation.initialize=function(a){n.Text.initialize(a);a.calculation=Ma(a.text)};n.Equation.getText=
+function(a){return a.text+" = "+w(A(a.calculation))};n.Equation.getParamForInput=n.Text.getParamForInput;n.Equation.getParamFromState=n.Text.getParamFromState;n.Equation.putParamToState=n.Text.putParamToState;n.Evaluate={};n.Evaluate.kind="Text";n.Evaluate.isMovable=!0;n.Evaluate.signature="**";n.Evaluate.updatePosition=Ka;n.Evaluate.initialize=function(a){n.Text.initialize(a);a.calculation=Ma(a.text)};n.Evaluate.getText=function(a){A(a.calculation);return a.text};n.Evaluate.getParamForInput=n.Text.getParamForInput;
+n.Evaluate.getParamFromState=n.Text.getParamFromState;n.Evaluate.putParamToState=n.Text.putParamToState;n.Plot={};n.Plot.kind="Text";n.Plot.isMovable=!0;n.Plot.signature="**";n.Plot.updatePosition=Ka;n.Plot.initialize=function(a){n.Text.initialize(a);a.calculation=Ma("plot(("+a.text+"))")};n.Plot.getText=function(a){A(a.calculation);return a.text};n.Plot.getParamForInput=n.Text.getParamForInput;n.Plot.getParamFromState=n.Text.getParamFromState;n.Plot.putParamToState=n.Text.putParamToState;n.Button=
+{};n.Button.kind="Text";n.Button.signature="**";n.Button.isMovable=!0;n.Button.updatePosition=Ka;n.Button.initialize=function(a){var b=document.createElement("button");wc(a,"click",b)};n.Button.getParamForInput=n.Text.getParamForInput;n.Button.getParamFromState=n.Text.getParamFromState;n.Button.putParamToState=n.Text.putParamToState;n.ToggleButton={};n.ToggleButton.kind="Text";n.ToggleButton.signature="**";n.ToggleButton.isMovable=!0;n.ToggleButton.updatePosition=Ka;n.ToggleButton.initialize=function(a){var b;
+b=void 0;void 0===b&&(b="CindyJSid");b+=++Ra;var c=document.createElement("input"),d=document.createElement("label");c.setAttribute("id",b);d.setAttribute("for",b);c.setAttribute("type","checkbox");a.pressed&&(c.checked=!0);a.checkbox=c;wc(a,"change",c,d)};n.ToggleButton.getParamForInput=n.Text.getParamForInput;n.ToggleButton.getParamFromState=n.Text.getParamFromState;n.ToggleButton.putParamToState=n.Text.putParamToState;n.EditableText={};n.EditableText.kind="Text";n.EditableText.isMovable=!0;n.EditableText.signature=
+[];n.EditableText.updatePosition=Ka;n.EditableText.initialize=function(a){var b=document.createElement("input");b.setAttribute("type","text");b.className="CindyJS-editabletext";Sa(a.fillalpha)||(a.fillalpha=1);a.fillcolor&&(b.style.backgroundColor=y.makeColor(a.fillcolor,a.fillalpha));Sa(a.minwidth)&&(b.style.width=a.minwidth-3+"px");"string"===typeof a.text&&(b.value=a.text);b.addEventListener("keydown",function(a){13===a.keyCode&&b.blur()});wc(a,"change",b)};n.EditableText.getText=function(a){return!1};
+n.EditableText.getParamForInput=n.Text.getParamForInput;n.EditableText.getParamFromState=n.Text.getParamFromState;n.EditableText.putParamToState=n.Text.putParamToState;n._helper.initializePoint=function(a){var b=0,c=0,d=0;if(a.pos){if("list"===a.pos.ctype&&f.isNumberVector(a.pos))return a.pos;2===a.pos.length&&(b=a.pos[0],c=a.pos[1],d=1);3===a.pos.length&&(b=a.pos[0],c=a.pos[1],d=a.pos[2])}a=f.turnIntoCSList([m._helper.input(b),m._helper.input(c),m._helper.input(d)]);return a=f.normalizeMax(a)};n._helper.initializeLine=
+function(a){var b=0,c=0,d=0;if(a.pos){if("list"===a.pos.ctype&&f.isNumberVector(a.pos))return a.pos;3===a.pos.length&&(b=a.pos[0],c=a.pos[1],d=a.pos[2])}a=f.turnIntoCSList([m._helper.input(b),m._helper.input(c),m._helper.input(d)]);return a=f.normalizeMax(a)};n.Poly={};n.Poly.kind="Poly";n.Poly.signature="P*";n.Poly.updatePosition=function(a){a.vertices=f.turnIntoCSList(a.args.map(function(a){return u.csnames[a].homog}))};var od={CircleMFixedr:function(a){a.pinned=!0;a.type="CircleMr";return[a]},
+CircleByFixedRadius:function(a){a.pinned=!0;a.type="CircleMr";return[a]},CircleByRadius:function(a){a.type="CircleMr";return[a]},IntersectionConicLine:function(a){a.args=[a.args[1],a.args[0]];a.type="IntersectLC";return[a]},IntersectionCircleCircle:function(a){a.type="IntersectCirCir";return[a]},IntersectionConicConic:function(a){a.type="IntersectConicConic";return[a]},FreePoint:function(a){a.type="Free";return[a]},Orthogonal:function(a){a.type="Perp";return[a]},Parallel:function(a){a.type="Para";
+return[a]},Pole:function(a){a.type="PolarOfLine";return[a]},Polar:function(a){a.type="PolarOfPoint";return[a]},Arc:function(a){a.type="ArcBy3";return[a]},EuclideanMid:function(a){a.type="Mid";return[a]},AngularBisector:function(a){a.type="AngleBisector";return[a]},TransformConic:function(a){a.type="TransformC";return[a]},TransformSegment:function(a){a.type="TransformS";return[a]},TrMoebiusSegment:function(a){a.type="TrMoebiusS";return[a]},angleBisector:function(a){var b={name:a.name+"_Intersection",
+type:"Meet",args:a.args,visible:!1};a.type="AngleBisector";a.args=[a.args[0],a.args[1],b.name];return[b,a]},Transform:function(a){var b=u.csnames[a.args[1]],b={Tr:"Transform",Mt:"TrMoebius",Rc:"ReflectC"}[u.csnames[a.args[0]].kind]+(b.isArc?"Arc":b.kind);if(n.hasOwnProperty(b))return a.type=b,[a];console.log(b+" not implemented yet");return[]},TrReflection:function(a){var b="TrReflection"+u.csnames[a.args[0]].kind;if(n.hasOwnProperty(b))return a.type=b,[a];console.log(b+" not implemented yet");return[]}},
+ge="align alpha angle args arrow arrowposition arrowshape arrowsides arrowsize clip color dashtype drawtrace fillalpha fillcolor filled labeled labelpos name overhang pinned printname radius size text text_fontfamily textbold textitalics textsize tracedim tracelength traceskip tracing type visible".split(" ");qa.saveState=function(){return{geometry:he()}};var ra={},Ed,Hb,Fd,Gd;Ed=[[],[.2],[.075,.225],[44/45,-56/15,32/9],[19372/6561,-25360/2187,64448/6561,-212/729],[9017/3168,-355/33,46732/5247,49/
+176,-5103/18656],[35/384,0,500/1113,125/192,-2187/6784,11/84]];Hb=[0,.2,.3,.8,8/9,1,1];Fd=[35/384,0,500/1113,125/192,-2187/6784,11/84,0];Gd=[5179/57600,0,7571/16695,.6140625,-92097/339200,187/2100,.025];var Aa,ca=[],xc=[],hc=!1;ra.tick=function(a){a/=Lb;for(var b=0;b<Lb;b++)ra.tick1(a),Cb+=a,A(ia.simulationstep)};ra.tick1=function(a){for(var b=a,c=0;0<a&&c<.999*a||0>a&&c>.999*a;)b=ra.oneRKStep(b),c+=b,b=Math.min(2*b,a-c),b=Math.max(b,1E-16),ra.restorePosition(),ra.doCollisions(),ra.calculateForces(),
+ra.moveToFinalPos();return!0};ra.restorePosition=function(){Aa.forEach(function(a){N[a.type].restorePos(a,9)})};ra.doCollisions=function(){Aa.forEach(function(a){N[a.type].doCollisions(a)})};ra.calculateForces=function(){Aa.forEach(function(a){N[a.type].calculateForces(a)})};ra.moveToFinalPos=function(){Aa.forEach(function(a){N[a.type].move(a)})};ra.oneRKStep=function(a){for(var b=function(a){Aa.forEach(function(b){N[b.type].initRK(b,a);N[b.type].storePosition(b)})},c=function(a){Aa.forEach(function(b){N[b.type].setToTimestep(b,
+Hb[a])})},d=function(a){Aa.forEach(function(b){N[b.type].proceedMotion(b,Hb[a],a,Ed[a])})},e=function(){Aa.forEach(function(a){N[a.type].resetForces(a)})},f=function(a){Aa.forEach(function(b){N[b.type].calculateDelta(b,a)})},h=function(b){var c=0;Aa.forEach(function(a){N[a.type].proceedMotion(a,Hb[6],7,Fd);N[a.type].savePos(a,8);N[a.type].proceedMotion(a,Hb[6],7,Gd);N[a.type].savePos(a,9);c+=N[a.type].sqDist(a,8,9)});return c=Math.sqrt(c)/a},k=function(a){Aa.forEach(function(a){N[a.type].recallPosition(a)})},
+l=!1;!l;){b(a);for(var m=0;7>m;m++)c(m),d(m),e(),ra.calculateForces(),f(m);h(a)>N.env.errorbound&&a>N.env.lowestdeltat?(a/=N.env.slowdownfactor,k()):l=!0}return a};var N={Mass:{reset:function(a,b){a.vel=[0,0,0];a.pos=[0,0,0,0];a.el=b;"undefined"===typeof a.mass&&(a.mass=1);"undefined"===typeof a.charge&&(a.charge=0);"undefined"===typeof a.friction&&(a.friction=0);a.lnfrict=0;"undefined"===typeof a.limitspeed&&(a.limitspeed=!1);"undefined"===typeof a.fixed&&(a.fixed=!1);"undefined"===typeof a.radius&&
+(a.radius=1);a.internalmove=!1;a.fx=0;a.fy=0;a.fz=0;a.vx=a.vx||0;a.vy=a.vy||0;a.vz=a.vz||0;a.mtype=0;a.env=N.env;a.deltat=0;a.mx=0;a.my=0;a.mz=0;a.mvx=0;a.mvy=0;a.mvz=0;a.dx=[0,0,0,0,0,0,0,0,0,0];a.dy=[0,0,0,0,0,0,0,0,0,0];a.dz=[0,0,0,0,0,0,0,0,0,0];a.dvx=[0,0,0,0,0,0,0,0,0,0];a.dvy=[0,0,0,0,0,0,0,0,0,0];a.dvz=[0,0,0,0,0,0,0,0,0,0];a.midx=0;a.midy=0;a.midz=0;a.lx=0;a.ly=0;a.lz=0},resetForces:function(a){a.fx=0;a.fy=0;a.fz=0},getBlock:!1,setToTimestep:function(a,b,c){},initRK:function(a,b){var c=D.extractPoint(a.el.homog);
+a.x=c.x;a.y=c.y;a.z=0;a.xo=a.x;a.yo=a.y;a.zo=a.z;a.vxo=a.vx;a.vyo=a.vy;a.vzo=a.vz;a.deltat=b;a.fx=0;a.fy=0;a.fz=0},setVelocity:function(a,b,c,d){d||(d=0);a.vx=b;a.vy=c;a.vz=d},move:function(a){a.pos=[a.x,a.y,1];a.internalmove=!0;aa&&U.down&&a.el===aa.mover||Ea(a.el,f.realVector(a.pos),"homog");a.el.sx=a.x;a.el.sy=a.y;a.internalmove=!1},proceedMotion:function(a,b,c,d){if(!a.fixed)for(a.x=a.mx,a.y=a.my,a.z=a.mz,a.vx=a.mvx,a.vy=a.mvy,a.vz=a.mvz,b=0;b<c;b++)a.x+=d[b]*a.dx[b]*a.deltat,a.y+=d[b]*a.dy[b]*
+a.deltat,a.z+=d[b]*a.dz[b]*a.deltat,a.vx+=d[b]*a.dvx[b]*a.deltat,a.vy+=d[b]*a.dvy[b]*a.deltat,a.vz+=d[b]*a.dvz[b]*a.deltat},calculateForces:function(a){var b=Math.sqrt(a.vx*a.vx+a.vy*a.vy+a.vz*a.vz);a.lnfrict=-Math.log((1-a.friction)*(1-a.env.friction)*(.1<b&&a.limitSpeed?.1/b:1));a.fx+=-a.vx*a.lnfrict*a.mass;a.fy+=-a.vy*a.lnfrict*a.mass;a.fz+=-a.vz*a.lnfrict*a.mass},calculateDelta:function(a,b){a.dx[b]=a.vx;a.dy[b]=a.vy;a.dz[b]=a.vz;a.dvx[b]=a.fx/a.mass;a.dvy[b]=a.fy/a.mass;a.dvz[b]=a.fz/a.mass},
+savePos:function(a,b){a.dx[b]=a.x;a.dy[b]=a.y;a.dz[b]=a.z;a.dvx[b]=a.vx;a.dvy[b]=a.vy;a.dvz[b]=a.vz},restorePos:function(a,b){a.fixed||(a.x=a.dx[b],a.y=a.dy[b],a.z=a.dz[b],a.vx=a.dvx[b],a.vy=a.dvy[b],a.vz=a.dvz[b])},sqDist:function(a,b,c){var d=(a.dx[b]-a.dx[c])*(a.dx[b]-a.dx[c]),d=d+(a.dy[b]-a.dy[c])*(a.dy[b]-a.dy[c]),d=d+(a.dz[b]-a.dz[c])*(a.dz[b]-a.dz[c]),d=d+(a.dvx[b]-a.dvx[c])*(a.dvx[b]-a.dvx[c]),d=d+(a.dvy[b]-a.dvy[c])*(a.dvy[b]-a.dvy[c]);return d+=(a.dvz[b]-a.dvz[c])*(a.dvz[b]-a.dvz[c])},kineticEnergy:function(a){return.5*
+a.mass*(a.vx*a.vx+a.vy*a.vy+a.vz*a.vz)},storePosition:function(a){a.mx=a.x;a.my=a.y;a.mz=a.z;a.mvx=a.vx;a.mvy=a.vy;a.mvz=a.vz},recallPosition:function(a){a.fixed||(a.x=a.mx,a.y=a.my,a.z=a.mz,a.vx=a.mvx,a.vy=a.mvy,a.vz=a.mvz)},doCollisions:function(a){}},Sun:{reset:function(a,b){a.vel=[0,0,0];a.pos=[0,0,0,0];a.el=b;"undefined"===typeof a.mass&&(a.mass=10);"undefined"===typeof a.friction&&(a.friction=0);a.charge=0;a.x=0;a.y=0;a.z=0},resetForces:function(a){},getBlock:!1,setToTimestep:function(a,b,c){},
+initRK:function(a,b){var c=D.extractPoint(a.el.homog);a.x=c.x;a.y=c.y;a.z=0},setVelocity:function(a,b,c,d){},move:function(a){},proceedMotion:function(a,b,c,d){},calculateDelta:function(a,b){},calculateForces:function(a){for(var b=a.x,c=a.y,d=a.z,e=0;e<ca.length;e++){var f=ca[e],h=f.behavior.x,k=f.behavior.y,l=f.behavior.z,m=Math.sqrt((b-h)*(b-h)+(c-k)*(c-k)+(d-l)*(d-l)),k=(c-k)*a.mass*f.behavior.mass/(m*m*m),l=(d-l)*a.mass*f.behavior.mass/(m*m*m);f.behavior.fx+=(b-h)*a.mass*f.behavior.mass/(m*m*
+m)*f.behavior.mass;f.behavior.fy+=k*f.behavior.mass;f.behavior.fz+=l*f.behavior.mass}},savePos:function(a,b){},restorePos:function(a,b){},sqDist:function(a,b,c){return 0},kineticEnergy:function(a){},storePosition:function(a){},recallPosition:function(a){},doCollisions:function(a){}},Velocity:{reset:function(a){var b=u.csnames[a.geo[1]];console.log(b);var c=D.extractPoint(b.homog);a=D.extractPoint(u.csnames[a.geo[2]].homog);b=b.behavior;N[b.type].setVelocity(b,a.x-c.x,a.y-c.y,0)},resetForces:function(a){},
+getBlock:!1,setToTimestep:function(a,b,c){},initRK:function(a,b){},setVelocity:function(a,b,c,d){},move:function(a){var b=u.csnames[a.geo[2]];if(!aa||!U.down||b!==aa.mover){var c=u.csnames[a.geo[1]];a=D.extractPoint(c.homog);c=c.behavior;a=f.realVector([a.x+c.vx,a.y+c.vy,1]);Ea(b,a,"homog")}},proceedMotion:function(a,b,c,d){},calculateForces:function(a){},calculateDelta:function(a,b){},savePos:function(a,b){},restorePos:function(a,b){},sqDist:function(a,b,c){return 0},kineticEnergy:function(a){},
+storePosition:function(a){},recallPosition:function(a){},doCollisions:function(a){}},Gravity:{reset:function(a,b){a.vel=[0,0,0];a.pos=[0,0,0,0];a.el=b;"undefined"===typeof a.strength&&(a.strength=1);a.namea=b.args[0];a.nameb=b.args[1];a.ma=u.csnames[a.namea];a.mb=u.csnames[a.nameb]},resetForces:function(a){},getBlock:!1,setToTimestep:function(a,b,c){},initRK:function(a,b){},setVelocity:function(a,b,c,d){},move:function(a){},proceedMotion:function(a,b,c,d){},calculateDelta:function(a,b){},calculateForces:function(a){var b=
+D.extractPoint(a.ma.homog),c=D.extractPoint(a.mb.homog),d=(c.x-b.x)*a.strength;a=(c.y-b.y)*a.strength;for(b=0;b<ca.length;b++)c=ca[b],c.behavior.fx+=d*c.behavior.mass,c.behavior.fy+=a*c.behavior.mass,c.behavior.fz+=0*c.behavior.mass},savePos:function(a,b){},restorePos:function(a,b){},sqDist:function(a,b,c){return 0},kineticEnergy:function(a){},storePosition:function(a){},recallPosition:function(a){},doCollisions:function(a){}},Spring:{reset:function(a,b){a.el=b;"undefined"===typeof a.strength&&(a.strength=
+1);"undefined"===typeof a.amplitude&&(a.amplitude=0);"undefined"===typeof a.phase&&(a.phase=0);"undefined"===typeof a.speed&&(a.speed=1);"undefined"===typeof a.l0&&(a.l0=0);"undefined"===typeof a.stype&&(a.stype=1);"undefined"===typeof a.readOnInit&&(a.readOnInit=!1);a.namea=b.args[0];a.nameb=b.args[1];a.ma=u.csnames[a.namea];a.mb=u.csnames[a.nameb];var c=D.extractPoint(a.ma.homog),d=D.extractPoint(a.mb.homog);a.l0=Math.sqrt((c.x-d.x)*(c.x-d.x)+(c.y-d.y)*(c.y-d.y));a.env=N.env},resetForces:function(a){},
+getBlock:!1,setToTimestep:function(a,b,c){},initRK:function(a,b){},setVelocity:function(a,b,c,d){},move:function(a){},proceedMotion:function(a,b,c,d){},calculateForces:function(a){var b,c,d,e;!a.ma.behavior||aa&&U.down&&a.ma===aa.mover?(c=D.extractPoint(a.ma.homog),b=c.x,d=c.y):(b=a.ma.behavior.x,d=a.ma.behavior.y);!a.mb.behavior||aa&&U.down&&a.mb===aa.mover?(e=D.extractPoint(a.mb.homog),c=e.x,e=e.y):(c=a.mb.behavior.x,e=a.mb.behavior.y);var f=Math.sqrt((b-c)*(b-c)+(d-e)*(d-e)),h=a.l0,k=a.stype;1===
+k&&(h=0);var l=0;if(2===k||3===k)l=a.ma.behavior.mass*a.mb.behavior.mass*a.strength;2===k&&(l=-l);var m,n;if(0===f||0!==k&&1!==k)if(a.ma.behavior&&a.mb.behavior&&0!==f){if(f*=f*f,2===k||3===k)m=(b-c)*l/f,n=(d-e)*l/f}else m=n=0;else m=-(b-c)*a.strength*(f-h)/f*a.env.springstrength,n=-(d-e)*a.strength*(f-h)/f*a.env.springstrength;a.ma.behavior&&(a.ma.behavior.fx+=m,a.ma.behavior.fy+=n);a.mb.behavior&&(a.mb.behavior.fx-=m,a.mb.behavior.fy-=n)},calculateDelta:function(a,b){},savePos:function(a,b){},restorePos:function(a,
+b){},sqDist:function(a,b,c){return 0},kineticEnergy:function(a){},storePosition:function(a){},recallPosition:function(a){},doCollisions:function(a){}},det:function(a,b,c,d,e,f){return c*f-e*d+e*b-a*f+a*d-c*b},Bouncer:{reset:function(a,b){a.el=b;"undefined"===typeof a.xdamp&&(a.xdamp=0);"undefined"===typeof a.ydamp&&(a.ydamp=0);"undefined"===typeof a.motorchanger&&(a.motorchanger=!0);a.namea=b.args[0];a.nameb=b.args[1];a.ma=u.csnames[a.namea];a.mb=u.csnames[a.nameb];var c=D.extractPoint(a.ma.homog),
+d=D.extractPoint(a.mb.homog);a.x1o=1.01*c.x-.01*d.x;a.y1o=1.01*c.y-.01*d.y;a.x2o=1.01*d.x-.01*c.x;a.y2o=1.01*d.y-.01*c.y;a.env=N.env},resetForces:function(a){},getBlock:!1,setToTimestep:function(a,b,c){},initRK:function(a,b){a.deltat=b},setVelocity:function(a,b,c,d){},move:function(a){},proceedMotion:function(a,b,c,d){},calculateForces:function(a){},calculateDelta:function(a,b){},savePos:function(a,b){},restorePos:function(a,b){},sqDist:function(a,b,c){return 0},kineticEnergy:function(a){},storePosition:function(a){},
+recallPosition:function(a){},doCollisions:function(a){for(var b=D.extractPoint(a.ma.homog),c=D.extractPoint(a.mb.homog),d=b.x,b=b.y,e=c.x,c=c.y,f=a.x1o,h=a.y1o,k=a.x2o,l=a.y2o,n=Math.sqrt((d-e)*(d-e)+(b-c)*(b-c)),q=(d-e)/n,n=(b-c)/n,r=0;r<ca.length;r++){var t=ca[r],u=t.behavior.xo,v=t.behavior.yo,w=t.behavior.x,x=t.behavior.y,y=m.mult(m.complex(f,h),m.complex(e,c)),z=m.mult(m.complex(k,l),m.complex(d,b)),y=m.sub(y,z),z=m.mult(m.complex(u,v),m.complex(d,b)),y=m.add(y,z),z=m.mult(m.complex(u,v),m.complex(e,
+c)),y=m.sub(y,z),z=m.sub(m.complex(f,h),m.complex(k,l)),y=m.div(y,z);0>N.det(d,b,e,c,w,x)*N.det(d,b,e,c,y.value.real,y.value.imag)&&0>N.det(d,b,w,x,y.value.real,y.value.imag)*N.det(e,c,w,x,y.value.real,y.value.imag)&&(v=t.behavior.mvx+a.deltat*(-y.value.real+t.behavior.xo),w=t.behavior.mvy+a.deltat*(-y.value.imag+t.behavior.yo),u=q*v+n*w,v=n*v-q*w,t.behavior.x=y.value.real,t.behavior.y=y.value.imag,t.behavior.vx=q*u*(1-a.xdamp),t.behavior.vy=n*u*(1-a.xdamp),t.behavior.vx+=-n*v*(1-a.ydamp),t.behavior.vy+=
+q*v*(1-a.ydamp))}a.x1o=d;a.y1o=b;a.x2o=e;a.y2o=c}},Environment:{init:function(a){"undefined"===typeof a.gravity&&(a.gravity=0);"undefined"===typeof a.friction&&(a.friction=0);"undefined"===typeof a.springstrength&&(a.springstrength=1);"undefined"!==typeof a.accuracy&&(Lb=a.accuracy);"undefined"!==typeof a.deltat&&oa(a.deltat/.6);"undefined"===typeof a.charges&&(a.charges=!1);"undefined"===typeof a.balls&&(a.balls=!1);"undefined"===typeof a.newton&&(a.newton=!1);"undefined"===typeof a.ballInteractionBoosting&&
+(a.ballInteractionBoosting=1);N.env=a;a.errorbound=.001;a.lowestdeltat=1E-7;a.slowdownfactor=2},reset:function(a){},resetForces:function(a){},getBlock:!1,setToTimestep:function(a,b,c){},initRK:function(a,b){},setVelocity:function(a,b,c,d){},move:function(a){},proceedMotion:function(a,b,c,d){},calculateForces:function(a){var b,c,d,e,f,h,k,l,m,n;if(a.newton)for(b=0;b<ca.length-1;b++)for(c=ca[b],d=c.behavior.x,e=c.behavior.y,f=b+1;f<ca.length;f++)h=ca[f],k=h.behavior.x,l=h.behavior.y,n=Math.sqrt((d-
+k)*(d-k)+(e-l)*(e-l)),k=(d-k)*c.behavior.mass*h.behavior.mass/(n*n*n),l=(e-l)*c.behavior.mass*h.behavior.mass/(n*n*n),c.behavior.fx-=k,c.behavior.fy-=l,h.behavior.fx+=k,h.behavior.fy+=l;if(a.charges)for(b=0;b<ca.length-1;b++)for(c=ca[b],d=c.behavior.x,e=c.behavior.y,f=b+1;f<ca.length;f++)h=ca[f],k=h.behavior.x,l=h.behavior.y,n=Math.sqrt((d-k)*(d-k)+(e-l)*(e-l)),k=(d-k)*c.behavior.charge*h.behavior.charge/(n*n*n),l=(e-l)*c.behavior.charge*h.behavior.charge/(n*n*n),c.behavior.fx+=k,c.behavior.fy+=l,
+h.behavior.fx-=k,h.behavior.fy-=l;if(a.balls)for(b=0;b<ca.length-1;b++)if(c=ca[b],0!==c.behavior.radius)for(d=c.behavior.x,e=c.behavior.y,f=b+1;f<ca.length;f++)h=ca[f],0!==h.behavior.radius&&(k=h.behavior.x,l=h.behavior.y,m=c.behavior.radius+h.behavior.radius,n=Math.sqrt((d-k)*(d-k)+(e-l)*(e-l)),0===a.ballInteractionBoosting?(k=(d-k)/(n*n*n)*(n>m?0:(n-m)*(n-m)),l=(e-l)/(n*n*n)*(n>m?0:(n-m)*(n-m))):1===a.ballInteractionBoosting?(k=(d-k)/(n*n*n*n)*(n>m?0:(n-m)*(n-m)),l=(e-l)/(n*n*n*n)*(n>m?0:(n-m)*
+(n-m))):(k=(d-k)/(n*n*n*n*n)*(n>m?0:(n-m)*(n-m)),l=(e-l)/(n*n*n*n*n)*(n>m?0:(n-m)*(n-m))),c.behavior.fx+=k,c.behavior.fy+=l,h.behavior.fx-=k,h.behavior.fy-=l);for(b=0;b<ca.length;b++)c=ca[b],c.behavior.fx+=0,c.behavior.fy+=-a.gravity*c.behavior.mass,c.behavior.fz+=0},calculateDelta:function(a,b){},savePos:function(a,b){},restorePos:function(a,b){},sqDist:function(a,b,c){return 0},kineticEnergy:function(a){},storePosition:function(a){},recallPosition:function(a){},doCollisions:function(a){}}};return qa};
+return H}(),createCindy=CindyJS;"undefined"!==typeof process&&"undefined"!==typeof module&&"undefined"!==typeof module.exports&&"undefined"===typeof window&&(module.exports=CindyJS);
+//# sourceMappingURL=Cindy.js.map
+
diff --git a/texmf-dist/scripts/ketpic/data/js/CindyJS.css b/texmf-dist/scripts/ketpic/data/js/CindyJS.css
new file mode 100644
index 00000000..2fdefb34
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/js/CindyJS.css
@@ -0,0 +1,121 @@
+.CindyJS-toolbar button, .CindyJS-animbuttons button, .CindyJS-button button, .CindyJS-button label {
+ background-color: #bfc4d0;
+ border: 1px solid #d0d0d0;
+ box-shadow: inset 1px 1px 2px #fff, inset -1px -1px 2px #aaa;
+ outline: none; }
+
+.CindyJS-toolbar button:active, .CindyJS-animbuttons button:active, .CindyJS-toolbar button.CindyJS-active, .CindyJS-animbuttons button.CindyJS-active, .CindyJS-button button:active, .CindyJS-button label:active, .CindyJS-button input[type=checkbox]:checked + label {
+ background-color: #aaafbb;
+ box-shadow: inset 1px 1px 2px #999, inset -1px -1px 2px #ccc; }
+
+.CindyJS-toolbar, .CindyJS-animbuttons {
+ line-height: 0px; }
+ .CindyJS-toolbar button, .CindyJS-animbuttons button {
+ display: inline-block;
+ margin: 0px;
+ padding: 0px; }
+ .CindyJS-toolbar button:focus, .CindyJS-animbuttons button:focus {
+ border-color: #06f; }
+ .CindyJS-toolbar img, .CindyJS-animbuttons img {
+ margin: 0px;
+ border: none;
+ display: block; }
+
+.CindyJS-widget {
+ overflow: hidden;
+ z-index: 0; }
+ .CindyJS-widget canvas {
+ z-index: 1; }
+ .CindyJS-widget .CindyJS-baseline {
+ margin: 0px;
+ padding: 0px;
+ border: none;
+ position: absolute;
+ white-space: nowrap;
+ margin-top: -1000px; }
+ .CindyJS-widget .CindyJS-baseline > img {
+ margin: 0px;
+ padding: 0px;
+ border: none;
+ display: inline;
+ position: static;
+ vertical-align: baseline;
+ visibility: hidden;
+ margin-right: -1px; }
+ .CindyJS-widget .CindyJS-baseline .CindyJS-button {
+ display: inline-block; }
+ .CindyJS-widget .CindyJS-button {
+ position: relative;
+ z-index: 2; }
+ .CindyJS-widget .CindyJS-toolbar, .CindyJS-widget .CindyJS-animbuttons {
+ position: absolute; }
+ .CindyJS-widget .CindyJS-toolbar button, .CindyJS-widget .CindyJS-animbuttons button {
+ position: relative;
+ z-index: 3; }
+ .CindyJS-widget .CindyJS-animspeed {
+ position: relative;
+ z-index: 3; }
+ .CindyJS-widget .CindyJS-animcontrols {
+ bottom: 5px;
+ left: 5px; }
+
+.CindyJS-button input[type=checkbox] {
+ position: absolute;
+ left: -10000px; }
+
+.CindyJS-button button, .CindyJS-button label {
+ margin: -6px -7px;
+ padding: 5px 6px;
+ border-radius: 4px; }
+
+.CindyJS-button button:focus, .CindyJS-button input[type=checkbox]:focus + label {
+ box-shadow: 0px 0px 3px #06f, inset 1px 1px 2px #fff, inset -1px -1px 2px #aaa; }
+
+.CindyJS-button button:focus:active, .CindyJS-button input[type=checkbox]:focus:checked + label {
+ background-color: #aaafbb;
+ box-shadow: 0px 0px 3px #06f, inset 1px 1px 2px #999, inset -1px -1px 2px #ccc; }
+
+.CindyJS-editabletext {
+ border: 1px solid #000;
+ margin: -4px -4px -1px;
+ padding: 4px 4px 1px; }
+ .CindyJS-editabletext:focus {
+ box-shadow: 0px 0px 3px #06f; }
+
+.CindyJS-toolbar div {
+ line-height: 0px; }
+
+.CindyJS-toolbar span.CindyJS-spacer {
+ display: inline-block;
+ margin: 0px;
+ padding: 1px;
+ width: 32px;
+ height: 24px; }
+
+.CindyJS-animcontrols {
+ position: absolute;
+ background-color: #00f;
+ height: 36px;
+ width: 102px; }
+ .CindyJS-animcontrols .CindyJS-animspeed {
+ height: 10px;
+ width: 100%;
+ border-radius: 4px;
+ background-color: #ff7f7f;
+ box-shadow: inset 1px 1px 2px #999, inset -1px -1px 2px #ccc; }
+ .CindyJS-animcontrols .CindyJS-animspeed div {
+ width: 50%;
+ height: 100%;
+ border-radius: 4px;
+ background-color: #cc0000;
+ box-shadow: inset 1px 1px 2px #fff, inset -1px -1px 2px #aaa; }
+ .CindyJS-animcontrols .CindyJS-animbuttons {
+ white-space: nowrap; }
+
+.CindyJS-animbuttons button {
+ border-radius: 4px;
+ width: 34px;
+ height: 26px;
+ box-sizing: border-box; }
+
+/*# sourceMappingURL=CindyJS.css.map */ \ No newline at end of file
diff --git a/texmf-dist/scripts/ketpic/data/js/ketcindylib.txt b/texmf-dist/scripts/ketpic/data/js/ketcindylib.txt
new file mode 100644
index 00000000..f1247e68
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/js/ketcindylib.txt
@@ -0,0 +1,6389 @@
+Ketinit():=Ketinit(1);
+Ketinit(sy):=Ketinit(sy,[-5,5],[-5,5]);
+Ketinit(sy,rangex,rangey):=(
+ regional(pt,tmp,tmp1,tmp2);
+ PenThickInit=8;
+ ULEN="1cm";
+ KETPICLAYER=20;
+ MilliIn=1/2.54*1000;
+ PenThick=round(MilliIn*0.02);
+ PenThickInit=PenThick;
+ TenSizeInit=0.02;
+ TenSize=TenSizeInit;
+ YaSize=1; YaAngle=18; YaPosition=1;
+ YaThick=1; YaStyle='tf';
+ KETPICCOUNT=1;
+ KCOLOR=[0,0,0];
+ GLIST=[];
+ GCLIST=[];
+// GDATALIST=[];
+ GOUTLIST=[];
+ POUTLIST=[];
+ VLIST=[];
+ FUNLIST=[];
+ LETTERlist=[];
+ COM0thlist=[];
+ COM1stlist=[];
+ COM2ndlist=[];
+ SCIWRLIST=[];
+ SCIRELIST=[];
+ ADDAXES="1";
+ LFmark=unicode("000a");
+ Dq=unicode("0022");
+ WaitUnit=10;
+ CONTINUED=0;
+ OutComList=[];
+ OutFileLIst=[]; // 15.10.22
+ FigPdfList=[]; // 16.04.08
+ ADDPACK=[]; // 16.05.16
+ ErrFlag=0;
+ setdirectory(Dirwork);
+ if(isstring(Fhead), // 15.04.06
+ Fnametex=Fhead+".tex";
+ Fnamesci=Fhead+".sce";
+ Fnamescibody=Fhead+"body.sce";
+ Fnameout=Fhead+".txt";
+ );
+ if(!isstring(Mackc),// 16.06.07
+ Mackc="sh";
+ );
+ ArrowlineNumber=1; // 15.01.05
+ ArrowheadNumber=1;
+ BezierNumber=1; //15.01.03
+ SCALEX=1;
+ SCALEY=sy;
+// Setscaling(sy);
+ XMIN=rangex_1/SCALEX;
+ XMAX=rangex_2/SCALEX;
+ YMIN=rangey_1/SCALEY;
+ YMAX=rangey_2/SCALEY;
+ Setwindow("Msg=n"); // 16.05.31
+);
+
+DqDq(str):=unicode("0022")+str+unicode("0022");
+
+Tab2list(dtstr):=Tab2list(dtstr,[]);
+Tab2list(dtstr,options):=(
+//help:Tab2list(datastr);
+//help:Tab2list(options=[0]);
+ regional(dtall,dt,rep,out,crm,lfm,htm,first,tmp,tmp1,tmp2);
+ crm=unicode("000d");
+ lfm=unicode("000a");
+ htm=unicode("0009");
+ rep=0;
+ if(length(options)>0,rep=options_1);
+ first=lfm; // 16.09.05from
+ if(indexof(dtstr,crm)>0,
+ first=crm;
+ if(indexof(dtstr,crm+lfm)>0,
+ first=first+lfm;
+ ); // 16.09.05upto
+ );
+ tmp1=Indexall(dtstr,first);
+ tmp1=prepend(0,tmp1);
+ tmp1=append(tmp1,length(dtstr));
+ dtall=[];
+ forall(1..(length(tmp1)-1),
+ tmp=substring(dtstr,tmp1_#,tmp1_(#+1)-1);
+ if(length(tmp)>0,
+ dtall=append(dtall,tmp);
+ );
+ );
+ out=[];
+ forall(dtall,dt,
+ tmp1=tokenize(dt,unicode("0009"));
+ tmp2=[];
+ forall(tmp1,
+ if(isstring(#),tmp=parse(#),tmp=#);
+ if(!isreal(tmp),
+ if(length(#)>0,tmp=#,tmp=rep);
+ );
+ tmp2=append(tmp2,tmp);
+ );
+ out=append(out,tmp2);
+ );
+ out;
+);
+
+Columnlist(dt,list):=( // 16.09.04
+//help:Columnlist(dt,1..3);
+ apply(dt,#_list);
+);
+
+Dispmat(dt):=( // 16.09.16
+//help:Dispmat(dt);
+ regional(htm,crm,lfm,row,tmp,tmp1,tmp2);
+ htm=unicode("0009");
+ crm=unicode("000d");
+ lfm=unicode("000a");
+ tmp2="";
+ forall(dt,row,
+ tmp1="";
+ forall(row,
+ if(isstring(#),
+ tmp1=tmp1+#+htm;
+ ,
+ tmp1=tmp1+text(#)+htm;
+ );
+ );
+ tmp1=substring(tmp1,0,length(tmp1)-1);
+ tmp1=tmp1+lfm;
+ tmp2=tmp2+tmp1;
+ );
+ print(tmp2);
+ println();
+);
+
+norm(v1):=( // 16.09.01
+//help:norm([2,1,3]);
+ regional(out,tmp,tmp1,tmp2);
+ out=0;
+ forall(1..length(v1),
+ out=out+(v1_#)^2;
+ );
+ out=sqrt(out);
+ out;
+);
+norm(v1,v2):=(
+ norm(v2-v1);
+);
+
+// 16.03.28
+Removespace(str):=(
+//help:Removespace(" a b c ");
+ regional(tmp,flg,out);
+ tmp=length(str)+1;
+ flg=0;
+ forall(1..length(str),
+ if(flg==0,
+ if((str_#)!=" ",
+ tmp=#;
+ flg=1;
+ );
+ );
+ );
+ out=substring(str,tmp-1,length(str));
+ flg=0;
+ tmp=0;
+ forall(reverse(1..length(out)),
+ if(flg==0,
+ if((out_#)!=" ",
+ tmp=#;
+ flg=1;
+ );
+ );
+ );
+ out=substring(out,0,tmp);
+);
+
+Indexall(str,key):=(
+ regional(rest,out,flg,tmp,tmp1,);
+ out=[];
+ rest=str;
+ flg=0;
+ forall(1..length(str),
+ if(flg==0,
+ tmp=indexof(rest,key);
+ if(tmp>0,
+ tmp1=tmp+length(str)-length(rest);
+ out=append(out,tmp1);
+ rest=substring(rest,tmp,length(rest));
+ ,
+ flg=1;
+ );
+ );
+ );
+ out;
+);
+
+Changestyle(nameL,style):=(
+//help:Changestyle(["sgAB"],["da"]);
+ regional(nmL,name,Ltype,Ltypeorg,Noflg,opcindy,tmp);
+ tmp=Divoptions(style);
+ Ltypeorg=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ if(islist(nameL),nmL=nameL,nmL=[nameL]);
+ forall(nmL,name,
+ Ltype=Ltypeorg;
+ GCLIST=select(GCLIST,#_1!=name);
+ COM2ndlist=select(COM2ndlist,indexof(#,"("+name)==0); // 15.05.23
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ );
+);
+
+Op(n,object):=( // 16.05.25
+//help:Op(4,[1,2,3,4]);
+//help:Op(3,"abcd");
+ regional(out);
+ if(islist(object),
+ out=object_n;
+ ,
+ if(isstring(object),
+ out=substring(object,n-1,n);
+ );
+ );
+ out;
+);
+
+Toupper(str):=(
+ regional(alphabet,out,tmp,tmp1);
+ alphabet="abcdefghijklmnopqrstuvwxyz";
+ out="";
+ forall(1..length(str),
+ tmp=substring(str,#-1,#);
+ tmp1=indexof(alphabet,tmp);
+ if(tmp1>0,
+ out=out+unicode(text(tmp1+64),base->10);
+ ,
+ out=out+tmp;
+ );
+ );
+ out;
+);
+
+Textformat(value,dig):=(
+//help:Textformat(2/3,4);
+//help:Textformat([gr1,gr2],5);
+ regional(vv,tmp,tmp1);
+ if(islist(value),
+ tmp1="[";
+ forall(value,
+ tmp1=tmp1+Textformat(#,dig)+",";
+ );
+ tmp1=substring(tmp1,0,length(tmp1)-1)+"]";
+ ,
+ if(ispoint(value) % isstring(value),
+// vv=Lcrd(value);
+// tmp1=Textformat(vv,dig);
+// tmp1=text(value); // 15.04.07
+ if(isstring(value),tmp1=Dq+value+Dq,tmp1=text(value)); // 15.10.02
+ ,
+ tmp1=format(value,dig);
+ );
+ );
+ tmp1;
+);
+
+Sprintf(value,dig):=(
+//help:Sprintf(5.1,4);
+ regional(vv,tmp,tmp1);
+ if(!islist(value),
+ vv=Textformat(value,dig);
+ if(indexof(vv,".")==0,vv=vv+".");
+ vv=vv+"0000000000000000";
+ tmp=indexof(vv,".")+dig;
+ vv=substring(vv,0,tmp);
+ ,
+ vv=apply(value,Sprintf(#,dig));
+ );
+ vv;
+);
+
+Assign(funstr,vrL):=(
+ regional(nn,out,tmp,tmp1);
+ nn=length(vrL)/2;
+ out=funstr;
+ forall(1..nn,
+ out=Assign(out,vrL_(2*#-1),vrL_(2*#));
+ );
+ out;
+);
+
+Assign(funstr,varname,rep):=(
+//help:Assign("x^2+a*x","a",1.3);
+//help:Assign("a*x^2+b*x",["a",1,"b",2]);
+ regional(repstr,ii,jj,tmp,tmp1,tmp2,Notvar,Flg);
+ if(isstring(rep),repstr=rep,repstr="("+Textformat(rep,5)+")"); // 15.02.09, 07.06
+ tmp=[46]; // 12.20
+ tmp=concat(tmp,48..57);
+ tmp=concat(tmp,65..90);
+ tmp=concat(tmp,97..122);
+ Notvar=apply(tmp,unicode(text(#),base->10));
+ tmp2="";
+ forall(1..100,
+ ii=indexof(funstr,varname);
+ if(ii>0,
+ Flg=0;
+ if(ii>1,
+ tmp=substring(funstr,ii-2,ii-1);
+ if(contains(Notvar,tmp),
+ tmp2=tmp2+substring(funstr,0,ii);
+ funstr=substring(funstr,ii,length(funstr));
+ Flg=1;
+ );
+ );
+ if(Flg==0,
+ jj=ii-1+length(varname);
+ if(jj<length(funstr),
+ tmp=substring(funstr,jj,jj+1));
+ if(contains(Notvar,tmp),
+ tmp2=tmp2+substring(funstr,0,jj);
+ funstr=substring(funstr,jj,length(funstr));
+ Flg=1;
+ );
+ );
+ if(Flg==0,
+ tmp2=tmp2+substring(funstr,0,ii-1)+repstr;
+ funstr=substring(funstr,jj,length(funstr));
+ );
+ );
+ );
+ funstr=tmp2+funstr;
+ funstr;
+);
+
+MeasureDepth(list):=(
+ regional(tmp,Depth,Flg);
+ Flg=0;
+ Depth=0;
+ if(ispoint(list), // 15.01.22
+ Depth=0;
+ Flg=1;
+ ,
+ tmp=list_1;
+ );
+ repeat(4,
+ if(Flg==0,
+ if(islist(tmp),
+ tmp=tmp_1;
+ Depth=Depth+1;
+ ,
+ if(ispoint(tmp),Depth=Depth+1);
+ Flg=1;
+ );
+ );
+ );
+ Depth;
+);
+
+Flattenlist(pltlist):=(
+//help:Flattenlist([[2,3],[[1,2],[5,6]]]);
+ regional(Out,nn,Dt,ii,tmp,flg);
+ Out=[];
+ if(MeasureDepth(pltlist)==1,
+ Out=[pltlist];
+ ,
+ forall(1..length(pltlist),nn,
+ Dt=pltlist_nn;
+ if(MeasureDepth(Dt)<2,
+ Out=append(Out,Dt);
+ ,
+ forall(1..length(Dt),ii,
+ tmp=Flattenlist(Dt_ii);
+ Out=concat(Out,tmp);
+ );
+ );
+ );
+ );
+ Out;
+);
+
+Divoptions(options):=(
+//help:Divoptions(options);
+ regional(Ltype,Noflg,Inflg,Outflg,eqL,realL,strL,opstr,opcindy,flg,tmp,tmp1);
+ Ltype="dr"; // 2015.01.13
+ Noflg=0;
+ Inflg=0;
+ Outflg=0;
+ eqL=[];
+ realL=[];
+ strL=[];
+ opstr="";
+ opcindy="";
+ forall(options,
+ flg=0;
+ if(flg==0,
+ if(isreal(#) % ispoint(#) % islist(#),
+ realL=append(realL,#);
+ opstr=opstr+","+text(#);
+ flg=1;
+ );
+ );
+ if(flg==0,
+ if(indexof(#,"=")>0,
+ eqL=append(eqL,#);
+ flg=1;
+ );
+ );
+ if(flg==0,
+ if(indexof(#,"no")+indexof(#,"No")>0,
+ if(indexof(#,"tex")>0,Noflg=1);
+ if(indexof(#,"disp")>0,Noflg=2);
+ if(indexof(#,"data")>0,Noflg=3);
+ flg=1;
+ );
+ );
+ if(flg==0,
+ if(indexof(#,"->")>0,
+ opcindy=opcindy+","+#;
+ flg=1;
+ );
+ );
+ if(flg==0,
+ if(indexof(#,"out")+indexof(#,"Out")>0,
+ if(indexof(#,"-")==0,
+ Outflg=1;
+ ,
+ Outflg=2;
+ );
+ flg=1;
+ );
+ );
+ if(flg==0,
+ if(indexof(#,"in")+indexof(#,"In")>0,
+ if(indexof(#,"-")==0,
+ Inflg=1;
+ ,
+ Inflg=2;
+ );
+ flg=1;
+ );
+ );
+ if(flg==0,
+ tmp=substring(#,0,2);
+ tmp1=indexof(tmp,"dr")+indexof(tmp,"Dr");
+ tmp1=tmp1+indexof(tmp,"da")+indexof(tmp,"Da");
+ tmp1=tmp1+indexof(tmp,"id")+indexof(tmp,"Id");
+ tmp1=tmp1+indexof(tmp,"do")+indexof(tmp,"Do");
+ tmp1=tmp1+indexof(tmp,"dp")+indexof(tmp,"Dp");
+ if(tmp1>0,
+ Ltype=#;
+ flg=1;
+ );
+ if(flg==0,
+ strL=append(strL,#);
+ opstr=opstr+","+Dq+#+Dq;
+ );
+ );
+ );
+ if(indexof(opcindy,"color->")==0,// 16.10.07from
+ opcindy=opcindy+",color->[0,0,0]";
+ );
+ [Ltype,Noflg,Inflg,Outflg,eqL,realL,strL,opstr,opcindy];
+);
+
+Dotprod(vec1,vec2):=(
+//help:Dotprod(vec1,vec2);
+ regional(v1,v2,tmp);
+ if(ispoint(vec1),v1=vec1.xy,v1=vec1);
+ if(ispoint(vec2),v2=vec2.xy,v2=vec2);
+ v1*v2;
+);
+
+Crossprod(a,b):=(
+//help:Crossprod(vec1,vec2);
+ regional(tmp1,tmp2,tmp3,Out);
+ if(length(a)==3,
+ tmp1=a_2*b_3-a_3*b_2;
+ tmp2=a_3*b_1-a_1*b_3;
+ tmp3=a_1*b_2-a_2*b_1;
+ Out=[tmp1,tmp2,tmp3];
+ ,
+ Out=a_1*b_2-a_2*b_1;
+ );
+ Out;
+);
+
+Ptstart(Fig):=(
+//help:Ptstart("gr1");
+ regional(tmp);
+ if(isstring(Fig),tmp=parse(Fig),tmp=Fig); // 16.01.21
+ tmp_1;
+);
+
+Ptend(Fig):=(
+//help:Ptend("gr1");
+ regional(tmp);
+ if(isstring(Fig),tmp=parse(Fig),tmp=Fig);
+ tmp_(length(tmp)); // 15.04.12
+);
+
+Numptcrv(Fig):=(
+//help:Numptcrv("gr1");
+ regional(tmp);
+ if(isstring(Fig),tmp=parse(Fig),tmp=Fig); // 15.12.23
+ length(tmp);
+);
+
+Ptcrv(Num,Fig):=(
+//help:Ptcrv(10,"gr1");
+ regional(tmp);
+ if(isstring(Fig),tmp=parse(Fig),tmp=Fig);
+ tmp_Num;
+);
+
+Invert(Fig):=(
+//help:Invert("gr1");
+ regional(tmp);
+ if(isstring(Fig),tmp=parse(Fig),tmp=Fig); // 16.01.27
+ reverse(tmp);
+);
+Invert(nm,Fig):=Invert(nm,Fig,["nodisp"]); // from 16.01.27
+Invert(nm,Fig,options):=(
+//help:Invert("1","gr1");
+ regional(name,tmp);
+ name="-inv"+nm;
+ tmp=Invert(Fig);
+ Listplot(name,tmp,options);
+);// upto 16.01.27
+
+Paramoncrv(pP,Gdata):=(
+ regional(Tmp,PtL);
+// Eps=10^(-8);
+ if(isstring(Gdata),PtL=parse(Gdata),PtL=Gdata);
+ Tmp=Nearestpt(pP,PtL);
+ Tmp_2;
+);
+
+ParamonCurve(pP,nN,plist):=(
+//help:ParamonCurve(A,10,"gr1");
+ regional(PtL,Out,Pa,Pb,vV,vW,sS);
+ if(isstring(plist),PtL=parse(plist),PtL=plist);
+ PtL=apply(PtL,LLcrd(#));//16.10.16
+ if(nN==length(PtL),
+ Out=nN;
+ ,
+ Pa=PtL_nN;
+ Pb=PtL_(nN+1);
+ vV=Pb-Pa;
+ vW=pP-Pa;
+ sS=vV*vW/|vV|^2;
+ sS=min([max([sS,0]),1]);
+ Out=nN+sS;
+ );
+ Out;
+);
+
+Pointoncrv(tT,PtL):=PointonCurve(tT,PtL);
+PointonCurve(tT,Gdata):=(
+//help:PointonCurve(20.5,"gr1");
+ regional(Out,Eps,nN,sS,Pa,Pb,PtL);
+ if(isstring(Gdata),PtL=parse(Gdata),PtL=Gdata);
+ if(length(PtL)==1,PtL=PtL_1);
+ Eps=10^(-4);
+ nN=floor(tT+Eps);
+ sS=max([tT-nN,0]);
+ if(nN==length(PtL),
+ Out=PtL_nN;
+ ,
+ Pa=PtL_nN;
+ Pb=PtL_(nN+1);
+ Out=(1-sS)*Pa+sS*Pb;
+ );
+ Out;
+);
+
+Koutenseg(pA,pB,pC,pD):=Koutenseg(pA,pB,pC,pD,[]);
+Koutenseg(pA,pB,pC,pD,options):=(
+ regional(Eps0,Eps,Eps2,pV,Sv2,Out,pP,pQ,Flg,p1,p2,q1,q2,
+ em1,eM1,em2,eM2,rT,Tmp1,Tmp2);
+ Eps0=10^(-4);
+ pV=pB-pA;
+ Sv2=|pV|;
+ pP=pC-pA; pQ=pD-pA;
+ Eps=10^(-3);
+ Eps2=0.2;
+ Tmp1=0;
+ forall(options,
+ if(Tmp1==0,
+ Eps=#;
+ Tmp1=1;
+ ,
+ Eps2=#;
+ );
+ );
+ Flg=0;
+ if(Sv2<10^(-3),
+ Out=["inf","inf"];
+ Flg=1;
+ );
+ if(Flg==0,
+ Eps=min([Eps2,Eps/Sv2]);
+ p1=pP*pV/Sv2^2;
+ p2=[pP_2,-pP_1]*pV/Sv2^2;
+ q1=pQ*pV/Sv2^2;
+ q2=[pQ_2,-pQ_1]*pV/Sv2^2;
+ em1=-Eps; eM1=1+Eps;
+ em2=-Eps; eM2=Eps;
+ if(max([p1,q1])<em1 % min([p1,q1])>eM1,
+ Out=["inf","inf"];
+ Flg=1;
+ );
+ if(max([p2,q2])<em2 % min([p2,q2])>eM2,
+ Out=["inf","inf"];
+ Flg=1;
+ );
+ );
+ if(Flg==0 & p2*q2<0,
+ rT=p1-(q1-p1)/(q2-p2)*p2;
+ if(rT>em1 & rT<eM1,
+ if(rT>-Eps0 & rT<1+Eps0,
+ Tmp1=pA+rT*pV;
+ Tmp2=min([max([rT,0]),1]);
+ Out=[Tmp1,Tmp2,0];
+ ,
+ Tmp1=pA+rT*pV;
+ Tmp2=min([max([rT,0]),1]);
+ Out=[Tmp1,Tmp2,1];
+ );
+ Flg=1;
+ );
+ if(Flg==0 & (p1<em1 % p1>eM1 % p2<em2 % p2>eM2),
+ if(q1<em1 % q1>eM1 % q2<em2 % q2>eM2,
+ Out=["inf","inf"];
+ Flg=1;
+ );
+ if(Flg==0,
+ rT=min([max([p1,0]),1]);
+ Tmp1=pA+rT*pV;
+ Out=[Tmp1,rT,1];
+ Flg=1;
+ );
+ );
+ );
+ if(Flg==0 & (p1 > -Eps0 & p1 < 1 + Eps0 & p2 > -Eps0 & p2 < Eps0),
+ rT= p1;
+ Tmp1=pA+rT*pV;
+ Out= [Tmp1, rT, 0];
+ Flg=1;
+ );
+ if(Flg==0 & (q1 > -Eps0 & q1 < 1 + Eps0 & q2 > -Eps0 & q2 < Eps0),
+ rT= q1;
+ Tmp1=pA+rT*pV;
+ Out=[Tmp1,rT,0];
+ Flg=1;
+ );
+ if(Flg==0 & (p1<em1 % p1>eM1 % p2<em2 % p2>eM2),
+ if(q1<em1 % q1>eM1 % q2<em2 % q2>eM2,
+ Out=["inf","inf"];
+ Flg=1;
+ );
+ if(Flg==0,
+ rT=min([max([q1,0]),1]);
+ Tmp1=pA+rT*pV;
+ Out=[Tmp1,rT,1];
+ Flg=1;
+ );
+ );
+ if(Flg==0 & (q1<em1 % q1>eM1% q2<em2 % q2>eM2),
+ rT=min([max([p1,0]),1]);
+ Tmp1=pA+rT*pV;
+ Out=[Tmp1,rT,1];
+ Flg=1;
+ );
+ if(Flg==0,
+ if(abs(p2)<abs(q2),
+ rT=min([max([p1,0]),1]);
+ ,
+ rT=min([max([q1,0]),1]);
+ );
+ Tmp1=pA+rT*pV;
+ Out=[Tmp1,rT,1];
+ );
+ Out;
+);
+
+IntersectcrvsPp(Gr1,Gr2):=IntersectcrvsPp(Gr1,Gr2,[]);
+IntersectcrvsPp(Gr1,Gr2,options):=(
+//help:IntersectcrvsPp("gr1","pa1");
+ regional(Out,Eps,Eps2,Eps0,Flg,Data1,Data2,
+ Tmp1,Tmp2,Tmp3,Tmp,KL1,KL2,pA,pB,Ni,Nj,
+ pP,pQ,rT,Flg,eqL,realL,opstr,Dif);
+ Eps=10^(-4);
+ Eps2=0.1;
+ Dif=0.05; // 2015.05.31
+ Flg=0;
+ Tmp1=Divoptions(options); //
+ eqL=Tmp1_5;
+ realL=Tmp1_6;
+ opstr=Tmp1_(length(Tmp1));
+ forall(eqL,
+ if(substring(#,0,1)=="D",
+ Tmp1=indexof(#,"=");
+ Dif=parse(substring(#,Tmp1,length(#)));
+ );
+ );
+ Tmp1=length(realL);
+ if(Tmp1>0,
+ Eps=realL_1;
+ if(Tmp1>1,
+ Eps2=realL_2;
+ );
+ );
+ Flg=0;
+ if(isstring(Gr1),Data1=parse(Gr1),Data1=Gr1);
+ if(isstring(Gr2),Data2=parse(Gr2),Data2=Gr2);
+ if(MeasureDepth(Data1)==2,Data1=Data1_1);
+ if(MeasureDepth(Data2)==2,Data2=Data2_1);
+ Data1=apply(Data1,LLcrd(#));
+ Data2=apply(Data2,LLcrd(#));
+ if(length(Data1)==length(Data2),
+ Tmp1=Reverse(Data2);
+ Eps0=10^(-6);
+ Tmp2=0;
+ forall(1..length(Data1),
+ Tmp2=Tmp2+abs(Data1_#-Data2_#);
+ );
+ Tmp3=0;
+ forall(1..length(Data1),
+ Tmp3=Tmp3+abs(Data1_#-Tmp1_#);
+ );
+ if(Tmp2<Eps0 % Tmp3<Eps0,
+ Out=[];
+ Flg=1;
+ );
+ );
+ if(Flg==0,
+ KL1=[];
+ KL2=[];
+ forall(1..(length(Data1)-1),Ni,
+ pA=Data1_Ni;
+ pB=Data1_(Ni+1);
+ forall(1..(length(Data2)-1),
+ pP=Data2_#; pQ=Data2_(#+1);
+ Tmp=Koutenseg(pA,pB,pP,pQ,[Eps,Eps2]);
+ if(Tmp!=["inf","inf"],
+ if(Tmp_3==0,
+ Tmp1=[Tmp_1,Tmp_2,Ni,#];
+ KL1=concat(KL1,[Tmp1]);
+ ,
+ Tmp2=[Tmp_1,Tmp_2,Ni,#];
+ KL2=concat(KL2,[Tmp2]);
+ );
+ );
+ );
+ );
+ Out=[];
+ if(length(KL1)>0,
+ Tmp=KL1_1;
+ pP=Tmp_1;
+ rT=Tmp_2;
+ Ni=Tmp_3;
+ Nj=Tmp_4;
+ Tmp=[pP,Ni+rT,Nj];
+ Out=[Tmp];
+ );
+ forall(2..length(KL1),Ni,
+ Tmp=KL1_Ni;
+ pP=Tmp_1;
+ Tmp2=0;
+ Flg=0;
+ forall(1..length(Out),Nj,
+ if(Flg==0,
+ Tmp=Out_Nj;
+ if(|pP-Tmp_1|<Eps,
+ Tmp2=1;
+ Flg=1;
+ );
+ );
+ );
+ if(Tmp2==0,
+ Tmp=KL1_Ni;
+ pP=Tmp_1;
+ rT=Tmp_2;
+ Tmp1=Tmp_3;
+ Tmp2=Tmp_4;
+ Tmp=[pP,Tmp1+rT,Tmp2];
+ Out=concat(Out,[Tmp]);
+ );
+ );
+ forall(1..length(KL2),Ni,
+ Tmp=KL2_Ni; // 15.11.21 Usui
+ pP=Tmp_1;
+ Tmp2=0;
+ Flg=0;
+ forall(1..length(Out),Nj,
+ if(Flg==0,
+ Tmp=Out_Nj;
+ if(|pP-Tmp_1|<Eps,
+ Tmp2=1;
+ Flg=1;
+ );
+ );
+ );
+ if(Tmp2==0,
+ Tmp=KL2_Ni;
+ rT=Tmp_2;
+ rT=min([max([rT,0]),1]); // 15.11.21 Usui
+ Tmp=[pP,Tmp_3+rT,Tmp_4];
+ Out=concat(Out,[Tmp]);
+ );
+ );
+ );
+ Tmp1=Out; // 15.04.06 from
+ Out=[];
+ forall(Tmp1,Tmp2,
+ Tmp3=select(1..(length(Out)),|Out_#_1-Tmp2_1|<Dif);//16.11.27
+ if(length(Tmp3)==0,
+ Out=append(Out,Tmp2);
+ ,
+ forall(Tmp3,//16.11.27
+ Out_#=(Out_#+Tmp2)/2;
+ );
+ );
+ ); // 15.04.06 upto
+ Out;
+);
+
+Intersectcrvs(Gr1,Gr2):=Intersectcrvs(Gr1,Gr2,[]);
+//help:Intersectcrvs("gr1","pa1");
+Intersectcrvs(Gr1,Gr2,options):=(
+ regional(tmp,tmp1,tmp2);
+ tmp1=IntersectcrvsPp(Gr1,Gr2,options);
+ apply(tmp1,#_1);
+);
+
+NearestptcrvPhy(point,PL):=(
+ regional(tmp,pP,plist);
+ pP=Pcrd(point);
+ if(isstring(PL),plist=parse(PL),plist=PL);
+ if(MeasureDepth(plist)==2,plist=plist_1);
+ plist=apply(plist,#); // 14.12.18
+ tmp=Nearestpt(pP,plist);
+ tmp=tmp_1;
+ [tmp_1/SCALEX,tmp_2/SCALEY];
+);
+
+Nearestptcrv(point,plist):=(
+//help:Nearestptcrv(A,"gr1");
+ regional(tmp);
+ tmp=Nearestpt(point,plist);
+ tmp_1;
+);
+
+Nearestpt(point,PL2):=(
+ regional(PL1,PL,Ans,Flg,Eps,pA,Pm,Im,Sm,Nn,Ni,
+ a1,b1,a2,b2,v1,v2,x1,x2,Tmp,rT,pP,sS,Lm,Pm,Sm,Flg);
+//help:Nearestpt("gr1","gr2");
+ if(isstring(point),PL1=parse(point),PL1=point);
+ if(MeasureDepth(PL1)==2,PL1=PL1_1);
+ if(!islist(PL1_1),
+ PL1=[PL1];
+ Flg=0;
+ ,
+ Flg=1;
+ );
+ if(isstring(PL2),PL=parse(PL2),PL=PL2);
+ if(MeasureDepth(PL)==2,PL=PL_1);
+ Eps=10^(-6);
+ Ans=[PL1_1,1,PL_1,1,|PL1_1-PL_1|];
+ forall(1..length(PL1),Nn, // 16.05.04
+ pA=PL1_Nn;
+ Pm=PL_1;
+ Im=1;
+ Sm=|Pm-pA|;
+ forall(1..(length(PL)-1),Ni,
+ a1=PL_Ni_1; a2=PL_Ni_2;
+ b1=PL_(Ni+1)_1; b2=PL_(Ni+1)_2;
+ v1=b1-a1; v2=b2-a2;
+ x1=pA_1; x2=pA_2;
+ Tmp=v2^2+v1^2;
+ if(abs(Tmp)>Eps,
+ rT=(-a2*v2-v1*a1+v1*x1+x2*v2)/Tmp;
+ if(rT<-Eps,
+ pP=[a1,a2];
+ ,
+ if(rT>1+Eps,
+ pP=[b1,b2];
+ ,
+ pP=[a1+rT*v1,a2+rT*v2];
+ );
+ );
+ sS=|pP-pA|;
+ if(sS<Sm-Eps,
+ Tmp=ParamonCurve(pP,Ni,PL);
+ Pm=pP; Lm=Tmp; Sm=sS;
+ );
+ );
+ if(Sm<Ans_5, // 16.05.03from
+ Ans=[pA,Nn,Pm,Lm,Sm];
+ );
+ ); // 16.05.03upto
+ );
+ if(Flg==0,
+ Ans=Ans_(3..5);
+ );
+ Ans;
+);
+
+Derivative(fun,var,value):=(
+//help:Derivative("x^3","x",2);
+ regional(str,tmp);
+ str="d(";
+ str=str+replace(fun,var,"#")+",";
+ str=str+value+")";
+ tmp=Pcrd([1,parse(str)]); // 14.11.08
+ tmp_2;
+);
+
+Integrate(pltdata,range):=Integrate(pltdata,range,[]);
+Intergrate(Arg1,Arg2,Arg3):=(
+ regional(pltdata,range,options,fnstr,vartr);
+ if(islist(Arg2),
+ pltdata=Arg1;
+ range=Arg2;
+ options=Arg3;
+ Integrate(pltdata,range,options);
+ ,
+ fnstr=Arg1;
+ vastr=Arg2;
+ range=Arg3;
+ Integrate(fnstr,vastr,range,[]);
+ );
+);
+
+Integrate(pltdata,range,options):=(
+//help:Integrate("gr1",[1,3]);
+//help:Integrate("gr1",[1,3],["Rule=t"]);
+ regional(tmp,tmp1,eqL,Rule,pdata,Sm,ptP,ptQ,list,va1,va2);
+ tmp=Divoptions(options);
+ eqL=tmp_5;
+ Rule="o";
+ forall(eqL,
+ if(Toupper(substring(#,0,1))=="R",
+ tmp=indexof(#,"=");
+ Rule=substring(#,tmp,tmp+1);
+ );
+ );
+ if(Rule=="o",
+ Sm= IntegrateO(pltdata,range);
+ ,
+ if(isstring(pltdata),pdata=parse(pltdata),pdata=pltdata);
+ if(MeasureDepth(pdata)==2,pdata=pdata_1);
+ va1=MeetCurve(pdata,range_1,0);
+ va2=MeetCurve(pdata,range_2,0);
+ list=select(pdata,(#_1>range_1 & #_1<range_2));
+ list=apply(list,LLcrd(#)); // 15.09.14
+ list=concat([va1],list);
+ list=concat(list,[va2]);
+ Sm=0;
+ forall(1..(length(list)-1),
+ ptP=list_#; // 15.09.14
+ ptQ=list_(#+1);
+ Sm=Sm+(ptP_2+ptQ_2)*(ptQ_1-ptP_1)/2;
+ );
+ Sm;
+ );
+);
+
+Integrate(fnstr,vastr,range,options):=(
+//help:Integrate("sin(x)","x",[0,pi],["Num=100","Rule=s"]);
+ regional(tmp,tmp1,Sm,Lx,Rx,va1,va2,Num,Waysx,ex,dx,xn,yn,x0,x1,x2,y0,y1,y2);
+ Num=100;
+ Way="t";
+ forall(options,
+ if(indexof(#,"=")>0,
+ if(indexof(#,"N=")>0,
+ Num=parse(substring(#,indexof(#,"="),length(#)));
+ );
+ if(indexof(#,"Num=")>0,
+ Num=parse(substring(#,indexof(#,"="),length(#)));
+ );
+ if(Toupper(substring(#,0,1))=="R",
+ tmp=indexof(#,"=");
+ Way=substring(#,tmp,tmp+1);
+ );
+ );
+ );
+ Sm=0;
+ if(Way=="t",
+ forall(1..Num,
+ Lx=range_1+(range_2-range_1)*(#-1)/Num;
+ Rx=range_1+(range_2-range_1)*#/Num;
+ va1=parse(replace(fnstr,vastr,textformat(Lx,5)));
+ va2=parse(replace(fnstr,vastr,textformat(Rx,5)));
+ Sm=Sm+(va1+va2)*(Rx-Lx)/2;
+ );
+ ,
+ sx=range_1;
+ ex=range_2;
+ dx=(ex-sx)/Num;
+ xn=apply(0..Num,sx+#*dx);
+ yn=apply(xn,parse(replace(fnstr,vastr,textformat(#,5))));
+ dx=dx/2;
+ repeat(Num,s,
+ x0=xn_s;
+ x1=(xn_s+xn_(s+1))/2;
+ x2=xn_(s+1);
+ y0=yn_s;
+ y1=parse(replace(fnstr,vastr,textformat(x1,5)));
+ y2=yn_(s+1);
+ Sm=Sm+dx*(y0+4*y1+y2)/3;
+ );
+ );
+ Sm;
+);
+
+IntegrateO(p0org,p1org,p2org,p3org):=(
+ regional(p0,p1,p2,p3,pQ,pR,cc,p01,p02,
+ p11,p12,p21,p22,p31,p32, tmp);
+ if(ispoint(p0org),p0=p0org.xy,p0=p0org); // 16.03.10
+ if(ispoint(p1org),p1=p1org.xy,p1=p1org); // 16.03.16
+ if(ispoint(p2org),p2=p2org.xy,p2=p2org);
+ if(ispoint(p3org),p3=p3org.xy,p3=p3org);
+ tmp=1+sqrt((1+Dotprod(p2-p0,p3-p1)/|p2-p0|/|p3-p1|)/2);
+ cc=4*|p2-p1|/3/(|p2-p0|+|p3-p1|)/tmp;
+ pQ=p1+cc*(p2-p0);
+ pR=p2+cc*(p1-p3);
+ p01=p1_1; p02=p1_2;
+ p31=p2_1; p32=p2_2;
+ p11=pQ_1; p12=pQ_2;
+ p21=pR_1; p22=pR_2;
+ tmp=-6*p12*p01+3*p12*p21+3*p12*p31+6*p02*p11-
+ 10*p02*p01+3*p02*p21+p02*p31-3*p22*p11-
+ 3*p22*p01+6*p22*p31-3*p32*p11-p32*p01-
+ 6*p32*p21+10*p32*p31;
+ tmp=tmp/20;
+);
+IntegrateO(pltdata,rangeorg):=(
+//help:IntegrateO("gr1",[0,2]);
+ regional(tmp,tmp1,tmp2,pdata,va1,va2,list,Bzk,Bzc,range,pmflg,
+ Sm,p0,p1,p2,p3,pQ,pR,cc,p01,p02,p11,p12,p21,p22,p31,p32);
+ if(isstring(pltdata),pdata=parse(pltdata),pdata=pltdata);
+ if(MeasureDepth(pdata)==2,pdata=pdata_1);
+ range=rangeorg;
+ pmflg=1;
+ if(range_2<range_1,
+ range=reverse(range);
+ pmflg=-1;
+ );
+ va1=MeetCurve(pdata,range_1,0);
+ va2=MeetCurve(pdata,range_2,0);
+ list=select(pdata,(#_1>range_1 & #_1<range_2));
+ if((length(list)>0) & (list_1_1>list_(length(list))_1),
+ list=reverse(list);
+// pmflg=pmflg*(-1);
+ );
+ list=apply(list,LLcrd(#));
+ list=concat([va1],list);
+ list=concat(list,[va2]);
+ Sm=0;
+ forall(1..(length(list)-1),
+ p1=list_#;
+ p2=list_(#+1);
+ if(#==1 % #==length(list)-1,
+ tmp1=(p1_2+p2_2)*(p2_1-p1_1)/2;
+ Sm=Sm+tmp1;
+ ,
+ p0=list_(#-1);
+ p3=list_(#+2);
+ tmp=1+sqrt((1+Dotprod(p2-p0,p3-p1)/|p2-p0|/|p3-p1|)/2);
+ cc=4*|p2-p1|/3/(|p2-p0|+|p3-p1|)/tmp;
+ pQ=p1+cc*(p2-p0);
+ pR=p2+cc*(p1-p3);
+ p01=p1_1; p02=p1_2;
+ p31=p2_1; p32=p2_2;
+ p11=pQ_1; p12=pQ_2;
+ p21=pR_1; p22=pR_2;
+ tmp1=-6*p12*p01+3*p12*p21+3*p12*p31+6*p02*p11-
+ 10*p02*p01+3*p02*p21+p02*p31-3*p22*p11-
+ 3*p22*p01+6*p22*p31-3*p32*p11-p32*p01-
+ 6*p32*p21+10*p32*p31;
+ tmp1=tmp1/20;
+ Sm=Sm+tmp1;
+ );
+ );
+ if(pmflg==-1,
+ Sm=-Sm;
+ );
+ Sm;
+);
+
+Findarea(pdstr):=(
+//help:Findarea("sgABCA");
+ regional(pd,p1,p2,s,tmp);
+ if(isstring(pdstr),pd=parse(pdstr),pd=pdstr);
+ s=0;
+ forall(1..(length(pd)-1),
+ p1=Lcrd(pd_#);
+ p2=Lcrd(pd_(#+1));
+ tmp=(p1_2+p2_2)*(p2_1-p1_1)/2;
+ s=s+tmp;
+ );
+ if(s<0,s=-s);
+ s;
+);
+
+Findarea(pdstr):=( // 15.11.27
+//help:Findarea("cr1");
+ regional(pd,p0,p1,p2,p3,s,tmp);
+ if(isstring(pdstr),pd=parse(pdstr),pd=pdstr);
+ s=0;
+ forall(1..(length(pd)-1),
+ p1=pd_#;
+ p2=pd_(#+1);
+ if(#==1,p0=pd_(length(pd)-1),p0=pd_(#-1));
+ if(#==length(pd)-1,p3=pd_2,p3=pd_(#+2));
+ tmp=IntegrateO(p0,p1,p2,p3);
+ s=s+tmp;
+ );
+ if(s<0,s=-s);
+ s;
+);
+
+Findlength(pdstr):=(
+//help:Findlength("gr1");
+ regional(pd,p1,p2,s,tmp);
+ if(isstring(pdstr),pd=parse(pdstr),pd=pdstr);
+ s=0;
+ forall(1..(length(pd)-1),
+ p1=Lcrd(pd_#);
+ p2=Lcrd(pd_(#+1));
+ tmp=|p2-p1|;
+ s=s+tmp;
+ );
+ s;
+);
+
+Inversefun(fnstr,rngstr,value):=(
+ regional(tmp,varstr,range,x1,x2,x3,va1,va2);
+ tmp=indexof(rngstr,"=");
+ varstr=substring(rngstr,0,tmp-1);
+ range=parse(substring(rngstr,tmp,length(rngstr)));
+ x1=range_1; x2=range_2;
+ repeat(15,
+ x3=(x1+x2)/2;
+ va1=parse(replace(fnstr,varstr,textformat(x1,5)));
+ va2=parse(replace(fnstr,varstr,textformat(x3,5)));
+ if((va1>value & va2>value) % (va1<value & va2<value),
+ x1=x3;
+ ,
+ x2=x3;
+ );
+ );
+ va1=parse(replace(fnstr,varstr,textformat(x1,5)))-value;
+ va2=parse(replace(fnstr,varstr,textformat(x2,5)))-value;
+ if(x1==range_1 % x2==range_2,
+ println("not found in ("+textformat(range_1,5)
+ +","+textformat(range_2,5)+")");
+ );
+ if(abs(va1)<=abs(va2),x1,x2);
+);
+
+Lcrd(pt):=(
+ regional(tmp);
+ if(ispoint(pt),
+ tmp=[pt.x/SCALEX,pt.y/SCALEY];
+ ,
+ tmp=pt;
+ );
+ tmp;
+);
+
+Pcrd(pt):=(
+ regional(tmp);
+ if(ispoint(pt),
+ tmp=re(pt.xy); // 15.07.24
+ ,
+ tmp=[pt_1*SCALEX,pt_2*SCALEY];
+ );
+ tmp;
+);
+
+LLcrd(pt):=(
+ regional(tmp);
+ if(ispoint(pt),
+ tmp=pt.xy
+ ,
+ tmp=pt;
+ );
+ tmp=[tmp_1/SCALEX,tmp_2/SCALEY];
+ tmp;
+);
+
+Doscaling(pltdata):=(
+ regional(Level,Out,gL,gr,tmp);
+ if(ispoint(pltdata) % isreal(pltdata_1),
+ gL=[[pltdata]];
+ Level=0;
+ ,
+ if(ispoint(pltdata_1) % isreal(pltdata_1_1),
+ gL=[pltdata];
+ Level=1;
+ ,
+ gL=pltdata;
+ Level=2;
+ );
+ );
+ Out=[];
+ forall(gL,gr,
+ tmp=apply(gr,Lcrd(#));
+ tmp=apply(tmp,LLcrd(#));
+ Out=concat(Out,[tmp]);
+ );
+ if(Level==0,
+ Out=Out_1_1;
+ );
+ if(Level==1,
+ Out=Out_1;
+ );
+ Out;
+);
+
+Unscaling(pltdata):=(
+ regional(Level,Out,gL,gr,tmp);
+ if(ispoint(pltdata) % isreal(pltdata_1),
+ gL=[[pltdata]];
+ Level=0;
+ ,
+ if(ispoint(pltdata_1) % isreal(pltdata_1_1),
+ gL=[pltdata];
+ Level=1;
+ ,
+ gL=pltdata;
+ Level=2;
+ );
+ );
+ Out=[];
+ forall(gL,gr,
+ tmp=apply(gr,Lcrd(#));
+ tmp=apply(tmp,LLcrd(#));
+ Out=concat(Out,[tmp]);
+ );
+ if(Level==0,
+ Out=Out_1_1;
+ );
+ if(Level==1,
+ Out=Out_1;
+ );
+ Out;
+);
+
+Definecolor(name,data):=(
+//help:Definecolor("mycolor",[1,1,1,0]);
+ regional(type,tmp);
+ if(length(data)>3,type="cmyk",type="rgb");
+ tmp=text(data);
+ tmp=substring(tmp,1,length(tmp)-1);
+ tmp="\definecolor{"+name+"}{"+type+"}{"+tmp+"}";
+ Texcom(tmp);
+);
+
+Setcolor(Par):=(
+//help:Setcolor([1,0,0,1]);
+//help:Setcolor([1,1,0]);
+ if(islist(Par),
+ if(length(Par)==3,
+ Setcolorrgb(Par); // 2015.04.28
+// KCOLOR=Par;
+ );
+ if(length(Par)==4,
+ Setcolor(Par,[]);
+ );
+ ,
+ Setcolor(Par,[]);
+ );
+);
+
+Setcolor(colorname,options):=(
+//help:Setcolor("greenyellow",0.3);
+ regional(tmp);
+ if(isstring(colorname),
+ tmp="Setcolor("+Dq+colorname+Dq;
+ if(length(options)>0,
+ tmp=tmp+","+text(options_1);
+ );
+ Com2nd(tmp+")");
+ );
+ if(islist(colorname),
+ tmp=text(colorname);
+ tmp=substring(tmp,1,length(tmp)-1);
+ tmp="Texcom("+Dq+"\color[cmyk]{"+tmp+"}"+Dq+")";
+ Com2nd(tmp);
+ );
+);
+
+Setcolorrgb(colorlist):=(
+// help:Setcolorrgb([0.5,0.3,0.4]);
+ regional(tmp);
+ tmp=text(colorlist);
+ tmp=substring(tmp,1,length(tmp)-1);
+ tmp="Texcom("+Dq+"\color[rgb]{"+tmp+"}"+Dq+")";
+ Com2nd(tmp);
+);
+
+ColorRgb2Cmyk(clr):=(
+// help:ColorRgb([0.2,0.5,0.1]);
+ regional(clrnew,tmp,black);
+ tmp=apply(clr,1-#);
+ black=min(tmp);
+ tmp=apply(clr,(1-#-black)/(1-black));
+ clrnew=append(tmp,black);
+ clrnew;
+);
+
+ColorCmyk2Rgb(clr):=(
+// help:ColorRgb([0.2,0.5,0.1,0.2]);
+ regional(clrnew,tmp,black);
+ black=clr_4;
+ tmp=apply(clr,1-min(1,#*(1-black)+black));
+ clrnew=tmp_(1..3);
+ clrnew;
+);
+
+Colorrgbhsv(rgb):=(
+ regional(varR,varG,varB,varMin,varMax,delMax,hh,ss,vv,delR,delG,delB);
+ varR = rgb_1;
+ varG = rgb_2;
+ varB = rgb_3;
+ varMin = min( [varR, varG, varB] );
+ varMax = max( [varR, varG, varB] );
+ delMax = varMax - varMin ;
+ vv = varMax;
+ if ( delMax == 0 ,
+ hh = 0 ;
+ ss = 0 ;
+ ,
+ ss = delMax / varMax;
+ delR = ( ( ( varMax - varR ) / 6 ) + ( delMax / 2 ) ) / delMax;
+ delG = ( ( ( varMax - varG ) / 6 ) + ( delMax / 2 ) ) / delMax;
+ delB = ( ( ( varMax - varB ) / 6 ) + ( delMax / 2 ) ) / delMax;
+ if( varR == varMax ,
+ hh = delB - delG;
+ ,
+ if ( varG == varMax,
+ hh = ( 1 / 3 ) + delR - delB;
+ ,
+ if ( varB == varMax ,
+ hh = ( 2 / 3 ) + delG - delR;
+ );
+ );
+ );
+ if ( hh < 0 ,hh = hh+1);
+ if ( hh > 1 ,hh = hh-1);
+ );
+ [hh*360,ss,vv];
+);
+
+Colorhsvrgb(sL):=(
+ regional(tmp,tmp1,tmp2,tmp3,hi,ff,dL);
+ tmp=[sL_1/60,sL_2,sL_3];
+ hi=mod(floor(tmp_1),6);
+ ff=tmp_1-floor(tmp_1);
+ tmp2=tmp_3*[1-tmp_2,1-tmp_2*ff,1-tmp_2*(1-ff)];
+ tmp2=append(tmp2,tmp_3);
+ if(hi==0,dL=tmp2_[4,3,1]);
+ if(hi==1,dL=tmp2_[2,4,1]);
+ if(hi==2,dL=tmp2_[1,4,3]);
+ if(hi==3,dL=tmp2_[1,2,4]);
+ if(hi==4,dL=tmp2_[3,1,4]);
+ if(hi==5,dL=tmp2_[4,1,2]);
+ dL;
+);
+
+Colorrgbhsl(rgb):=(
+ regional(rr,gg,bb,mn,mx,delta,deltaR,deltaG,deltaB,hh,ss,ll);
+ rr = rgb_1 ;
+ gg = rgb_2 ;
+ bb = rgb_3 ;
+ mn = min([rr, gg, bb]);
+ mx = max([rr, gg, bb]);
+ delta = mx - mn;
+ ll = (mx + mn) / 2;
+ if (delta == 0,
+ hh=0;
+ ss=0;
+ ,
+ if (ll < 0.5,
+ ss = delta/ (mx + mn);
+ ,
+ ss = delta / (2 - mx - mn);
+ );
+ deltaR = (((mx - rr) / 6) + (delta / 2)) / delta;
+ deltaG = (((mx - gg) / 6) + (delta / 2)) / delta;
+ deltaB = (((mx - bb) / 6) + (delta / 2)) / delta;
+ if (rr == mx,
+ hh = deltaB - deltaG;
+ ,
+ if (gg == mx,
+ hh = (1 / 3) + deltaR - deltaB;
+ ,
+ if (bb == mx,
+ hh = (2 / 3) + deltaG - deltaR;
+ );
+ );
+ );
+ if ( hh < 0, hh = hh+1);
+ if ( hh > 1, hh = hh-1);
+ );
+ [hh*360,ss,ll];
+);
+
+Colorhslrgb(hsl):=(
+ regional(hh,ss,ll,rr,gg,bb,var1,var2);
+ hh=hsl_1/360;
+ ss=hsl_2;
+ ll=hsl_3;
+ if ( ss == 0.0,
+ rr = ll ;
+ gg = ll ;
+ bb = ll ;
+ ,
+ if ( ll < 0.5 ,
+ var2 = ll * ( 1.0 + ss );
+ ,
+ var2 = ( ll + ss ) - ( ss * ll );
+ );
+ var1 = 2.0 * ll - var2;
+ rr = hue2rgb( var1, var2, hh + ( 1.0 / 3.0 ) );
+ gg = hue2rgb( var1, var2, hh );
+ bb = hue2rgb( var1, var2, hh - ( 1.0 / 3.0 ) );
+ );
+ [rr,gg,bb];
+);
+
+hue2rgb(vv1,vv2,vh):=(
+ regional(out);
+ if ( vh < 0.0 ,vh =vh+1);
+ if ( vh > 1.0 ,vh =vh-1);
+ if ( 6.0*vh < 1.0 ,
+ out = vv1 + ( vv2 - vv1 ) * 6.0 * vh ;
+ ,
+ if( 2.0*vh < 1.0 ,
+ out = vv2;
+ ,
+ if ( 3.0*vh < 2.0 ,
+ out = vv1 + ( vv2 - vv1 ) * ( ( 2.0 / 3.0 ) - vh ) * 6.0 ;
+ ,
+ out= vv1 ;
+ );
+ );
+ );
+ out;
+);
+
+Colorrgbhwb(sL):=(
+ regional(dl1,dl2,dl3);
+ dl1 = Colorrgbhsl(sL)_1;//Colorcode("rgb","hsl",sL)_1;
+ dl2 = min(sL);
+ dl3 = 1 - max(sL);
+ dL= [dl1, dl2 , dl3 ];
+);
+
+Colorhwbrgb(sLorg):=(
+ regional(sL,tmp,tmp1,tmp2,tmp3,ratio,ff,ii,vv,nn,dL,flg);
+ sL=sLorg;
+ sL=[sL_1/360,sL_2,sL_3];
+ ratio = sL_2 + sL_3;
+ // sL_2 + sL_3 cant be > 1
+ if (ratio > 1.,
+ sL_2 =sL_2 / ratio;
+ sL_3 = sL_3 / ratio;
+ );
+ ii = floor(6 * sL_1);
+ vv = 1 - sL_3;
+ ff = 6 * sL_1 - ii;
+ if(mod(ii,2)==1,ff = 1 - ff);
+ nn = sL_2 + ff * (vv - sL_2); // linear interpolation
+ tmp=[[vv,nn,sL_2],[nn,vv,sL_2],[sL_2,vv,nn],
+ [sL_2,nn,vv],[nn,sL_2,vv],[vv,sL_2,nn],[vv,nn,sL_2]];
+ flg=0;
+ forall(0..6,
+ if(flg==0 & ii == # ,
+ dL=tmp_(#+1);
+ flg=1;
+ );
+ );
+ dL;
+);
+
+Colorhslhsv(sL):=(
+ regional(dl1,dl2,dl3,dL);
+ dl1=sL_1;
+ if(sL_3 == 0,
+ // no need to do calc on black
+ // also avoids divide by 0 error
+ dL= [0, 0, 0];
+ ,
+ sL_3 = sL_3 * 2;
+ if(sL_3 <= 1,sL_2 = sL_2 * sL_3,sL_2 = sL_2 * (2 - sL_3));
+ dl3 = (sL_3 + sL_2) / 2;
+ dl2 = (2 * sL_2) / (sL_3 + sL_2);
+ dL = [dl1, dl2, dl3];
+ );
+ dL;
+);
+
+Colorcode(src,dest,sL):=(
+//help:Colorcode("rgb","cmyk",[1,0.5,0]);
+ regional(tmp,tmp1,tmp2,tmp3,mn,mx,delta,black,dL,flg);
+ regional(dl1,dl2,dl3);
+ if(src=="rgb" & dest=="hsv", dL=Colorrgbhsv(sL));
+ if(src=="hsv" & dest=="rgb", dL=Colorhsvrgb(sL));
+ if(src=="rgb" & dest=="hsl", dL=Colorrgbhsl(sL));
+ if(src=="hsl" & dest=="rgb", dL=Colorhslrgb(sL));
+ if(src=="rgb" & dest=="hwb", dL=Colorrgbhwb(sL));
+ if(src=="hwb" & dest=="rgb", dL=Colorhwbrgb(sL));
+ if(src=="hsl" & dest=="hsv", dL=Colorhslhsv(sL));
+ if(src=="hsv" & dest=="hsl",
+ dl1 = sL_1;
+ dl3 = (2 - sL_2) * sL_3;
+ dl2 = sL_2 * sL_3;
+ if(dl3 <= 1,dl2 = dl2/dl3,dl2=dl2/(2 - dl3));
+ dl3 =d l3/ 2;
+ dL = [dl1, dl2 , dl3 ];
+ );
+
+ if(src=="rgb" & dest=="cmyk",
+ tmp=apply(sL,1-#);
+ black=min(tmp);
+ tmp=apply(sL,(1-#-black)/(1-black));
+ dL=append(tmp,black);
+ );
+ if(src=="cmyk" & dest=="rgb",
+ black=sL_4;
+ tmp=apply(sL,1-min(1,#*(1-black)+black));
+ dL=tmp_(1..3);
+ );
+ if(src=="hsv" & dest=="cmyk",
+ tmp=Colorcode("hsv","rgb",sL);
+ dL=Colorcode("rgb","cmyk",tmp);
+ );
+ if(src=="cmyk" & dest=="hsv",
+ tmp=Colorcode("cmyk","rgb",sL);
+ dL=Colorcode("rgb","hsv",tmp);
+ );
+
+ if(src=="hsv" & dest=="hwb",
+ tmp = Colorcode("hsv","rgb",sL);
+ dL = Colorcode("rgb","hwb",tmp);
+ );
+ if(src=="hwb" & dest=="hsv",
+ tmp = Colorcode("hwb","rgb",sL);
+ dL = Colorcode("rgb","hsv",tmp);
+ );
+ if(src=="hsl" & dest=="hwb",
+ tmp = Colorcode("hsl","rgb",sL);
+ dL = Colorcode("rgb","hwb",tmp);
+ );
+ if(src=="hwb" & dest=="hsl",
+ tmp = Colorcode("hwb","rgb",sL);
+ dL = Colorcode("rgb","hsl",tmp);
+ );
+ if(src=="hsl" & dest=="cmyk",
+ tmp = Colorcode("hsl","rgb",sL);
+ dL = Colorcode("rgb","cmyk",tmp);
+ );
+ if(src=="hwb" & dest=="cmyk",
+ tmp = Colorcode("hwb","rgb",sL);
+ dL = Colorcode("rgb","cmyk",tmp);
+ );
+ if(src=="cmyk" & dest=="hsl",
+ tmp = Colorcode("cmyk","rgb",sL);
+ dL = Colorcode("rgb","hsl",tmp);
+ );
+ if(src=="cmyk" & dest=="hwb",
+ tmp = Colorcode("cmyk","rgb",sL);
+ dL = Colorcode("rgb","hwb",tmp);
+ );
+ if(src=="hsb" & dest=="rgb",dL=Colorcode("hsv","rgb",sL));
+ if(src=="rgb" & dest=="hsb",dL=Colorcode("rgb","hsv",sL));
+
+ if(src=="hsb" & dest=="hsl",dL=Colorcode("hsv","hsl",sL));
+ if(src=="hsl" & dest=="hsb",dL=Colorcode("hsl","hsv",sL));
+
+ if(src=="hsb" & dest=="hwb",dL=Colorcode("hsv","hwb",sL));
+ if(src=="hwb" & dest=="hsb",dL=Colorcode("hwb","hsv",sL));
+
+ if(src=="hsb" & dest=="cmyk",dL=Colorcode("hsv","cmyk",sL));
+ if(src=="cmyk" & dest=="hsb",dL=Colorcode("cmyk","hsv",sL));
+
+ dL;
+);
+
+Addcolor(cmdorg,list):=(
+//help:Addcolor("Plotdata('1','x^2','x',[])",[1,1,0]);
+ regional(rgb,cmyk,cmd,tmp,tmp1,tmp2,tmp3,tmp4);
+ cmd=replace(cmdorg,"'",Dq);
+ if(length(list)==3,
+ rgb=list;
+ cmyk=Colorcode("rgb","cmyk",list);
+ ,
+ cmyk=list;
+ rgb=Colorcode("cmyk","rgb",list);
+ );
+ tmp1="color->"+text(rgb);
+ tmp2="Setcolor("+text(cmyk)+");";
+ tmp3=substring(cmd,0,length(cmd)-2);
+ tmp=substring(tmp3,length(tmp3)-1,length(tmp3));
+ if(tmp!="[",
+ tmp3=tmp3+",";
+ );
+ tmp3=tmp3+Dq+tmp1+Dq+"])";
+ parse(tmp2);
+ parse(tmp3);
+ Setcolor("black");
+);
+
+Colorinfile(filename,clrf,clrt):=(
+ regional(tmp,tmp1,tmp2,head,cstrL,chstrL,head,body);
+ if(length(clrf_1)==3,
+ head="[rgb]{";
+ ,
+ head="[cmyk]{";
+ );
+ tmp=apply(clrf,text(#));
+ cstrL=apply(tmp,head+substring(#,1,length(#)-1)+"}");
+ if(length(clrt_1)==3,
+ head="[rgb]{";
+ ,
+ head="[cmyk]{";
+ );
+ tmp=apply(clrt,text(#));
+ chstrL=apply(tmp,head+substring(#,1,length(#)-1)+"}");
+ tmp1=load(filename);
+ tmp=tokenize(tmp1,"{\unitlength");
+ head=tokenize(tmp_1,"%%%");
+ head=head_(2..length(head));
+ head=apply(head,"%%%"+#);
+ tmp2=tmp_2;
+ forall(1..5,
+ tmp2=replace(tmp2,cstrL_#,chstrL_#);
+ );
+ body=tokenize(tmp2,"%");
+ body_1="{\unitlength"+body_1;
+ body=apply(body,#+"%");
+ body=body_(1..(length(body)-1));
+ tmp=replace(filename,".tex","new.tex");
+ SCEOUT=openfile(tmp);
+ forall(head,
+ println(SCEOUT,#);
+ );
+ forall(1..length(body),
+ tmp=body_#;
+ if(#<length(body),
+ println(SCEOUT,tmp);
+ ,
+ print(SCEOUT,tmp)
+ );
+ );
+ closefile(SCEOUT);
+);
+
+GetLinestyle(str,name):=(
+ regional(noflg,tmp,tmp1,tmp2,Dop,Ltype,subflg);
+ Ltype=-1;
+ Dop="";
+ tmp1=indexof(str,",");
+ if(tmp1>0,
+ Dop=","+substring(str,tmp1,length(str));
+ );
+ noflg=parse(substring(str,0,1));
+ if(substring(name,0,3)=="sub",subflg=1,subflg=0); // 16.02.29
+ tmp1=substring(str,1,3);
+ if(tmp1=="dr" % tmp1=="Dr",
+ Ltype=0;
+ if(noflg==0 & subflg==0, // 16.02.29
+ Drwline(name+Dop);
+ );
+ );
+ if(tmp1=="da" % tmp1=="Da",
+ Ltype=1;
+ if(noflg==0 & subflg==0, // 16.02.29
+ Dashline(name+Dop);
+ );
+ );
+ if(tmp1=="id" % tmp1=="Id",
+ Ltype=2; // 15.11.09
+ if(noflg==0 & subflg==0, // 16.02.29
+ Invdashline(name+Dop);
+ );
+ );
+ if(tmp1=="do" % tmp1=="Do",
+ Ltype=3;
+ if(noflg==0 & subflg==0, // 16.02.29
+ Dottedline(name+Dop);
+ );
+ );
+ if(tmp1=="dp" % tmp1=="Dp",
+ Ltype=0;
+ tmp1=parse(name);
+ tmp2="";
+ forall(tmp1,
+ tmp2=tmp2+textformat(#_1,5)+",";
+ );
+ tmp2=substring(tmp2,0,length(tmp2)-1);
+ if(noflg==0,
+ Drwpt(tmp2+Dop);
+ );
+ );
+ if(tmp1=="no" % tmp1=="No",
+ Ltype=10;
+ );
+ Ltype;
+);
+
+Chunderscore(str):=(
+ regional(flg,tmp,tmp1,tmp2,tmp3);
+ if(indexof(str,"]")>0,
+ tmp1=replace(str,"]",",]");
+ ,
+ tmp1=str+",";
+ );
+ flg=0;
+ tmp2=[];
+ tmp3=0;
+ forall(1..length(tmp1),
+ if(flg==0,
+ tmp=substring(tmp1,tmp3,length(tmp1));
+ tmp=indexof(tmp,"_");
+ if(tmp==0,
+ flg=1;
+ ,
+ tmp3=tmp3+tmp;
+ tmp=substring(tmp1,tmp3,length(tmp1));
+ tmp=indexof(tmp,",")-1;
+ tmp=substring(tmp1,tmp3,tmp3+tmp);
+ tmp2=append(tmp2,tmp);
+ );
+ );
+ );
+ forall(tmp2,
+ tmp1=replace(tmp1,"_"+#,"("+#+")");
+ );
+ if(indexof(str,"]")>0,
+ tmp1=replace(tmp1,",]",")");
+ tmp1=replace(tmp1,"[","list(");
+ ,
+ tmp1=substring(tmp1,0,length(tmp1)-1);
+ );
+ tmp1;
+);
+
+//AddGraph(pltdata):=AddGraph("-"+pltdata,pltdata,[]);
+AddGraph(nm,pltdata):=AddGraph(nm,pltdata,[]);
+// if(isstring(Arg2),
+// AddGraph(Arg1,Arg2,[]);
+// ,
+// if(MeasureDepth(Arg2)>0,
+// Addgraph(Arg1,Arg2,[]);
+// ,
+// Addgraph("-"+Arg1,Arg1,Arg2);
+// );
+// );
+//);
+AddGraph(nm,pltdata,options):=(
+//help:AddGraph("1","imp1"); // 16.04.04
+//help:Addgraph("1",["[pt1]","gr1"],["nodisp"]);
+ regional(name,Ltype,Noflg,opcindy,pdata,fname,flg,
+ tmp,tmp1,tmp2,tmp3);
+ if(substring(nm,0,1)=="-",
+ name=substring(nm,1,length(nm));
+ ,
+ name="ad"+nm;
+ );
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_9;
+ if(isstring(pltdata),
+ pdata=parse(pltdata)
+ ,
+ if(!islist(pltdata),pdata=[pltdata],pdata=pltdata);
+ pdata=apply(pdata,parse(#));
+ ); // 15.01.22
+ pdata=Flattenlist(pdata);
+ tmp1=[];
+ forall(pdata,tmp2,
+ tmp=apply(tmp2,Pcrd(#));
+ tmp1=append(tmp1,tmp);
+ );
+ if(length(tmp1)==1,tmp1=tmp1_1);
+ pdata=tmp1;
+ if(Noflg<3,
+ println("generate addgraph "+name);
+ tmp=name+"="+textformat(pdata,5);
+ parse(tmp);
+ if(isstring(pltdata), // 16.04.04 from
+ if(indexof(pltdata,"]")>0,
+ tmp1="list(Listplot("+substring(pltdata,1,length(pltdata));
+ tmp1=replace(tmp1,"]",",]");
+ ,
+ tmp1="Listplot("+substring(pltdata,0,length(pltdata))+",]";
+ );
+ flg=0;
+ tmp2=[];
+ tmp3=0;
+ forall(1..length(tmp1),
+ if(flg==0,
+ tmp=indexof(substring(tmp1,tmp3,length(tmp1)),"_");
+ if(tmp==0,
+ flg=1;
+ ,
+ tmp3=tmp3+tmp;
+ tmp=indexof(substring(tmp1,tmp3,length(tmp1)),",")-1;
+ tmp=substring(tmp1,tmp3,tmp3+tmp);
+ tmp2=append(tmp2,tmp);
+ );
+ );
+ );
+ forall(tmp2,
+ tmp1=replace(tmp1,"_"+#,"("+#+")");
+ );
+ tmp1=replace(tmp1,",]",")");
+ tmp1=replace(tmp1,",","),Listplot(");
+ if(indexof(pltdata,"[")>0,
+ tmp1=tmp1+")";
+ );
+ GLIST=append(GLIST,name+"="+tmp1);
+ ,
+ if(MeasureDepth(pdata)==1,
+ tmp1=name+"=Listplot("+textformat(pdata,5)+")";
+ ,
+ tmp1="list(";
+ forall(1..length(pdata),
+ tmp=name+"p"+textformat(#,5)+"=";
+ if(length(pdata_#)>1, // 15.01.22
+ tmp=tmp+"Listplot("+textformat(pdata_#,5)+")";
+ ,
+ tmp=tmp+"Pointdata("+textformat(pdata_#_1,5)+")";
+ );
+ GLIST=append(GLIST,tmp);
+ tmp1=tmp1+name+"p"+textformat(#,5)+",";
+ );
+ tmp1=name+"="+substring(tmp1,0,length(tmp1)-1)+")";
+ );
+ GLIST=append(GLIST,tmp1);
+ );
+ ); // 16.04.04 upto
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+);
+
+Joincrvs(nm,plotstrL):=Joincrvs(nm,plotstrL,[]);
+Joincrvs(nm,plotstrL,options):=(
+//help:Joincrvs("1",["sgAB","sgDCB"]);
+ regional(plotlist,PtL,Eps,QdL,Flg,Ni,Qd,pP,pS,pQ,pR,rMN,
+ opcindy,tmp,tmp1,tmp2,str,name,Ltype,Noflg);
+ name="join"+nm;
+ plotlist=[];
+ forall(plotstrL,str,
+ if(isstring(str),
+ tmp=parse(str);
+ tmp=apply(tmp,LLcrd(#));
+ ,
+ tmp=str;
+ );
+ plotlist=append(plotlist,tmp);
+ );
+ Eps=10^(-4);
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ tmp1=tmp_6;
+ if(length(tmp1)>0,Eps=tmp1_1);
+ QdL=[];
+ forall(plotlist,Qd,
+ if(ispoint(Qd_1) % !islist(Qd_1_1),
+ QdL=concat(QdL,[Qd]);
+ ,
+ forall(Qd,
+ QdL=concat(QdL,[#]);
+ );
+ );
+ );
+ Flg=0;
+ if(length(QdL)==0,
+ PtL=[];
+ Flg=1;
+ );
+ if(Flg==0,
+ PtL=QdL_1;
+ forall(2..length(QdL),Ni,
+ Qd=QdL_Ni;
+ if(Numptcrv(Qd)>1,
+ pP=Ptend(PtL);
+ pS=Ptstart(PtL);
+ pQ=Ptstart(Qd);
+ pR=Ptend(Qd);
+ rMN=min([|pP-pQ|,|pP-pR|,|pS-pQ|,|pS-pR|]);
+ if(rMN==|pP-pR|,
+ Qd=reverse(Qd);
+ ,
+ if(rMN==|pS-pQ|,
+ PtL=reverse(PtL);
+ ,
+ if(rMN==|pS-pR|,
+ PtL=reverse(PtL);
+ Qd=reverse(Qd);
+ );
+ );
+ );
+ );
+ if(rMN>Eps,
+ PtL=concat(PtL,Qd);
+ ,
+ PtL=concat(PtL,Qd_(2..length(Qd)));
+ );
+ );
+ );
+ if(Noflg<3,
+ println("generate joincurve "+name);
+ tmp1=apply(PtL,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp1="";
+ forall(plotstrL,
+ tmp1=tmp1+#+",";
+ );
+ tmp1=substring(tmp1,0,length(tmp1)-1);
+ GLIST=append(GLIST,name+"=Joincrvs("+tmp1+")");
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ PtL;
+);
+
+Partcrv(nm,pA,pB,PkLstr):=Partcrv(nm,pA,pB,PkLstr,[]);
+Partcrv(nm,pA,pB,PkLstr,options):=(
+//help:Partcrv("1",A,B,"sgABC");
+//help:Partcrv("1",1.3,2.5,"sgABC");
+ regional(PkL,Ans,Eps,Npt,Out1,Out2,tmp,tmp1,Flg,nS,nE,PPL,pP,
+ opcindy,Ta,Tb,name,Ltype,Noflg,DepthFlg);
+ name="part"+nm;
+ if(isstring(PkLstr),PkL=parse(PkLstr),PkL=PkLstr);
+ DepthFlg=0;
+ if(MeasureDepth(PkL)==2,
+ PkL=PkL_1;
+ DepthFlg=1;
+ );
+ PkL=apply(PkL,LLcrd(#));
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ Eps=10^(-3);
+ Flg=0;
+ if(isreal(pA),
+ if(pA>pB+Eps,
+ Npt=Numptcrv(PkL);
+ Out1=Partcrv("",pA,Npt,PkLstr,["nodata"]);
+ Out2=Partcrv("",1,pB,PkLstr,["nodata"]);
+ tmp=Ptstart(PkL)-Ptend(PkL);
+ if(|tmp|<Eps,
+ Ans=Joincrvs("",[Out1,Out2],["nodata"]);
+ ,
+ Ans=[apply(Out1,Pcrd(#)),apply(Out2,Pcrd(#))];
+ );
+ Flg=1;
+ );
+ if(Flg==0,
+ nS=ceil(pA);
+ nE=floor(pB);
+ PPL=[];
+ if(pA<nS-Eps,
+ pP=(nS-pA)*PkL_(nS-1)+(1-nS+pA)*PkL_nS;
+ PPL=[pP];
+ );
+ PPL=concat(PPL,PkL_(nS..nE));
+ if(pB>nE+Eps,
+ pP=(1-pB+nE)*PkL_nE+(pB-nE)*PkL_(nE+1);
+ PPL=concat(PPL,[pP]);
+ );
+ Ans=PPL;
+ Flg=1;
+ );
+ );
+ if(Flg==0,
+ tmp=Nearestpt(LLcrd(Pcrd(pA)),PkL);
+ Ta=tmp_2;
+ tmp=Nearestpt(LLcrd(Pcrd(pB)),PkL); // 15.09.12
+ Tb=tmp_2;
+ Ans=Partcrv("",Ta,Tb,PkL,["nodata"] );
+ Ans=apply(Ans,Pcrd(#));
+ );
+ if(Noflg<3,
+ println("generate partcrv "+name);
+ tmp1=apply(Ans,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+// GLIST=append(GLIST, // 16.04.03
+ if(DepthFlg==0,
+ tmp=PkLstr;
+ ,
+ tmp=PkLstr+"(1)";
+ );
+ tmp1=name+"=Partcrv("+textformat(Lcrd(pA),5)
+ +","+textformat(Lcrd(pB),5)+","+tmp+")"; // 16.04.03
+ GLIST=append(GLIST,tmp1);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ Ans;
+);
+
+Opcrvs(num,Fig):=Opcrvs(num,Fig,["nodisp"]);
+Opcrvs(num,Fig,options):=(
+ //help:Subgraph(2,"grfs");
+ regional(name,tmp,tmp1);
+ name="-"+Fig+text(num);
+ tmp=Fig+"_"+text(num);
+ tmp1=parse(tmp);
+ Listplot(name,tmp1,options);
+);
+
+
+Pointdata(nm,list):=Pointdata(nm,list,[]);
+Pointdata(nm,list,options):=(
+//help:Pointdata("1",[2,4],["Size=5"]);
+//help:Pointdata("2",[[2,3],[4,1]]);
+ regional(name,nameL,ptlist,opstr,opcindy,
+ eqL,size,thick,tmp,tmp1,tmp2,tmp3,Ltype,Noflg);
+ name="pt"+nm;
+ nameL=name+"L";
+ println("generate pointdata "+name);
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ opstr=tmp_(length(tmp)-1);
+ size="";
+ eqL=tmp_5;
+ if(length(eqL)>0,
+ forall(eqL,
+ tmp=substring(#,0,1);
+ if(tmp=="s" % tmp=="S",
+ tmp=indexof(#,"=");
+ size=substring(#,tmp,length(#));
+ );
+ );
+ );
+ tmp=MeasureDepth(list);
+ if(tmp>0, // 2015.02.21
+ if(tmp==1,ptlist=list,ptlist=list_1);
+ tmp=apply(ptlist,[textformat(Pcrd(#),5)]);
+ tmp1=text(tmp);
+ tmp2=substring(tmp1,1,length(tmp1)-1);
+ tmp3=tmp1;
+ ,
+ ptlist=list;
+ tmp1=textformat(Pcrd(ptlist),5);
+ tmp2=tmp1;
+ tmp3="["+tmp1+"]";
+ );
+ tmp=name+"="+tmp1;
+ parse(tmp);
+ tmp=nameL+"="+tmp3;
+ parse(tmp);
+ if(Noflg<3,
+ GLIST=append(GLIST,name+"=Pointdata("+tmp2+")");
+ );
+ if(Noflg<2,
+ tmp=[nameL,0,opcindy];
+ GCLIST=append(GCLIST,tmp);
+ if(Noflg==0,
+ if(length(size)>0,
+ Com2nd("Setpt("+size+")");
+ );
+ thick=PenThick/PenThickInit; // 16.04.09 from
+ if(length(size)>0,tmp1=parse(size),tmp1=1);
+ tmp1=max(tmp1,1)/8;
+ Setpen(tmp1); // 16.04.09 upto
+ Com2nd("Drwpt(list("+name+")"+opstr+")");
+ Setpen(thick); // 16.04.09
+ if(length(size)>0,
+ Com2nd("Setpt("+textformat(TenSize/TenSizeInit,1)+")");
+ );
+ );
+ );
+ ptlist;
+);
+
+Listplot(nm,list,options):=(
+//help:Listplot([A,B]);
+// help:Listplot(["A","B"]);
+//help:Listplot("1",[[2,1],[3,3]]);
+//help:Listplot(options2=["Msg=yes"]);
+ regional(name,tmp,tmp1,ptlist,Ltype,opcindy,Noflg,eqL,Msg);
+ if(substring(nm,0,1)=="-", // 16.01.27 from
+ name=substring(nm,1,length(nm));
+ ,
+ name="sg"+nm;
+ ); // upto
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ eqL=tmp_5;
+ opcindy=tmp_(length(tmp));
+ Msg=1; // 15.09.17
+ forall(eqL,
+ tmp=substring(#,0,1);
+ if(Toupper(tmp)=="M",
+ tmp=indexof(#,"=");
+ tmp1=substring(#,tmp,tmp+1); // 16.06.28
+ if(Toupper(tmp1)=="N", // 16.06.28
+ Msg=0;
+ );
+ );
+ );
+ if(Noflg<3,
+ if(Msg==1,
+ println("generate Listplot "+name);
+ );
+ if(isstring(list_1),tmp=apply(list,parse(#)),tmp=list); // 15.03.24
+ ptlist=apply(tmp,Pcrd(#));
+ tmp=name+"="+textformat(ptlist,5);
+ parse(tmp);
+ GLIST=append(GLIST,name+"=Listplot("+textformat(list,5)+")"); // 15.12.23
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ tmp1=apply(list,Lcrd(#));
+ tmp1;
+);
+Listplot(Arg1,Arg2):=(
+ regional(name,list,options,str);
+ if(isstring(Arg1),
+ name=Arg1;
+ list=Arg2;
+ Listplot(name,list,[]);
+ ,
+ list=Arg1;
+ options=Arg2;
+ name="";
+ forall(list, // 16.10.07from
+ name=name+#.name;
+ );// 16.10.07upto
+ Listplot(name,list,options);
+ );
+);
+Listplot(list):=Listplot(list,[]);
+
+Lineplot(nm,list,options):=(
+//help:Lineplot([A,B]);
+//help:Lineplot("1",[[2,1],[3,3]]);
+ regional(name,Out,tmp,tmp1,opstr,opcindy,Mag,Semi,
+ Vec,pA,pB,Ltype,Noflg);
+ name="ln"+nm;
+ Mag=100;
+ Semi="";
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ opstr=tmp_(length(tmp)-1);
+ tmp1=tmp_6;
+ if(length(tmp1)>0,Mag=tmp1_1);
+ tmp1=tmp_7;
+ if(length(tmp1)>0,Semi=tmp1_1);
+ pA=Lcrd(list_1); pB=Lcrd(list_2);
+ Vec= Mag/dist(pA,pB)*(pB-pA);
+ if(length(Semi)==0,
+ Out=[pA-Vec,pA+Vec];
+ ,
+ if(Semi=="+",
+ Out=[pA,pA+Vec];
+ ,
+ Out=[pA-Vec,pA];
+ );
+ );
+ if(Noflg<3,
+ println("generate Lineplot "+name);
+ tmp1=apply(Out,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ GLIST=append(GLIST,name+"=Lineplot("+textformat(list,5)+opstr+")");
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ Out;
+);
+Lineplot(Arg1,Arg2):=(
+ regional(name,list,options,str);
+ if(isstring(Arg1),
+ name=Arg1;
+ list=Arg2;
+ Lineplot(name,list,[]);
+ ,
+ list=Arg1;
+ options=Arg2;
+ name="";
+ forall(list, // 16.10.07from
+ name=name+#.name;
+ );// 16.10.07upto
+ Lineplot(name,list,options);
+ );
+);
+Lineplot(list):=Lineplot(list,[]);
+
+Plotdata(name1,func,variable):=Plotdata(name1,func,variable,[]);
+Plotdata(name1,func,variable,options):=(
+//help:Plotdata("1","sin(x)","x",["Num=100"]);
+//help:Plotdata("2","x^2","x=[-1,1]");
+//help:Plotdata("3","Fout(x)","x",["out"]);
+ regional(Fn,Va,tmp,tmp1,tmp2,eqL,name,Vname,x1,x2,dx,
+ PdL,QdL,Num,Ec,Dc,Fun,Exfun,x,Ke,Eps,Pa,
+ Ltype,Noflg,Inflg,Outflg,opstr,opcindy);
+ name="gr"+name1;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ Inflg=tmp_3;
+ Outflg=tmp_4;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ eqL=tmp_5;
+ Num=50;
+ Ec=[];
+ Exfun="";
+ Dc=1000;
+ forall(eqL,
+ tmp=indexof(#,"=");
+ tmp1=substring(#,tmp,length(#));
+ opstr=opstr+",'"+#+"'";
+ if(substring(#,0,1)=="N",
+ Num=parse(tmp1);
+ );
+ if(substring(#,0,1)=="E",
+ if(substring(tmp1,0,1)=="[",
+ Ec=parse(tmp1);
+ ,
+ Exfun=tmp1;
+ );
+ );
+ if(substring(#,0,1)=="D",
+ Dc=parse(tmp1);
+ );
+ );
+ if(Inflg==0 & Outflg==0,
+ Eps=10^(-3);
+ tmp=replace(func,LFmark,"");
+ tmp=tokenize(variable,"=");
+ Vname=tmp_1;
+ if(length(tmp)>1,
+ tmp=tmp_2;
+ tmp=parse(tmp);
+ x1=tmp_1;
+ x2=tmp_2;
+ ,
+ x1=XMIN;
+ x2=XMAX;
+ );
+ // dx=(x2-x2)/Num;
+ Ec=append(sort(Ec),10000);
+ Fun=Assign(func,Vname, "xx");
+ Exfun=Assign(Exfun,Vname, "xx");
+ PdL=[];
+ Ke=1;
+ forall(0..Num,
+ xx=x1+#*(x2-x1)/Num; // differs from Scilab ( / Num-1)
+ if(length(Exfun)>0,
+ tmp=parse(Exfun);
+ if(abs(tmp)<Eps,
+ if(length(Pdt)>0,
+ PdL=concat(PdL,["inf"]);
+ );
+ );
+ ,
+ Pa=[];
+ if(xx-Ec_Ke<-Eps,
+ Pa=[xx,parse(Fun)];
+ );
+ if(abs(xx-Ec_Ke)<=Eps,
+ if(length(PdL)>0,
+ if(PdL_(length(PdL))_1!="inf",
+ Pa=["inf"];
+ );
+ );
+ );
+ if(xx-Ec_Ke>Eps,
+ Pa=[xx,parse(Fun)];
+ Ke=Ke+1;
+ );
+ if(length(Pa)>0,
+ if(Pa_1=="inf",
+ PdL=concat(PdL,[Pa]);
+ ,
+ if(length(PdL)==0,
+ PdL=[Pa];
+ ,
+ tmp=PdL_(length(PdL));
+ if(tmp_1=="inf",
+ PdL=concat(PdL,[Pa]);
+ ,
+ if(dist(tmp,Pa)<Dc,
+ PdL=concat(PdL,[Pa]);
+ ,
+ PdL=concat(PdL,[["inf"],Pa]);
+ );
+ );
+ );
+ );
+ );
+ );
+ );
+ tmp1=[];
+ tmp2=select(1..length(PdL),PdL_#==["inf"]);
+ tmp=1;
+ forall(tmp2,
+ if(#>tmp,
+ tmp1=concat(tmp1,[PdL_(tmp..(#-1))])
+ );
+ tmp=#+1;
+ );
+ if(tmp<length(PdL),
+ tmp1=concat(tmp1,[PdL_(tmp..length(PdL))]);
+ );
+ PdL=tmp1;
+ if(length(PdL)==1,
+ PdL=PdL_1;
+ );
+ if(Noflg<3,
+ println("generate Plotdata "+name);
+ if(MeasureDepth(PdL)==1,
+ tmp1=apply(PdL,Pcrd(#));
+ ,
+ tmp1=[];
+ forall(PdL,tmp2,
+ tmp1=append(tmp1,apply(tmp2,Pcrd(#)));
+ );
+ );
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp1=replace(func,LFmark,"");
+ tmp2=replace(variable,LFmark,"");
+ tmp=name+"=Plotdata('"+tmp1+"','"+tmp2+"'"+opstr+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ PdL;
+ ,
+ // Inflg or Outflg >0 15.05.15
+ if(Noflg<3,
+ if(Outflg==1,
+ println("Output Plotdata "+name);
+ tmp=name+"=Plotdata('"+func+"','"+variable+"'"+opstr+")";
+ GLIST=append(GLIST,tmp);
+ SCIWRLIST=append(SCIWRLIST,name);
+ if(Inflg==0,Inflg=1); // 15.05.17
+ );
+ if(Inflg==1,
+ println("Input Plotdata "+name);
+ if(length(SCIRELIST)==0,
+ ReadOutData(Fnameout);
+ );
+ tmp=parse(name);
+ if(islist(tmp),
+ Extractdata(name,["nodisp"]); // 12.19
+ );
+ tmp="// "+name+"=Plotdata('"+func+"','"+variable+"'"+opstr+")";
+ Com1st(tmp);
+ SCIRELIST=append(SCIRELIST,name);
+ );
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ if(Inflg==1,
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ );
+ );
+);
+
+Paramplot(name1,funstr,variable):=Paramplot(name1,funstr,variable,[]);
+Paramplot(name1,funstr,variable,options):=(
+//help:Paramplot("1","[2*cos(t),sin(t)]","t=[0,2*pi]");
+ regional(name,Out,tmp,tmp1,tmp2,vname,func,str,Rng,Num,
+ Ec,Exfun,Dc,eqL,Fntmp,Vatmp,t1,t2,dt,tt,pa,ke,
+ Ltype,Noflg,Inflg,Outflg,opstr,opcindy);
+ name="gp"+name1;
+ Eps=10^(-4);
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ Inflg=tmp_3;
+ Outflg=tmp_4;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ eqL=tmp_5;
+ Num=50;
+ Ec=[];
+ Exfun="";
+ Dc=1000;
+ forall(eqL,
+ tmp=indexof(#,"=");
+ tmp1=substring(#,tmp,length(#));
+ opstr=opstr+",'"+#+"'";
+ if(substring(#,0,1)=="N",
+ Num=parse(tmp1);
+ );
+ if(substring(#,0,1)=="E",
+ if(substring(tmp1,0,1)=="[",
+ Ec=parse(tmp1);
+ ,
+ Exfun=tmp1;
+ );
+ );
+ if(substring(#,0,1)=="D",
+ Dc=parse(tmp1);
+ );
+ );
+ if(Inflg==0 & Outflg==0,
+ tmp=indexof(variable,"=");
+ vname=substring(variable,0,tmp-1);
+ str=substring(variable,tmp,length(variable));
+ Rng=parse(str);
+ t1=Rng_1; t2=Rng_2;
+ dt=(t2-t1)/Num;// differs from Scilab ( / Num-1)
+ func=Assign(funstr,vname,"tt");
+ Out=[];
+ Ec=append(sort(Ec),10000);
+ ke=1;
+ forall(0..Num,
+ pt=[];
+ tt=Rng_1+#*dt;
+ if(tt-Ec_ke<-Eps,
+ pa=parse(func);
+ );
+ if(abs(tt-Ec_ke)<=Eps,
+ if(length(Out)>0,
+ if(Out_(length(Out))_1!="inf",
+ pa=["inf"];
+ );
+ );
+ );
+ if(tt-Ec_ke>Eps,
+ pa=parse(func);
+ ke=ke+1;
+ );
+ if(length(pa)>0,
+ if(pa_1=="inf",
+ Out=append(Out,pa);
+ ,
+ if(length(Out)==0,
+ Out=[pa];
+ ,
+ tmp=Out_(length(Out));
+ if(tmp_1=="inf",
+ Out=append(Out,pa);
+ ,
+ if(|tmp-pa|<Dc,
+ Out=append(Out,pa);
+ ,
+ Out=concat(Out,[["inf"],pa]);
+ );
+ );
+ );
+ );
+ );
+ );
+ tmp1=[];
+ tmp2=select(1..length(Out),Out_#==["inf"]);
+ tmp=1;
+ forall(tmp2,
+ if(#>tmp,
+ tmp1=concat(tmp1,[Out_(tmp..(#-1))])
+ );
+ tmp=#+1;
+ );
+ if(tmp<length(Out),
+ tmp1=concat(tmp1,[Out_(tmp..length(Out))]);
+ );
+ Out=tmp1;
+ if(length(Out)==1,
+ Out=Out_1;
+ );
+ if(Noflg<3,
+ println("generate Paramplot "+name);
+ if(MeasureDepth(Out)==1,
+ tmp1=apply(Out,Pcrd(#));
+ ,
+ tmp1=[];
+ forall(Out,tmp2,
+ tmp1=append(tmp1,apply(tmp2,Pcrd(#)));
+ );
+ );
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp1=replace(funstr,LFmark,""); // 15.11.13
+ tmp2=replace(variable,LFmark,"");
+ tmp=name+"=Paramplot('"+tmp1+"','"+tmp2+"'"+opstr+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ Out;
+ ,
+ // Inflg or Outflg >0 15.05.15
+ if(Noflg<3,
+ if(Outflg==1,
+ println("Output Paramplot "+name);
+ tmp=name+"=Paramplot('"+funstr+"','"+variable+"'"+opstr+")";
+ GLIST=append(GLIST,tmp);
+ SCIWRLIST=append(SCIWRLIST,name);
+ if(Inflg==0,Inflg=1); // 15.05.17
+ );
+ if(Inflg==1,
+ println("Input Paramplotdata "+name);
+ if(length(SCIRELIST)==0,
+ ReadOutData(Fnameout);
+ );
+ tmp=parse(name);
+ if(islist(tmp),
+ Extractdata(name,["nodisp"]); // 12.19
+ );
+ tmp="// "+name+"=Paramplot('"+func+"','"+variable+"'"+opstr+")";
+ Com1st(tmp);
+ SCIRELIST=append(SCIRELIST,name);
+ );
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ if(Inflg==1,
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ );
+ );
+);
+
+Circledata(cenrad):=Circledata(cenrad,[]);
+Circledata(para1,para2):=(
+//help:Circledata([A,B],["Rng=[0,pi/2]"]);
+//help:Circledata([A,B,C]);
+ regional(name,cenrad,options,str,n);
+ if(isstring(para1),
+ name=para1;
+ cenrad=para2;
+ options=[];
+ ,
+ cenrad=para1;
+ options=para2;
+ name="";// 16.10.07from
+ forall(cenrad,
+ name=name+#.name;
+ );// 16.10.07upto
+ );
+ Circledata(name,cenrad,options);
+);
+Circledata(nm,cenrad,options):=(
+ regional(name,Out,Ctr,Ptcir,ra,Num,Rg,opstr,opcindy,
+ tmp,tmp1,tmp1,Th,Ltype,Noflg,eqL,pA,pB,pC,d1,d2,Eps);
+ name="cr"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ eqL=tmp_5;
+ Num=50;
+ Rg=[0,2*pi];
+ forall(eqL,
+ tmp=indexof(#,"=");
+ tmp1=substring(#,tmp,length(#));
+ opstr=opstr+",'"+#+"'";
+ if(substring(#,0,1)=="N",
+ Num=parse(tmp1);
+ );
+ if(substring(#,0,1)=="R",
+ Rg=parse(tmp1);
+ );
+ );
+ if(length(cenrad)==2,
+ Ctr=Lcrd(cenrad_1);
+ Ptcir=Lcrd(cenrad_2);
+ ra=dist(Ctr,Ptcir);
+ ,
+ Eps=10^(-1);
+ pA=Lcrd(cenrad_1);
+ pB=Lcrd(cenrad_2);
+ pC=Lcrd(cenrad_3);
+ tmp=pB-pA;
+ tmp1=(tmp_2,-tmp_1);
+ tmp=pC-pB;
+ tmp2=(tmp_2,-tmp_1);
+ d1=det([tmp1,tmp2]);
+ d2=det([pC-pA,tmp2]);
+ if(abs(d1)<Eps & abs(d2)>10*Eps,
+ println("points are in a line");
+ ra=0;
+ ,
+ Ctr=1/2*(pA+pB)+1/2*d2/d1*tmp1;
+ ra=|pA-Ctr|;
+ tmp=name+"center="+Ctr;
+ parse(tmp);
+ Defvar(name+"center",Ctr);
+ );
+ );
+ if(ra>0,
+ Out=[];
+ forall(0..Num,
+ Th=Rg_1+#*(Rg_2-Rg_1)/Num;
+ Out=append(Out,Ctr+ra*[cos(Th),sin(Th)]);
+ );
+ ,
+ Out=Lineplot("1",[pA,pB],["nodata"]);
+ );
+ if(Noflg<3,
+ println("generate Circledata "+name);
+ tmp1=apply(Out,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ if(length(cenrad)==2,
+ tmp=name+"=Circledata("+cenrad+opstr+")";
+ ,
+ if(ra>0,
+ tmp=name+"=Circledata(["+Ctr+","+cenrad_1+"]"+opstr+")";
+ ,
+ tmp=name+"=Lineplot("+cenrad_1+","+cenrad_2+")";
+ );
+ );
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ Out;
+);
+
+Framedata():=(
+ regional(pA,pB);
+ pA=LLcrd((SW+NE)/2); // 15.09.17
+ pB=LLcrd(NE);
+ Framedata("win",[pA,pB]);
+);
+Framedata(list):=Framedata(list,[]);
+Framedata(Arg1,Arg2):=(
+ regional(name,list,options,str);
+ if(isstring(Arg1),
+ name=Arg1;
+ list=Arg2;
+ Framedata(name,list,[]);
+ ,
+ list=Arg1;
+ options=Arg2;
+ name="";// 16.10.07from
+ forall(list,
+ name=name+#.name;
+ );// 16.10.07upto
+ Framedata(name,list,options);
+ );
+);
+
+Framedata(nm,list,options):=(
+//help:Framedata();
+//help:Framedata([A,B]);
+//help:Framedata("1",[A,B]);
+//help:Framedata("1",[C,dx,dy]);
+ regional(name,Out,tmp,tmp1,pB,x1,x2,y1,y2,dx,dy,
+ opcindy,Ltype,Noflg,cent,dx,dy);
+ name="fr"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ if(length(list)==2, // 15.05.12
+ pA=Lcrd(list_1); pB=Lcrd(list_2);
+ dx=abs(pB_1-pA_1); dy=abs(pB_2-pA_2);
+ ,
+ pA=Lcrd(list_1);
+ dx=list_2; dy=list_3;
+ );
+ x1=pA_1-dx; x2=pA_1+dx;
+ y1=pA_2-dy; y2=pA_2+dy;
+ Out=[[x1,y1],[x2,y1],[x2,y2],[x1,y2],[x1,y1]];
+ if(Noflg<3,
+ println("generate Framedata "+name);
+ tmp1=apply(Out,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ GLIST=append(GLIST,name+"=Framedata("+pA+","+dx+","+dy+")");
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ Out;
+);
+Framedata(nm,cent,dx,dy):=Framedata(nm,cent,dx,dy,[]);
+Framedata(nm,cent,dx,dy,options):=(
+ regional(name,Out,tmp,tmp1,x1,y1,x2,y2,Ltype,opcindy,Noflg);
+ name="fr"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ x1=cent.x-dx; x2=cent.x+dx;
+ y1=cent.y-dy; y2=cent.y+dy;
+ Out=[[x1,y1],[x2,y1],[x2,y2],[x1,y2],[x1,y1]];
+ if(Noflg<3,
+ println("generate Framedata "+name);
+ tmp1=apply(Out,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ GLIST=append(GLIST,name+"=Framedata("+cent.xy+","+dx+","+dy+")");
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ Out;
+);
+
+Framedata2(nm,list):=Framedata2(nm,list,[]);
+Framedata2(nm,list,options):=(
+//help:Framedata2("1",[A,B]);
+ regional(tmp,tmp1,pC,pB);
+ pC=(Lcrd(list_1)+Lcrd(list_2))/2;
+ pB=Lcrd(list_2);
+ Framedata(nm,[pC,pB],options);
+);
+
+Ovaldata(nm,Pdata):=Ovaldata(nm,Pdata,[]);
+Ovaldata(nm,Pdata,options):=(
+//help:Ovaldata("1",[A,B]);
+//help:Ovaldata(optios=[size]);
+ regional(name,Graph,Ctr,Dx,Dy,Rc,Out,Point,Graph,
+ opstr,opcindy,tmp,tmp1,tmp2,tmp3,Ltype,Noflg);
+ name="ov"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ opstr=tmp_(length(tmp)-1);
+ Rc=0.2;
+ tmp1=tmp_6;
+ if(length(tmp1)>0,Rc=tmp1_1*Rc);
+// if(length(tmp1)>0,Rc=tmp1_1); //15.11.15
+ Ctr=Lcrd(Pdata_1);
+ if(ispoint(Pdata_2) % islist(Pdata_2),
+ tmp1=Lcrd(Pdata_2);
+ Dx=abs(tmp1_1-Ctr_1);
+ Dy=abs(tmp1_2-Ctr_2);
+ ,
+ Dx=Pdata_2;
+ Dy=Pdata_3;
+ );
+ Point=Ctr+[Dx-Rc,Dy-Rc];
+ tmp1=Circledata("1",[Point,Point+[Rc,0]],
+ ["Rng=[0,pi/2]","Num=10","nodata"]);
+ tmp2=Listplot("1",[Ctr+[Dx-Rc,Dy],Ctr+[0,Dy]],
+ ["nodata"]);
+ tmp3=Listplot("2",[Ctr+[Dx,0],Ctr+[Dx,Dy-Rc]],
+ ["nodata"]);
+ Graph=Joincrvs("1",[tmp3,tmp1,tmp2],["nodata"]);
+ tmp1=Reflectdata("1",[Graph],[Ctr,Ctr+[0,1]],["nodata"]);
+ Graph=Joincrvs("1",[Graph,tmp1],["nodata"]);
+ tmp2=Reflectdata("2",[Graph],[Ctr,Ctr+[1,0]],
+ ["nodata"]);
+ Graph=Joincrvs("2",[Graph,tmp2],["nodata"]);
+ if(Noflg<3,
+ println("generate Ovaldata "+name);
+ tmp1=apply(Graph,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ GLIST=append(GLIST,
+ name+"=Ovaldata("+Ctr+","+Dx+","+Dy+opstr+")");//16.01.30
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ tmp1=apply(Graph,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp=textformat(Ctr,5)+","+textformat(Dx,5)+","+textformat(Dy,5);
+ GLIST=append(GLIST,
+ name+"=Ovaldata("+tmp+opstr+")");
+ );
+ Graph;
+);
+
+Segmark(nm,ptlist):=Segmark(nm,ptlist,[]);
+Segmark(nm,ptlist,options):=Drawsegmark(nm,ptlist,options);
+Drawsegmark(nm,ptlist):=Drawsegmark(nm,ptlist,[]);
+Drawsegmark(nm,ptlist,options):=(
+//help:Segmark("1",[A,B]);
+//help:Segmark(options=["Type=1","Width=1","Size=1"]);
+ regional(name,pA,pB,wid,mid,size,tp,dir,nor,eqL,
+ tmp,tmp1,tmp2);
+ name="mrk"+nm;
+ pA=ptlist_1;
+ pB=ptlist_2;
+ size=0.15;
+ wid=0.05;
+ tp=1;
+ tmp1=Divoptions(options);
+ eqL=tmp1_5;
+ forall(eqL,
+ tmp=indexof(#,"=");
+ tmp1=substring(#,tmp,length(#));
+ tmp1=parse(tmp1);
+ tmp=substring(#,0,1);
+ if(tmp=="S" % tmp=="s",
+ size=size*tmp1;
+ );
+ if(tmp=="W" % tmp=="w",
+ wid=wid*tmp1;
+ );
+ if(tmp=="T" % tmp=="t",
+ tp=tmp1;
+ );
+ );
+ mid=(pA+pB)/2;
+ dir=(pB-pA)/|pB-pA|;
+ nor=[-dir_2,dir_1];
+// nor=nor/|nor|;
+ if(tp==1,
+ tmp1=mid+size*nor;
+ tmp2=mid-size*nor;
+ Listplot(name,[tmp1,tmp2]);
+ );
+ if(tp==2,
+ tmp1=mid+wid*dir+size*nor;
+ tmp2=mid+wid*dir-size*nor;
+ Listplot(name+"r",[tmp1,tmp2]);
+ tmp1=mid-wid*dir+size*nor;
+ tmp2=mid-wid*dir-size*nor;
+ Listplot(name+"l",[tmp1,tmp2]);
+ );
+ if(tp==3,
+ tmp1=mid;
+ tmp2=mid+size*dir;
+ Circledata(name,[tmp1,tmp2]);
+ );
+ if(tp==4,
+ tmp=mid+size*2/sqrt(3)*nor;
+ tmp1=mid+size*dir-size/sqrt(3)*nor;
+ tmp2=mid-size*dir-size/sqrt(3)*nor;
+ Listplot(name,[tmp,tmp1,tmp2,tmp]);
+ );
+);
+
+Parabolaplot(nm,ptlist):=Parabolaplot(nm,ptlist,"[-5,5]",[]);
+Parabolaplot(nm,ptlist,Arg):=(
+ regional(rng,options);
+ if(isstring(Arg),
+ rng=Arg;
+ options=[];
+ ,
+ rng="[-5,5]";
+ options=Arg;
+ );
+ Parabolaplot(nm,ptlist,rng,options);
+);
+Parabolaplot(nm,ptlist,rng,options):=(
+//help:Parabolaplot("1",[A,B,C]):
+//help:Parabolaplot("1",[A,B,C],"[-5,5]");
+ regional(pA,pB,pC,angle,tmp,tmp1,tmp2);
+ tmp1=Lcrd(ptlist_1);
+ tmp2=Lcrd(ptlist_3);
+ pB=Lcrd(ptlist_2);
+ tmp=(tmp2-pB)/|tmp2-pB|;
+ if(tmp_2>=0,
+ angle=arccos(tmp_1);
+ ,
+ if(tmp_1>=0,
+ angle=arcsin(tmp_2);
+ ,
+ angle=-arccos(tmp_1);
+ );
+ );
+ pA=Rotatepoint(tmp1,-angle,pB);
+ pC=Rotatepoint(tmp2,-angle,pB);
+ tmp1=1/(2*(pA_2-pB_2));
+ tmp2=1/2*(pA_2+pB_2);
+ tmp="("+format(tmp1,5)+")*(x-("+format(pA_1,5)+"))^2";
+ tmp=tmp+"+("+format(tmp2,5)+")";
+ tmp1=parse(rng);
+ tmp1=[pA_1-(tmp1_2-tmp1_1)/2,pA_1+(tmp1_2-tmp1_1)/2];
+ tmp2="x="+textformat(tmp1,5);
+ Plotdata(nm+"para",tmp,tmp2,append(options,"nodisp"));
+ Rotatedata(nm+"para","gr"+nm+"para",angle,append(options,pB));
+);
+
+Ellipseplot(nm,ptlist):=Ellipseplot(nm,ptlist,"[0,2*pi]",[]);
+Ellipseplot(nm,ptlist,Arg):=(
+ regional(rng,options);
+ if(isstring(Arg),
+ rng=Arg;
+ options=[];
+ ,
+ rng="[0,2*pi]";
+ options=Arg;
+ );
+ Ellipseplot(nm,ptlist,rng,options);
+);
+Ellipseplot(nm,ptlist,rng,options):=(
+//help:Ellipseplot("1",[A,B,3]);
+//help:Ellipseplot("1",[A,B,C],"[0,pi]",[options]);
+ regional(pA,pB,d,angle,f,a,b,pM,tmp,tmp1,tmp2);
+ pA=Lcrd(ptlist_1);
+ tmp1=Lcrd(ptlist_2);
+ if(ispoint(ptlist_3),
+ tmp2=Lcrd(ptlist_3);
+ d=|tmp2-pA|+|tmp2-tmp1|;
+ ,
+ d=ptlist_3;
+ );
+ tmp=(tmp1-pA)/|tmp1-pA|;
+ if(tmp_2>=0,
+ angle=arccos(tmp_1);
+ ,
+ if(tmp_1>=0,
+ angle=arcsin(tmp_2);
+ ,
+ angle=-arccos(tmp_1);
+ );
+ );
+ pB=Rotatepoint(tmp1,-angle,pA);
+ f=|pB_1-pA_1|/2;
+ a=d/2;
+ b=sqrt(d^2/4-f^2);
+ pM=(pA+pB)/2;
+ tmp="["+format(pM_1,5)+","+format(pM_2,5)+"]";
+ tmp=tmp+"+["+format(a,5)+"*cos(t),"+format(b,5)+"*sin(t)]";
+ Paramplot(nm+"elp",tmp,"t="+rng,append(options,"nodisp"));
+ Rotatedata(nm+"elp","gp"+nm+"elp",angle,append(options,pA));
+);
+
+Hyperbolaplot(nm,ptlist):=Hyperbolaplot(nm,ptlist,"[-5/2,5/2]",[]);
+Hyperbolaplot(nm,ptlist,Arg):=(
+ regional(rng,options);
+ if(isstring(Arg),
+ rng=Arg;
+ options=[];
+ ,
+ rng="[-5/2,5/2]";
+ options=Arg;
+ );
+ Hyperbolaplot(nm,ptlist,rng,options);
+);
+Hyperbolaplot(nm,ptlist,rng,optionsorg):=(
+//help:Hyperbolaplot("1",[A,B,C],["Num=200"]):
+//help:Hyperbolaplot("1",[A,B,C],"[-5,5]",["Asy=do"]);
+ regional(pA,pB,d,angle,f,a,b,pM,eqL,options,opasy,tmp,tmp1,tmp2);
+ tmp=Divoptions(optionsorg);
+ eqL=tmp_5;
+ options=optionsorg;
+ opasy=[];
+ forall(eqL,
+ if(Toupper(substring(#,0,1))=="A",
+ tmp=indexof(#,"=");
+ opasy=[substring(#,tmp,length(#))];
+ options=remove(options,[#]);
+ );
+ );
+ pA=Lcrd(ptlist_1);
+ tmp1=Lcrd(ptlist_2);
+ if(ispoint(ptlist_3),
+ tmp2=Lcrd(ptlist_3);
+ d=abs(|tmp2-pA|-|tmp2-tmp1|);
+ ,
+ d=ptlist_3;
+ );
+ tmp=(tmp1-pA)/|tmp1-pA|;
+ if(tmp_2>=0,
+ angle=arccos(tmp_1);
+ ,
+ if(tmp_1>=0,
+ angle=arcsin(tmp_2);
+ ,
+ angle=-arccos(tmp_1);
+ );
+ );
+ pB=Rotatepoint(tmp1,-angle,pA);
+ f=|pB_1-pA_1|/2;
+ a=d/2;
+ b=sqrt(f^2-d^2/4);
+ pM=(pA+pB)/2;
+ tmp="["+format(pM_1,5)+"+"+format(a,5)+"*(exp(t)+exp(-t))/2,";
+ tmp=tmp+format(pM_2,5)+"+"+format(b,5)+"*(exp(t)-exp(-t))/2]";
+ Paramplot(nm+"hyp1",tmp,"t="+rng,append(options,"nodisp"));
+ tmp="["+format(pM_1,5)+"-"+format(a,5)+"*(exp(t)+exp(-t))/2,";
+ tmp=tmp+format(pM_2,5)+"+"+format(b,5)+"*(exp(t)-exp(-t))/2]";
+ Paramplot(nm+"hyp2",tmp,"t="+rng,append(options,"nodisp"));
+ tmp=["gp"+nm+"hyp1","gp"+nm+"hyp2"];
+ Rotatedata(nm+"hyp",tmp,angle,append(options,pA));
+ if(length(opasy)>0,
+ Lineplot(nm+"asy1",[pM+[a,b],pM+[-a,-b]],["nodisp"]);
+ Lineplot(nm+"asy2",[pM+[-a,b],pM+[a,-b]],["nodisp"]);
+ tmp=["ln"+nm+"asy1","ln"+nm+"asy2"];
+ Rotatedata(nm+"asy",tmp,angle,append(opasy,pA));
+ );
+);
+
+Polygonplot(nm,ptlist,number):=Polygonplot(nm,ptlist,number,[]);
+Polygonplot(nm,ptlist,number,options):=(
+//help:Polygonplot("1",[A,B],12);
+ regional(rr,pA,pB,ptL,angle,tmp,tmp1,tmp2);
+ pA=Lcrd(ptlist_1);
+ pB=Lcrd(ptlist_2);
+ rr=|pB-pA|;
+ tmp=(pB-pA)/rr;
+ if(tmp_2>=0,
+ angle=arccos(tmp_1);
+ ,
+ if(tmp_1>=0,
+ angle=arcsin(tmp_2);
+ ,
+ angle=-arccos(tmp_1);
+ );
+ );
+ ptL=[];
+ forall(0..number,
+ tmp=angle+#*2*pi/number;
+ tmp1=pA+rr*[cos(tmp),sin(tmp)];
+ if(#>0 & #<number,
+ Putpoint((ptlist_2).name+text(#),tmp1);//16.10.07
+ //Pointdata(nm,ptL);
+ );
+ tmp2=tmp1;
+ ptL=append(ptL,tmp1);
+ );
+ Listplot(nm+"ply",ptL,options);
+);
+
+Putintersect(nm,pdata1,pdata2):=(
+//help:Putintersect("Q","gr1","gr2");
+ regional(pd1,pd2,tmp);
+ if(isstring(pdata1),pd1=parse(pdata1),pd1=pdata1);
+ if(isstring(pdata2),pd2=parse(pdata2),pd2=pdata2);
+ tmp=Intersectcrvs(pd1,pd2);
+ if(length(tmp)==1,
+ Putpoint(nm,tmp_1);
+ ,
+ if(length(tmp)==0,
+ err("No intersect point");
+ ,
+ err("Multiple intersect points");
+ println(tmp);
+ err("Choose point number");
+ );
+ );
+);
+Putintersect(nm,pdata1,pdata2,ptno):=(
+ regional(pd1,pd2,tmp);
+ if(isstring(pdata1),pd1=parse(pdata1),pd1=pdata1);
+ if(isstring(pdata2),pd2=parse(pdata2),pd2=pdata2);
+ tmp=Intersectcrvs(pd1,pd2);
+ if(length(tmp)>0,
+ Putpoint(nm,tmp_ptno);
+ ,
+ err("No intersect point");
+ );
+);
+
+Arrowheaddata(point,direction):=Arrowheaddata(point,direction,[]);
+Arrowheaddata(point,direction,options):=(
+//help:Arrowheaddata(A,B);
+ regional(list,Ookisa,Hiraki,Futosa,Houkou,Str,Flg,tmp,Ev,Nv,pA,pB,
+ pP,rF,gG,Flg,Nj,Eps,tmp1,scx,scy);
+ Eps=10^(-3);
+ pP=point;
+ Ookisa=0.2*YaSize;
+ Hiraki=YaAngle;
+ Futosa=0;
+ Str=YaStyle;
+ tmp=Divoptions(options);
+ tmp1=tmp_6;
+ if(length(tmp1)>0,Ookisa=Ookisa*tmp1_1);
+ if(length(tmp1)>1,
+ tmp=tmp1_2;
+ if(tmp<5,
+ Hiraki=Hiraki*tmp;
+ ,
+ Hiraki=tmp;
+ );
+ );
+ Flg=0;
+ Hiraki=Hiraki*pi/180;
+ if(isstring(direction),Houkou=parse(direction),Houkou=direction);
+ if(MeasureDepth(Houkou)==2,Houkou=Houkou_1);
+ if(islist(Houkou_1),
+// pP=Lcrd(pP);
+// pP=Doscaling(pP);
+// Houkou=Dosscaling(Houkou);
+ pP=Pcrd(pP);
+ scy=SCALEY;
+ SCALEY=1;
+ tmp=Nearestpt(pP,Houkou);
+ pA=tmp_1;
+ rF=floor(tmp_2);
+ if(rF==1,
+ if(|Ptend(Houkou)-Ptstart(Houkou)|<Eps,
+ rF=Numptcrv(Houkou);
+ );
+ );
+ gG=apply(0..10,pP+Ookisa*cos(Hiraki)*[cos(2*pi/10*#),sin(2*pi/10*#)]);
+ Flg=0;
+ forall(1..rF,Nj,
+ if(Flg==0,
+ pB=Ptcrv(rF+1-Nj,Houkou);
+ tmp=IntersectcrvsPp([pA,pB],gG);
+ if(length(tmp)>0,
+ Houkou=pP-tmp_1_1;
+ Flg=1;
+ );
+ pA=pB;
+ );
+ );
+ SCALEY=scy;
+ if(Flg==0,
+ println("Arrowhead may be too large (no intersect)");
+ Flg=2;
+ );
+ if(Flg==1,
+ Houkou=Unscaling(Houkou);
+ pP=Unscaling(pP);
+ );
+ );
+ if(Flg<2,
+// pP=Doscaling(pP);
+// Houkou=Doscaling(Houkou);
+ pP=Pcrd(pP);
+ if(!ispoint(point),
+ Houkou=Pcrd(Houkou);
+ );
+// if(MeasureDepth(Houkou)==0,Houkou=Pcrd(Houkou));
+ Ev=-1/|Houkou|*Houkou;
+ Ev=Lcrd(Ev);
+ Nv=[-Ev_2, Ev_1];
+ if(indexof(Str,"c")>0,
+ pP=pP-0.5*Ookisa*cos(Hiraki)*Ev;
+ );
+ if(indexof(Str,"b")>0,
+ pP=pP-Ookisa*cos(Hiraki)*Ev;
+ );
+ pA=pP+Ookisa*cos(Hiraki)*Ev+Ookisa*sin(Hiraki)*Nv;
+ pB=pP+Ookisa*cos(Hiraki)*Ev-Ookisa*sin(Hiraki)*Nv;
+ list=[pA,pP,pB];
+ list=apply(list,LLcrd(#));
+// Out=Unscaling(Out);
+ list;
+ );
+);
+
+Arrowhead(point,Houkou):=Arrowhead(point,Houkou,[]);
+Arrowhead(point,Houkou,options):=(
+//help:Arrowhead(B,B-A,[1.5,30]);
+//help:Arrowhead(A,"gr1");
+ // global ArrowheadNumber
+ regional(name,Ltype,Noflg,reL,opstr,opcindy,ptstr,hostr,tmp,tmp1,list);
+ name="arh"+text(ArrowheadNumber);
+ ArrowheadNumber=ArrowheadNumber+1;
+ ptstr=textformat(point,5);
+ if(isstring(Houkou), // 15.01.11
+ tmp=parse(Houkou);
+ if(MeasureDepth(tmp)<2,
+ hostr=Houkou;
+ ,
+ hostr=Houkou+"(1)";
+ );
+ ,
+ if(ispoint(point),
+ hostr=textformat(LLcrd(Houkou),5);
+ ,
+ hostr=textformat(Houkou,5);
+ );
+ );
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ reL=tmp_6;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ list=Arrowheaddata(point,Houkou,options);
+ if(Noflg<3,
+// println("generate Arrowhead "+name);
+ tmp1=apply(list,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+// GLIST=append(GLIST,name+"=Listplot("+list+")");
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(1)+Ltype,name);
+ ,
+// if(Noflg==1,Ltype=0);
+ Ltype=0;
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ if(Noflg==0,
+ if(length(reL)<3, // 16.04.09 from
+ forall(1..(2-length(reL)),
+ opstr=opstr+",1";
+ );
+ tmp=PenThick/PenThickInit;
+ opstr=opstr+","+text(tmp);
+ ); // 16.04.09 upto
+ Com2nd("Arrowhead("+ptstr+","+hostr+opstr+")");
+ );
+);
+
+Arrowdata(ptlist):=Arrowdata(ptlist,[]);
+Arrowdata(Arg1,Arg2):=(
+ regional(tmp,nm,ptlist,flg,pA,pB,options);
+ flg=0;
+ if(isstring(Arg1),
+ nm=Arg1;
+ ptlist=Arg2;
+ Arrowdata(nm,ptlist,[]);
+ flg=1;
+ );
+ if(flg==0,
+ tmp=MeasureDepth(Arg1);
+ if(tmp==0,
+ pA=Arg1;
+ pB=Arg2;
+ Arrowdata(pA,pB,[]);
+ ,
+ ptlist=Arg1;
+ options=Arg2;
+ nm=text(ArrowlineNumber);
+ ArrowlineNumber=ArrowlineNumber+1;
+ Arrowdata(nm,ptlist,options);
+ );
+ );
+);
+Arrowdata(Arg1,Arg2,options):=(
+//help:Arrowdata([A,B],[2,10]);
+ regional(Retflg,nm,ptlist,name,opstr,opcindy,realL,strL,size,
+ flg,Ltype,Noflg,lineflg,tmp,tmp1,tmp2,pA,pB,segpos);
+ Retflg=0;
+ Noflg=0;
+ Ltype=0;
+ if(!isstring(Arg1),
+ pA=Arg1;
+ pB=Arg2;
+ Arrowdata(pA,pB,options,"old");
+ Retflg=1;
+ ptlist=[pA,pB];
+ );
+ if(Retflg==0,
+ nm=Arg1;
+ ptlist=Arg2;
+ name="ar"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ realL=tmp_6;
+ strL=tmp_7;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ size=1; // 15.06.11
+ if(length(realL)>0,
+ size=realL_1;
+ );
+ tmp2=select(strL,indexof(#,"l")>0); // 16.04.09
+ if(length(tmp2)>0,lineflg=1,lineflg=0); // 16.04.09
+ segpos=1;
+ tmp1=tmp_5;
+ if(length(tmp1)>2,
+ segpos=tmp1_3;
+ );
+ if(Noflg<3,
+// println("generate Arrowdata "+name);
+ tmp1=apply(ptlist,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp1=Pcrd(ptlist_1);//16.10.20
+ tmp2=Pcrd(ptlist_2);//16.10.20
+ if(lineflg==0, // 16.04.09 from
+ tmp=tmp2-0.2*size/2*(tmp2-tmp1)/|tmp2-tmp1|; // 15.06.11
+ ,
+ tmp=tmp2;
+ ); // 16.04.09 upto
+ tmp=[LLcrd(tmp1),LLcrd(tmp)];//16.10.20
+ GLIST=append(GLIST,name+"=Listplot("+textformat(tmp,5)+")");
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ tmp=textformat(ptlist,5);
+ tmp=substring(tmp,1,length(tmp)-1);
+ tmp1=indexof(tmp,"],[");
+ if(tmp1>0,
+ pA=substring(tmp,0,tmp1);
+ pB=substring(tmp,tmp1+1,length(tmp));
+ ,
+ tmp1=indexof(tmp,",");
+ pA=substring(tmp,0,tmp1-1);
+ pB=substring(tmp,tmp1,length(tmp));
+ );
+ tmp1="Lcrd("+pA+")+"
+ +textformat(segpos,5)+"*(Lcrd("+pB+")-"+"Lcrd("+pA+"))";
+ tmp1=parse(tmp1);
+ tmp2="Lcrd("+pB+")-Lcrd("+pA+")";
+ tmp2=parse(tmp2);
+ Arrowhead(tmp1,tmp2,options);
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ );
+ ptlist;
+);
+Arrowdata(pA,pB,options,str):=(
+ regional(ptA,ptB,opstr,Astr,Bstr,name,tmp,opcindy);
+ Astr=textformat(pA,5);
+ Bstr=textformat(pB,5);
+ name="ar"+pA.name+pB.name;
+ println("generate Arrow "+name);
+ opstr="";
+ opcindy="";
+ forall(options,
+ if(isstring(#),
+ if(indexof(#,"->")>0,
+ opcindy=opcindy+","+#;
+ ,
+ tmp="'"+#+"'";
+ );
+ ,
+ tmp=text(#);
+ );
+ opstr=opstr+","+tmp;
+ );
+ ptA=Lcrd(pA);
+ ptB=Lcrd(pB);
+ Arrowheaddata(ptB,ptB-ptA,options);
+ tmp="connect("+textformat([ptA,ptB],5)
+ +",linecolor->"+text(KCOLOR)+opcindy+");";
+ parse(tmp); // 14.11.17
+ Com2nd("Arrowline("+Astr+","+Bstr+opstr+")"); // 14.10.04
+);
+
+Anglemark(plist):=Anglemark(plist,[]);
+Anglemark(Arg1,Arg2):=( // 2015.04.28 from
+ regional(nm,plist,options,tmp);
+ if(isstring(Arg1),
+ nm=Arg1;
+ plist=Arg2;
+ Anglemark(nm,plist,[]);
+ ,
+ plist=Arg1;
+ options=Arg2;
+ tmp=textformat(plist,5);
+ tmp=replace(tmp,",","");
+ nm=substring(tmp,1,length(tmp)-1);
+ Anglemark(nm,plist,options);
+ );
+); // upto
+Anglemark(nm,plist,options):=(
+//help:Anglemark([A,B,C],["E=\theta",2]);
+//help:Anglemark("1",[A,B,C],["E=1.2,\theta",2]);
+//help:Anglemark(options=["E/L=(sep,)letter",size]);
+ regional(name,Out,pB,pA,pC,Ctr,ra,sab,sac,ratio,opstr,Bname,Bpos,
+ Brat,tmp,tmp1,tmp2,Num,opcindy,Ltype,eqL,realL,Rg,Th,Noflg);
+ name="ag"+nm;
+ ra=0.5;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ eqL=tmp_5;
+ realL=tmp_6;
+ Bname="";
+ Brat=1.5;
+ Num=20;
+ if(length(realL)>0,
+ ra=realL_1*ra;
+ opstr=opstr+","+text(realL_1);
+ );
+ forall(eqL,
+ if(substring(#,0,1)=="L",Bname="Letter(");
+ if(substring(#,0,1)=="E",Bname="Expr(");
+ Bpos="md"+name;
+ Bname=Bname+Bpos+","+Dq+"c"+Dq+","+Dq;//16.10.29
+ tmp=substring(#,indexof(#,"="),length(#));
+ tmp1=indexof(tmp,",");
+ Bname=Bname+substring(tmp,tmp1,length(tmp))+Dq+")";
+ if(tmp1>0,
+ Brat=parse(substring(tmp,0,tmp1-1));
+ );
+ );
+ pB=Lcrd(plist_1); pA=Lcrd(plist_2); pC=Lcrd(plist_3);
+ Ctr=Lcrd(pA);
+ sab=pB-pA;
+ sac=pC-pA;
+ Rg=[arctan2(sab)+0,arctan2(sac)+0];
+ if(Rg_2<Rg_1,Rg_2=Rg_2+2*pi);
+ Out=[];
+ forall(0..Num,
+ Th=Rg_1+#*(Rg_2-Rg_1)/Num;
+ Out=append(Out,Ctr+ra*[cos(Th),sin(Th)]);
+ );
+ if(length(Bname)>0,
+ Th=(Rg_1+Rg_2)/2;
+ tmp1=Ctr+Brat*ra*[cos(Th),sin(Th)];
+ tmp="Defvar("+Dq+Bpos+"=";
+ tmp=tmp+textformat(tmp1,5)+Dq+");";
+ parse(tmp);
+ parse(Bname);
+ );
+ if(Noflg<3,
+ println("generate anglemark "+name);
+ tmp1=apply(Out,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp=textformat(plist,5);
+ tmp1=substring(tmp,1,length(tmp)-1);
+ tmp=name+"=Anglemark("+tmp1+opstr+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ Out;
+);
+
+Paramark(plist):=Paramark(plist,[]);
+Paramark(plist,options):=(
+//help:Paramark([A,B,C],["E=\theta"]);
+ regional(name,Out,pB,pA,pC,ra,sab,sac,ratio,opstr,Bname,Bpos,
+ Brat,tmp,tmp1,tmp2,Ltype,Noflg,eqL,realL,opcindy);
+ tmp=textformat(plist,5);
+ tmp=replace(tmp,",","");
+ tmp=substring(tmp,1,length(tmp)-1);
+ name="pm"+tmp;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ eqL=tmp_5;
+ realL=tmp_6;
+ ra=0.5;
+ Bname="";
+ Brat=1.2;
+ if(length(realL)>0,
+ tmp=realL_1;
+ ra=tmp*ra;
+ opstr=opstr+","+text(tmp);
+ );
+ forall(eqL,
+ if(substring(#,0,1)=="L",Bname="Letter(");
+ if(substring(#,0,1)=="E",Bname="Expr(");
+ Bpos="md"+name;
+ Bname=Bname+Dq+Bpos+Dq+","+Dq+"c"+Dq+","+Dq;
+ tmp=substring(#,indexof(#,"="),length(#));
+ tmp1=indexof(tmp,",");
+ Bname=Bname+substring(tmp,tmp1,length(tmp))+Dq+")";
+ if(tmp1>0,
+ Brat=parse(substring(tmp,0,tmp1-1));
+ );
+ );
+ pB=Lcrd(plist_1); pA=Lcrd(plist_2); pC=Lcrd(plist_3);
+ Ctr=Lcrd(pA);
+ Out=[];
+ Out=append(Out,pA+ra*(pB-pA)/|pB-pA|);
+ Out=append(Out,pA+ra*(pB-pA)/|pB-pA|+ra*(pC-pA)/|pC-pA|);
+ Out=append(Out,pA+ra*(pC-pA)/|pC-pA|);
+ if(length(Bname)>0,
+ tmp1=pA+Brat*ra*(pB-pA)/|pB-pA|+Brat*ra*(pC-pA)/|pC-pA|;
+ tmp="Defvar("+Dq+Bpos+"="+textformat(tmp1,5)+Dq+");";
+ parse(tmp);
+ parse(Bname);
+ );
+ if(Noflg<3,
+ println("generate paramark "+name);
+ tmp1=apply(Out,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp1=substring(textformat(plist,5),1,length(textformat(plist,5))-1);
+ tmp=name+"=Paramark("+tmp1+opstr+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ Out;
+);
+
+MakeBowdata(pA,pB,Hgt):=(
+ regional(angle,pB2,pH2,pC2,pC,tmp,Th1,Th2,ra,dMA);
+ angle=arctan2(pB-pA)+0;
+ pB2=Rotatepoint(pB,-angle,pA);
+ tmp=Lcrd(pA);
+ pH2=[(tmp_1+pB2_1)/2,tmp_2-Hgt];
+ dMA=|tmp-pB2|/2;
+ ra=(dMA^2+Hgt^2)/(2*Hgt);
+ pC2=[pH2_1,pB2_2+(ra-Hgt)];
+ pC=Rotatepoint(pC2,angle,pA);
+ Th1=arctan2(pA-pC2)+angle;
+ Th2=arctan2(pB2-pC2)+angle;
+ [pC,ra,Th1,Th2];
+);
+
+Bowdata(nm,plist,options):=(
+//help:Bowdata([C,A],[2,1.2,"Expr=10","da"]);
+//help:Bowdata([A,B],["Expr=t0n3,a"]);
+//help:Bowdata([A,B],["Exprrot=t0n2r,a"]);
+ regional(name,Out,pB,pA,pC,ra,tmp,tmp1,tmp2,Ltype,eqL,realL,
+ Bname,Bpos,Th,Cut,Num,Hgt,opstr,opcindy,Ydata,pC,
+ Th1,Th2,Noflg,Bops,Bmov,Tmov,Nmov,rev);
+ name="bw"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ eqL=tmp_5;
+ realL=tmp_6;
+ pA=Lcrd(plist_1); pB=Lcrd(plist_2);
+ Hgt=1/2*|pB-pA|*0.2;
+ Cut=0;
+ Num=24;
+ Bname="";
+ Tmov=0;//16.11.01from
+ Nmov=0;
+ Bmov="";
+ rev=0;//16.11.01upto
+ if(length(realL)>0,
+ Hgt=realL_1*Hgt; // 15.04.12
+ if(length(realL)>1,Cut=realL_2);
+ );
+ forall(eqL,
+ tmp=substring(#,0,1);
+ if(tmp=="L" % tmp=="l",
+ if(indexof(#,"rot")>0,
+ Bname="Letterrot(";
+ ,
+ Bname="Letter(";
+ );
+ );
+ if(tmp=="E" % tmp=="e",
+ if(indexof(#,"rot")>0,
+ Bname="Exprrot(";
+ ,
+ Bname="Expr(";
+ );
+ );
+ tmp=indexof(#,"=");
+ Bops=substring(#,tmp,length(#)); // 16.11.01
+ );
+ Ydata=MakeBowdata(pA,pB,Hgt);
+ pC=Ydata_1;
+ ra=Ydata_2;
+ Th=(Ydata_3+Ydata_4)*0.5;
+ BOWMIDDLE=[pC_1+ra*cos(Th),pC_2+ra*sin(Th)];
+ Bpos="md"+name; // 16.10.31from(moved)
+ tmp="Defvar("+Dq+Bpos+"="+textformat(BOWMIDDLE,5)+Dq+");";
+ parse(tmp);// 16.10.31upto(moved)
+ if(length(Bname)>0, //16.11.01from
+ tmp=indexof(Bops,",");
+ if(tmp>0,
+ tmp1=substring(Bops,0,tmp-1);
+ if(length(tmp1)>=4 & substring(tmp1,0,1)=="t" & indexof(tmp1,"n")>0,
+ Bmov=tmp1;
+ Bops=substring(Bops,tmp,length(Bops));
+ );
+ );
+ if(length(Bmov)>0,
+ tmp=indexof(Bmov,"t");
+ if(tmp>0,
+ tmp1=indexof(Bmov,"n");
+ Tmov=parse(substring(Bmov,tmp,tmp1-1));
+ tmp=indexof(Bmov,"r");
+ if(tmp>0,
+ Nmov=parse(substring(Bmov,tmp1,tmp-1));
+ rev=1;
+ ,
+ Nmov=parse(substring(Bmov,tmp1,length(Bmov)));
+ );
+ );
+ );
+ Bname=Bname+Bpos;//16.11.01
+ if(abs(Tmov)+abs(Nmov)>0,
+ tmp=Pcrd(pA)-Pcrd(pB);
+ tmp1=1/norm(tmp)*tmp;
+ tmp2=[-tmp1_2,tmp1_1];
+ tmp=MARKLEN*(Tmov*tmp1+Nmov*tmp2);
+ tmp=LLcrd(tmp);
+ Bname=Bname+"+"+text(tmp);
+ );
+ Bname=Bname+",";
+ if(indexof(Bname,"rot")>0,
+ if(rev==1,tmp=pB-pA,tmp=pA-pB);
+ Bname=Bname+textformat(tmp,5)+",";
+ ,
+ Bname=Bname+Dq+"c"+Dq+",";
+ );
+ Bname=Bname+Dq+Bops+Dq+")";
+ parse(Bname);
+ );//16.11.01upto
+ if(Cut==0,
+ Th1=Ydata_3;
+ Th2=Ydata_4;
+ Out=[];
+ forall(0..Num,
+ tmp=Th1+#*(Th2-Th1)/Num;
+ Out=append(Out,pC+ra*[cos(tmp),sin(tmp)]);
+ );
+ ,
+ Th1=Ydata_3;
+ Th2=Th-Cut/(2*ra);
+ tmp1=[];
+ forall(0..Num/2,
+ tmp=Th1+#*(Th2-Th1)/(Num/2);
+ tmp1=append(tmp1,pC+ra*[cos(tmp),sin(tmp)]);
+ );
+ Th1=Th+Cut/(2*ra);
+ Th2=Ydata_4;
+ tmp2=[];
+ forall(0..Num/2,
+ tmp=Th1+#*(Th2-Th1)/(Num/2);
+ tmp2=append(tmp2,pC+ra*[cos(tmp),sin(tmp)]);
+ );
+ Out=[tmp1,tmp2];
+ );
+ if(Noflg<3,
+ println("generate bowdata "+name+" and "+Bpos);//16.10.31
+ if(MeasureDepth(Out)==1,Out=[Out]);
+ tmp1=[];
+ forall(Out,tmp2,
+ tmp=apply(tmp2,Pcrd(#));
+ tmp1=append(tmp1,tmp);
+ );
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp1=substring(textformat(plist,5),1,length(textformat(plist,5))-1);
+ tmp=name+"=Bowdata("+tmp1+opstr+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+);
+
+Deqplot(nm,deq,rng,initf):=Deqplot(nm,deq,rng,Lcrd(initf)_1,initf,[]);
+Deqplot(nm,deq,rng,Arg1,Arg2):=(
+ regional(initt,initf,options);
+ if(isreal(Arg1) & length(Arg1)==1,
+ initt=Arg1;
+ initf=Arg2;
+ options=[];
+ ,
+ initf=Lcrd(Arg1);
+ initt=initf_1;
+ options=Arg2;
+ );
+ Deqplot(nm,deq,rng,initt,initf,options);
+);
+Deqplot(nm,deq,rng,initt,initf,options):=(
+ regional(name,Noflg,Ltype,eqL,opstr,opcindy,pdL,var2,deq2,rng2,initt2,initf2,
+ tmp,tmp1,tmp2,tmp3,tmp4);
+ tmp=tokenize(deq,"=");
+ tmp1=tmp_1;
+ tmp2=tmp_2;
+ tmp3=tokenize(tmp1,"`");
+ if(length(tmp3)==2,
+ if(indexof(tmp1,"[")>0,
+ Deqplot(nm,deq,rng,initt,initf,options,[2,3]);
+ ,
+ if(indexof(rng,"=")>0,rng2=rng,rng2=rng+"=[XMIN,XMAX]");
+ tmp=tokenize(rng2,"=");
+ deq2="["+tmp_1+","+replace(tmp1,"`","]")+"`=[1,"+tmp2+"]";
+ rng2="t="+tmp_2;
+ if(isreal(initf) & length(initf)==1,
+ initf2=[initt,initf];
+ initt2=initt;
+ ,
+ initf2=Lcrd(initf));
+ initt2=initf2_1;
+ Deqplot(nm,deq2,rng2,initt2,initf2,options,[2,3]);
+ );
+ ,
+ name="de"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ eqL=tmp_5;
+ opcindy=tmp_9;
+ opstr="";
+ forall(eqL,
+ if(Toupper(substring(#,0,1))=="N",
+ tmp=indexof(#,"=");
+ tmp1="N="+substring(#,tmp,length(#));
+ opstr=opstr+",'"+tmp1+"'";
+ );
+ );
+ if(Noflg<1,
+ if(indexof(rng,"=")>0,rng2=rng,rng2=rng+"=[XMIN,XMAX]");
+ var2="d"+tmp3_1;
+ deq2="["+tmp3_1+","+var2+"]`=[";
+ tmp=replace(tmp2,tmp3_1+"`",var2);
+ deq2=deq2+var2+","+tmp+"]";
+ Deqplot(nm,deq2,rng2,initt,initf,append(options,"nodisp"),[1,2]);
+ parse(tmp);
+ tmp=name+"=Deqplot(Assign("+Dq+deq+Dq+"),'"+rng+"',";
+ tmp=tmp+initt+","+initf+opstr+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ parse("de"+nm);
+ );
+ );
+);
+Deqplot(nm,deq,rng,initt,initf,options,Sel):=(
+//help:Deqplot("2","y`=y*(1-y)","x",0, 0.5,["Num=100"]);
+//help:Deqplot("1","y``=-y","x",0, [1,0]);
+//help:Deqplot("3","[x,y]`=[x*(1-y),0.3*y*(x-1)]","t=[0,20]",[1,0.5]);
+ regional(Ltype,Noflg,Inflg,Outflg,strL,opstr,opcindy,Num,
+ outstr,name,func,xf,yf,pdL,Eps,Inf,t1,t2,tt,Vname,dt,funP,funN,flg,
+ kl1,kl2,kl3,kl4,x0,y0,x1,y1,tmp,tmp1,tmp2);
+ name="de"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ Inflg=tmp_3;
+ Outflg=tmp_4;
+ eqL=tmp_5;
+ strL=tmp_7;
+// opstr=tmp_(length(tmp)-1);
+ opstr="";
+ opcindy=tmp_(length(tmp));
+ outstr="";
+ forall(strL,
+ tmp=Toupper(substring(#,0,1));
+ if(tmp=="S",
+ outstr="Sci";
+ );
+ );
+ Num=50;
+ forall(eqL,
+ tmp=indexof(#,"=");
+ tmp2=substring(#,0,1);
+ tmp2=Toupper(tmp2);
+ tmp1=substring(#,tmp,length(#));
+ opstr=opstr+",'"+tmp2+"="+tmp1+"'";
+ if(Toupper(substring(#,0,1))=="N",
+ Num=parse(tmp1);
+ );
+ );
+ if(outstr=="Sci",
+ if(Inflg==0 & Outflg==0,Outflg=1;Inflg=1);
+ );
+ if(Noflg<3,
+ if(outstr=="Sci",
+ if(Outflg==1,
+ println("Output Deqplot "+name);
+ SCIWRLIST=append(SCIWRLIST,name);
+ );
+ if(Inflg==1,
+ println("Input Deqplot "+name);
+ if(length(SCIRELIST)==0,
+ ReadOutData(Fnameout);
+ );
+ tmp=parse(name);
+ if(islist(tmp),
+ Extractdata(name,["nodisp"]); // 12.19
+ );
+ SCIRELIST=append(SCIRELIST,name);
+ );
+ ,
+ Eps=10^(-3);
+ Inf=10^3;
+ tmp=tokenize(deq,"=");
+ tmp1=tmp_1;
+ func=tmp_2;
+ tmp=indexof(tmp1,",");
+ xf=substring(tmp1,1,tmp-1);
+ yf=substring(tmp1,tmp,length(tmp1));
+ tmp=indexof(yf,"]");
+ yf=substring(yf,0,tmp-1);
+ tmp=tokenize(rng,"=");
+ Vname=tmp_1;
+ tmp=parse(tmp_2);
+ t1=tmp_1;
+ t2=tmp_2;
+ tmp="funP("+Vname+","+xf+","+yf+"):="+func+";";
+ parse(tmp);
+ tmp=tokenize(func,",");
+ tmp1="-("+substring(tmp_1,1,length(tmp_1))+")";
+ tmp2="-("+substring(tmp_2,0,length(tmp_2)-1)+")";
+ tmp="funN("+Vname+","+xf+","+yf+"):=["+tmp1+","+tmp2+"];";
+ parse(tmp);
+ dt=(t2-t1)/Num;
+ tt=initt;
+ tmp=Lcrd(initf);
+ x0=tmp_1;
+ y0=tmp_2;
+ pdL=[[tt,x0,y0]];
+ flg=0;
+ forall(1..floor((t2-initt)/dt),
+ if(flg==0,
+ kl1=dt*funP(tt,x0,y0);
+ kl2=dt*funP(tt+dt/2,x0+kl1_1/2,y0+kl1_2/2);
+ kl3=dt*funP(tt+dt/2,x0+kl2_1/2,y0+kl2_2/2);
+ kl4=dt*funP(tt+dt,x0+kl3_1,y0+kl3_2);//16.10.14
+ tmp1=[x0,y0]+(kl1+2*kl2+2*kl3+kl4)/6;
+ x0=tmp1_1;
+ y0=tmp1_2;
+ tt=initt+#*dt;
+ pdL=append(pdL,[tt,x0,y0]);
+ if(|tmp1|>Inf,flg=1);
+ );
+ );
+ tt=initt;
+ tmp=Lcrd(initf);
+ x0=tmp_1;
+ y0=tmp_2;
+ flg=0;
+ forall(1..floor((initt-t1)/dt),
+ if(flg==0,
+ kl1=dt*funN(tt,x0,y0);
+ kl2=dt*funN(tt+dt/2,x0+kl1_1/2,y0+kl1_2/2);
+ kl3=dt*funN(tt+dt/2,x0+kl2_1/2,y0+kl2_2/2);
+ kl4=dt*funN(tt+dt/2,x0+kl3_1/2,y0+kl3_2/2);
+ tmp1=[x0,y0]+(kl1+2*kl2+2*kl3+kl4)/6;
+ x0=tmp1_1;
+ y0=tmp1_2;
+ tt=initt-#*dt;
+ pdL=prepend([tt,x0,y0],pdL);
+ if(|tmp1|>Inf,flg=1);
+ );
+ );
+ println("Generate Deqplot "+name);
+ pdL=apply(pdL,#_Sel);
+ tmp1=apply(pdL,Pcrd(#));
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ );
+ if(Noflg<1,
+ tmp=name+"=Deqplot(Assign("+Dq+deq+Dq+"),'"+rng+"',";
+ tmp=tmp+initt+","+initf+opstr+")";
+ GLIST=append(GLIST,tmp);
+ );
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ if(outstr=="Sci",
+ if(Inflg==1,
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ ,
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ pdL;
+ );
+ );
+);
+
+Enclosing(nm,plist):=EnclosingS(nm,plist);
+Enclosing(nm,plist,options):=EnclosingS(nm,plist,options);
+EnclosingS(nm,plist):=EnclosingS(nm,plist,[]);
+EnclosingS(nm,plist,options):=(
+//help:Enclosing("1",["sc2","crAB","sc2","Invert(sc1)"],[pt,"dr"]);
+ regional(name,AnsL,Start,Eps,EEps,S,Flg,Fdata,Gdata,KL,pt,qt,
+ t1,t2,t3,ii,nn,tmp,tmp1,tmp2,Ltype,Noflg,realL,eqL,opstr,opcindy);
+ name="en"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ eqL=tmp_5;
+ realL=tmp_6;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ Eps=10^(-3);
+ EEps=0.1;
+ Start=[];
+ Flg=0;
+ forall(realL,
+ if(isList(#) % ispoint(#),
+ Start=Lcrd(#); // 15.09.12
+ ,
+ Flg=Flg+1;
+ if(Flg==1,Eps=#);
+ if(Flg==2,EEps=#);
+ );
+ );
+// tmp1=concat([Eps,EEps],eqL); // 15.04.06
+ Fdata=plist_1;
+ Gdata=plist_(length(plist));
+ KL=IntersectcrvsPp(Fdata,Gdata);
+ if(length(KL)==1,
+ pt=KL_1_1;
+ t1=KL_1_2;
+ );
+ if(length(KL)==0,
+ if(Numptcrv(Fdata)>Numptcrv(Gdata),
+ tmp=Nearestpt(Fdata,Gdata);
+ pt=tmp_1;
+ t1=tmp_2;
+ ,
+ tmp=Nearestpt(Gdata,Fdata);
+ pt=tmp_3;
+ t1=tmp_4;
+ );
+ );
+ if(length(KL)>1,
+ if(Start==[],
+ err("No Start Point");
+ ,
+ pt=KL_1_1;
+ t1=KL_1_2;
+ tmp=|pt-Start|;
+ forall(2..length(KL),ii, // 15.04.20
+ tmp1=KL_ii_1;
+ tmp2=|tmp1-Start|; // 15.04.20
+ if(tmp2<tmp,
+ pt=tmp1;
+ t1=KL_ii_2;
+ tmp=tmp2;
+ );
+ );
+ );
+ );
+// pt=Pcrd(pt); // 15.09.12
+ Start=pt;
+ AnsL=[];
+ forall(1..length(plist),nn,
+ Fdata=plist_nn;
+ if(nn>1, pt=qt);
+ if(nn==length(plist),
+ qt=Start;
+ ,
+ Flg=0;
+ Gdata=plist_(nn+1);
+// tmp1=concat([Eps,EEps],eqL); // 15.04.06
+ KL=IntersectcrvsPp(Gdata,Fdata);
+ if(length(KL)==1,
+ tmp=KL_1;
+ qt=KL_1_1;
+ t3=KL_1_2;
+ Flg=10;
+ );
+ if(length(KL)==0,Flg=1);
+ if(length(KL)>1,
+ tmp1=KL_1_1;
+ tmp2=KL_2_1;
+ tmp=|tmp1-tmp2|;
+ if(tmp<Eps*10, Flg=1);
+ );
+ if(Flg==1,
+ if(Numptcrv(Fdata)>Numptcrv(Gdata),
+ tmp=Nearestpt(Fdata,Gdata);
+ qt=tmp_1;
+ t3=tmp_4;
+ Flg=10;
+ ,
+ tmp=Nearestpt(Gdata,Fdata);
+ qt=tmp_3;
+ t3=tmp_2;
+ Flg=10;
+ );
+ );
+ if(Flg<10,
+ t2=10^6; //%inf;
+ forall(1..length(KL),ii,
+ tmp1=KL_ii_1;
+ tmp=KL_ii_3;
+ tmp2=ParamonCurve(tmp1,tmp,Fdata);
+ tmp3=KL_ii_2;
+ if(tmp2>t1+Eps & tmp2<t2+Eps,
+ qt=tmp1;
+ t2=tmp2;
+ t3=tmp3;
+ );
+ );
+ );
+ );
+ tmp=Partcrv("",pt,qt,Fdata,["nodata"]);
+ t1=t3;
+ if(nn==1,
+ AnsL=tmp;
+ ,
+ AnsL=concat(AnsL,tmp_(2..length(tmp)));
+ );
+ );
+ AnsL=apply(AnsL,Pcrd(#)); // 15.09.12
+ AnsL_(length(AnsL))=AnsL_1;//16.10.20
+ if(Noflg<3,
+ println("generate Enclosing "+name);
+ tmp=name+"="+textformat(AnsL,5);
+ parse(tmp);
+// tmp=name+"=Enclosing(";//16.10.20from
+// tmp1="list(";
+// forall(plist,
+// tmp1=tmp1+#+",";
+// );
+// tmp=tmp+substring(tmp1,0,length(tmp1)-1)+")"+opstr+")";
+ tmp=apply(AnsL,LLcrd(#));
+ tmp=name+"=Listplot("+textformat(tmp,5)+")";//16.10.20upto
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ tmp=apply(AnsL,LLcrd(#));//16.10.20
+ tmp;
+);
+
+Shade(plist):=Shade(plist,[]);
+Shade(plist,options):=(
+//help:Shade(["gr2","sg1"],[0.5]);
+//help:Shade([pointlist],[0.5]);
+ regional(tmp,tmp1,tmp2,opstr,opcindy,Str,G2,flg);
+ if(isstring(plist_1), // 16.01.24
+ println("output Shade of "+plist);
+ ,
+ println("output Shade of lists");
+ );
+ tmp=Divoptions(options);
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ flg=0;
+ forall(plist,
+ if(flg==0,
+ if(isstring(#),tmp=parse(#),tmp=#); // from 16.01.24
+ if(!islist(tmp),flg=1); upto
+ );
+ );
+ if(flg==1,
+// err("some data not defined yet");
+ ,
+ G2=Joincrvs("1",plist,["nodata"]);
+ G2=apply(G2,Pcrd(#));
+ tmp1="fillpoly("+textformat(G2,5)+opcindy+");";
+ parse(tmp1);
+ );
+ Str="Shade(";
+ tmp1="list(";
+ forall(plist,
+ if(isstring(#), // from 16.01.24
+ if(length(#)>1,
+ tmp1=tmp1+#+",";
+ ,
+ tmp1=tmp1+Dq+#+Dq+",";
+ );
+ ,
+ tmp1=tmp1+"Listplot("+textformat(#,5)+"),";
+ ); // upto 16.01.24
+ );
+ Str=Str+substring(tmp1,0,length(tmp1)-1)+")"+opstr+")";
+ Com2nd(Str);
+);
+
+
+//help:start();
+
+Rotatepoint(point,Theta,ctr):=(
+//help:Rotatepoint(A,2*pi/3,B);
+ regional(X1,X2,Y1,Y2,Cx,Cy,tmp);
+ tmp=Lcrd(point);
+ X1=tmp_1; Y1=tmp_2;
+ tmp=Lcrd(ctr);
+ Cx=tmp_1; Cy=tmp_2;
+ X2=Cx+(X1-Cx)*cos(Theta)-(Y1-Cy)*sin(Theta);
+ Y2=Cy+(X1-Cx)*sin(Theta)+(Y1-Cy)*cos(Theta);
+ [X2,Y2];
+);
+
+Translatepoint(point,mov):=(
+//help:Translatepoint(A,[2,3]);
+ regional(X1,X2,Y1,Y2,Cx,Cy,tmp);
+ tmp=Lcrd(point);
+ X1=tmp_1; Y1=tmp_2;
+ tmp=Lcrd(mov);
+ Cx=tmp_1; Cy=tmp_2;
+ X2=X1+Cx;
+ Y2=Y1+Cy;
+ [X2,Y2];
+);
+
+Scalepoint(point,ratio,center):=(
+//help:Scalepoint(A,[3,2],[0,0]);
+ regional(X1,X2,Y1,Y2,Cx,Cy,tmp);
+ tmp=Lcrd(point);
+ X1=tmp_1; Y1=tmp_2;
+ tmp=Lcrd(center);
+ Cx=tmp_1; Cy=tmp_2;
+ X2=Cx+ratio_1*(X1-Cx);
+ Y2=Cy+ratio_2*(Y1-Cy);
+ [X2,Y2];
+);
+
+Reflectpoint(point,symL):=(
+//help:Reflectpoint(A,B);
+//help:Reflectpoint(A,[[2,3]]);
+//help:Reflectpoint(A,[C,E]);\\
+ regional(X1,X2,Y1,Y2,Us,Vs,Pt1,Pt2,Cx,Cy,tmp);
+ tmp=Lcrd(point);
+ X1=tmp_1; Y1=tmp_2;
+ Pt1=Lcrd(symL_1);
+ if(length(symL)==1,
+ Pt2=Pt1;
+ ,
+ Pt2=Lcrd(symL_2);
+ );
+ Us=Pt2_1-Pt1_1;
+ Vs=Pt2_2-Pt1_2;
+ if(Pt1==Pt2,
+ X2=2*Pt1_1-X1;
+ Y2=2*Pt1_2-Y1;
+ ,
+ X2=(Us^2-Vs^2)/(Us^2+Vs^2)*X1+2*Us*Vs/(Us^2+Vs^2)*Y1
+ -2*Vs*(Us*Pt1_2-Vs*Pt1_1)/(Us^2+Vs^2);
+ Y2=2*Us*Vs/(Us^2+Vs^2)*X1-(Us^2-Vs^2)/(Us^2+Vs^2)*Y1
+ +2*Us*(Us*Pt1_2-Vs*Pt1_1)/(Us^2+Vs^2);
+ );
+ [X2,Y2];
+);
+
+Rotatedata(nm,plist,Theta):=Rotatedata(nm,plist,Theta,[]);
+Rotatedata(nm,plist,angle,options):=(
+//help:Rotatedata("1","crAB",pi/3,[[1,5],"dr,2"]);
+ regional(tmp,tmp1,tmp2,pdata,Theta,Pt,Cx,Cy,PdLL,PdL,
+ opcindy,Nj,Njj,Kj,Mj,X1,Y1,X2,Y2,Ltype,Noflg,name);
+ name="rt"+nm;
+ Pt=[0,0];
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ tmp1=tmp_6;
+ if(length(tmp1)>0,Pt=Lcrd(tmp1_1));
+ pdata=plist;
+ if(isstring(pdata),pdata=[pdata]);
+ if(!isstring(pdata_1) & MeasureDepth(pdata)==1,
+ pdata=[pdata];
+ );
+ if(isstring(angle),Theta=parse(angle),Theta=angle);
+ Cx=Pt_1; Cy=Pt_2;
+ PdL=[];
+ forall(pdata,Njj,
+ if(isstring(Njj),Kj=parse(Njj),Kj=Njj);
+ if(MeasureDepth(Kj)==1,Kj=[Kj]);
+ tmp2=[];
+ forall(Kj,Nj,
+ tmp1=[];
+ forall(Nj,
+ tmp=LLcrd(#);
+ X1=tmp_1;
+ Y1=tmp_2;
+ X2=Cx+(X1-Cx)*cos(Theta)-(Y1-Cy)*sin(Theta);
+ Y2=Cy+(X1-Cx)*sin(Theta)+(Y1-Cy)*cos(Theta);
+ tmp1=concat(tmp1,[[X2,Y2]]);
+ );
+ tmp2=concat(tmp2,[tmp1]);
+ );
+ PdL=concat(PdL,tmp2);
+ );
+ if(Noflg<3,
+ println("generate Rotatedata "+name);
+ tmp1=[];
+ forall(PdL,tmp2,
+ tmp=apply(tmp2,Pcrd(#));
+ tmp1=append(tmp1,tmp);
+ );
+ if(length(tmp1)==1,tmp1=tmp1_1);
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+// tmp1=textformat(plist,5);
+ tmp1=text(plist); // 15.10.15
+ tmp1=replace(tmp1,"[","list(");
+ tmp1=replace(tmp1,"]",")");
+ tmp=name+"=Rotatedata("+tmp1+","
+ +textformat(angle,5)+","+textformat(Pt,5)+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ PdL;
+);
+
+translatedata(nm,plist,mov):=translatedata(nm,plist,mov,[]);
+translatedata(nm,plist,mov,options):=(
+//help:translatedata("1",["gr1"],[1,2]);
+ regional(tmp,tmp1,tmp2,pdata,Cx,Cy,PdL,Nj,Njj,Kj,
+ opcindy,X2,Y2,Ltype,Noflg,name);
+ name="tr"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ pdata=plist;
+ if(isstring(pdata),pdata=[pdata]);
+ if(!isstring(pdata_1) & MeasureDepth(pdata)==1,
+ pdata=[pdata];
+ );
+ tmp=Lcrd(mov);
+ Cx=tmp_1; Cy=tmp_2;
+ PdL=[];
+ forall(pdata,Njj,
+ if(isstring(Njj),Kj=parse(Njj),Kj=Njj);
+ if(MeasureDepth(Kj)==1,Kj=[Kj]);
+ tmp2=[];
+ forall(Kj,Nj,
+ tmp1=[];
+ forall(Nj,
+ tmp=LLcrd(#);
+ X2=tmp_1+Cx;
+ Y2=tmp_2+Cy;
+ tmp1=concat(tmp1,[[X2,Y2]]);
+ );
+ tmp2=concat(tmp2,[tmp1]);
+ );
+ PdL=concat(PdL,tmp2);
+ );
+ if(Noflg<3,
+ println("generate translatedata "+name);
+ tmp1=[];
+ forall(PdL,tmp2,
+ tmp=apply(tmp2,Pcrd(#));
+ tmp1=append(tmp1,tmp);
+ );
+ if(length(tmp1)==1,tmp1=tmp1_1);
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+// tmp1=textformat(plist,5);
+ tmp1=text(plist); // 15.10.15
+ tmp1=replace(tmp1,"[","list(");
+ tmp1=replace(tmp1,"]",")");
+ tmp=name+"=translatedata("+tmp1+","+textformat(mov,5)+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ PdL;
+);
+
+Scaledata(nm,plist,ratioV):=(
+ regional(tmp);
+ tmp=Lcrd(ratioV);
+ Scaledata(nm,plist,tmp_1,tmp_2,[]);
+);
+Scaledata(nm,plist,Arg1,Arg2):=(
+//help:Scaledata("1","crAB",3,2,[[0,0]]);
+ regional(tmp,options);
+ if(islist(Arg2),
+ tmp=Lcrd(Arg1);
+ options=Arg2;
+ Scaledata(nm,plist,tmp_1,tmp_2,options);
+ ,
+ Scaledata(nm,plist,Arg1,Arg2,[]);
+ );
+);
+Scaledata(nm,plist,rx,ry,options):=(
+ regional(tmp,tmp1,tmp2,pdata,Theta,Pt,Cx,Cy,PdL,
+ opcindy,Nj,Njj,Kj,X2,Y2,Ltype,Noflg,name);
+ name="sc"+nm;
+ Pt=[0,0];
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ tmp1=tmp_6;
+ if(length(tmp1)>0,
+ Pt=Lcrd(tmp1_1);
+ );
+ pdata=plist;
+ if(isstring(pdata),pdata=[pdata]);
+ if(!isstring(pdata_1) & MeasureDepth(pdata)==1,
+ pdata=[pdata];
+ );
+ Cx=Pt_1; Cy=Pt_2;
+ PdL=[];
+ forall(pdata,Njj,
+ if(isstring(Njj),Kj=parse(Njj),Kj=Njj);
+ if(MeasureDepth(Kj)==1,Kj=[Kj]);
+ tmp2=[];
+ forall(Kj,Nj,
+ tmp1=[];
+ forall(Nj,
+ tmp=LLcrd(#);
+ X2=Cx+rx*(tmp_1-Cx);
+ Y2=Cy+ry*(tmp_2-Cy);
+ tmp1=concat(tmp1,[[X2,Y2]]);
+ );
+ tmp2=concat(tmp2,[tmp1]);
+ );
+ PdL=concat(PdL,tmp2);
+ );
+ if(Noflg<3,
+ println("generate Scaledata "+name);
+ tmp1=[];
+ forall(PdL,tmp2,
+ tmp=apply(tmp2,Pcrd(#));
+ tmp1=append(tmp1,tmp);
+ );
+ if(length(tmp1)==1,tmp1=tmp1_1);
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+ tmp1=text(plist); // 15.10.15
+ tmp1=replace(tmp1,"[","list(");
+ tmp1=replace(tmp1,"]",")");
+ tmp=name+"=Scaledata("+tmp1+","
+ +textformat(rx,5)+","+textformat(ry,5)+","+textformat(Pt,5)+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ PdL;
+);
+
+Reflectdata(nm,plist,symL):=Reflectdata(nm,plist,symL,[]);
+Reflectdata(nm,plist,symL,options):=(
+//help:Reflectdata("1","crAB",[C]);
+ regional(tmp,tmp1,tmp2,pdata,Us,Vs,Pt1,Pt2,Cx,Cy,PdL,
+ opcindy,Nj,Njj,Kj,X1,Y1,X2,Y2,Ltype,Noflg,name);
+ name="re"+nm;
+ Pt=[0,0];
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opcindy=tmp_(length(tmp));
+ pdata=plist;
+ if(isstring(pdata),pdata=[pdata]);
+ if(!isstring(pdata_1) & MeasureDepth(pdata)==1,
+ pdata=[pdata];
+ );
+ Pt1=Lcrd(symL_1);
+ if(length(symL)==1,
+ Pt2=Pt1;
+ ,
+ Pt2=Lcrd(symL_2);
+ );
+ Us=Pt2_1-Pt1_1;
+ Vs=Pt2_2-Pt1_2;
+ PdL=[];
+ forall(pdata,Njj,
+ if(isstring(Njj),Kj=parse(Njj),Kj=Njj);
+ if(MeasureDepth(Kj)==1,Kj=[Kj]);
+ tmp2=[];
+ forall(Kj,Nj,
+ tmp1=[];
+ forall(Nj,
+ tmp=LLcrd(#);
+ X1=tmp_1;
+ Y1=tmp_2;
+ if(Pt1==Pt2,
+ X2=2*Pt1_1-X1;
+ Y2=2*Pt1_2-Y1;
+ ,
+ X2=(Us^2-Vs^2)/(Us^2+Vs^2)*X1+2*Us*Vs/(Us^2+Vs^2)*Y1
+ -2*Vs*(Us*Pt1_2-Vs*Pt1_1)/(Us^2+Vs^2);
+ Y2=2*Us*Vs/(Us^2+Vs^2)*X1-(Us^2-Vs^2)/(Us^2+Vs^2)*Y1
+ +2*Us*(Us*Pt1_2-Vs*Pt1_1)/(Us^2+Vs^2);
+ );
+ tmp1=concat(tmp1,[[X2,Y2]]);
+ );
+ tmp2=concat(tmp2,[tmp1]);
+ );
+ PdL=concat(PdL,tmp2);
+ );
+ if(Noflg<3,
+ println("generate Reflectdata "+name);
+ tmp1=[];
+ forall(PdL,tmp2,
+ tmp=apply(tmp2,Pcrd(#));
+ tmp1=append(tmp1,tmp);
+ );
+ if(length(tmp1)==1,tmp1=tmp1_1);
+ tmp=name+"="+textformat(tmp1,5);
+ parse(tmp);
+// tmp1=textformat(plist,5);
+ tmp1=text(plist); // 15.10.15
+ tmp1=replace(tmp1,"[","list(");
+ tmp1=replace(tmp1,"]",")");
+ tmp=name+"=Reflectdata("+tmp1+","+textformat(symL,5)+")";
+ GLIST=append(GLIST,tmp);
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ PdL;
+);
+
+Mksegments():=Mksegments([]);
+Mksegments(options):=(
+//help:Mksegments();
+ regional(segstr,p,q,r,tmp1,tmp2,tmp3);
+ forall(allsegments(),seg,
+ str=text(inspect(seg,"definition"));
+ tmp1=indexof(str,"(");
+ tmp2=indexof(str,";");
+ tmp3=indexof(str,")");
+ p=substring(str,tmp1,tmp2-1);
+ q=substring(str,tmp2,tmp3-1);
+ Listplot([parse(p),parse(q)]);
+ );
+);
+
+Mkcircles():=Mkcircles([]);
+Mkcircles(options):=(
+//help:Mkcircles():
+ regional(seg,cir,str,p,q,r,tmp1,tmp2,tmp3,tmp4);
+ forall(allcircles(),cir,
+ str=text(inspect(cir,"definition"));
+ tmp1=indexof(str,"(");
+ tmp2=indexof(str,";");
+ tmp3=indexof(str,")");
+ tmp4=indexof(str,";",tmp2+1);
+ if(tmp4==0,
+ p=substring(str,tmp1,tmp2-1);
+ q=substring(str,tmp2,tmp3-1);
+ Circledata([parse(p),parse(q)]);
+ ,
+ p=substring(str,tmp1,tmp2-1);
+ q=substring(str,tmp2,tmp4-1);
+ r=substring(str,tmp4,tmp3-1);
+ Circledata([parse(p),parse(q),parse(r)]);
+ );
+ );
+);
+
+Makesciarg(arglist):=(
+ regional(str,tmpstr);
+ str="";
+ forall(arglist,
+ if(isstring(#),
+ tmpstr=Dq+#+Dq;
+ ,
+ tmpstr=textformat(#,5);
+ );
+ str=str+tmpstr+",";
+ );
+ str=substring(str,0,length(str)-1);
+ str;
+);
+
+Setax(arglist):=(
+//help:Setax(["l","x","e","y","n","O","sw"]);
+//help:Setax([7,"nw"]);
+ regional(tmp);
+ tmp=Makesciarg(arglist);
+ Com1st("Setax("+tmp+")");
+);
+
+Htickmark(arglist):=(
+//help:Htickmark([1,"1",2,"sw","2"]);
+ regional(tmp);
+ tmp="";
+ tmp=Makesciarg(arglist);
+ Com2nd("Htickmark("+tmp+")");
+);
+
+Vtickmark(arglist):=(
+//help:Vtickmark([1,"1",2,"sw","2"]);
+ regional(tmp);
+ tmp=Makesciarg(arglist);
+ Com2nd("Vtickmark("+tmp+")");
+);
+
+Drwxy():=(
+//help:Drwxy();
+ Com2nd("Drwxy()");
+ Addax(0); // 16.01.21
+);
+
+Drwpt(pstr):=Drawpoint(pstr);
+Drwpt(ptlist,nn):=( // 16.03.05 from
+//help:Drwpt(A);
+//help:Drwpt("[1,1],0");
+//help:Drwpt(A,0);
+//help:Drwpt([1,2],0);
+ Drawpoint(ptlist,nn);
+);
+Drawpoint(pstr):=(
+ if(isstring(pstr),
+ println("Drwpt : "+pstr);
+ Com2nd("Drwpt("+pstr+")");
+ ,
+ Drawpoint(pstr,1);
+ );
+);
+Drawpoint(ptlistorg,nn):=(
+ regional(ptlist,thick,tmp,tmp1);
+ println("Drwpt : "+text(ptlistorg));
+ if(islist(ptlistorg),
+ if(MeasureDepth(ptlistorg)==1,
+ ptlist=ptlistorg
+ ,
+ ptlist=[ptlistorg]
+ );
+ ,
+ ptlist=[ptlistorg]
+ );
+ thick=PenThick/PenThickInit;// 16.04.09 from
+ tmp1=max(TenSize/TenSizeInit,1)/8;
+ Setpen(tmp1); // 16.04.09 upto
+ forall(ptlist,
+ tmp=textformat(#,5)+","+text(nn);
+ Com2nd("Drwpt("+tmp+")"); // 16.04.09
+ );
+ Setpen(thick); // 16.04.09
+);// 16.03.05 upto
+
+Addax(param):=(
+//help:Addax(0);
+ ADDAXES=text(param);
+);
+
+Expr(Pt,Dr,St):=Expr([Pt,Dr,St]);
+Expr(list):=Expr(list,[]);
+Expr(listorg,options):=( //16.10.09
+//help:Expr([A,"e","f(x)=x^2"]);
+ regional(list,str,tmp,tmp1,tmp2);
+ list=listorg;
+ forall(1..round(length(list)/3),
+ str=list_(3*#);
+ if(!isstring(str),str=format(str,5));
+ str="$"+str+"$";
+ list_(3*#)=str;
+ );
+ Letter(list,options);
+);
+
+Letter(Pt,Dr,St):=Letter([Pt,Dr,St]);
+Letter(list):=Letter(list,[]);
+Letter(list,options):=(
+//help:Letter([C,"c","Graph of f(x)"]);
+ regional(Nj,Pos,Dir,Str,Off,Dmv,Xmv,Ymv,Noflg,opcindy,
+ opL,aln,sz,clr,bld,ita,tmp,tmp1,tmp2);
+ tmp=Divoptions(options);
+ Noflg=tmp_2;
+ opL=select(options,indexof(#,"->")>0); //16.10.09from
+ tmp=select(opL,indexof(#,"color"));
+ size=12;
+ clr=[0,0,0];
+ bld=false;
+ ita=false;
+ aln="left";
+ forall(opL,
+ tmp=indexof(#,"->");
+ tmp1=removespace(substring(#,0,tmp-1));
+ tmp2=substring(#,tmp+1,length(#));
+ if(tmp1=="size",sz=parse(tmp2));
+ if(tmp1=="color",clr=parse(tmp2));
+ if(tmp1=="bold",bld=parse(tmp2));
+ if(tmp1=="ita",ita=parse(tmp2));
+ );//16.10.09upto
+ Off=-4;
+ Dmv=8;
+ Nj=1;
+ while(Nj+2<=length(list),
+// Pos=textformat(list_Nj,5);
+ Pos=list_Nj;
+ Dir=list_(Nj+1);
+ tmp=indexof(Dir,"s")+indexof(Dir,"n");//16.10.19from
+ if(tmp>0,
+ tmp=indexof(Dir,"w")+indexof(Dir,"e");
+ if(tmp==0,
+ Dir="c"+Dir;//16.10.08
+ );
+ );//16.10.19upto
+ Str=list_(Nj+2);
+ if(!isstring(Str),Str=format(Str,5)); // 16.09.30,10.09
+ tmp=replace(Str,".xy","");
+ tmp=replace(tmp,".x","(1)");
+ Str=replace(tmp,".y","(2)");
+ if(indexof(Str,"`")>0,
+// tmp=Dq+",Assign('"+Str+"','`',Prime()))";
+ tmp=Dq+",Assign('"+Str+"'))"; // 15.02.22
+ ,
+ tmp=Dq+","+Dq+Str+Dq+")";
+ );
+ if(Noflg==0,
+ Com2nd("Letter("+Lcrd(Pos)+","+Dq+Dir+tmp);//16.10.10
+ );
+ if(Noflg<2,
+ Xmv=0;//16.10.13
+ Ymv=-4;
+ if(indexof(Dir,"n")>0,
+ Ymv=Dmv/2;
+ );
+ if(indexof(Dir,"s")>0,
+ Ymv=-Dmv*3/2;//16.10.13
+ );
+ if(indexof(Dir,"e")>0,
+ Xmv=Dmv/2;
+ Off=0;
+ aln="left";
+ );
+ if(indexof(Dir,"w")>0,
+ Xmv=-Dmv/2;
+ Off=0; // 16.09.30from
+ aln="right";
+ );
+ if(indexof(Dir,"c")>0,
+ Xmv=0;//16.10.13
+ Off=0;
+ if(Ymv==0,Ymv=-4);//16.10.08
+ aln="mid"; // 16.09.30upto
+ );
+ drawtext(Pcrd(Pos),Str,offset->[Off+Xmv,Off+Ymv],
+ size->sz,color->clr,align->aln,bold->bld,italics->ita);//16.10.09
+ );
+ Nj=Nj+3;
+ );
+);
+
+Letterrot(pt,dir,str):=Letterrot(pt,dir,0,0,str);
+Letterrot(pt,dir,movstr,str):=(
+//help:Letterrot(C,B-A,"AB"):
+//help:Letterrot(C,B-A,0,5,"AB"):
+//help:Letterrot(C,B-A,"t0n5","AB"):
+ regional(tmov,nmov,tmp,tmp1,tmp2);
+ tmp1=indexof(movstr,"t");
+ tmp2=indexof(movstr,"n");
+ if(tmp1>0,
+ if(tmp2>0,tmp=tmp2-1,tmp=length(movstr));
+ tmov=parse(substring(movstr,tmp1,tmp));
+ ,
+ tmov=0;
+ );
+ if(tmp2>0,
+ nmov=parse(substring(movstr,tmp2,length(movstr)));
+ ,
+ nmov=0;
+ );
+ Letterrot(pt,dir,tmov,nmov,str);
+);
+Letterrot(pt,dir,tmov,nmov,str):=(
+ Letter([pt,"c",str],["notex"]);
+ Com2nd("Letterrot("+pt+","+dir+","+tmov+","+nmov+",'"+str+"')");
+);
+
+Exprrot(pt,dir,str):=Exprrot(pt,dir,0,0,str);
+Exprrot(pt,dir,movstr,str):=(
+//help:Exprrot(C,B-A,"d"):
+//help:Exprrot(C,B-A,0,5,"d"):
+//help:Exprrot(C,B-A,"t0n5","d"):
+ regional(tmov,nmov,tmp,tmp1,tmp2);
+ tmp1=indexof(movstr,"t");
+ tmp2=indexof(movstr,"n");
+ if(tmp1>0,
+ if(tmp2>0,tmp=tmp2-1,tmp=length(movstr));
+ tmov=parse(substring(movstr,tmp1,tmp));
+ ,
+ tmov=0;
+ );
+ if(tmp2>0,
+ nmov=parse(substring(movstr,tmp2,length(movstr)));
+ ,
+ nmov=0;
+ );
+ Exprrot(pt,dir,tmov,nmov,str);
+);
+Exprrot(pt,dir,tmov,nmov,str):=(
+ Expr([pt,"c",str],["notex"]);
+ Com2nd("Exprrot("+pt+","+dir+","+tmov+","+nmov+",'"+str+"')");
+);
+
+Putpoint(name,Pt):=Putpoint(name,Pt,Pt);
+Putpoint(name,Ptinit,Pt):=(
+//help:Putpoint("A",[1,2],[1,A.y]);
+ regional(ptstr);
+ ptstr=apply(allpoints(),#.name);
+ if(!contains(ptstr,name),
+ createpoint(name,Pcrd([Ptinit_1,Ptinit_2]));
+ ,
+ ptstr=name+".xy="+textformat(Pcrd(Pt),5);
+ parse(ptstr);
+ );
+);
+
+Bezierpt(t,ptlist,ctrlist):=(
+ regional(flg3,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9);
+ p0=ptlist_1;
+ p3=ptlist_2;
+ p1=ctrlist_1;
+ if(length(ctrlist)==1,
+ p2=p3;
+ flg3=0;
+ ,
+ p2=ctrlist_2;
+ flg3=1;
+ );
+ if(length(p0)<3, // 15.02.08
+ p0=Lcrd(p0);
+ p3=Lcrd(p3);
+ p1=Lcrd(p1);
+ p2=Lcrd(p2);
+ );
+ p4=(1-t)*p0+t*p1;
+ p5=(1-t)*p1+t*p2;
+ p6=(1-t)*p2+t*p3;
+ p7=(1-t)*p4+t*p5;
+ p8=(1-t)*p5+t*p6;
+ p9=(1-t)*p7+t*p8;
+ if(flg3==0,p7,p9);
+);
+
+Bezier(ptctrlist):=BezierCurve(ptctrlist_3,ptctrlist_1,ptctrlist_2,[]);
+Bezier(ptctrlist,options):=BezierCurve(ptctrlist_3,ptctrlist_1,ptctrlist_2,options);
+Bezier(nm,ptlist,ctrlist):=BezierCurve(nm,ptlist,ctrlist,[]);
+Bezier(nm,ptlist,ctrlist,options):=BezierCurve(nm,ptlist,ctrlist,options);
+BezierCurve(nm,ptlist,ctrlist):=BezierCurve(nm,ptlist,ctrlist,[]);
+BezierCurve(nm,ptlistorg,ctrlistorg,options):=(
+//help:Bezier("1",[A,D],[B,C]);
+//help:Bezier(options=["Num=10"]);
+ regional(name,Ltype,Noflg,opstr,opcindy,Num,
+ ptlist,ctrlist,tmp,tmp1,tmp2,ii,st,out,list);
+ name="bz"+nm;
+ tmp=Divoptions(options);
+ Ltype=tmp_1;
+ Noflg=tmp_2;
+ opstr=tmp_(length(tmp)-1);
+ opcindy=tmp_(length(tmp));
+ Num=10;
+ tmp1=tmp_5;
+ forall(tmp1, // 14.12.31
+ if(substring(#,0,1)=="N",
+ tmp2=indexof(#,"=");
+ Num=parse(substring(#,tmp2,length(#)));
+ opstr=opstr+","+Dq+#+Dq;
+ );
+ );
+ ptlist=apply(ptlistorg,Lcrd(#)); // 16.08.16
+ ctrlist=[]; // 14.12.31
+ if(length(ctrlistorg)==length(ptlist)-1,
+ forall(ctrlistorg,tmp1,
+ if(MeasureDepth(tmp1)==0,tmp=[tmp1],tmp=tmp1);
+ tmp=apply(tmp,Lcrd(#)); // 16.08.16
+ ctrlist=append(ctrlist,tmp);
+ );
+ ,
+ forall(1..(length(ptlist)-1),ii,
+ tmp=ctrlistorg_((2*ii-1)..(2*ii));
+ tmp=apply(tmp,Lcrd(#)); // 16.08.16
+ ctrlist=append(ctrlist,tmp);
+ );
+ );
+ if(!islist(Num),
+ Num=apply(ctrlist,Num);
+ );
+ list=[];
+ forall(1..(length(ptlist)-1),ii,
+ tmp1=ptlist_(ii..(ii+1));
+ tmp2=ctrlist_ii;
+ if(ii==1,st=0,st=1);
+ forall(st..Num_ii,
+ tmp=Bezierpt(#/Num_ii,tmp1,tmp2);
+ list=append(list,tmp);
+ );
+ );
+ if(Noflg<3,
+ println("generate Bezier "+name);
+ out=apply(list,Pcrd(#));
+ tmp=name+"="+textformat(out,5);
+ parse(tmp);
+ tmp1=textformat(ptlist,5);
+ tmp1="list("+substring(tmp1,1,length(tmp1)-1)+")";
+ tmp2=textformat(ctrlist,5);
+ tmp2="list("+substring(tmp2,1,length(tmp2)-1)+")";
+ GLIST=append(GLIST,name+"=Bezier("+tmp1+","+tmp2+opstr+")");
+ );
+ if(Noflg<2,
+ if(isstring(Ltype),
+ Ltype=GetLinestyle(text(Noflg)+Ltype,name);
+ ,
+ if(Noflg==1,Ltype=0);
+ );
+ GCLIST=append(GCLIST,[name,Ltype,opcindy]);
+ );
+ list;
+);
+
+Readcsvsla(fname):=Readplotdigdata(fname,[]);
+Readcsvsla(fname,options):=Readplotdigdata(fname,options);
+Readplotdigdata(fname):=Readplotdigdata(fname,[]);
+Readplotdigdata(fname,options):=(
+ regional(fsc,mv,cmdall,dataL,nd,npt,ptdata,ii,tmp,tmp1,tmp2,tmp3);
+ tmp=Divoptions(options);
+ tmp1=tmp_6;
+ sc=1;//10;
+ mv=[0,0];//[5,5];
+ forall(tmp1,
+ if(!islist(#),sc=#,mv=#);
+ );
+ if(indexof(fname,".")>0,
+ tmp=load(fname);
+ ,
+ tmp=load(fname+".txt");
+ );
+ cmdall=tokenize(tmp,"//");
+ dataL=[];
+ forall(2..length(cmdall),ii,
+ tmp1=parse("["+cmdall_ii+"]");
+ dataL=append(dataL,tmp1);
+ );
+ if(length(dataL_(length(dataL)))<2,
+ dataL=dataL_(1..(length(dataL)-1));
+ );
+ nd=length(dataL_1)/2;
+ npt=length(dataL);
+ ptdata=[];
+ forall(1..nd,ii,
+ tmp3=[];
+ forall(1..npt,
+ tmp1=dataL_#_(2*ii-1);
+ tmp2=dataL_#_(2*ii);
+ if(isreal(tmp1),
+ tmp3=append(tmp3,[tmp1,tmp2]);
+ );
+ );
+ ptdata=append(ptdata,tmp3);
+ );
+ tmp1=[];
+ forall(ptdata,
+ tmp=#/sc;
+ tmp=translatedata("1",[tmp],-mv,["nodata"]);
+ tmp1=append(tmp1,tmp);
+ );
+ ptdata=tmp1;
+ ptdata;
+);
+
+Putbezierdata(name,ptL):=Putbezierdata(name,ptL,[]);
+Putbezierdata(name,ptL,options):=(
+ regional(psize,Deg,tmp,tmp1,tmp2,p1,p2,pts,ctrs);
+ tmp=Divoptions(options);
+ psize=3;
+ Deg=3;
+ tmp1=tmp_5;
+ forall(tmp1,
+ if(substring(#,0,1)=="D",
+ tmp=indexof(#,"=");
+ Deg=parse(substring(#,tmp,length(#)));
+ );
+ if(substring(#,0,1)=="S",
+ tmp=indexof(#,"=");
+ psize=parse(substring(#,tmp,length(#)));
+ );
+ );
+ pts=[];
+ ctrs=[];
+ forall(1..length(ptL),
+ p2=ptL_#; // 16.08.16
+ if(ispoint(p2),
+ tmp1=text(p2);
+ ,
+ tmp1=name+text(#);
+ Putpoint(tmp1,p2,Lcrd(parse(tmp1))); // 16.08.16
+ );
+ inspect(parse(tmp1),"ptsize",psize);
+ pts=append(pts,parse(tmp1));
+ inspect(parse(tmp1),"color",4);
+ if(#>1,
+ p1=Lcrd(ptL_(#-1)); // 16.08.16
+ p2=Lcrd(ptL_#); // 16.08.16
+ if(Deg==3,
+ tmp=(2*p1+p2)/3;
+ tmp1=name+"p"+text(#-1);
+ Putpoint(tmp1,tmp,Lcrd(parse(tmp1))); // 16.08.16
+ inspect(parse(tmp1),"labeled",false); //15.01.22
+ Letter([parse(tmp1),"ne",tmp1],["notex"]); //15.01.22
+ inspect(parse(tmp1),"ptsize",psize);
+ inspect(parse(tmp1),"color",3);
+ tmp=(p1+2*p2)/3;
+ tmp2=name+"q"+text(#-1);
+ Putpoint(tmp2,tmp,Lcrd(parse(tmp2))); // 16.08.16
+ inspect(parse(tmp2),"labeled",false); //15.01.22
+ Letter([parse(tmp2),"ne",tmp2],["notex"]); //15.01.22
+ inspect(parse(tmp2),"ptsize",psize);
+ inspect(parse(tmp2),"color",3);
+ ctrs=append(ctrs,[parse(tmp1),parse(tmp2)]);
+ ,
+ tmp=(p1+p2)/2;
+ tmp1=name+"p"+text(#-1);
+ Putpoint(tmp1,tmp,Lcrd(parse(tmp1))); // 16.08.16
+ inspect(parse(tmp1),"labeled",false); //15.01.22
+ Letter([parse(tmp1),"ne",tmp1],["notex"]); //15.01.22
+ inspect(parse(tmp1),"ptsize",psize);
+ inspect(parse(tmp1),"color",3);
+ ctrs=append(ctrs,[parse(tmp1)]);
+ );
+ );
+ );
+ [pts,ctrs,name];
+);
+
+Bezierstart(n):=( // 2016.02.26
+ BezierNumber=n;
+);
+
+Mkbezierptcrv(ptdata):=Mkbezierptcrv(ptdata,[]);
+Mkbezierptcrv(ptdata,options):=(
+ //help:Mkbezierptcrv([A,B,C,D]);
+ //help:Mkbezierptcrv([[A,B],[C,D]]);
+ //help:Mkbezierptcrv(options=["Num=10"]);
+ // global BezierNumber
+ regional(ptlist,Out,tmp,tmp1,tmp2);
+ if(isstring(ptdata),
+ ptlist=Readcsvsla(ptdata,options);
+ ,
+ ptlist=ptdata;
+ );
+ if(MeasureDepth(ptlist)==1,ptlist=[ptlist]);
+ Out=[];
+ forall(1..length(ptlist),
+ tmp=floor((BezierNumber-1)/26);// 15.02.23
+ if(tmp==0,tmp="",tmp=text(tmp));
+ tmp2=mod(BezierNumber,26);
+ if(tmp2==0,tmp2=26);
+ tmp1=unicode(text(96+tmp2),base->10)+tmp;// 15.03.11
+ tmp2=Putbezierdata(tmp1,ptlist_#,options);
+ Bezier(tmp2,options);
+ BezierNumber=BezierNumber+1;
+ Out=append(Out,tmp2_(1..2));
+ );
+ Out;
+);
+
+Mkbeziercrv(nm,ptctrL):=Mkbeziercrv(nm,ptctrL,[]);
+Mkbeziercrv(nm,ptctrL,options):=(
+ //help:Mkbeziercrv("1",[[A,B,C,D],[[P,Q],[R,S],T]]);
+ regional(ptctrLL,name,ptlist,ctrlist,tmp,tmp1,tmp2);
+ if(MeasureDepth(ptctrL)==2,ptctrLL=[ptctrL],ptctrLL=ptctrL);
+ forall(1..length(ptctrLL),
+ name=nm+text(#);
+ ptlist=ptctrLL_#_1;
+ ctrlist=ptctrLL_#_2;
+ Bezier(name,ptlist,ctrlist,options);
+ );
+);
+
+Writebezier():=Writebezier(Fhead,"all");
+Writebezier(head):=Writebezier(head,"all");
+Writebezier(head,seL):=(
+//help:Writebezier(file);
+//help:Writebezier(file,"acd");
+ regional(bz,dt,name,tmp,tmp1,tmp2);
+ bz=select(GLIST,indexof(#,"=Bezier")>0);
+ tmp1=[]; // 16.04.22from
+ if(seL!="all",
+ forall(1..length(seL),
+ tmp=substring(seL,#-1,#);
+ tmp=select(bz,indexof(#,"bz"+tmp)>0);
+ tmp1=concat(tmp1,tmp);
+ );
+ bz=tmp1;// 16.04.22upto
+ );
+ dt=[head+"n",[[length(bz),0]]];
+ forall(1..length(bz),
+ tmp=indexof(bz_#,"=");
+ name=substring(bz_#,0,tmp-1);
+ tmp=indexof(bz_#,","+Dq);
+ if(tmp>0,
+ tmp1=substring(bz_#,0,tmp-1)+")";
+ ,
+ tmp1=bz_#;
+ );
+ tmp1=replace(tmp1,"Bezier(","[");
+ tmp1=replace(tmp1,"list(","[");
+ tmp1=replace(tmp1,")","]");
+ tmp1=replace(tmp1,",",".xy,");
+ tmp1=replace(tmp1,"]",".xy]");
+ tmp1=replace(tmp1,".xy,[",",[");
+ tmp1=replace(tmp1,"].xy","]");
+ tmp1=replace(tmp1,name,head+text(#));
+ parse(tmp1);
+ tmp=parse(head+text(#)+"_1");
+ dt=concat(dt,[head+text(#)+"k",tmp]);
+ tmp=parse(head+text(#)+"_2");
+ dt=concat(dt,[head+text(#)+"c",tmp]);
+ );
+ WriteOutData(head+".txt",dt);
+ dt;
+);
+
+Readbezier(file):=Readbezier(file,[]);
+Readbezier(file,optionorg):=(
+//help:Readbezier("xsr");
+//help:Readbezier(options=["Num=10","nogeo"]);
+ regional(nn,options,stL,geo,nc,alpha,out,tmp,tmp1,tmp2,tmp3);
+ options=optionorg;
+ tmp=Divoptions(options);
+ stL=tmp_7;
+ geo=0;
+ forall(stL,
+ tmp=Toupper(substring(#,0,1));
+ if(tmp=="G",geo=1);
+ options=remove(options,[#]);
+ );
+ ReadOutData(file);
+ tmp=file+"n_1_1";
+ nn=parse(tmp);
+ out=[];
+ forall(1..nn,nc,
+ tmp=file+text(nc);
+ tmp1=parse(tmp+"k");
+ tmp2=parse(tmp+"c");
+ if(MeasureDepth(tmp2)==1,tmp2=[tmp2]); // 16.04.22from
+ if(geo==1,
+ alpha="abcdefghijklmnopqrstuvwxyz";
+ forall(1..length(tmp1),
+ tmp="k"+BezierNumber+"n"+text(nc)+substring(alpha,#-1,#);
+ Putpoint(tmp,tmp1_#,parse(tmp+".xy"));
+ inspect(parse(tmp),"labeled",false);
+ inspect(parse(tmp),"ptsize",3);
+ tmp1_#=parse(tmp+".xy");
+ );
+ forall(1..length(tmp2),
+ tmp="c"+BezierNumber+"n"+text(nc)+substring(alpha,#-1,#)+"1";
+ Putpoint(tmp,tmp2_#_1,parse(tmp+".xy"));
+ inspect(parse(tmp),"labeled",false);
+ inspect(parse(tmp),"color",4);
+ inspect(parse(tmp),"ptsize",3);
+ tmp2_#_1=parse(tmp+".xy");
+ tmp="c"+BezierNumber+"no"+text(nc)+substring(alpha,#-1,#)+"2";
+ Putpoint(tmp,tmp2_#_2,parse(tmp+".xy"));
+ inspect(parse(tmp),"labeled",false);
+ inspect(parse(tmp),"color",4);
+ inspect(parse(tmp),"ptsize",3);
+ tmp2_#_2=parse(tmp+".xy");
+ );
+ BezierNumber=BezierNumber+1;
+ );
+ Bezier(file+text(nc),tmp1,tmp2,options);// 16.04.22upto
+ out=append(out,"bz"+tmp);
+ );
+ out;
+);
+
+Ospline(nm,ptlist):=Ospline(nm,ptlist,[]);
+Ospline(nm,ptlist,options):=(
+//help:Ospline("1",ptlist,[options]);
+ regional(tmp,tmp1,tmp2,list,ptL,ctrL,name,closed,flg,
+ p0,p1,p2,p3,pQ,pR,cc,p01,p02,p11,p12,p21,p22,p31,p32);
+ name="o"+nm;
+ if(isstring(ptlist),list=parse(ptlist),list=ptlist);
+ if(|list_1-list_(length(list))|<10^(-6),closed=1,closed=0);
+// list=apply(list,LLcrd(#));
+ ctrL=[];
+ forall(1..(length(list)-1),
+ flg=0;
+ p1=Lcrd(list_#); // 16.08.16
+ p2=Lcrd(list_(#+1)); // 16.08.16
+ if(#==1 % #==length(list)-1,
+ flg=1;
+ if(closed==0,
+ pQ=(p1+2*p2)/3; // 15.09.21 // 16.08.16
+ pR=(2*p1+p2)/3; // 16.08.16
+ ctrL=append(ctrL,[pQ,pR]);
+ flg=2;
+ ,
+ if(#==1,
+ p0=Lcrd(list_(length(list)-1)); // 16.08.16
+ p3=Lcrd(list_(#+2)); // 16.08.16
+ ,
+ p0=Lcrd(list_(#-1)); // 16.08.16
+ p3=Lcrd(list_2); // 16.08.16
+ );
+ );
+ );
+ if(flg<=1,
+ if(flg==0,
+ p0=Lcrd(list_(#-1)); // 16.08.16
+ p3=Lcrd(list_(#+2)); // 16.08.16
+ );
+ tmp=1+sqrt((1+Dotprod(p2-p0,p3-p1)/|p2-p0|/|p3-p1|)/2);
+ cc=4*|p2-p1|/3/(|p2-p0|+|p3-p1|)/tmp;
+ pQ=p1+cc*(p2-p0); // 15.09.21 // 16.08.16
+ pR=p2+cc*(p1-p3); // 16.08.16
+ ctrL=append(ctrL,[pQ,pR]);
+ );
+ );
+// list=apply(list,LLcrd(#)); // 16.08.16
+// ctrL=apply(ctrL,LLcrd(#));
+ if(closed==0, // 15.09.21
+ p1=ctrL_2_1;
+ p2=Lcrd(list_2); // 16.08.16
+ pQ=p2+(p2-p1);
+ ctrL_1=[pQ];
+ tmp=length(ctrL);
+ tmp1=ctrL_(tmp-1);
+ p1=ctrL_(tmp-1)_2;
+ p2=Lcrd(list_(tmp)); // 16.08.16
+ pQ=p2+(p2-p1);
+ ctrL_tmp=[pQ];
+ );
+ Bezier("o"+nm,list,ctrL,options);
+);
+
+CRspline(nm,ptL):=CRspline(nm,ptL,[]);
+CRspline(nm,ptL,options):=(
+ // Catmull-Rom spline
+//help:CRspline("1",[A,B,C,A]);
+ regional(name,ptlist,ctrpts,eqL,opcindy,c,v,tmp,tmp1,tmp2,ctrlist,cflg);
+ name="crsp"+nm;
+ if(MeasureDepth(ptL)==1,tmp=[ptL],tmp=ptL);
+ ptlist=tmp_1;
+ if(length(tmp)==1,
+ cflg=1;
+ ,
+ cflg=0;
+ ctrpts=tmp_2;
+ );
+ c=1/6;
+ tmp=Divoptions(options);
+ eqL=tmp_5;
+ opcindy=tmp_(length(tmp)); // 15.03.05
+ forall(eqL,
+ if(substring(#,0,1)=="R",
+ tmp2=indexof(#,"=");
+ c=parse(substring(#,tmp2,length(#)));
+ );
+ );
+ ptlist=apply(ptlist,Lcrd(#)); // 16.08.16
+ ctrlist=[];
+ forall(1..(length(ptlist)-1),
+ if(#==1,
+ if(cflg==0,
+ tmp1=ctrpts_1;
+ ,
+ v=ptlist_2-ptlist_(length(ptlist)-1);
+ tmp1=ptlist_#+c*v;
+ );
+ ,
+ v=ptlist_(#+1)-ptlist_(#-1);
+ tmp1=ptlist_#+c*v;
+ );
+ if(#==length(ptlist)-1,
+ if(cflg==0,
+ tmp2=ctrpts_2;
+ ,
+ v=ptlist_2-ptlist_#;
+ tmp2=ptlist_(#+1)-c*v;
+ );
+ ,
+ v=ptlist_(#+2)-ptlist_#;
+ tmp2=ptlist_(#+1)-c*v;
+ );
+ tmp=select(options,indexof(text(#),"->")>0);
+ tmp=append(tmp,"notex"); //15.03.05
+ Pointdata(name+text(#),[tmp1,tmp2],tmp);
+ ctrlist=append(ctrlist,[tmp1,tmp2]);
+ );
+ Bezier(nm,ptlist,ctrlist,options);
+);
+
+Beziersmooth(nm,ptL):=Bzspline(nm,ptL,[]);
+//help:Beziersmooth("1",[A,B,C,A]);
+Beziersmooth(nm,ptL,options):=Bzspline(nm,ptL,options);
+Bzspline(nm,ptL):=Bzspline(nm,ptL,[]);
+Bzspline(nm,ptLorg,options):=(
+ // smooth bezier
+ regional(name,Eps,ptL,pt,pt1,pt2,pt3,npt,lstr,
+ tmp,tmp1,tmp2,cflg,ctrlist);
+ name="bzsp"+nm;
+ Eps=10^(-3);
+ ptL=apply(ptLorg,Lcrd(#)); // 16.08.16
+ if(|ptL_1-ptL_(length(ptL))|<Eps,cflg=1,cflg=0);
+ forall(2..length(ptL),
+ pt=ptL_#;
+ pt1=ptL_(#-1);
+ tmp1="C"+text(#-1)+"q";
+ Putpoint(tmp1,(pt1+4*pt)/5,Lcrd(parse(tmp1))); // 16.08.16
+ );
+ forall(2..(length(ptL)-1),
+ if(#<length(ptL) % cflg==1,
+ lstr="c"+text(#);
+ pt=ptLorg_#; // 16.08.16
+ pt1=parse("C"+text(#-1)+"q");
+ create([lstr],"Join",[pt1,pt]);
+ tmp2="C"+text(#)+"p";
+ tmp=Append((2*pt.xy-pt1.xy),1);
+ create([tmp2],"PointOnLine",[parse(lstr),tmp]);
+ );
+ );
+ if(cflg==0,
+ pt=ptL_1;
+ pt1=ptL_2;
+ tmp1="C1p";
+ Putpoint(tmp1,(4*pt+pt1)/5,Lcrd(parse(tmp1))); // 16.08.16
+ );
+ if(cflg==1,
+ lstr="c1";
+ pt=ptLorg_1; // 16.08.16
+ pt1=parse("C"+text(length(ptL)-1)+"q");
+ create([lstr],"Join",[pt1,pt]);
+ tmp1="C1p";
+ tmp=Append((2*pt.xy-pt1.xy),1);
+ create([tmp1],"PointOnLine",[parse(lstr),tmp]);
+ );
+ ctrlist=[];
+ forall(1..(length(ptL)-1),
+ if(#>1 % cflg==1,
+ tmp1="c"+text(#);
+ inspect(parse(tmp1),"alpha",0.3);
+ );
+ tmp1="C"+text(#)+"p";
+ tmp2="C"+text(#)+"q";
+ inspect(parse(tmp1),"ptsize",3);
+ inspect(parse(tmp1),"color",3);
+ inspect(parse(tmp2),"ptsize",3);
+ inspect(parse(tmp2),"color",3);
+ tmp=[parse(tmp1),parse(tmp2)];
+ ctrlist=append(ctrlist,tmp);
+ );
+ Bezier(nm,ptL,ctrlist,options);
+ [ptL,ctrlist];
+);
+
+Beziersym(nm,ptL):=Bzsspline(nm,ptL,[]);
+Beziersym(nm,ptL,options):=Bzsspline(nm,ptL,options);
+Bzsspline(nm,ptL):=Bzsspline(nm,ptL,[]);
+Bzsspline(nm,ptLorg,options):=(
+ // smooth bezier with symmetric control points
+ regional(name,Eps,ptL,pt,pt1,pt2,pt3,npt,lstr,
+ tmp,tmp1,tmp2,cflg,ctrlist);
+ name="bzssp"+nm;
+ Eps=10^(-3);
+ ptL=apply(ptLorg,Lcrd(#)); // 16.08.16
+ if(|ptL_1-ptL_(length(ptL))|<Eps,cflg=1,cflg=0);
+ forall(2..length(ptL),
+ pt=ptL_#;
+ pt1=ptL_(#-1);
+ tmp1="C"+text(#-1)+"q";
+ Putpoint(tmp1,(pt1+4*pt)/5,Lcrd(parse(tmp1)));
+ );
+ forall(2..(length(ptL)-1),
+ if(#<length(ptL) % cflg==1,
+ pt=ptL_#;
+ pt1=parse("C"+text(#-1)+"q");
+ tmp2="C"+text(#)+"p=2*pt-pt1";
+ parse(tmp2);
+ );
+ );
+ if(cflg==0,
+ pt=ptL_1;
+ pt1=ptL_2;
+ Putpoint("C1p",(4*pt+pt1)/5,Lcrd(C1p)); // 16.08.16
+ inspect(C1p,"ptsize",3);
+ inspect(C1p,"color",3);
+ );
+ if(cflg==1,
+ pt=ptL_1;
+ pt1=Lcrd(parse("C"+text(length(ptL)-1)+"q")); // 16.08.16
+ tmp1="Putpoint("+Dq+"C1p"+Dq+",2*pt-pt1)"; // 16.08.16
+ parse(tmp1);
+ );
+ ctrlist=[];
+ forall(1..(length(ptL)-1),
+ tmp1="C"+text(#)+"p";
+ tmp2="C"+text(#)+"q";
+ inspect(parse(tmp2),"ptsize",3);
+ inspect(parse(tmp2),"color",3);
+ tmp=[parse(tmp1),parse(tmp2)];
+ ctrlist=append(ctrlist,tmp);
+ );
+ Bezier(nm,ptL,ctrlist,options);
+ [ptL,ctrlist];
+);
+
+Listbspline2bz(listorg):=(
+ regional(Eps,list,pcl,ptl,ctrl,k);
+ Eps=10^(-3);
+ list=apply(listorg,Lcrd(#)); // 16.08.16
+ k=length(list);
+ if(|list_1-list_k|>Eps,
+ pcl=list;
+ pcl_1=2*list_1-list_2;
+ pcl_k=2*list_k-list_(k-1);
+ ,
+ pcl=concat(list,[list_2]);
+ );
+ ctrl=apply(2..(length(pcl)-1),[pcl_#]);
+ ptl=apply(1..(length(pcl)-1),(pcl_#+pcl_(#+1))/2);
+ [ptl,ctrl];
+);
+
+Bspline(nm,ctrL):=Bspline(nm,ctrL,[]);
+Bspline(nm,ctrL,options):=(
+//help:Bspline("",[A,B,C]);
+ regional(list,tmp);
+ list=Listbspline2bz(ctrL);
+ tmp=BezierCurve("b"+nm,list_1,list_2,options);
+ tmp;
+);
+
+MeetCurve(Crv,Xorg,Yorg):=(
+ regional(Cv,tmp,tmp1,tmp2,X0,Y0,x1,x2,y1,y2,Ylist,Ban,Tate);
+ if(isstring(Crv),Cv=parse(Crv),Cv=Crv);
+ if(MeasureDepth(Cv)==2,Cv=Cv_1);
+ Cv=apply(Cv,LLcrd(#)); // 14.12.18
+ while(length(Cv)==1,
+ Cv=Cv_1;
+ );
+ Cv=apply(Cv,Lcrd(#));
+ tmp1=min(apply(Cv,#_1));
+ tmp2=max(apply(Cv,#_1));
+ if(isstring(Xorg),X0=parse(Xorg),X0=Xorg);
+ if(isstring(Yorg),Y0=parse(Yorg),Y0=Yorg);
+ if(X0<tmp1,
+ X0=tmp1;
+ ,
+ if(X0>tmp2,
+ X0=tmp2;
+ );
+ );
+ tmp1=select(
+ 1..(length(Cv)-1),Cv_#_1<=X0 & X0<=Cv_(#+1)_1);
+ tmp2=select(
+ 1..(length(Cv)-1),Cv_#_1>=X0 & X0>=Cv_(#+1)_1);
+ tmp2=remove(tmp2,common(tmp2,tmp1));
+ Ban=concat(tmp1,tmp2);
+ Tate=select(Ban,
+ abs(Cv_#_1-Cv_(#+1)_1)<=
+ 10^(-2)*abs(Cv_#_2-Cv_(#+1)_2)
+ );
+ Ban=remove(Ban,Tate);
+ Ylist=[];
+ forall(Ban,
+ tmp=Cv_#;
+ x1=tmp_1; y1=tmp_2;
+ tmp=Cv_(#+1);
+ x2=tmp_1; y2=tmp_2;
+ tmp=((x2-X0)*y1+(X0-x1)*y2)/(x2-x1);
+ Ylist=append(Ylist,tmp);
+ );
+ forall(Tate,
+ tmp=Cv_#;
+ x1=tmp_1; y1=tmp_2;
+ tmp=Cv_(#+1);
+ x2=tmp_1; y2=tmp_2;
+ tmp1=min([y1,y2]);
+ tmp2=max([y1,y2]);
+ if(Y0<tmp1,
+ tmp=tmp1;
+ ,
+ if(Y0>tmp2,
+ tmp=tmp2;
+ ,
+ tmp=Y0;
+ );
+ );
+ Ylist=append(Ylist,tmp);
+ );
+ tmp=sort(Ylist,abs(#_1-Y0));
+ [X0,tmp_1];
+);
+
+PutonLine(name,p1,p2):=PutonLine(name,p1,p2,[]);
+PutonLine(name,p1org,p2org,options):=(
+//help:PutonLine("C","sgAB");
+//help:PutonLine("C",pA,pB);
+ regional(par,p1,p2,dx,dy,tmp,tmp1,tmp2);
+ par=0.5;
+ tmp=Divoptions(options);
+ if(length(tmp_6)>0,
+ par=tmp_6_1;
+ );
+ p1=Lcrd(p1org);//16.10.11from
+ p2=Lcrd(p2org);
+ dx=p2_1-p1_1;
+ dy=p2_2-p1_2;
+ tmp1=(1-par)*p1+par*p2;
+ if(abs(dx)>abs(dy),
+ tmp=name+".x";
+ tmp2="["+tmp+",dy/dx*("+tmp+"-p1_1)+p1_2]";//16.10.11upto
+ Putpoint(name,tmp1,parse(tmp2));
+ ,
+ if(abs(dy)>0,
+ tmp=name+".y";
+ tmp2="[dx/dy*("+tmp+"-p1.y)+p1_1,"+tmp+"]";
+ Putpoint(name,tmp1,parse(tmp2));
+ ,
+ tmp2=p1;//16.10.11
+ Putpoint(name,tmp1,tmp2);
+ );
+ );
+);
+
+PutonSeg(name,sgstr):=(
+ regional(seg,p1,p2);
+ if(isstring(sgstr),seg=parse(sgstr),seg=sgstr);
+ PutonSeg(name,LLcrd(seg_1),LLcrd(seg_2));
+);
+PutonSeg(name,p1,p2):=PutonSeg(name,p1,p2,[]);
+PutonSeg(name,p1org,p2org,options):=(
+//help:PutonSeg("C","sgAB");
+//help:PutonSeg("C",pA,pB);
+ regional(par,dx,dy,p,tmp,tmp1,tmp2);
+ par=0.5;
+ tmp=Divoptions(options);
+ if(length(tmp_6)>0,
+ par=tmp_6_1;
+ );
+ p1=Lcrd(p1org);//16.10.11from
+ p2=Lcrd(p2org);
+ PutonLine(name,p1,p2,[par]);
+ dx=p2_1-p1_1;
+ dy=p2_2-p1_2;
+ p=parse(name+".xy");
+ p=LLcrd(p);
+ if(abs(dx)>abs(dy) & (p_1-p1_1)*(p_1-p2_1)>0,
+ if(|p-p1|<|p-p2|,
+ parse(name+".xy=Pcrd(p1)");
+ ,
+ parse(name+".xy=Pcrd(p2)");
+ );
+ );
+ if(abs(dx)<abs(dy) & (p_2-p1_2)*(p_2-p2_2)>0,
+ if(|p-p1|<|p-p2|,
+ parse(name+".xy=Pcrd(p1)");
+ ,
+ parse(name+".xy=Pcrd(p2)");//16.10.11upto
+ );
+ );
+);
+
+PutonCurve(pn,crv):=PutonCurve(pn,crv,[]);
+PutonCurve(pn,crv,options):=(
+//help:PutonCurve("A","gr1");
+ regional(Pmt,pstr,optionL,leftlim,rightlim,tmp,tmp1,Flg,Msg);
+ if(!islist(options),optionL=[options],optionL=options);
+ leftlim=XMIN;
+ rightlim=XMAX;
+ Flg=0;
+ Msg="y";
+ forall(optionL,
+ if(isstring(#), // 16.02.10 from
+ tmp=indexof(#,"=");
+ tmp1=Toupper(substring(#,tmp,tmp+1));
+ if(tmp1=="N", Msg="n"); // 16.02.10 upto
+ ,
+ if(Flg==0,
+ leftlim=#;
+ Flg=Flg+1;
+ ,
+ rightlim=#;
+ );
+ );
+ );
+ Pmt=MeetCurve(crv,leftlim,0);
+ pstr=apply(allpoints(),textformat(#,5)); // 15.04.07
+ if(!contains(pstr,pn),
+ createpoint(pn,Pcrd(Pmt));
+ ,
+ tmp1=parse(pn+".x");
+ if(tmp1< leftlim % tmp1>rightlim,
+ if(tmp1< leftlim,tmp= leftlim, tmp=rightlim);
+ Pmt=MeetCurve(crv,textformat(tmp,5),pn+".y");
+ ,
+ Pmt=MeetCurve(crv,pn+".x",pn+".y");
+ );
+ ptstr=pn+".xy="+textformat(Pcrd(Pmt),5)+";";
+ parse(ptstr);
+ );
+ if(Msg=="y",
+ println("Put "+pn+" on Curve "+text(crv));
+ );
+);
+
+CrossPoint(name,Crv1,Crv2,range):=(
+ regional(Mx1,Mx2,Mx3,tmp,Crs1,Crs2,Crs3,Crs4,df1,df2);
+ Mx1=range_1; Mx2=range_2;
+ repeat(15,
+ Mx3=(Mx1+Mx2)/2;
+ Crs1=MeetCurve(Crv1,Mx1,0);
+ Crs2=MeetCurve(Crv2,Mx1,0);
+ Crs3=MeetCurve(Crv1,Mx3,0);
+ Crs4=MeetCurve(Crv2,Mx3,0);
+ df1=Crs1_2-Crs2_2;
+ df2=Crs3_2-Crs4_2;
+ if((df1>0 & df2>0) % (df1<0 & df2<0),
+ Mx1=Mx3;
+ ,
+ Mx2=Mx3;
+ );
+ );
+ Putpoint(name,Crs1);
+);
+
+Setscaling(sc):=(
+//help:Setscaling(3);
+ SCALEX=1;
+ SCALEY=sc;
+ Com0th("Setscaling("+sc+")");
+ Setwindow("Msg=no");
+);
+
+Tabledatalight(nm,xLst,yLst,rmvL):=Tabledatalight(nm,xLst,yLst,rmvL,[]);
+Tabledatalight(nm,xLst,yLst,rmvL,options):=(
+//help:Tabledatalight("",xLst,yLst,rmvL,[2]);
+ regional(name,upleft,ul,flg,tick,n,m,xsize,ysize,rlist,clist,Tb,
+ tmp,tmp1,tmp2,tmp3,Eps);
+// name="tb"+nm;
+ name="tb";
+ println("Tabledatalight "+name+" generated");
+ tmp=sum(yLst);
+ upleft=[0,tmp];
+ tick=1;
+ tmp=Divoptions(options);
+ flg=0;
+ forall(tmp_6,
+ if(flg==0,
+ tick=#;
+ flg=flg+1;
+ ,
+ upleft=tmp_6_1;
+ );
+ );
+ ul=upleft/10;
+ m=length(xLst);
+ n=length(yLst);
+ xsize=sum(xLst);
+ ysize=sum(yLst);
+ clist=[ul];
+ rlist=[ul];
+ forall(1..m,
+ tmp1=clist_(#)_1+xLst_#/10;
+ clist=append(clist,[tmp1,clist_1_2]);
+ );
+ forall(1..n,
+ tmp1=rlist_(#)_2-yLst_#/10;
+ rlist=append(rlist,[0,tmp1]);
+ );
+ Tb=[clist,rlist];
+ tmp=name+"="+Tb;
+ parse(tmp);
+ forall(0..m,
+ tmp1="c"+text(#)+"r0";
+ tmp2="c"+text(#)+"r"+text(n);
+ Tlistplot("c"+text(#)+"r0r"+text(n),[tmp1,tmp2],options);
+ if(mod(#,tick)==0 % #==m,
+ tmp=clist_(#+1);
+ drawtext(clist_(#+1)-[0.04,-0.1],"c"+text(#));
+ );
+ );
+ forall(0..n,
+ tmp1="c0r"+text(#);
+ tmp2="c"+text(m)+"r"+text(#);
+ Tlistplot("r"+text(#)+"c0c"+text(m),[tmp1,tmp2],options);
+ if(mod(#,tick)==0 % #==n,
+ tmp=rlist_(#+1);
+ drawtext(rlist_(#+1)-[0.4,0.1],"r"+text(#));
+ );
+ );
+ Tsegrmv(rmvL,options);
+ Addax(0);
+ Eps=10^(-3);
+ tmp1=clist_(length(clist));
+ tmp2=rlist_1;
+ tmp3=rlist_(length(rlist));
+ Setwindow([0-Eps,tmp1_1+Eps],[tmp3_2-Eps,tmp2_2+Eps]);
+ Tb;
+);
+
+Tabledata(nm,n,m,xsize,ysize,rmvL):=
+ Tabledata(nm,n,m,xsize,ysize,rmvL,[]);
+Tabledata(nm,n,m,xsize,ysize,rmvL,options):=(
+ regional(Tb,name,tmp,xLst,yLst);
+ name="tb"+nm;
+ xLst=apply(1..n,xsize/n);
+ yLst=apply(1..m,ysize/m);
+ Tabledata(nm,xLst,yLst,rmvL,options)
+);
+Tabledata(nm,xLst,yLst,rmvL):=Tabledata(nm,xLst,yLst,rmvL,[]);
+Tabledata(nm,xLst,yLst,rmvL,options):=(
+//help:Tabledata("",xLst,yLst,rmvL,[2]);
+ regional(name,upleft,ul,flg,tick,n,m,xsize,ysize,rlist,clist,Tb,
+ tmp,tmp1,tmp2,tmp3,Eps);
+// name="tb"+nm;
+ name="tb";
+ println("Tabledata "+name+" generated");
+ tmp=sum(yLst);
+ upleft=[0,tmp];
+ tick=1;
+ tmp=Divoptions(options);
+ flg=0;
+ forall(tmp_6,
+ if(flg==0,
+ tick=#;
+ flg=flg+1;
+ ,
+ upleft=tmp_6_1;
+ );
+ );
+ ul=upleft/10;
+ m=length(xLst);
+ n=length(yLst);
+ xsize=sum(xLst);
+ ysize=sum(yLst);
+ clist=[ul];
+ rlist=[ul];
+ forall(1..m,
+ tmp1=clist_(#)_1+xLst_#/10;
+ clist=append(clist,[tmp1,clist_1_2]);
+ );
+ forall(1..n,
+ tmp1=rlist_(#)_2-yLst_#/10;
+ rlist=append(rlist,[0,tmp1]);
+ );
+ Tb=[clist,rlist];
+ tmp=name+"="+Tb;
+ parse(tmp);
+ forall(0..m,
+ tmp="C"+text(#);
+ tmp1="c"+text(#)+"r0";
+ if(#==0,
+ Putpoint(tmp,Tgrid(tmp1));
+ ,
+ Putpoint(tmp,Tgrid(tmp1),[parse(tmp+".x"),C0.y]);
+ clist_(#+1)=parse(tmp+".xy");
+ );
+ inspect(parse(tmp),"ptsize",3);
+ inspect(parse(tmp),"labeled",false);
+ if(mod(#,tick)==0 % #==m,
+ tmp=clist_(#+1);
+ drawtext(clist_(#+1)-[0.04,-0.1],"c"+text(#));
+ );
+ );
+ forall(0..n,
+ tmp="R"+text(#);
+ tmp1="c0r"+text(#);
+ if(#==0,
+ Putpoint(tmp,Tgrid(tmp1));
+ ,
+ Putpoint(tmp,Tgrid(tmp1),[R0.x,parse(tmp+".y")]);
+ rlist_(#+1)=parse(tmp+".xy");
+ );
+ Putpoint(tmp,Tgrid(tmp1),[R0.x,parse(tmp+".y")]);
+ inspect(parse(tmp),"ptsize",3);
+ inspect(parse(tmp),"labeled",false);
+ if(mod(#,tick)==0 % #==n,
+ tmp=rlist_(#+1);
+ drawtext(rlist_(#+1)-[0.4,0.1],"r"+text(#));
+ );
+ );
+ Tb=[clist,rlist];
+ tmp=name+"="+Tb;
+ parse(tmp);
+ forall(0..m,
+ tmp1="c"+text(#)+"r0";
+ tmp2="c"+text(#)+"r"+text(n);
+ Tlistplot("c"+text(#)+"r0r"+text(n),[tmp1,tmp2],options);
+ if(#<m,
+ tmp1=parse("C"+text(#));
+ tmp2=parse("C"+text(#+1));
+ tmp=(tmp1.xy+tmp2.xy)/2;
+ drawtext(tmp+[-0.2,0.5],text((tmp2.x-tmp1.x)*10));
+ );
+ );
+ forall(0..n,
+ tmp1="c0r"+text(#);
+ tmp2="c"+text(m)+"r"+text(#);
+ Tlistplot("r"+text(#)+"c0c"+text(m),[tmp1,tmp2],options);
+ if(#<n,
+ tmp1=parse("R"+text(#));
+ tmp2=parse("R"+text(#+1));
+ tmp=(tmp1.xy+tmp2.xy)/2;
+ drawtext(tmp-[1.2,0.1],text(abs(tmp1.y-tmp2.y)*10));
+ );
+ );
+ Tsegrmv(rmvL,options);
+ Addax(0);
+ Eps=10^(-3);
+ tmp1=clist_(length(clist));
+ tmp2=rlist_1;
+ tmp3=rlist_(length(rlist)); // 15.06.11
+ Setwindow([0-Eps,tmp1_1+Eps],[tmp3_2-Eps,tmp2_2+Eps]);
+ Tb;
+);
+
+Tseginfo(seg):=(
+ regional(cr,tp,tpc,n1,n2,n3,tmp,tmp1,tmp2);
+ if(substring(seg,0,2)=="sg",
+ cr=substring(seg,2,length(seg));
+ ,
+ cr=seg;
+ );
+ tp=substring(cr,0,1);
+ if(tp=="c",
+ tpc="r";
+ ,
+ tpc="c";
+ );
+ tmp1=indexof(cr,tpc);
+ tmp=substring(cr,tmp1,length(cr));
+ tmp2=tmp1+indexof(tmp,tpc);
+ n1=substring(cr,1,tmp1-1);
+ n2=substring(cr,tmp1,tmp2-1);
+ n3=substring(cr,tmp2,length(cr));
+ [tp+n1,tpc,parse(n2),parse(n3)];
+);
+
+Tsegrmv(rmvL):=Tsegrmv(rmvL,[]);
+Tsegrmv(rmvL,options):=(
+ regional(cr,gcL,flg,gc,hd,tail,tpc,m1,m2,n1,n2,tmp,tmp1,tmp2);
+ forall(rmvL,cr,
+ tmp1=Tseginfo(cr);
+ hd=tmp1_1;
+ tpc=tmp1_2;
+ m1=tmp1_3;
+ m2=tmp1_4;
+ gcL=select(GCLIST,Tseginfo(#_1)_1==tmp1_1);
+ flg=0;
+ forall(gcL,
+ if(flg==0,
+ tmp=Tseginfo(#_1);
+ n1=tmp_3;
+ n2=tmp_4;
+ if(m1>=n1 & m2<=n2,
+ gc=#;
+ flg=1;
+ );
+ );
+ );
+ if(flg==1,
+ Changestyle([gc_1],["nodisp"]);
+ tail="";
+ if(indexof(hd,"r")>0,
+ tail=hd; hd="";
+ );
+ if(n1<m1,
+ tmp1=tpc+text(n1);
+ tmp2=tpc+text(m1);
+ tmp=hd+tail+tmp1+tmp2;
+ Tlistplot(tmp,[hd+tmp1+tail,hd+tmp2+tail],options);
+ );
+ if(m2<n2,
+ tmp1=tpc+text(m2);
+ tmp2=tpc+text(n2);
+ tmp=hd+tail+tmp1+tmp2;
+ Tlistplot(tmp,[hd+tmp1+tail,hd+tmp2+tail],options);
+ );
+ );
+ );
+);
+
+Tgrid(ptstr):=(
+//help:Tgrid("c2r5");
+ regional(tmp,tmp1,tmp2);
+ tmp=parse(ptstr);
+ if(islist(tmp),
+ tmp;
+ ,
+ tmp=indexof(ptstr,"r");
+ tmp1=substring(ptstr,1,tmp-1);
+ tmp1=parse(tmp1);
+ tmp2=substring(ptstr,tmp,length(ptstr));
+ tmp2=parse(tmp2);
+ [tb_1_(tmp1+1)_1,tb_2_(tmp2+1)_2];
+ );
+);
+
+Tlistplot(ptL):=Tlistplot(ptL,[]);
+Tlistplot(Ag1,Ag2):=(
+ regional(nm,ptL,options);
+ if(isstring(Ag1),
+ nm=Ag1;
+ ptL=Ag2;
+ options=[];
+ ,
+ ptL=Ag1;
+ options=Ag2;
+ nm=ptL_1+ptL_2;
+ );
+ Tlistplot(nm,ptL,options);
+);
+Tlistplot(nm,ptL,options):=(
+//help:Tlistplot(["c0r0","c0r4"]);
+//help:Tlistplot("1",["c0r0","c0r4"]);
+ regional(tmp);
+ tmp=apply(ptL,Tgrid(#)); // 15.06.03
+ Listplot(nm,tmp,append(options,"Msg=no"));
+);
+
+ChangeTablestyle(nameL,style):=(
+////help:ChangeTablestyle(["r0c0c3"],["da"]);
+ regional(nmL,tmp,tmp1,tmp2);
+ if(islist(nameL),nmL=nameL,nmL=[nameL]);
+ nmL=apply(nmL,"sg"+#);
+ nmL=select(nmL,islist(parse(#)));
+ Changestyle(nmL,style);
+);
+
+Findcell(pos1,pos2):=Findcell("",pos1,pos2);
+Findcell(Tbdata,pos1,pos2):=(
+//help:Findcell("c0r0","c2r1");
+ regional(tmp1,tmp2,posnw,posse,ctr,dx,dy);
+ if(isstring(pos1),
+ posnw=Tgrid(pos1); // 15.05.20
+ posse=Tgrid(pos2);
+ //posnw=parse(pos1);
+ //posse=parse(pos2);
+ ,
+ if(islist(pos1),
+ posnw=pos1;
+ posse=pos2;
+ ,
+ tmp1="c"+text(pos1-1)+"r"+text(pos2-1);
+ tmp2="c"+text(pos1)+"r"+text(pos2);
+ posnw=Tgrid(tmp1);
+ posse=Tgrid(tmp2);
+// posnw=parse(tmp1);
+// posse=parse(tmp2);
+ );
+ );
+ ctr=(posnw+posse)/2;
+ dx=abs(posse_1-ctr_1);
+ dy=abs(posnw_2-ctr_2);
+ [ctr,dx,dy];
+);
+
+Putcell(pos1,pos2,dir,lttr):=Putcell("",pos1,pos2,dir,lttr);
+Putcell(Tbdata,pos1,pos2,dir,lttr):=(
+//help:Putcell("c0r0","c2r1","lt","abc");
+//help:Putcell(2,3,"c","xyz");
+ regional(tmp,tmp1,tmp2,posnw,posse,
+ posdir,posstr,ctr,dx,dy);
+ tmp=Findcell(Tbdata,pos1,pos2);
+ ctr=tmp_1; dx=tmp_2; dy=tmp_3;
+ posdir=ctr;
+ posstr=dir;
+ if(indexof(dir,"b")>0,
+ posdir_2=posdir_2-dy;
+ posstr=replace(posstr,"b","n");
+ );
+ if(indexof(dir,"t")>0,
+ posdir_2=posdir_2+dy;
+ posstr=replace(posstr,"t","s");
+ );
+ if(indexof(dir,"l")>0,
+ posdir_1=posdir_1-dx;
+ posstr=replace(posstr,"l","e");
+ );
+ if(indexof(dir,"r")>0,
+ posdir_1=posdir_1+dx;
+ posstr=replace(posstr,"r","w");
+ );
+ Letter(posdir,posstr,text(lttr));
+);
+
+Putcellexpr(pos1,pos2,dir,ex):=Putcellexpr("",pos1,pos2,dir,ex);
+Putcellexpr(Tbdata,pos1,pos2,dir,ex):=(
+//help:Putcellexpr("c0r0","c2r1","lt","abc");
+//help:Putcellexpr(2,3,"c","\sin x");
+ Putcell(Tbdata,pos1,pos2,dir,"$"+text(ex)+"$");
+);
+
+Putrow(nrow,dir,lttrL):=Putrow("",nrow,dir,lttrL);
+Putrow(Tbdata,nrow,dir,lttrL):=(
+//help:Putrow(1,"c",["x","y","z"]);
+ regional(tmp,tmp1,mcol);
+ mcol=length(lttrL);
+ forall(1..mcol,
+ Putcell(Tbdata,#,nrow,dir,lttrL_#);
+ );
+);
+
+Putrowexpr(nrow,dir,exL):=Putrowexpr("",nrow,dir,exL);
+Putrowexpr(Tbdata,nrow,dir,exL):=(
+//help:Putrowexpr(2,"r",["x","y","z"]);
+ regional(lttrL);
+ lttrL=apply(exL,"$"+#+"$");
+ Putrow(Tbdata,nrow,dir,lttrL);
+);
+
+PutcoL(mcol,dir,lttrL):=PutcoL("",mcol,dir,lttrL);
+PutcoL(Tbdata,mcol,dir,lttrL):=(
+//help:PutcoL(1,"c",["x","y","z"]);
+ regional(tmp,tmp1,nrow);
+ nrow=length(lttrL);
+ forall(1..nrow,
+ Putcell(Tbdata,mcol,#,dir,lttrL_#);
+ );
+);
+PutcoLexpr(mcol,dir,exL):=PutcoLexpr("",mcol,dir,exL);
+PutcoLexpr(Tbdata,mcol,dir,exL):=(
+//help:PutcoLexpr(2,"r",["x","y","z"]);
+ regional(lttrL);
+ lttrL=apply(exL,"$"+#+"$");
+ PutcoL(Tbdata,mcol,dir,lttrL);
+);
+
+Setwindow():=Setwindow("Msg=yes");
+Setwindow(str):=(
+ regional(tmp,tmp1,tmp2,msg);
+ msg="y";
+ tmp=indexof(str,"="); // 16.02.10
+ tmp1=Toupper(substring(str,tmp,tmp+1));
+ if(tmp1=="N",msg="n");
+ if((ispoint(SW) & ispoint(NE)),
+ tmp1=Lcrd(SW);
+ tmp2=Lcrd(NE);
+ XMIN=tmp1_1; XMAX=tmp2_1;
+ YMIN=tmp1_2; YMAX=tmp2_2;
+ ,
+// XMIN=-5; XMAX=5;
+// YMIN=Lcrdy(-5); YMAX=Lcrdy(5);
+ createpoint("SW",Pcrd([XMIN,YMIN]));
+ createpoint("NE", Pcrd([XMAX,YMAX]));
+ );
+ if(msg=="y",
+ println("Setwindow(["+XMIN+","+XMAX+"],["+YMIN+","+YMAX+"])");
+ );
+ layer(KETPICLAYER);
+ autoclearlayer(KETPICLAYER,true);
+ drawpoly([Pcrd([XMIN,YMIN]), Pcrd([XMAX,YMIN]),
+ Pcrd([XMAX,YMAX]),Pcrd([XMIN,YMAX])],color->[1,1,1]);
+);
+Setwindow(xrange,yrange):=(
+//help:Setwindow([2,3],[-1,1]);
+ XMIN=xrange_1;
+ XMAX=xrange_2;
+ YMIN=yrange_1;
+ YMAX=yrange_2;
+// Setwindow();
+);
+
+Sciform(list):=(
+ regional(plotlist,comp,pos,out,out2,nn,strL,flg,
+ tmp,tmp1,tmp2,tmp3,Nj);
+ plotlist=Flatten([list]);
+ out=replace(plotlist_1,".xy","");
+ out=replace(out,".x","(1)");
+ out=replace(out,".y","(2)");
+ if(length(plotlist)==1,
+ comp=[];
+ forall(1..length(out),
+ comp=append(comp,substring(out,#-1,#));
+ );
+ out="";
+ pos=0;
+ forall(comp,
+ if(#!="'",
+ out=out+#;
+ ,
+ if(pos==0,
+ tmp=indexof(out,"Assign(");
+ if(substring(out,length(out)-7,length(out))=="Assign(",
+ out=out+"'";
+ pos=1;
+ ,
+ out=out+"Assign('";
+ pos=2;
+ );
+ ,
+ if(pos==2,
+ out=out+"')";
+ ,
+ out=out+"'";
+ );
+ pos=0;
+ );
+ );
+ );
+ ,
+ forall(2..length(plotlist),
+ comp=plotlist_#;
+ if(isstring(comp),
+ pos=indexof(comp,"Assign(");
+ if(pos>0,
+ comp=substring(comp,6,length(comp));
+ );
+ out=out+"Assign(";
+ comp=replace(comp,".xy","");
+ comp=replace(comp,".x","(1)");
+ comp=replace(comp,".y","(2)");
+ out=out+"'"+comp+"'";
+ out=out+"),";
+ );
+ if(islist(comp),
+ forall(comp,
+ out=out+"'"+#+"',";
+ );
+ );
+ );
+ if(length(plotlist)>1,
+ out=substring(out,0,length(out)-1);
+ out=out+");";
+ );
+ );
+ pos=[];
+ forall(1..length(out),
+ tmp=indexof(substring(out,#-1,length(out)),"Assign");
+ if(tmp>0,
+ tmp1=#-1+tmp;
+ if(length(pos)==0,
+ pos=[tmp1];
+ ,
+ if(pos_(length(pos))<tmp1,
+ pos=append(pos,tmp1);
+ );
+ );
+ );
+ );
+ if(length(pos)>0,
+ strL=[];
+ Nj=0;
+ forall(pos,
+ tmp=substring(out,Nj,#-1);
+ strL=append(strL,tmp);
+ Nj=#-1;
+ );
+ strL=append(strL,substring(out,Nj,length(out)));
+ out="";
+ forall(strL,
+ if(indexof(#,"Assign")==0,
+ out=out+#;
+ ,
+ tmp=indexof(#,"('");
+ tmp1=indexof(#,"')");
+ tmp2=substring(#,tmp+1,tmp1-2);
+ tmp3=substring(#,tmp1-2,length(#));
+ if(indexof(tmp2,"=")==0,
+ out=out+#;
+ ,
+ tmp=substring(tmp2,0,indexof(tmp2,"="));
+ out=out+"'"+tmp+"'+"+"Assign('";
+ tmp=substring(tmp2,indexof(tmp2,"="),length(tmp2));
+ out=out+tmp+tmp3;
+ );
+ );
+ );
+ );
+ out2=""; // patched 16.01.21 from
+ nn=length(out);
+ flg=0;
+ forall(1..nn,
+ if(flg==0,
+ tmp=indexof(out,"='+Assign('");
+ if(tmp==0,
+ out2=out2+out;
+ flg=1;
+ ,
+ out2=out2+substring(out,0,tmp);
+ out=substring(out,tmp+10,length(out));
+ tmp=indexof(out,"'"); // 16.04.19 from
+ tmp1=substring(out,0,tmp-1);
+ tmp2="1234567890";
+ tmp=apply(1..length(tmp1),
+ indexof(tmp2,substring(tmp1,#-1,#)));
+ tmp=min(tmp);
+ if(tmp==0, // 16.04.19 upto
+ out2=out2+"'+Assign('";
+ ,
+ tmp=indexof(out,"'");
+ out=substring(out,0,tmp)+substring(out,tmp+1,length(out)); // 16.04.18 upto
+ );
+ );
+ );
+ );
+ out2=replace(out2,"Dist=","D=");
+ out2=replace(out2,"Dis=","D=");
+ out2;
+);
+
+
+Rform(list):=(
+ regional(plotlist,comp,pos,out,strL,tmp,tmp1,tmp2,tmp3,Nj);
+ out=list;
+ out=replace(out,"[[[","list([[");
+ out=replace(out,"[","c(");
+ out=replace(out,"]",")");
+ out=replace(out,".xy","");
+ out=replace(out,".x","[1]");
+ out=replace(out,".y","[2]");
+ out;
+);
+
+Defvar(varstr):=(
+ regional(name,value,tmp,tmp1);
+ parse(varstr);
+ tmp=indexof(varstr,"=");
+ name=substring(varstr,0,tmp-1);
+ value=substring(varstr,tmp,length(varstr));
+ value=parse(value);
+ tmp1=select(1..length(VLIST),VLIST_#_1==name+"=");
+ if(length(tmp1)>0,
+ tmp=tmp1_1;
+ VLIST_tmp=[name+"=",value];
+ ,
+ VLIST=prepend([name+"=",value],VLIST);
+ );
+);
+
+Defvar(name,value):=(
+//help:Defvar("a",0.3);
+ regional(tmp,tmp1);
+ if(islist(value),
+ tmp1="[";
+ forall(value,
+ tmp1=tmp1+format(#,5)+",";
+ );
+ tmp1=substring(tmp1,0,length(tmp1)-1)+"]";
+ ,
+ tmp1=format(value,5);
+ );
+ tmp=name+"="+tmp1; // 15.02.06
+ parse(tmp);
+ VLIST=select(VLIST,#_1!=name+"="); // 15.02.08
+ VLIST=prepend([name+"=",value],VLIST);
+);
+
+Iftosci(strorg):=( // 16.06.10
+ regional(str,ifL,ppL,cpL,kk,sL,
+ tmp,tmp1,tmp2,tmp3,tmp4);
+ str=replace(strorg,LFmark,"");
+ ifL=Indexall(str,"if(");
+ ppL=Bracket(str,"()");
+ cpL=Indexall(str,",");
+ tmp1=Bracket(str,"[]");
+ forall(1..(length(tmp1)/2),kk,
+ cpL=select(cpL,#<tmp1_(2*kk-1)_1%#_1>tmp1_(2*kk)_1);
+ );
+ forall(1..length(ifL),kk,
+ tmp=select(ppL,#_1>ifL_kk);
+ tmp1=tmp_1;
+ tmp2=select(tmp,#_2==-tmp1_2);
+ tmp2=tmp2_1;
+ tmp3=select(cpL,#>tmp1_1 & #<tmp2_1);
+ ifL_kk=[tmp1_1,tmp2_1,tmp1_2,tmp3];
+ );
+ forall(1..length(cpL),kk,
+ tmp=select(1..length(ifL),contains(ifL_#_4,cpL_kk));
+ tmp1=tmp_(length(tmp));
+ cpL_kk=[cpL_kk,tmp1];
+ );
+ sL=apply(1..length(str),substring(str,#-1,#));
+ forall(1..length(ifL),kk,
+ tmp1=ifL_kk_1;
+ tmp2=ifL_kk_2;
+ tmp=select(cpL,#_2==kk);
+ tmp3=apply(tmp,#_1);
+ sL_tmp1=" ";
+ sL_tmp2=";end;";
+ sL_(tmp3_1)=" then,";
+ if(length(tmp3)>1,
+ sL_(tmp3_2)=";else,";
+ );
+ );
+ tmp=sum(sL);
+);
+
+Fortosci(strorg):=(
+ regional(str,jj,var,tmp,tmp1,tmp2,tmp3,tmp4,
+ Out,repL,Pflg,Iflg,Cflg);
+ str=strorg;
+ repL=[];
+ tmp1=Indexall(str,"forall");
+ tmp2=Indexall(str,",");
+ forall(1..length(tmp1),jj,
+ tmp=select(tmp2,#>tmp1_jj);
+ var=substring(str,tmp_1,tmp_2-1);
+ tmp3=substring(str,tmp1_jj-1,tmp_2-1);
+ tmp=indexof(tmp3,"(");
+ tmp4=substring(tmp3,tmp,length(tmp3));
+ tmp=indexof(tmp4,",");
+ tmp4=substring(tmp4,0,tmp-1);
+ tmp4="for "+var+"="+tmp4;
+ tmp4=replace(tmp4,"..",":");
+ repL=concat(repL,[tmp3,tmp4]);
+ );
+ forall(1..length(repL)/2,
+ str=replace(str,repL_(2*#-1),repL_(2*#));
+ );
+ tmp=Bracket(str);
+ tmp=select(tmp,#_2==0);
+ tmp=tmp_1_1;
+ tmp1=substring(str,tmp-1,length(str));
+ tmp1=replace(tmp1,")",";end");
+ str=substring(str,0,tmp-1)+tmp1;
+ str=replace(str,";;",";");
+ str;
+);
+
+Deffun(name,bodylist):=(
+//help:Deffun("f(x)",["regional(y)","y=x^2*(x-3)","y"]); // 16.02.18
+ regional(funstr,tmp,tmp1,str,Pos);
+ funstr=name+":=(";
+ forall(bodylist,
+ funstr=funstr+#+";";
+ );
+ funstr=funstr+");";
+ parse(funstr);
+ tmp=bodylist_(length(bodylist));
+ str="function "+tmp+"="+name+",";
+ forall(1..(length(bodylist)-1),
+ tmp1=bodylist_#;
+ tmp1=replace(tmp1,LFmark,"");// 16.05.26
+ tmp1=replace(tmp1," ","");// 16.05.26
+ Pos=indexof(tmp1,"regional")+indexof(tmp1,"local");
+ if(Pos==0,
+ tmp=replace(tmp1,".xy","");
+ tmp=replace(tmp,".x","(1)");
+ tmp=replace(tmp,".y","(2)");
+ if(indexof(tmp,"if(")>0,
+ tmp=iftosci(tmp);
+ );
+ if(indexof(tmp,"forall(")>0, // 16.05.26from
+ tmp=Fortosci(tmp);
+ ); // 16.05.26upto
+ str=str+tmp+",";
+ );
+ );
+ str=str+"endfunction;";
+ FUNLIST=append(FUNLIST,str);
+);
+
+Windispg():=(
+ regional(Nj,Nk,Dt,Vj,tmp,tmp1,tmp2,tmp3,opcindy);
+ gsave();
+ layer(KETPIClayer);
+ forall(GCLIST,Nj,
+ if(isstring(Nj_1),Dt=parse(Nj_1),Dt=Nj_1); // 11.17
+ if(islist(Dt) & length(Dt)>0, // 12.19,12.22
+ tmp=MeasureDepth(Dt);
+ if(tmp==1,Dt=[Dt]);
+ opcindy=Nj_3;
+ if(Nj_2<0,tmp1=0,tmp1=Nj_2);
+ if(tmp1<10,
+ forall(Dt,Nk,
+// tmp2=apply(Nk,if(ispoint(#),Lcrd(#),#));
+// tmp2=apply(tmp2,Pcrd(#));
+ tmp2=Nk; // 14.12.04
+ if(length(Nk)>1,
+ forall(2..length(Nk),
+ tmp3=textformat(Nk_[#-1,#],5);
+ tmp3=substring(tmp3,1,length(tmp3)-1);
+ if(tmp1==1,opcindy=opcindy+",dashpattern->[2,2]");
+ tmp="draw("+tmp3+
+ ",dashtype->"+text(tmp1)+",linecolor->"+KCOLOR+opcindy+")";
+ parse(tmp);
+ );
+ ,
+ if(length(Nk)==1,
+ tmp="draw("+text(tmp2_1)+opcindy+")"; // 14.12.31
+ parse(tmp);
+ );
+ );
+ );
+ );
+ );
+ );
+// if(ADDAXES=="1", // 16.10.08from
+// draw([XMIN,0],[XMAX,0],color->[0,0.2,0]);
+// draw([0,YMIIN],[0,YMAX],color->[0,0.2,0]);
+// Letter([[XMAX,0],"e","x",[0,YMAX],"n","y"]);
+// Letter([[0,0],"sw","O"]);
+// ); // 16.10.08upto
+ grestore();
+ layer(0);
+);
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/READMEj(kobayashi-suzuki).txt b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/READMEj(kobayashi-suzuki).txt
new file mode 100644
index 00000000..897ac82f
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/READMEj(kobayashi-suzuki).txt
@@ -0,0 +1,116 @@
+ʓʑʑ́iy-ʑ́j̍Wf[^ɂ‚ 1994N622
+
+PD͂߂
+
+ R[NbhԂ̑ʑ̂̒ŁCgӂ̒̓p`
+ɂ“ʑp`h́Cʓʑʑ(regular-faced convex polyhedron)ƌ
+΂Ă܂Dʓʑʑ̂́Cʑ́Cʑ́CpCp
+ 92 ނ݂܂D̂ƂؖVictor A.
+Zalgaller(1) ɂȂŁCʓʑʑ̂͂y-ʑ(Z-polyhedron)ƂĂ
+Ă܂D
+
+ ʓʑʑ̖̂͌^́CȂǂŊȒPɍ邱Ƃł܂C_̍W
+vZ邱ƂC܂ŃRs[^ɂ\͍łD
+́Cʑ̂̃Ot\𗘗pvZASYlĂCTƐ
+lvZɂĂׂĂ̐ʓʑp`̒_̈ʒuW߂܂(2)D
+̍Wf[^͂܂܂ȗprɗpłƎv܂̂ŁCɌJ
+܂Dǂ𗧂ĉD
+
+ Wf[^͎RɔzzĂĂ܂܂DCf[^ɂ
+K̃hLgYĉDȂCWf[^̗pɊւĔ
+؂̏Qɂ‚ĐӔC𕉂˂܂̂ŁC䗹D
+
+ dCʐMw Hw v
+ 182 szszu1-5-1
+ j 񎑗 쎡
+ 285 tqs117
+ E-mail: suzuki@alp0.cs.uec.ac.jp
+ suz-tak@tansei.cc.u-tokyo.ac.jp
+
+F
+(1) Zalgaller,V.A.: Convex Polyhedra with Regular Faces(p),
+Consultants Bureau, 1969. ( Zalgaller,B.A.: Vypuklye
+Mnogogranniki c Pravil'nymi Granyami, Nauka Press, 1966.)
+(2) ьv, ؑ쎡: p`ʂɂ‚ׂĂ̓ʑʑ̂̒_W
+̌vZ, dCʐMwIv, Vol.5, No.2, pp.147-184(1992).
+
+
+QDf[^t@C̎
+
+ʑ̃f[^̓fBNg data/ ɂD
+
+P‚̑ʑ̂ɂ‚P‚̃t@CΉDeʑ̂̃t@Cȉ
+ɎDt@CƑʑ̖̂̂Ƃ̑Ή́Ct@C dnamej.tex ̕\P
+\RQƂ̂ƁD
+
+ʑ(regular polyhedron): r01, r02, r03, r04, r05.
+(r02 = a03, r03 = p04)
+
+ʑ(semiregular polyhedron): s01, s02, s03, s04, s05, s06, s07,
+s08, s09, s10, s11, s12L, s12R, s13L, s13R.
+(s12 s13 ͂ꂼꋾ֌Wɂ鑽ʑ݂̂̂ŁCnƉE
+nꂼ L, R ŋʂĂD)
+(n37 s08 ̔Pꂽ́D~[̑ʑ̂ƌĂ΂D s14 Ƃ݂
+ꍇD)
+
+p(prism): p03, p04, p05, p06, p07, p08, p09, p10.
+
+p(antiprism): a03, a04, a05, a06, a07, a08, a09, a10.
+
+ʓʑʑ(regular-faced convex polyhedron):
+ iʑ́Cʑ́CpCpj
+n01, n02, n03, n04, n05, n06, n07, n08, n09, n10, n11, n12, n13, n14,
+n15, n16, n17, n18, n19, n20, n21, n22, n23, n24, n25, n26, n27, n28,
+n29, n30, n31, n32, n33, n34, n35, n36, n37, n38, n39, n40, n41, n42,
+n43, n44L, n44R, n45L, n45R, n46L, n46R, n47L, n47R, n48L, n48R, n49,
+n50, n51, n52, n53, n54, n55, n56, n57, n58, n59, n60, n61, n62, n63,
+n64, n65, n66, n67, n68, n69, n70, n71, n72, n73, n74, n75, n76, n77,
+n78, n79, n80, n81, n82, n83, n84, n85, n86, n87, n88, n89, n90, n91,
+n92.
+(n44, n45, n46, n47, n48 ɂ͋֌Wɂ鑽ʑ݂̂̂ŁC
+nƉEnꂼ L, R ŋʂĂD)
+
+
+RDf[^̃tH[}bg
+
+ f[^͂‚̂Sނ̃f[^ȂD
+ E_ɗאڂ钸_̃f[^
+ E_͂ޖʂ̃f[^
+ Eʂ\钸_̃f[^
+ E_̍Wf[^
+
+ _Cʂ͔ԍŎʂDn ‚̒_Ƃ̒_ԍ͈̔͂
+1 Ԃ n Ԃ܂łƂȂDm ‚̖ʂƂ̖ʔԍ͈̔͂
+1 Ԃ m Ԃ܂łƂȂD
+
+ ̓Iɂ́C‚̂悤Ƀf[^ȂłDf[^͒_W
+̃f[^ŁCƂ͐ł
+
+ _̐
+ _ԍ _ɗאڂ钸_̐ אڂ钸_̔ԍDDD
+ DDD
+ i_̐j
+ DDD
+ _̐
+ _ԍ _ɗאڂʂ̐ אڂʂ̔ԍDDD
+ DDD
+ i_̐j
+ DDD
+ ʂ̐
+ ʔԍ ʂ\钸_̐ ʂ\钸_̔ԍDDD
+ DDD
+ iʂ̐j
+ DDD
+ _̐
+ _ԍ _̂wW _̂xW _̂yW
+ DDD
+ i_̐j
+ DDD
+
+
+SDʑ̂̃n[hRs[ɂ‚
+
+eʑ̂̃n[hRs[ PBM `ŋL^̂CfBNg
+hardcopy/ ɂDt@C̑Ή͍Wf[^ƓłD
+
+ȏD
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/READMEj(mitani).txt b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/READMEj(mitani).txt
new file mode 100644
index 00000000..262fff5b
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/READMEj(mitani).txt
@@ -0,0 +1,7 @@
+OBJ`̍Wf[^ɂ‚
+
+юA؎ʓʑʑ́iy-ʑ́j̍Wf[^OBJ`ɕύX̂łB
+f[^̓eɂ‚ẮÃt@CƓĂREADMEj(kobayashi-suzuki).txtB
+
+2007N827
+OJ jmitani@gmail.com
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a03.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a03.obj
new file mode 100644
index 00000000..2259162a
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a03.obj
@@ -0,0 +1,14 @@
+v -0.70710678 -0.40824829 0.57735027
+v 0.00000000 0.81649658 0.57735027
+v 0.70710678 -0.40824829 0.57735027
+v -0.00000000 -0.81649658 -0.57735027
+v -0.70710678 0.40824829 -0.57735027
+v 0.70710678 0.40824829 -0.57735027
+f 1 2 5
+f 1 5 4
+f 1 4 3
+f 1 3 2
+f 2 3 6
+f 2 6 5
+f 3 4 6
+f 4 5 6
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a04.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a04.obj
new file mode 100644
index 00000000..552dd092
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a04.obj
@@ -0,0 +1,18 @@
+v -0.60778126 -0.60778126 0.51108108
+v -0.60778126 0.60778126 0.51108108
+v 0.60778126 0.60778126 0.51108108
+v 0.60778126 -0.60778126 0.51108108
+v -0.00000000 -0.85953250 -0.51108108
+v -0.85953250 0.00000000 -0.51108108
+v 0.00000000 0.85953250 -0.51108108
+v 0.85953250 -0.00000000 -0.51108108
+f 1 2 6
+f 1 6 5
+f 1 5 4
+f 1 4 3 2
+f 2 3 7
+f 2 7 6
+f 3 4 8
+f 3 8 7
+f 4 5 8
+f 5 6 7 8
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a05.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a05.obj
new file mode 100644
index 00000000..0ad84696
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a05.obj
@@ -0,0 +1,22 @@
+v -0.52573111 -0.72360680 0.44721360
+v -0.85065081 0.27639320 0.44721360
+v 0.00000000 0.89442719 0.44721360
+v 0.85065081 0.27639320 0.44721360
+v 0.52573111 -0.72360680 0.44721360
+v -0.00000000 -0.89442719 -0.44721360
+v -0.85065081 -0.27639320 -0.44721360
+v -0.52573111 0.72360680 -0.44721360
+v 0.52573111 0.72360680 -0.44721360
+v 0.85065081 -0.27639320 -0.44721360
+f 1 2 7
+f 1 7 6
+f 1 6 5
+f 1 5 4 3 2
+f 2 3 8
+f 2 8 7
+f 3 4 9
+f 3 9 8
+f 4 5 10
+f 4 10 9
+f 5 6 10
+f 6 7 8 9 10
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a06.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a06.obj
new file mode 100644
index 00000000..fa5467aa
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a06.obj
@@ -0,0 +1,26 @@
+v -0.45970084 -0.79622522 0.39331989
+v -0.91940169 0.00000000 0.39331989
+v -0.45970084 0.79622522 0.39331989
+v 0.45970084 0.79622522 0.39331989
+v 0.91940169 -0.00000000 0.39331989
+v 0.45970084 -0.79622522 0.39331989
+v -0.00000000 -0.91940169 -0.39331989
+v -0.79622522 -0.45970084 -0.39331989
+v -0.79622522 0.45970084 -0.39331989
+v 0.00000000 0.91940169 -0.39331989
+v 0.79622522 0.45970084 -0.39331989
+v 0.79622522 -0.45970084 -0.39331989
+f 1 2 8
+f 1 8 7
+f 1 7 6
+f 1 6 5 4 3 2
+f 2 3 9
+f 2 9 8
+f 3 4 10
+f 3 10 9
+f 4 5 11
+f 4 11 10
+f 5 6 12
+f 5 12 11
+f 6 7 12
+f 7 8 9 10 11 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a07.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a07.obj
new file mode 100644
index 00000000..17d011c5
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a07.obj
@@ -0,0 +1,30 @@
+v -0.40659420 -0.84430155 0.34905022
+v -0.91360887 -0.20852526 0.34905022
+v -0.73265743 0.58427480 0.34905022
+v 0.00000000 0.93710402 0.34905022
+v 0.73265743 0.58427480 0.34905022
+v 0.91360887 -0.20852526 0.34905022
+v 0.40659420 -0.84430155 0.34905022
+v -0.00000000 -0.93710402 -0.34905022
+v -0.73265743 -0.58427480 -0.34905022
+v -0.91360887 0.20852526 -0.34905022
+v -0.40659420 0.84430155 -0.34905022
+v 0.40659420 0.84430155 -0.34905022
+v 0.91360887 0.20852526 -0.34905022
+v 0.73265742 -0.58427480 -0.34905022
+f 1 2 9
+f 1 9 8
+f 1 8 7
+f 1 7 6 5 4 3 2
+f 2 3 10
+f 2 10 9
+f 3 4 11
+f 3 11 10
+f 4 5 12
+f 4 12 11
+f 5 6 13
+f 5 13 12
+f 6 7 14
+f 6 14 13
+f 7 8 14
+f 8 9 10 11 12 13 14
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a08.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a08.obj
new file mode 100644
index 00000000..2235341d
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a08.obj
@@ -0,0 +1,34 @@
+v -0.36349134 -0.87754573 0.31270999
+v -0.87754573 -0.36349134 0.31270999
+v -0.87754573 0.36349134 0.31270999
+v -0.36349134 0.87754573 0.31270999
+v 0.36349134 0.87754573 0.31270999
+v 0.87754573 0.36349134 0.31270999
+v 0.87754573 -0.36349134 0.31270999
+v 0.36349134 -0.87754573 0.31270999
+v -0.00000000 -0.94984865 -0.31270999
+v -0.67164442 -0.67164442 -0.31270999
+v -0.94984865 0.00000000 -0.31270999
+v -0.67164442 0.67164442 -0.31270999
+v 0.00000000 0.94984865 -0.31270999
+v 0.67164442 0.67164442 -0.31270999
+v 0.94984865 -0.00000000 -0.31270999
+v 0.67164442 -0.67164442 -0.31270999
+f 1 2 10
+f 1 10 9
+f 1 9 8
+f 1 8 7 6 5 4 3 2
+f 2 3 11
+f 2 11 10
+f 3 4 12
+f 3 12 11
+f 4 5 13
+f 4 13 12
+f 5 6 14
+f 5 14 13
+f 6 7 15
+f 6 15 14
+f 7 8 16
+f 7 16 15
+f 8 9 16
+f 9 10 11 12 13 14 15 16
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a09.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a09.obj
new file mode 100644
index 00000000..79e22eca
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a09.obj
@@ -0,0 +1,38 @@
+v -0.32807418 -0.90137641 0.28264447
+v -0.83071299 -0.47961237 0.28264447
+v -0.94465196 0.16656763 0.28264447
+v -0.61657778 0.73480878 0.28264447
+v 0.00000000 0.95922474 0.28264447
+v 0.61657778 0.73480878 0.28264447
+v 0.94465196 0.16656763 0.28264447
+v 0.83071299 -0.47961237 0.28264447
+v 0.32807418 -0.90137641 0.28264447
+v -0.00000000 -0.95922474 -0.28264447
+v -0.61657778 -0.73480878 -0.28264447
+v -0.94465196 -0.16656763 -0.28264447
+v -0.83071299 0.47961237 -0.28264447
+v -0.32807418 0.90137641 -0.28264447
+v 0.32807418 0.90137641 -0.28264447
+v 0.83071299 0.47961237 -0.28264447
+v 0.94465196 -0.16656763 -0.28264447
+v 0.61657778 -0.73480878 -0.28264447
+f 1 2 11
+f 1 11 10
+f 1 10 9
+f 1 9 8 7 6 5 4 3 2
+f 2 3 12
+f 2 12 11
+f 3 4 13
+f 3 13 12
+f 4 5 14
+f 4 14 13
+f 5 6 15
+f 5 15 14
+f 6 7 16
+f 6 16 15
+f 7 8 17
+f 7 17 16
+f 8 9 18
+f 8 18 17
+f 9 10 18
+f 10 11 12 13 14 15 16 17 18
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a10.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a10.obj
new file mode 100644
index 00000000..cc602ba2
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/a10.obj
@@ -0,0 +1,42 @@
+v -0.29859575 -0.91898322 0.25750808
+v -0.78173382 -0.56796287 0.25750808
+v -0.96627614 0.00000000 0.25750808
+v -0.78173382 0.56796287 0.25750808
+v -0.29859575 0.91898322 0.25750808
+v 0.29859575 0.91898322 0.25750808
+v 0.78173382 0.56796287 0.25750808
+v 0.96627614 -0.00000000 0.25750808
+v 0.78173382 -0.56796287 0.25750808
+v 0.29859575 -0.91898322 0.25750808
+v -0.00000000 -0.96627614 -0.25750808
+v -0.56796287 -0.78173382 -0.25750808
+v -0.91898322 -0.29859575 -0.25750808
+v -0.91898322 0.29859575 -0.25750808
+v -0.56796287 0.78173382 -0.25750808
+v 0.00000000 0.96627615 -0.25750808
+v 0.56796287 0.78173382 -0.25750808
+v 0.91898322 0.29859575 -0.25750808
+v 0.91898322 -0.29859575 -0.25750808
+v 0.56796287 -0.78173382 -0.25750808
+f 1 2 12
+f 1 12 11
+f 1 11 10
+f 1 10 9 8 7 6 5 4 3 2
+f 2 3 13
+f 2 13 12
+f 3 4 14
+f 3 14 13
+f 4 5 15
+f 4 15 14
+f 5 6 16
+f 5 16 15
+f 6 7 17
+f 6 17 16
+f 7 8 18
+f 7 18 17
+f 8 9 19
+f 8 19 18
+f 9 10 20
+f 9 20 19
+f 10 11 20
+f 11 12 13 14 15 16 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n01.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n01.obj
new file mode 100644
index 00000000..70574b60
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n01.obj
@@ -0,0 +1,10 @@
+v -0.69337525 -0.69337525 0.19611614
+v -0.69337525 0.69337525 0.19611614
+v 0.69337525 0.69337525 0.19611614
+v 0.69337525 -0.69337525 0.19611614
+v 0.00000000 0.00000000 -0.78446454
+f 1 2 5
+f 1 5 4
+f 1 4 3 2
+f 2 3 5
+f 3 4 5
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n02.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n02.obj
new file mode 100644
index 00000000..e279a395
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n02.obj
@@ -0,0 +1,12 @@
+v -0.58469160 -0.80475895 0.10246352
+v -0.94605088 0.30739056 0.10246352
+v 0.00000000 0.99473676 0.10246352
+v 0.94605088 0.30739056 0.10246352
+v 0.58469160 -0.80475895 0.10246352
+v 0.00000000 0.00000000 -0.51231761
+f 1 2 6
+f 1 6 5
+f 1 5 4 3 2
+f 2 3 6
+f 3 4 6
+f 4 5 6
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n03.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n03.obj
new file mode 100644
index 00000000..72508077
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n03.obj
@@ -0,0 +1,17 @@
+v -0.48245064 -0.83562902 0.26261287
+v -0.96490128 0.00000000 0.26261287
+v -0.48245064 0.83562902 0.26261287
+v 0.48245064 0.83562902 0.26261287
+v 0.96490128 -0.00000000 0.26261287
+v 0.48245064 -0.83562902 0.26261287
+v -0.48245064 -0.27854301 -0.52522573
+v 0.00000000 0.55708601 -0.52522573
+v 0.48245064 -0.27854301 -0.52522573
+f 1 2 7
+f 1 7 9 6
+f 1 6 5 4 3 2
+f 2 3 8 7
+f 3 4 8
+f 4 5 9 8
+f 5 6 9
+f 7 8 9
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n04.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n04.obj
new file mode 100644
index 00000000..03abdf63
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n04.obj
@@ -0,0 +1,22 @@
+v -0.37660445 -0.90920356 0.17753304
+v -0.90920356 -0.37660445 0.17753304
+v -0.90920356 0.37660445 0.17753304
+v -0.37660445 0.90920356 0.17753304
+v 0.37660445 0.90920356 0.17753304
+v 0.90920356 0.37660445 0.17753304
+v 0.90920356 -0.37660445 0.17753304
+v 0.37660445 -0.90920356 0.17753304
+v 0.00000000 -0.53259911 -0.35506608
+v -0.53259911 0.00000000 -0.35506608
+v 0.00000000 0.53259911 -0.35506608
+v 0.53259911 -0.00000000 -0.35506608
+f 1 2 10 9
+f 1 9 8
+f 1 8 7 6 5 4 3 2
+f 2 3 10
+f 3 4 11 10
+f 4 5 11
+f 5 6 12 11
+f 6 7 12
+f 7 8 9 12
+f 9 10 11 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n05.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n05.obj
new file mode 100644
index 00000000..7e79daa2
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n05.obj
@@ -0,0 +1,27 @@
+v -0.30722035 -0.94552702 0.10767686
+v -0.80431332 -0.58436784 0.10767686
+v -0.99418594 0.00000000 0.10767686
+v -0.80431332 0.58436784 0.10767686
+v -0.30722035 0.94552702 0.10767686
+v 0.30722035 0.94552702 0.10767686
+v 0.80431332 0.58436784 0.10767686
+v 0.99418594 -0.00000000 0.10767686
+v 0.80431332 -0.58436784 0.10767686
+v 0.30722035 -0.94552702 0.10767686
+v -0.30722035 -0.42285254 -0.21535373
+v -0.49709297 0.16151530 -0.21535373
+v 0.00000000 0.52267448 -0.21535373
+v 0.49709297 0.16151530 -0.21535373
+v 0.30722035 -0.42285254 -0.21535373
+f 1 2 11
+f 1 11 15 10
+f 1 10 9 8 7 6 5 4 3 2
+f 2 3 12 11
+f 3 4 12
+f 4 5 13 12
+f 5 6 13
+f 6 7 14 13
+f 7 8 14
+f 8 9 15 14
+f 9 10 15
+f 11 12 13 14 15
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n06.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n06.obj
new file mode 100644
index 00000000..f93e9b72
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n06.obj
@@ -0,0 +1,37 @@
+v -0.29220218 -0.89930585 0.32537191
+v -0.76499524 -0.55580158 0.32537191
+v -0.94558612 0.00000000 0.32537191
+v -0.76499524 0.55580158 0.32537191
+v -0.29220218 0.89930585 0.32537191
+v 0.29220218 0.89930585 0.32537191
+v 0.76499524 0.55580158 0.32537191
+v 0.94558612 -0.00000000 0.32537191
+v 0.76499524 -0.55580158 0.32537191
+v 0.29220218 -0.89930585 0.32537191
+v 0.00000000 -0.80436360 -0.17175213
+v -0.76499524 -0.24856202 -0.17175213
+v -0.47279306 0.65074382 -0.17175213
+v 0.47279306 0.65074382 -0.17175213
+v 0.76499524 -0.24856202 -0.17175213
+v -0.29220218 -0.40218180 -0.47899169
+v -0.47279306 0.15361978 -0.47899169
+v 0.00000000 0.49712404 -0.47899169
+v 0.47279306 0.15361978 -0.47899169
+v 0.29220218 -0.40218180 -0.47899169
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 9 8 7 6 5 4 3 2
+f 2 3 12
+f 3 4 13 17 12
+f 4 5 13
+f 5 6 14 18 13
+f 6 7 14
+f 7 8 15 19 14
+f 8 9 15
+f 9 10 11 20 15
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n07.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n07.obj
new file mode 100644
index 00000000..529d40b7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n07.obj
@@ -0,0 +1,14 @@
+v -0.44309521 -0.25582114 0.27642855
+v 0.00000000 0.51164228 0.27642855
+v 0.44309521 -0.25582114 0.27642855
+v -0.44309521 -0.25582114 -0.60976188
+v 0.00000000 0.51164228 -0.60976188
+v 0.44309521 -0.25582114 -0.60976188
+v -0.00000000 -0.00000000 1.00000000
+f 1 2 5 4
+f 1 4 6 3
+f 1 3 7
+f 1 7 2
+f 2 3 6 5
+f 2 7 3
+f 4 5 6
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n08.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n08.obj
new file mode 100644
index 00000000..09205712
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n08.obj
@@ -0,0 +1,18 @@
+v -0.34099026 -0.46599026 0.46599026
+v -0.34099026 0.46599026 0.46599026
+v 0.59099026 0.46599026 0.46599026
+v 0.59099026 -0.46599026 0.46599026
+v -0.34099026 -0.46599026 -0.46599026
+v -0.34099026 0.46599026 -0.46599026
+v 0.59099026 0.46599026 -0.46599026
+v 0.59099026 -0.46599026 -0.46599026
+v -1.00000000 0.00000000 -0.00000000
+f 1 5 8 4
+f 1 4 3 2
+f 1 2 9
+f 1 9 5
+f 2 3 7 6
+f 2 6 9
+f 3 4 8 7
+f 5 6 7 8
+f 5 9 6
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n09.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n09.obj
new file mode 100644
index 00000000..e7b7c9a7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n09.obj
@@ -0,0 +1,22 @@
+v -0.48211943 -0.66358047 0.39220581
+v -0.78008563 0.25346519 0.39220581
+v -0.00000000 0.82023057 0.39220581
+v 0.78008563 0.25346519 0.39220581
+v 0.48211943 -0.66358047 0.39220581
+v -0.48211943 -0.66358047 -0.57203305
+v -0.78008563 0.25346519 -0.57203305
+v 0.00000000 0.82023057 -0.57203305
+v 0.78008563 0.25346519 -0.57203305
+v 0.48211943 -0.66358047 -0.57203305
+v 0.00000000 0.00000000 0.89913619
+f 1 2 7 6
+f 1 6 10 5
+f 1 5 11
+f 1 11 2
+f 2 3 8 7
+f 2 11 3
+f 3 4 9 8
+f 3 11 4
+f 4 5 10 9
+f 4 11 5
+f 6 7 8 9 10
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n10.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n10.obj
new file mode 100644
index 00000000..012f40ee
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n10.obj
@@ -0,0 +1,22 @@
+v -0.49886702 -0.49886702 0.29449549
+v -0.49886702 0.49886702 0.29449549
+v 0.49886702 0.49886702 0.29449549
+v 0.49886702 -0.49886702 0.29449549
+v 0.00000000 -0.70550451 -0.54449549
+v -0.70550451 0.00000000 -0.54449549
+v 0.00000000 0.70550451 -0.54449549
+v 0.70550451 -0.00000000 -0.54449549
+v 0.00000000 0.00000000 1.00000000
+f 1 2 6
+f 1 6 5
+f 1 5 4
+f 1 4 9
+f 1 9 2
+f 2 3 7
+f 2 7 6
+f 2 9 3
+f 3 4 8
+f 3 8 7
+f 3 9 4
+f 4 5 8
+f 5 6 7 8
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n11.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n11.obj
new file mode 100644
index 00000000..291356f8
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n11.obj
@@ -0,0 +1,27 @@
+v -0.50365704 -0.69322445 0.34134421
+v -0.81493421 0.26478818 0.34134421
+v -0.00000000 0.85687254 0.34134421
+v 0.81493421 0.26478818 0.34134421
+v 0.50365704 -0.69322445 0.34134421
+v 0.00000000 -0.85687254 -0.51552833
+v -0.81493421 -0.26478818 -0.51552833
+v -0.50365704 0.69322444 -0.51552833
+v 0.50365704 0.69322444 -0.51552833
+v 0.81493421 -0.26478818 -0.51552833
+v 0.00000000 0.00000000 0.87092056
+f 1 2 7
+f 1 7 6
+f 1 6 5
+f 1 5 11
+f 1 11 2
+f 2 3 8
+f 2 8 7
+f 2 11 3
+f 3 4 9
+f 3 9 8
+f 3 11 4
+f 4 5 10
+f 4 10 9
+f 4 11 5
+f 5 6 10
+f 6 7 8 9 10
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n12.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n12.obj
new file mode 100644
index 00000000..4513f468
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n12.obj
@@ -0,0 +1,11 @@
+v -0.61237244 -0.35355339 0.00000000
+v 0.61237244 -0.35355339 0.00000000
+v 0.00000000 0.00000000 -1.00000000
+v 0.00000000 0.70710678 0.00000000
+v 0.00000000 0.00000000 1.00000000
+f 1 4 3
+f 1 3 2
+f 1 2 5
+f 1 5 4
+f 2 3 4
+f 2 4 5
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n13.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n13.obj
new file mode 100644
index 00000000..ba77013e
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n13.obj
@@ -0,0 +1,17 @@
+v -0.58778525 -0.80901699 0.00000000
+v -0.95105652 0.30901699 0.00000000
+v -0.00000000 1.00000000 0.00000000
+v 0.95105652 0.30901699 0.00000000
+v 0.58778525 -0.80901699 0.00000000
+v 0.00000000 0.00000000 -0.61803399
+v 0.00000000 0.00000000 0.61803399
+f 1 2 6
+f 1 6 5
+f 1 5 7
+f 1 7 2
+f 2 3 6
+f 2 7 3
+f 3 4 6
+f 3 7 4
+f 4 5 6
+f 4 7 5
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n14.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n14.obj
new file mode 100644
index 00000000..066ad4d0
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n14.obj
@@ -0,0 +1,17 @@
+v -0.37979590 -0.21927526 0.37979590
+v 0.00000000 0.43855053 0.37979590
+v 0.37979590 -0.21927526 0.37979590
+v -0.37979590 -0.21927526 -0.37979590
+v 0.00000000 0.43855053 -0.37979590
+v 0.37979590 -0.21927526 -0.37979590
+v -0.00000000 -0.00000000 1.00000000
+v -0.00000000 0.00000000 -1.00000000
+f 1 2 5 4
+f 1 4 6 3
+f 1 3 7
+f 1 7 2
+f 2 3 6 5
+f 2 7 3
+f 4 5 8
+f 4 8 6
+f 5 6 8
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n15.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n15.obj
new file mode 100644
index 00000000..cce594a8
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n15.obj
@@ -0,0 +1,22 @@
+v -0.41421356 -0.41421356 0.41421356
+v -0.41421356 0.41421356 0.41421356
+v 0.41421356 0.41421356 0.41421356
+v 0.41421356 -0.41421356 0.41421356
+v -0.41421356 -0.41421356 -0.41421356
+v -0.41421356 0.41421356 -0.41421356
+v 0.41421356 0.41421356 -0.41421356
+v 0.41421356 -0.41421356 -0.41421356
+v -1.00000000 0.00000000 -0.00000000
+v 1.00000000 -0.00000000 -0.00000000
+f 1 5 8 4
+f 1 4 3 2
+f 1 2 9
+f 1 9 5
+f 2 3 7 6
+f 2 6 9
+f 3 4 10
+f 3 10 7
+f 4 8 10
+f 5 6 7 8
+f 5 9 6
+f 7 10 8
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n16.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n16.obj
new file mode 100644
index 00000000..5222ab17
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n16.obj
@@ -0,0 +1,27 @@
+v -0.48745718 -0.67092726 0.48745718
+v -0.78872229 0.25627141 0.48745718
+v -0.00000000 0.82931170 0.48745718
+v 0.78872229 0.25627141 0.48745718
+v 0.48745718 -0.67092726 0.48745718
+v -0.48745718 -0.67092726 -0.48745718
+v -0.78872229 0.25627141 -0.48745718
+v 0.00000000 0.82931170 -0.48745718
+v 0.78872229 0.25627141 -0.48745718
+v 0.48745718 -0.67092726 -0.48745718
+v 0.00000000 0.00000000 1.00000000
+v 0.00000000 0.00000000 -1.00000000
+f 1 2 7 6
+f 1 6 10 5
+f 1 5 11
+f 1 11 2
+f 2 3 8 7
+f 2 11 3
+f 3 4 9 8
+f 3 11 4
+f 4 5 10 9
+f 4 11 5
+f 6 7 12
+f 6 12 10
+f 7 8 12
+f 8 9 12
+f 9 10 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n17.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n17.obj
new file mode 100644
index 00000000..5bafb396
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n17.obj
@@ -0,0 +1,26 @@
+v -0.44343735 -0.44343735 0.37288488
+v -0.44343735 0.44343735 0.37288488
+v 0.44343735 0.44343735 0.37288488
+v 0.44343735 -0.44343735 0.37288488
+v 0.00000000 -0.62711512 -0.37288488
+v -0.62711512 0.00000000 -0.37288488
+v 0.00000000 0.62711512 -0.37288488
+v 0.62711512 -0.00000000 -0.37288488
+v 0.00000000 0.00000000 1.00000000
+v 0.00000000 0.00000000 -1.00000000
+f 1 2 6
+f 1 6 5
+f 1 5 4
+f 1 4 9
+f 1 9 2
+f 2 3 7
+f 2 7 6
+f 2 9 3
+f 3 4 8
+f 3 8 7
+f 3 9 4
+f 4 5 8
+f 5 6 10
+f 5 10 8
+f 6 7 10
+f 7 8 10
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n18.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n18.obj
new file mode 100644
index 00000000..11416d75
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n18.obj
@@ -0,0 +1,29 @@
+v -0.39744851 -0.68840102 0.18815267
+v -0.79489703 0.00000000 0.18815267
+v -0.39744851 0.68840102 0.18815267
+v 0.39744851 0.68840102 0.18815267
+v 0.79489703 0.00000000 0.18815267
+v 0.39744851 -0.68840102 0.18815267
+v -0.39744851 -0.68840102 -0.60674436
+v -0.79489703 0.00000000 -0.60674436
+v -0.39744851 0.68840102 -0.60674436
+v 0.39744851 0.68840102 -0.60674436
+v 0.79489703 -0.00000000 -0.60674436
+v 0.39744851 -0.68840102 -0.60674436
+v 0.00000000 -0.45893401 0.83718338
+v 0.39744851 0.22946701 0.83718338
+v -0.39744851 0.22946701 0.83718338
+f 1 2 8 7
+f 1 7 12 6
+f 1 6 13
+f 1 13 15 2
+f 2 3 9 8
+f 2 15 3
+f 3 4 10 9
+f 3 15 14 4
+f 4 5 11 10
+f 4 14 5
+f 5 6 12 11
+f 5 14 13 6
+f 7 8 9 10 11 12
+f 13 14 15
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n19.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n19.obj
new file mode 100644
index 00000000..6942d041
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n19.obj
@@ -0,0 +1,38 @@
+v -0.33282985 -0.80352235 0.17212538
+v -0.80352235 -0.33282985 0.17212538
+v -0.80352235 0.33282985 0.17212538
+v -0.33282985 0.80352235 0.17212538
+v 0.33282985 0.80352235 0.17212538
+v 0.80352235 0.33282985 0.17212538
+v 0.80352235 -0.33282985 0.17212538
+v 0.33282985 -0.80352235 0.17212538
+v -0.33282985 -0.80352235 -0.49353432
+v -0.80352235 -0.33282985 -0.49353432
+v -0.80352235 0.33282985 -0.49353432
+v -0.33282985 0.80352235 -0.49353432
+v 0.33282985 0.80352235 -0.49353432
+v 0.80352235 0.33282985 -0.49353432
+v 0.80352235 -0.33282985 -0.49353432
+v 0.33282985 -0.80352235 -0.49353432
+v -0.33282985 -0.33282985 0.64281788
+v 0.33282985 -0.33282985 0.64281788
+v 0.33282985 0.33282985 0.64281788
+v -0.33282985 0.33282985 0.64281788
+f 1 2 10 9
+f 1 9 16 8
+f 1 8 18 17
+f 1 17 2
+f 2 3 11 10
+f 2 17 20 3
+f 3 4 12 11
+f 3 20 4
+f 4 5 13 12
+f 4 20 19 5
+f 5 6 14 13
+f 5 19 6
+f 6 7 15 14
+f 6 19 18 7
+f 7 8 16 15
+f 7 18 8
+f 9 10 11 12 13 14 15 16
+f 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n20.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n20.obj
new file mode 100644
index 00000000..48711e26
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n20.obj
@@ -0,0 +1,47 @@
+v -0.28328429 -0.87185940 -0.16705489
+v -0.74164790 -0.53883874 -0.16705489
+v -0.91672723 0.00000000 -0.16705489
+v -0.74164790 0.53883874 -0.16705489
+v -0.28328429 0.87185940 -0.16705489
+v 0.28328429 0.87185940 -0.16705489
+v 0.74164790 0.53883874 -0.16705489
+v 0.91672722 0.00000000 -0.16705489
+v 0.74164790 -0.53883874 -0.16705489
+v 0.28328429 -0.87185940 -0.16705489
+v -0.28328429 -0.38990738 -0.46491762
+v -0.45836361 0.14893137 -0.46491762
+v 0.00000000 0.48195202 -0.46491762
+v 0.45836361 0.14893137 -0.46491762
+v 0.28328429 -0.38990738 -0.46491762
+v -0.28328429 -0.87185940 0.39951370
+v 0.28328429 -0.87185940 0.39951370
+v 0.74164790 -0.53883874 0.39951370
+v 0.91672722 0.00000000 0.39951370
+v 0.74164790 0.53883874 0.39951370
+v 0.28328429 0.87185940 0.39951370
+v -0.28328429 0.87185940 0.39951370
+v -0.74164790 0.53883874 0.39951370
+v -0.91672723 0.00000000 0.39951370
+v -0.74164790 -0.53883874 0.39951370
+f 1 2 11
+f 1 11 15 10
+f 1 10 17 16
+f 1 16 25 2
+f 2 3 12 11
+f 2 25 24 3
+f 3 4 12
+f 3 24 23 4
+f 4 5 13 12
+f 4 23 22 5
+f 5 6 13
+f 5 22 21 6
+f 6 7 14 13
+f 6 21 20 7
+f 7 8 14
+f 7 20 19 8
+f 8 9 15 14
+f 8 19 18 9
+f 9 10 15
+f 9 18 17 10
+f 11 12 13 14 15
+f 16 17 18 19 20 21 22 23 24 25
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n21.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n21.obj
new file mode 100644
index 00000000..be39dcb0
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n21.obj
@@ -0,0 +1,57 @@
+v -0.26010839 -0.80053131 0.01968437
+v -0.68097260 -0.49475556 0.01968437
+v -0.84172843 0.00000000 0.01968437
+v -0.68097260 0.49475556 0.01968437
+v -0.26010839 0.80053131 0.01968437
+v 0.26010839 0.80053131 0.01968437
+v 0.68097260 0.49475556 0.01968437
+v 0.84172843 0.00000000 0.01968437
+v 0.68097260 -0.49475556 0.01968437
+v 0.26010839 -0.80053131 0.01968437
+v 0.00000000 -0.71601697 -0.42283845
+v -0.68097260 -0.22126141 -0.42283845
+v -0.42086421 0.57926990 -0.42283845
+v 0.42086421 0.57926990 -0.42283845
+v 0.68097260 -0.22126141 -0.42283845
+v -0.26010839 -0.35800848 -0.69633260
+v -0.42086421 0.13674707 -0.69633260
+v 0.00000000 0.44252282 -0.69633260
+v 0.42086421 0.13674707 -0.69633260
+v 0.26010839 -0.35800848 -0.69633260
+v -0.26010839 -0.80053131 0.53990115
+v 0.26010839 -0.80053131 0.53990115
+v 0.68097260 -0.49475556 0.53990115
+v 0.84172843 0.00000000 0.53990115
+v 0.68097260 0.49475556 0.53990115
+v 0.26010839 0.80053131 0.53990115
+v -0.26010839 0.80053131 0.53990115
+v -0.68097260 0.49475556 0.53990115
+v -0.84172843 0.00000000 0.53990115
+v -0.68097260 -0.49475556 0.53990115
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 22 21
+f 1 21 30 2
+f 2 3 12
+f 2 30 29 3
+f 3 4 13 17 12
+f 3 29 28 4
+f 4 5 13
+f 4 28 27 5
+f 5 6 14 18 13
+f 5 27 26 6
+f 6 7 14
+f 6 26 25 7
+f 7 8 15 19 14
+f 7 25 24 8
+f 8 9 15
+f 8 24 23 9
+f 9 10 11 20 15
+f 9 23 22 10
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
+f 21 22 23 24 25 26 27 28 29 30
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n22.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n22.obj
new file mode 100644
index 00000000..1dfec909
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n22.obj
@@ -0,0 +1,35 @@
+v -0.41410547 -0.71725171 0.14820052
+v -0.82821094 0.00000000 0.14820052
+v -0.41410547 0.71725171 0.14820052
+v 0.41410547 0.71725171 0.14820052
+v 0.82821094 0.00000000 0.14820052
+v 0.41410547 -0.71725171 0.14820052
+v 0.00000000 -0.82821094 -0.56041649
+v -0.71725171 -0.41410547 -0.56041649
+v -0.71725171 0.41410547 -0.56041649
+v 0.00000000 0.82821094 -0.56041649
+v 0.71725171 0.41410547 -0.56041649
+v 0.71725171 -0.41410547 -0.56041649
+v 0.00000000 -0.47816781 0.82443193
+v 0.41410547 0.23908390 0.82443193
+v -0.41410547 0.23908390 0.82443193
+f 1 2 8
+f 1 8 7
+f 1 7 6
+f 1 6 13
+f 1 13 15 2
+f 2 3 9
+f 2 9 8
+f 2 15 3
+f 3 4 10
+f 3 10 9
+f 3 15 14 4
+f 4 5 11
+f 4 11 10
+f 4 14 5
+f 5 6 12
+f 5 12 11
+f 5 14 13 6
+f 6 7 12
+f 7 8 9 10 11 12
+f 13 14 15
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n23.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n23.obj
new file mode 100644
index 00000000..a7c786ce
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n23.obj
@@ -0,0 +1,46 @@
+v -0.34182948 -0.82524936 0.13857553
+v -0.82524936 -0.34182948 0.13857553
+v -0.82524936 0.34182948 0.13857553
+v -0.34182948 0.82524936 0.13857553
+v 0.34182948 0.82524936 0.13857553
+v 0.82524936 0.34182948 0.13857553
+v 0.82524936 -0.34182948 0.13857553
+v 0.34182948 -0.82524936 0.13857553
+v 0.00000000 -0.89324347 -0.44957324
+v -0.63161852 -0.63161852 -0.44957324
+v -0.89324347 0.00000000 -0.44957324
+v -0.63161852 0.63161852 -0.44957324
+v 0.00000000 0.89324347 -0.44957324
+v 0.63161852 0.63161852 -0.44957324
+v 0.89324347 -0.00000000 -0.44957324
+v 0.63161852 -0.63161852 -0.44957324
+v -0.34182948 -0.34182948 0.62199542
+v 0.34182948 -0.34182948 0.62199542
+v 0.34182948 0.34182948 0.62199542
+v -0.34182948 0.34182948 0.62199542
+f 1 2 10
+f 1 10 9
+f 1 9 8
+f 1 8 18 17
+f 1 17 2
+f 2 3 11
+f 2 11 10
+f 2 17 20 3
+f 3 4 12
+f 3 12 11
+f 3 20 4
+f 4 5 13
+f 4 13 12
+f 4 20 19 5
+f 5 6 14
+f 5 14 13
+f 5 19 6
+f 6 7 15
+f 6 15 14
+f 6 19 18 7
+f 7 8 16
+f 7 16 15
+f 7 18 8
+f 8 9 16
+f 9 10 11 12 13 14 15 16
+f 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n24.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n24.obj
new file mode 100644
index 00000000..95d5834f
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n24.obj
@@ -0,0 +1,57 @@
+v -0.28840390 -0.88761595 -0.13832577
+v -0.75505123 -0.54857683 -0.13832577
+v -0.93329464 0.00000000 -0.13832577
+v -0.75505123 0.54857683 -0.13832577
+v -0.28840391 0.88761595 -0.13832577
+v 0.28840390 0.88761595 -0.13832577
+v 0.75505122 0.54857683 -0.13832577
+v 0.93329464 0.00000000 -0.13832577
+v 0.75505123 -0.54857683 -0.13832577
+v 0.28840391 -0.88761595 -0.13832577
+v -0.28840390 -0.39695392 -0.44157158
+v -0.46664732 0.15162291 -0.44157158
+v 0.00000000 0.49066203 -0.44157158
+v 0.46664732 0.15162291 -0.44157158
+v 0.28840391 -0.39695392 -0.44157158
+v -0.54857683 -0.75505123 0.35911156
+v 0.00000000 -0.93329464 0.35911156
+v 0.54857683 -0.75505123 0.35911156
+v 0.88761595 -0.28840391 0.35911156
+v 0.88761595 0.28840390 0.35911156
+v 0.54857683 0.75505123 0.35911156
+v -0.00000000 0.93329464 0.35911156
+v -0.54857683 0.75505123 0.35911156
+v -0.88761595 0.28840390 0.35911156
+v -0.88761595 -0.28840391 0.35911156
+f 1 2 11
+f 1 11 15 10
+f 1 10 17
+f 1 17 16
+f 1 16 2
+f 2 3 12 11
+f 2 16 25
+f 2 25 3
+f 3 4 12
+f 3 25 24
+f 3 24 4
+f 4 5 13 12
+f 4 24 23
+f 4 23 5
+f 5 6 13
+f 5 23 22
+f 5 22 6
+f 6 7 14 13
+f 6 22 21
+f 6 21 7
+f 7 8 14
+f 7 21 20
+f 7 20 8
+f 8 9 15 14
+f 8 20 19
+f 8 19 9
+f 9 10 15
+f 9 19 18
+f 9 18 10
+f 10 18 17
+f 11 12 13 14 15
+f 16 17 18 19 20 21 22 23 24 25
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n25.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n25.obj
new file mode 100644
index 00000000..e3048519
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n25.obj
@@ -0,0 +1,67 @@
+v -0.26676074 -0.82100515 0.04465919
+v -0.69838870 -0.50740909 0.04465919
+v -0.86325590 0.00000000 0.04465919
+v -0.69838870 0.50740909 0.04465919
+v -0.26676075 0.82100515 0.04465919
+v 0.26676074 0.82100515 0.04465919
+v 0.69838870 0.50740909 0.04465919
+v 0.86325590 0.00000000 0.04465919
+v 0.69838870 -0.50740909 0.04465919
+v 0.26676074 -0.82100515 0.04465919
+v 0.00000000 -0.73432933 -0.40918129
+v -0.69838870 -0.22692024 -0.40918129
+v -0.43162795 0.59408491 -0.40918129
+v 0.43162795 0.59408491 -0.40918129
+v 0.69838870 -0.22692024 -0.40918129
+v -0.26676074 -0.36716467 -0.68967014
+v -0.43162795 0.14024442 -0.68967014
+v 0.00000000 0.45384049 -0.68967014
+v 0.43162795 0.14024442 -0.68967014
+v 0.26676074 -0.36716467 -0.68967014
+v -0.50740909 -0.69838870 0.50476653
+v 0.00000000 -0.86325590 0.50476653
+v 0.50740909 -0.69838870 0.50476653
+v 0.82100515 -0.26676074 0.50476653
+v 0.82100515 0.26676074 0.50476653
+v 0.50740909 0.69838870 0.50476653
+v -0.00000000 0.86325590 0.50476653
+v -0.50740909 0.69838870 0.50476653
+v -0.82100515 0.26676074 0.50476653
+v -0.82100515 -0.26676074 0.50476653
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 22
+f 1 22 21
+f 1 21 2
+f 2 3 12
+f 2 21 30
+f 2 30 3
+f 3 4 13 17 12
+f 3 30 29
+f 3 29 4
+f 4 5 13
+f 4 29 28
+f 4 28 5
+f 5 6 14 18 13
+f 5 28 27
+f 5 27 6
+f 6 7 14
+f 6 27 26
+f 6 26 7
+f 7 8 15 19 14
+f 7 26 25
+f 7 25 8
+f 8 9 15
+f 8 25 24
+f 8 24 9
+f 9 10 11 20 15
+f 9 24 23
+f 9 23 10
+f 10 23 22
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
+f 21 22 23 24 25 26 27 28 29 30
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n26.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n26.obj
new file mode 100644
index 00000000..3eb6d8d7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n26.obj
@@ -0,0 +1,16 @@
+v -0.25000000 -0.43301270 0.50000000
+v 0.25000000 0.43301270 0.50000000
+v 0.75000000 -0.43301270 0.50000000
+v -0.25000000 -0.43301270 -0.50000000
+v 0.25000000 0.43301270 -0.50000000
+v 0.75000000 -0.43301270 -0.50000000
+v -1.00000000 0.00000000 -0.00000000
+v -0.50000000 0.86602540 0.00000000
+f 1 4 6 3
+f 1 3 2
+f 1 2 8 7
+f 1 7 4
+f 2 3 6 5
+f 2 5 8
+f 4 5 6
+f 4 7 8 5
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n27.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n27.obj
new file mode 100644
index 00000000..41a03100
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n27.obj
@@ -0,0 +1,26 @@
+v -0.50000000 -0.86602540 0.00000000
+v -1.00000000 0.00000000 0.00000000
+v -0.50000000 0.86602540 0.00000000
+v 0.50000000 0.86602540 0.00000000
+v 1.00000000 -0.00000000 0.00000000
+v 0.50000000 -0.86602540 0.00000000
+v -0.50000000 -0.28867513 -0.81649658
+v 0.00000000 0.57735027 -0.81649658
+v 0.50000000 -0.28867513 -0.81649658
+v -0.50000000 -0.28867513 0.81649658
+v 0.50000000 -0.28867513 0.81649658
+v 0.00000000 0.57735027 0.81649658
+f 1 2 7
+f 1 7 9 6
+f 1 6 11 10
+f 1 10 2
+f 2 3 8 7
+f 2 10 12 3
+f 3 4 8
+f 3 12 4
+f 4 5 9 8
+f 4 12 11 5
+f 5 6 9
+f 5 11 6
+f 7 8 9
+f 10 11 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n28.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n28.obj
new file mode 100644
index 00000000..8d1f142f
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n28.obj
@@ -0,0 +1,34 @@
+v -0.38268343 -0.92387953 -0.00000000
+v -0.92387953 -0.38268343 -0.00000000
+v -0.92387953 0.38268343 -0.00000000
+v -0.38268343 0.92387953 -0.00000000
+v 0.38268343 0.92387953 -0.00000000
+v 0.92387953 0.38268343 -0.00000000
+v 0.92387953 -0.38268343 -0.00000000
+v 0.38268343 -0.92387953 -0.00000000
+v -0.00000000 -0.54119610 -0.54119610
+v -0.54119610 0.00000000 -0.54119610
+v 0.00000000 0.54119610 -0.54119610
+v 0.54119610 -0.00000000 -0.54119610
+v -0.54119610 0.00000000 0.54119610
+v 0.00000000 -0.54119610 0.54119610
+v 0.54119610 -0.00000000 0.54119610
+v -0.00000000 0.54119610 0.54119610
+f 1 2 10 9
+f 1 9 8
+f 1 8 14
+f 1 14 13 2
+f 2 3 10
+f 2 13 3
+f 3 4 11 10
+f 3 13 16 4
+f 4 5 11
+f 4 16 5
+f 5 6 12 11
+f 5 16 15 6
+f 6 7 12
+f 6 15 7
+f 7 8 9 12
+f 7 15 14 8
+f 9 10 11 12
+f 13 14 15 16
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n29.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n29.obj
new file mode 100644
index 00000000..ef7fd148
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n29.obj
@@ -0,0 +1,34 @@
+v -0.38268343 -0.92387953 -0.00000000
+v -0.92387953 -0.38268343 -0.00000000
+v -0.92387953 0.38268343 -0.00000000
+v -0.38268343 0.92387953 -0.00000000
+v 0.38268343 0.92387953 -0.00000000
+v 0.92387953 0.38268343 -0.00000000
+v 0.92387953 -0.38268343 -0.00000000
+v 0.38268343 -0.92387953 -0.00000000
+v 0.00000000 -0.54119610 -0.54119610
+v -0.54119610 0.00000000 -0.54119610
+v 0.00000000 0.54119610 -0.54119610
+v 0.54119610 -0.00000000 -0.54119610
+v -0.38268343 -0.38268343 0.54119610
+v 0.38268343 -0.38268343 0.54119610
+v 0.38268343 0.38268343 0.54119610
+v -0.38268343 0.38268343 0.54119610
+f 1 2 10 9
+f 1 9 8
+f 1 8 14 13
+f 1 13 2
+f 2 3 10
+f 2 13 16 3
+f 3 4 11 10
+f 3 16 4
+f 4 5 11
+f 4 16 15 5
+f 5 6 12 11
+f 5 15 6
+f 6 7 12
+f 6 15 14 7
+f 7 8 9 12
+f 7 14 8
+f 9 10 11 12
+f 13 14 15 16
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n30.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n30.obj
new file mode 100644
index 00000000..565d361a
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n30.obj
@@ -0,0 +1,42 @@
+v -0.30901699 -0.95105652 0.00000000
+v -0.80901699 -0.58778525 0.00000000
+v -1.00000000 0.00000000 0.00000000
+v -0.80901699 0.58778525 0.00000000
+v -0.30901699 0.95105652 0.00000000
+v 0.30901699 0.95105652 0.00000000
+v 0.80901699 0.58778525 0.00000000
+v 1.00000000 -0.00000000 0.00000000
+v 0.80901699 -0.58778525 0.00000000
+v 0.30901699 -0.95105652 0.00000000
+v -0.30901699 -0.42532540 -0.32491970
+v -0.50000000 0.16245985 -0.32491970
+v 0.00000000 0.52573111 -0.32491970
+v 0.50000000 0.16245985 -0.32491970
+v 0.30901699 -0.42532540 -0.32491970
+v -0.30901699 -0.42532540 0.32491970
+v 0.30901699 -0.42532540 0.32491970
+v 0.50000000 0.16245985 0.32491970
+v -0.00000000 0.52573111 0.32491970
+v -0.50000000 0.16245985 0.32491970
+f 1 2 11
+f 1 11 15 10
+f 1 10 17 16
+f 1 16 2
+f 2 3 12 11
+f 2 16 20 3
+f 3 4 12
+f 3 20 4
+f 4 5 13 12
+f 4 20 19 5
+f 5 6 13
+f 5 19 6
+f 6 7 14 13
+f 6 19 18 7
+f 7 8 14
+f 7 18 8
+f 8 9 15 14
+f 8 18 17 9
+f 9 10 15
+f 9 17 10
+f 11 12 13 14 15
+f 16 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n31.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n31.obj
new file mode 100644
index 00000000..2bc879c4
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n31.obj
@@ -0,0 +1,42 @@
+v -0.30901699 -0.95105652 -0.00000000
+v -0.80901699 -0.58778525 -0.00000000
+v -1.00000000 -0.00000000 -0.00000000
+v -0.80901699 0.58778525 -0.00000000
+v -0.30901700 0.95105652 -0.00000000
+v 0.30901699 0.95105652 -0.00000000
+v 0.80901699 0.58778525 -0.00000000
+v 1.00000000 -0.00000000 -0.00000000
+v 0.80901699 -0.58778525 -0.00000000
+v 0.30901699 -0.95105652 -0.00000000
+v -0.30901699 -0.42532540 -0.32491970
+v -0.50000000 0.16245985 -0.32491970
+v 0.00000000 0.52573111 -0.32491970
+v 0.50000000 0.16245985 -0.32491970
+v 0.30901699 -0.42532540 -0.32491970
+v 0.00000000 -0.52573111 0.32491970
+v 0.50000000 -0.16245985 0.32491970
+v 0.30901699 0.42532540 0.32491970
+v -0.30901699 0.42532540 0.32491970
+v -0.50000000 -0.16245985 0.32491970
+f 1 2 11
+f 1 11 15 10
+f 1 10 16
+f 1 16 20 2
+f 2 3 12 11
+f 2 20 3
+f 3 4 12
+f 3 20 19 4
+f 4 5 13 12
+f 4 19 5
+f 5 6 13
+f 5 19 18 6
+f 6 7 14 13
+f 6 18 7
+f 7 8 14
+f 7 18 17 8
+f 8 9 15 14
+f 8 17 9
+f 9 10 15
+f 9 17 16 10
+f 11 12 13 14 15
+f 16 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n32.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n32.obj
new file mode 100644
index 00000000..39d12437
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n32.obj
@@ -0,0 +1,52 @@
+v -0.30240276 -0.93070001 -0.20579132
+v -0.79170071 -0.57520424 -0.20579132
+v -0.97859590 -0.00000000 -0.20579132
+v -0.79170071 0.57520424 -0.20579132
+v -0.30240276 0.93070001 -0.20579132
+v 0.30240276 0.93070001 -0.20579132
+v 0.79170071 0.57520424 -0.20579132
+v 0.97859590 -0.00000000 -0.20579132
+v 0.79170071 -0.57520424 -0.20579132
+v 0.30240276 -0.93070001 -0.20579132
+v -0.30240276 -0.41622170 -0.52375640
+v -0.48929795 0.15898254 -0.52375641
+v 0.00000000 0.51447831 -0.52375641
+v 0.48929795 0.15898254 -0.52375641
+v 0.30240276 -0.41622170 -0.52375640
+v -0.48929795 -0.67346085 0.30868699
+v 0.48929795 -0.67346085 0.30868699
+v 0.79170071 0.25723915 0.30868699
+v -0.00000000 0.83244339 0.30868699
+v -0.79170071 0.25723915 0.30868699
+v 0.00000000 -0.51447831 0.62665207
+v 0.48929795 -0.15898254 0.62665207
+v 0.30240276 0.41622170 0.62665207
+v -0.30240276 0.41622170 0.62665207
+v -0.48929795 -0.15898254 0.62665207
+f 1 2 11
+f 1 11 15 10
+f 1 10 17 21 16
+f 1 16 2
+f 2 3 12 11
+f 2 16 25 20 3
+f 3 4 12
+f 3 20 4
+f 4 5 13 12
+f 4 20 24 19 5
+f 5 6 13
+f 5 19 6
+f 6 7 14 13
+f 6 19 23 18 7
+f 7 8 14
+f 7 18 8
+f 8 9 15 14
+f 8 18 22 17 9
+f 9 10 15
+f 9 17 10
+f 11 12 13 14 15
+f 16 21 25
+f 17 22 21
+f 18 23 22
+f 19 24 23
+f 20 25 24
+f 21 22 23 24 25
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n33.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n33.obj
new file mode 100644
index 00000000..4fb6508f
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n33.obj
@@ -0,0 +1,52 @@
+v -0.30240276 -0.93070001 -0.20579132
+v -0.79170071 -0.57520424 -0.20579132
+v -0.97859590 0.00000000 -0.20579132
+v -0.79170071 0.57520424 -0.20579132
+v -0.30240276 0.93070001 -0.20579132
+v 0.30240276 0.93070001 -0.20579132
+v 0.79170071 0.57520424 -0.20579132
+v 0.97859590 -0.00000000 -0.20579132
+v 0.79170071 -0.57520424 -0.20579132
+v 0.30240276 -0.93070001 -0.20579132
+v -0.30240276 -0.41622170 -0.52375641
+v -0.48929795 0.15898254 -0.52375641
+v 0.00000000 0.51447831 -0.52375641
+v 0.48929795 0.15898254 -0.52375641
+v 0.30240276 -0.41622170 -0.52375641
+v -0.79170071 -0.25723915 0.30868699
+v 0.00000000 -0.83244339 0.30868699
+v 0.79170071 -0.25723915 0.30868699
+v 0.48929795 0.67346085 0.30868699
+v -0.48929795 0.67346085 0.30868699
+v -0.30240276 -0.41622170 0.62665207
+v 0.30240276 -0.41622170 0.62665207
+v 0.48929795 0.15898254 0.62665207
+v -0.00000000 0.51447831 0.62665207
+v -0.48929795 0.15898254 0.62665207
+f 1 2 11
+f 1 11 15 10
+f 1 10 17
+f 1 17 21 16 2
+f 2 3 12 11
+f 2 16 3
+f 3 4 12
+f 3 16 25 20 4
+f 4 5 13 12
+f 4 20 5
+f 5 6 13
+f 5 20 24 19 6
+f 6 7 14 13
+f 6 19 7
+f 7 8 14
+f 7 19 23 18 8
+f 8 9 15 14
+f 8 18 9
+f 9 10 15
+f 9 18 22 17 10
+f 11 12 13 14 15
+f 16 21 25
+f 17 22 21
+f 18 23 22
+f 19 24 23
+f 20 25 24
+f 21 22 23 24 25
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n34.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n34.obj
new file mode 100644
index 00000000..eea5439f
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n34.obj
@@ -0,0 +1,62 @@
+v -0.30901699 -0.95105652 0.00000000
+v -0.80901699 -0.58778525 0.00000000
+v -1.00000000 0.00000000 0.00000000
+v -0.80901699 0.58778525 0.00000000
+v -0.30901699 0.95105652 0.00000000
+v 0.30901699 0.95105652 0.00000000
+v 0.80901699 0.58778525 0.00000000
+v 1.00000000 -0.00000000 0.00000000
+v 0.80901699 -0.58778525 0.00000000
+v 0.30901699 -0.95105652 0.00000000
+v -0.00000000 -0.85065081 -0.52573111
+v -0.80901699 -0.26286556 -0.52573111
+v -0.50000000 0.68819096 -0.52573111
+v 0.50000000 0.68819096 -0.52573111
+v 0.80901699 -0.26286556 -0.52573111
+v -0.30901699 -0.42532540 -0.85065081
+v -0.50000000 0.16245985 -0.85065081
+v 0.00000000 0.52573111 -0.85065081
+v 0.50000000 0.16245985 -0.85065081
+v 0.30901699 -0.42532540 -0.85065081
+v -0.80901699 -0.26286556 0.52573111
+v 0.00000000 -0.85065081 0.52573111
+v 0.80901699 -0.26286556 0.52573111
+v 0.50000000 0.68819096 0.52573111
+v -0.50000000 0.68819096 0.52573111
+v -0.30901699 -0.42532540 0.85065081
+v 0.30901699 -0.42532540 0.85065081
+v 0.50000000 0.16245985 0.85065081
+v -0.00000000 0.52573111 0.85065081
+v -0.50000000 0.16245985 0.85065081
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 22
+f 1 22 26 21 2
+f 2 3 12
+f 2 21 3
+f 3 4 13 17 12
+f 3 21 30 25 4
+f 4 5 13
+f 4 25 5
+f 5 6 14 18 13
+f 5 25 29 24 6
+f 6 7 14
+f 6 24 7
+f 7 8 15 19 14
+f 7 24 28 23 8
+f 8 9 15
+f 8 23 9
+f 9 10 11 20 15
+f 9 23 27 22 10
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
+f 21 26 30
+f 22 27 26
+f 23 28 27
+f 24 29 28
+f 25 30 29
+f 26 27 28 29 30
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n35.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n35.obj
new file mode 100644
index 00000000..ed3b9efc
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n35.obj
@@ -0,0 +1,38 @@
+v -0.34781848 -0.60243929 0.34781848
+v -0.69563697 0.00000000 0.34781848
+v -0.34781848 0.60243929 0.34781848
+v 0.34781848 0.60243929 0.34781848
+v 0.69563697 0.00000000 0.34781848
+v 0.34781848 -0.60243929 0.34781848
+v -0.34781848 -0.60243929 -0.34781848
+v -0.69563697 0.00000000 -0.34781848
+v -0.34781848 0.60243929 -0.34781848
+v 0.34781848 0.60243929 -0.34781848
+v 0.69563697 -0.00000000 -0.34781848
+v 0.34781848 -0.60243929 -0.34781848
+v 0.00000000 -0.40162619 0.91580369
+v 0.34781848 0.20081310 0.91580369
+v -0.34781848 0.20081310 0.91580369
+v -0.34781848 0.20081310 -0.91580369
+v 0.34781848 0.20081310 -0.91580369
+v 0.00000000 -0.40162619 -0.91580369
+f 1 2 8 7
+f 1 7 12 6
+f 1 6 13
+f 1 13 15 2
+f 2 3 9 8
+f 2 15 3
+f 3 4 10 9
+f 3 15 14 4
+f 4 5 11 10
+f 4 14 5
+f 5 6 12 11
+f 5 14 13 6
+f 7 8 16 18
+f 7 18 12
+f 8 9 16
+f 9 10 17 16
+f 10 11 17
+f 11 12 18 17
+f 13 14 15
+f 16 17 18
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n36.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n36.obj
new file mode 100644
index 00000000..977ef5c4
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n36.obj
@@ -0,0 +1,38 @@
+v -0.34781848 -0.60243929 0.34781848
+v -0.69563697 0.00000000 0.34781848
+v -0.34781848 0.60243929 0.34781848
+v 0.34781848 0.60243929 0.34781848
+v 0.69563697 0.00000000 0.34781848
+v 0.34781848 -0.60243929 0.34781848
+v -0.34781848 -0.60243929 -0.34781848
+v -0.69563697 0.00000000 -0.34781848
+v -0.34781848 0.60243929 -0.34781848
+v 0.34781848 0.60243929 -0.34781848
+v 0.69563697 -0.00000000 -0.34781848
+v 0.34781848 -0.60243929 -0.34781848
+v 0.00000000 -0.40162619 0.91580369
+v 0.34781848 0.20081310 0.91580369
+v -0.34781848 0.20081310 0.91580369
+v -0.34781848 -0.20081310 -0.91580369
+v -0.00000000 0.40162619 -0.91580369
+v 0.34781848 -0.20081310 -0.91580369
+f 1 2 8 7
+f 1 7 12 6
+f 1 6 13
+f 1 13 15 2
+f 2 3 9 8
+f 2 15 3
+f 3 4 10 9
+f 3 15 14 4
+f 4 5 11 10
+f 4 14 5
+f 5 6 12 11
+f 5 14 13 6
+f 7 8 16
+f 7 16 18 12
+f 8 9 17 16
+f 9 10 17
+f 10 11 18 17
+f 11 12 18
+f 13 14 15
+f 16 17 18
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n37.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n37.obj
new file mode 100644
index 00000000..69c08490
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n37.obj
@@ -0,0 +1,50 @@
+v -0.35740674 -0.86285621 0.35740674
+v -0.86285621 -0.35740674 0.35740674
+v -0.86285621 0.35740674 0.35740674
+v -0.35740674 0.86285621 0.35740674
+v 0.35740674 0.86285621 0.35740674
+v 0.86285621 0.35740674 0.35740674
+v 0.86285621 -0.35740674 0.35740674
+v 0.35740674 -0.86285621 0.35740674
+v -0.35740674 -0.86285621 -0.35740674
+v -0.86285621 -0.35740674 -0.35740674
+v -0.86285621 0.35740674 -0.35740674
+v -0.35740674 0.86285621 -0.35740674
+v 0.35740674 0.86285621 -0.35740674
+v 0.86285621 0.35740674 -0.35740674
+v 0.86285621 -0.35740674 -0.35740674
+v 0.35740674 -0.86285621 -0.35740674
+v -0.35740674 -0.35740674 0.86285621
+v 0.35740674 -0.35740674 0.86285621
+v 0.35740674 0.35740674 0.86285621
+v -0.35740674 0.35740674 0.86285621
+v 0.00000000 -0.50544946 -0.86285621
+v -0.50544946 -0.00000000 -0.86285621
+v 0.00000000 0.50544946 -0.86285621
+v 0.50544946 -0.00000000 -0.86285621
+f 1 2 10 9
+f 1 9 16 8
+f 1 8 18 17
+f 1 17 2
+f 2 3 11 10
+f 2 17 20 3
+f 3 4 12 11
+f 3 20 4
+f 4 5 13 12
+f 4 20 19 5
+f 5 6 14 13
+f 5 19 6
+f 6 7 15 14
+f 6 19 18 7
+f 7 8 16 15
+f 7 18 8
+f 9 10 22 21
+f 9 21 16
+f 10 11 22
+f 11 12 23 22
+f 12 13 23
+f 13 14 24 23
+f 14 15 24
+f 15 16 21 24
+f 17 18 19 20
+f 21 22 23 24
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n38.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n38.obj
new file mode 100644
index 00000000..fd528ea3
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n38.obj
@@ -0,0 +1,62 @@
+v -0.29524181 -0.90866085 -0.29524181
+v -0.77295309 -0.56158329 -0.29524181
+v -0.95542256 0.00000000 -0.29524181
+v -0.77295309 0.56158329 -0.29524181
+v -0.29524181 0.90866085 -0.29524181
+v 0.29524181 0.90866085 -0.29524181
+v 0.77295309 0.56158329 -0.29524181
+v 0.95542256 0.00000000 -0.29524181
+v 0.77295309 -0.56158329 -0.29524181
+v 0.29524181 -0.90866085 -0.29524181
+v -0.29524181 -0.40636549 -0.60567742
+v -0.47771128 0.15521780 -0.60567742
+v 0.00000000 0.50229537 -0.60567742
+v 0.47771128 0.15521780 -0.60567742
+v 0.29524181 -0.40636549 -0.60567742
+v -0.29524181 -0.90866085 0.29524181
+v 0.29524181 -0.90866085 0.29524181
+v 0.77295309 -0.56158329 0.29524181
+v 0.95542256 -0.00000000 0.29524181
+v 0.77295309 0.56158329 0.29524181
+v 0.29524181 0.90866085 0.29524181
+v -0.29524181 0.90866085 0.29524181
+v -0.77295309 0.56158329 0.29524181
+v -0.95542256 0.00000000 0.29524181
+v -0.77295309 -0.56158329 0.29524181
+v -0.29524181 -0.40636549 0.60567742
+v 0.29524181 -0.40636549 0.60567742
+v 0.47771128 0.15521780 0.60567742
+v 0.00000000 0.50229537 0.60567742
+v -0.47771128 0.15521780 0.60567742
+f 1 2 11
+f 1 11 15 10
+f 1 10 17 16
+f 1 16 25 2
+f 2 3 12 11
+f 2 25 24 3
+f 3 4 12
+f 3 24 23 4
+f 4 5 13 12
+f 4 23 22 5
+f 5 6 13
+f 5 22 21 6
+f 6 7 14 13
+f 6 21 20 7
+f 7 8 14
+f 7 20 19 8
+f 8 9 15 14
+f 8 19 18 9
+f 9 10 15
+f 9 18 17 10
+f 11 12 13 14 15
+f 16 17 27 26
+f 16 26 25
+f 17 18 27
+f 18 19 28 27
+f 19 20 28
+f 20 21 29 28
+f 21 22 29
+f 22 23 30 29
+f 23 24 30
+f 24 25 26 30
+f 26 27 28 29 30
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n39.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n39.obj
new file mode 100644
index 00000000..5cb96de7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n39.obj
@@ -0,0 +1,62 @@
+v -0.29524181 -0.90866085 -0.29524181
+v -0.77295309 -0.56158329 -0.29524181
+v -0.95542256 -0.00000000 -0.29524181
+v -0.77295309 0.56158329 -0.29524181
+v -0.29524181 0.90866085 -0.29524181
+v 0.29524181 0.90866085 -0.29524181
+v 0.77295309 0.56158329 -0.29524181
+v 0.95542256 -0.00000000 -0.29524181
+v 0.77295309 -0.56158329 -0.29524181
+v 0.29524181 -0.90866085 -0.29524181
+v -0.29524181 -0.40636549 -0.60567742
+v -0.47771128 0.15521780 -0.60567742
+v 0.00000000 0.50229537 -0.60567742
+v 0.47771128 0.15521780 -0.60567742
+v 0.29524181 -0.40636549 -0.60567742
+v -0.29524181 -0.90866085 0.29524181
+v 0.29524181 -0.90866085 0.29524181
+v 0.77295309 -0.56158329 0.29524181
+v 0.95542256 0.00000000 0.29524181
+v 0.77295309 0.56158329 0.29524181
+v 0.29524181 0.90866085 0.29524181
+v -0.29524181 0.90866085 0.29524181
+v -0.77295309 0.56158329 0.29524181
+v -0.95542256 0.00000000 0.29524181
+v -0.77295309 -0.56158329 0.29524181
+v 0.00000000 -0.50229537 0.60567742
+v 0.47771128 -0.15521780 0.60567742
+v 0.29524181 0.40636549 0.60567742
+v -0.29524181 0.40636549 0.60567742
+v -0.47771128 -0.15521780 0.60567742
+f 1 2 11
+f 1 11 15 10
+f 1 10 17 16
+f 1 16 25 2
+f 2 3 12 11
+f 2 25 24 3
+f 3 4 12
+f 3 24 23 4
+f 4 5 13 12
+f 4 23 22 5
+f 5 6 13
+f 5 22 21 6
+f 6 7 14 13
+f 6 21 20 7
+f 7 8 14
+f 7 20 19 8
+f 8 9 15 14
+f 8 19 18 9
+f 9 10 15
+f 9 18 17 10
+f 11 12 13 14 15
+f 16 17 26
+f 16 26 30 25
+f 17 18 27 26
+f 18 19 27
+f 19 20 28 27
+f 20 21 28
+f 21 22 29 28
+f 22 23 29
+f 23 24 30 29
+f 24 25 30
+f 26 27 28 29 30
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n40.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n40.obj
new file mode 100644
index 00000000..c1b57f02
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n40.obj
@@ -0,0 +1,72 @@
+v -0.27602000 -0.84950220 -0.44962093
+v -0.72262973 -0.52502123 -0.44962093
+v -0.89321947 -0.00000000 -0.44962093
+v -0.72262973 0.52502123 -0.44962093
+v -0.27602000 0.84950220 -0.44962093
+v 0.27601999 0.84950220 -0.44962093
+v 0.72262973 0.52502123 -0.44962093
+v 0.89321947 -0.00000000 -0.44962093
+v 0.72262973 -0.52502123 -0.44962093
+v 0.27602000 -0.84950220 -0.44962093
+v -0.27602000 -0.37990893 -0.73984553
+v -0.44660973 0.14511230 -0.73984553
+v 0.00000000 0.46959326 -0.73984553
+v 0.44660974 0.14511230 -0.73984553
+v 0.27602000 -0.37990893 -0.73984553
+v -0.27602000 -0.84950220 0.10241906
+v 0.27602000 -0.84950220 0.10241906
+v 0.72262973 -0.52502123 0.10241906
+v 0.89321947 -0.00000000 0.10241906
+v 0.72262973 0.52502123 0.10241906
+v 0.27601999 0.84950220 0.10241906
+v -0.27602000 0.84950220 0.10241906
+v -0.72262973 0.52502123 0.10241906
+v -0.89321947 -0.00000000 0.10241906
+v -0.72262973 -0.52502123 0.10241906
+v -0.44660973 -0.61470556 0.57201233
+v 0.44660974 -0.61470556 0.57201233
+v 0.72262973 0.23479663 0.57201233
+v -0.00000000 0.75981786 0.57201233
+v -0.72262973 0.23479663 0.57201233
+v 0.00000000 -0.46959326 0.86223693
+v 0.44660973 -0.14511230 0.86223693
+v 0.27602000 0.37990893 0.86223693
+v -0.27602000 0.37990893 0.86223693
+v -0.44660973 -0.14511230 0.86223693
+f 1 2 11
+f 1 11 15 10
+f 1 10 17 16
+f 1 16 25 2
+f 2 3 12 11
+f 2 25 24 3
+f 3 4 12
+f 3 24 23 4
+f 4 5 13 12
+f 4 23 22 5
+f 5 6 13
+f 5 22 21 6
+f 6 7 14 13
+f 6 21 20 7
+f 7 8 14
+f 7 20 19 8
+f 8 9 15 14
+f 8 19 18 9
+f 9 10 15
+f 9 18 17 10
+f 11 12 13 14 15
+f 16 17 27 31 26
+f 16 26 25
+f 17 18 27
+f 18 19 28 32 27
+f 19 20 28
+f 20 21 29 33 28
+f 21 22 29
+f 22 23 30 34 29
+f 23 24 30
+f 24 25 26 35 30
+f 26 31 35
+f 27 32 31
+f 28 33 32
+f 29 34 33
+f 30 35 34
+f 31 32 33 34 35
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n41.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n41.obj
new file mode 100644
index 00000000..3adcc5a7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n41.obj
@@ -0,0 +1,72 @@
+v -0.27602000 -0.84950220 -0.44962093
+v -0.72262973 -0.52502123 -0.44962093
+v -0.89321947 0.00000000 -0.44962093
+v -0.72262973 0.52502123 -0.44962093
+v -0.27602000 0.84950220 -0.44962093
+v 0.27601999 0.84950220 -0.44962093
+v 0.72262973 0.52502123 -0.44962093
+v 0.89321947 0.00000000 -0.44962093
+v 0.72262973 -0.52502123 -0.44962093
+v 0.27602000 -0.84950220 -0.44962093
+v -0.27602000 -0.37990893 -0.73984553
+v -0.44660973 0.14511230 -0.73984553
+v 0.00000000 0.46959326 -0.73984553
+v 0.44660973 0.14511230 -0.73984553
+v 0.27602000 -0.37990893 -0.73984553
+v -0.27602000 -0.84950220 0.10241906
+v 0.27602000 -0.84950220 0.10241906
+v 0.72262973 -0.52502123 0.10241906
+v 0.89321947 -0.00000000 0.10241906
+v 0.72262973 0.52502123 0.10241906
+v 0.27602000 0.84950220 0.10241906
+v -0.27602000 0.84950220 0.10241906
+v -0.72262973 0.52502123 0.10241906
+v -0.89321947 -0.00000000 0.10241906
+v -0.72262973 -0.52502123 0.10241906
+v -0.72262973 -0.23479663 0.57201233
+v 0.00000000 -0.75981786 0.57201233
+v 0.72262973 -0.23479663 0.57201233
+v 0.44660973 0.61470556 0.57201233
+v -0.44660973 0.61470556 0.57201233
+v -0.27602000 -0.37990893 0.86223693
+v 0.27602000 -0.37990893 0.86223693
+v 0.44660973 0.14511230 0.86223693
+v 0.00000000 0.46959326 0.86223693
+v -0.44660973 0.14511230 0.86223693
+f 1 2 11
+f 1 11 15 10
+f 1 10 17 16
+f 1 16 25 2
+f 2 3 12 11
+f 2 25 24 3
+f 3 4 12
+f 3 24 23 4
+f 4 5 13 12
+f 4 23 22 5
+f 5 6 13
+f 5 22 21 6
+f 6 7 14 13
+f 6 21 20 7
+f 7 8 14
+f 7 20 19 8
+f 8 9 15 14
+f 8 19 18 9
+f 9 10 15
+f 9 18 17 10
+f 11 12 13 14 15
+f 16 17 27
+f 16 27 31 26 25
+f 17 18 28 32 27
+f 18 19 28
+f 19 20 29 33 28
+f 20 21 29
+f 21 22 30 34 29
+f 22 23 30
+f 23 24 26 35 30
+f 24 25 26
+f 26 31 35
+f 27 32 31
+f 28 33 32
+f 29 34 33
+f 30 35 34
+f 31 32 33 34 35
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n42.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n42.obj
new file mode 100644
index 00000000..414d704a
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n42.obj
@@ -0,0 +1,82 @@
+v -0.24269512 -0.74693876 -0.24269512
+v -0.63538406 -0.46163354 -0.24269512
+v -0.78537789 0.00000000 -0.24269512
+v -0.63538406 0.46163354 -0.24269512
+v -0.24269512 0.74693876 -0.24269512
+v 0.24269512 0.74693876 -0.24269512
+v 0.63538406 0.46163354 -0.24269512
+v 0.78537789 0.00000000 -0.24269512
+v 0.63538406 -0.46163354 -0.24269512
+v 0.24269512 -0.74693876 -0.24269512
+v 0.00000000 -0.66808234 -0.65559271
+v -0.63538406 -0.20644880 -0.65559271
+v -0.39268895 0.54048997 -0.65559271
+v 0.39268895 0.54048997 -0.65559271
+v 0.63538406 -0.20644880 -0.65559271
+v -0.24269512 -0.33404117 -0.91077746
+v -0.39268895 0.12759237 -0.91077746
+v 0.00000000 0.41289759 -0.91077746
+v 0.39268895 0.12759237 -0.91077746
+v 0.24269512 -0.33404117 -0.91077746
+v -0.24269512 -0.74693876 0.24269512
+v 0.24269512 -0.74693876 0.24269512
+v 0.63538406 -0.46163354 0.24269512
+v 0.78537789 -0.00000000 0.24269512
+v 0.63538406 0.46163354 0.24269512
+v 0.24269512 0.74693876 0.24269512
+v -0.24269512 0.74693876 0.24269512
+v -0.63538406 0.46163354 0.24269512
+v -0.78537789 0.00000000 0.24269512
+v -0.63538406 -0.46163354 0.24269512
+v -0.63538406 -0.20644880 0.65559271
+v 0.00000000 -0.66808234 0.65559271
+v 0.63538406 -0.20644880 0.65559271
+v 0.39268895 0.54048997 0.65559271
+v -0.39268895 0.54048997 0.65559271
+v -0.24269512 -0.33404117 0.91077746
+v 0.24269512 -0.33404117 0.91077746
+v 0.39268895 0.12759237 0.91077746
+v 0.00000000 0.41289759 0.91077746
+v -0.39268895 0.12759237 0.91077746
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 22 21
+f 1 21 30 2
+f 2 3 12
+f 2 30 29 3
+f 3 4 13 17 12
+f 3 29 28 4
+f 4 5 13
+f 4 28 27 5
+f 5 6 14 18 13
+f 5 27 26 6
+f 6 7 14
+f 6 26 25 7
+f 7 8 15 19 14
+f 7 25 24 8
+f 8 9 15
+f 8 24 23 9
+f 9 10 11 20 15
+f 9 23 22 10
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
+f 21 22 32
+f 21 32 36 31 30
+f 22 23 33 37 32
+f 23 24 33
+f 24 25 34 38 33
+f 25 26 34
+f 26 27 35 39 34
+f 27 28 35
+f 28 29 31 40 35
+f 29 30 31
+f 31 36 40
+f 32 37 36
+f 33 38 37
+f 34 39 38
+f 35 40 39
+f 36 37 38 39 40
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n43.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n43.obj
new file mode 100644
index 00000000..15b86180
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n43.obj
@@ -0,0 +1,82 @@
+v -0.24269512 -0.74693876 -0.24269512
+v -0.63538406 -0.46163354 -0.24269512
+v -0.78537789 -0.00000000 -0.24269512
+v -0.63538406 0.46163354 -0.24269512
+v -0.24269512 0.74693876 -0.24269512
+v 0.24269512 0.74693876 -0.24269512
+v 0.63538406 0.46163354 -0.24269512
+v 0.78537789 -0.00000000 -0.24269512
+v 0.63538406 -0.46163354 -0.24269512
+v 0.24269512 -0.74693876 -0.24269512
+v 0.00000000 -0.66808234 -0.65559271
+v -0.63538406 -0.20644880 -0.65559271
+v -0.39268895 0.54048997 -0.65559271
+v 0.39268895 0.54048997 -0.65559271
+v 0.63538406 -0.20644880 -0.65559271
+v -0.24269512 -0.33404117 -0.91077746
+v -0.39268895 0.12759237 -0.91077746
+v 0.00000000 0.41289759 -0.91077746
+v 0.39268895 0.12759237 -0.91077746
+v 0.24269512 -0.33404117 -0.91077746
+v -0.24269512 -0.74693876 0.24269512
+v 0.24269512 -0.74693876 0.24269512
+v 0.63538406 -0.46163354 0.24269512
+v 0.78537789 0.00000000 0.24269512
+v 0.63538406 0.46163354 0.24269512
+v 0.24269512 0.74693876 0.24269512
+v -0.24269512 0.74693876 0.24269512
+v -0.63538406 0.46163354 0.24269512
+v -0.78537789 0.00000000 0.24269512
+v -0.63538406 -0.46163354 0.24269512
+v -0.39268895 -0.54048997 0.65559271
+v 0.39268895 -0.54048997 0.65559271
+v 0.63538406 0.20644880 0.65559271
+v -0.00000000 0.66808234 0.65559271
+v -0.63538406 0.20644880 0.65559271
+v 0.00000000 -0.41289759 0.91077746
+v 0.39268895 -0.12759237 0.91077746
+v 0.24269512 0.33404117 0.91077746
+v -0.24269512 0.33404117 0.91077746
+v -0.39268895 -0.12759237 0.91077746
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 22 21
+f 1 21 30 2
+f 2 3 12
+f 2 30 29 3
+f 3 4 13 17 12
+f 3 29 28 4
+f 4 5 13
+f 4 28 27 5
+f 5 6 14 18 13
+f 5 27 26 6
+f 6 7 14
+f 6 26 25 7
+f 7 8 15 19 14
+f 7 25 24 8
+f 8 9 15
+f 8 24 23 9
+f 9 10 11 20 15
+f 9 23 22 10
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
+f 21 22 32 36 31
+f 21 31 30
+f 22 23 32
+f 23 24 33 37 32
+f 24 25 33
+f 25 26 34 38 33
+f 26 27 34
+f 27 28 35 39 34
+f 28 29 35
+f 29 30 31 40 35
+f 31 36 40
+f 32 37 36
+f 33 38 37
+f 34 39 38
+f 35 40 39
+f 36 37 38 39 40
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n44L.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n44L.obj
new file mode 100644
index 00000000..a118aec6
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n44L.obj
@@ -0,0 +1,44 @@
+v -0.36450673 -0.63134418 0.31187184
+v -0.72901347 0.00000000 0.31187184
+v -0.36450673 0.63134418 0.31187184
+v 0.36450673 0.63134418 0.31187184
+v 0.72901347 0.00000000 0.31187184
+v 0.36450673 -0.63134418 0.31187184
+v 0.00000000 -0.72901347 -0.31187184
+v -0.63134418 -0.36450673 -0.31187184
+v -0.63134418 0.36450673 -0.31187184
+v -0.00000000 0.72901347 -0.31187184
+v 0.63134418 0.36450673 -0.31187184
+v 0.63134418 -0.36450673 -0.31187184
+v 0.00000000 -0.42089612 0.90710884
+v 0.36450673 0.21044806 0.90710884
+v -0.36450673 0.21044806 0.90710884
+v 0.21044806 -0.36450673 -0.90710884
+v -0.42089612 0.00000000 -0.90710884
+v 0.21044806 0.36450673 -0.90710884
+f 1 2 8
+f 1 8 7
+f 1 7 6
+f 1 6 13
+f 1 13 15 2
+f 2 3 9
+f 2 9 8
+f 2 15 3
+f 3 4 10
+f 3 10 9
+f 3 15 14 4
+f 4 5 11
+f 4 11 10
+f 4 14 5
+f 5 6 12
+f 5 12 11
+f 5 14 13 6
+f 6 7 12
+f 7 8 17 16
+f 7 16 12
+f 8 9 17
+f 9 10 18 17
+f 10 11 18
+f 11 12 16 18
+f 13 14 15
+f 16 17 18
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n44R.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n44R.obj
new file mode 100644
index 00000000..d29c2764
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n44R.obj
@@ -0,0 +1,44 @@
+v -0.36450673 -0.63134418 0.31187184
+v -0.72901347 0.00000000 0.31187184
+v -0.36450673 0.63134418 0.31187184
+v 0.36450673 0.63134418 0.31187184
+v 0.72901347 0.00000000 0.31187184
+v 0.36450673 -0.63134418 0.31187184
+v 0.00000000 -0.72901347 -0.31187184
+v -0.63134418 -0.36450673 -0.31187184
+v -0.63134418 0.36450673 -0.31187184
+v 0.00000000 0.72901347 -0.31187184
+v 0.63134418 0.36450673 -0.31187184
+v 0.63134418 -0.36450673 -0.31187184
+v 0.00000000 -0.42089612 0.90710884
+v 0.36450673 0.21044806 0.90710884
+v -0.36450673 0.21044806 0.90710884
+v -0.21044806 -0.36450673 -0.90710884
+v -0.21044806 0.36450673 -0.90710884
+v 0.42089612 -0.00000000 -0.90710884
+f 1 2 8
+f 1 8 7
+f 1 7 6
+f 1 6 13
+f 1 13 15 2
+f 2 3 9
+f 2 9 8
+f 2 15 3
+f 3 4 10
+f 3 10 9
+f 3 15 14 4
+f 4 5 11
+f 4 11 10
+f 4 14 5
+f 5 6 12
+f 5 12 11
+f 5 14 13 6
+f 6 7 12
+f 7 8 16
+f 7 16 18 12
+f 8 9 17 16
+f 9 10 17
+f 10 11 18 17
+f 11 12 18
+f 13 14 15
+f 16 17 18
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n45L.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n45L.obj
new file mode 100644
index 00000000..79c06df1
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n45L.obj
@@ -0,0 +1,58 @@
+v -0.36349134 -0.87754573 0.31270999
+v -0.87754573 -0.36349134 0.31270999
+v -0.87754573 0.36349134 0.31270999
+v -0.36349134 0.87754573 0.31270999
+v 0.36349134 0.87754573 0.31270999
+v 0.87754573 0.36349134 0.31270999
+v 0.87754573 -0.36349134 0.31270999
+v 0.36349134 -0.87754573 0.31270999
+v 0.00000000 -0.94984865 -0.31270999
+v -0.67164442 -0.67164442 -0.31270999
+v -0.94984865 -0.00000000 -0.31270999
+v -0.67164442 0.67164442 -0.31270999
+v 0.00000000 0.94984865 -0.31270999
+v 0.67164442 0.67164442 -0.31270999
+v 0.94984865 -0.00000000 -0.31270999
+v 0.67164442 -0.67164442 -0.31270999
+v -0.36349134 -0.36349134 0.82676438
+v 0.36349134 -0.36349134 0.82676438
+v 0.36349134 0.36349134 0.82676438
+v -0.36349134 0.36349134 0.82676438
+v 0.47492433 -0.19672010 -0.82676438
+v -0.19672010 -0.47492433 -0.82676438
+v -0.47492433 0.19672010 -0.82676438
+v 0.19672010 0.47492433 -0.82676438
+f 1 2 10
+f 1 10 9
+f 1 9 8
+f 1 8 18 17
+f 1 17 2
+f 2 3 11
+f 2 11 10
+f 2 17 20 3
+f 3 4 12
+f 3 12 11
+f 3 20 4
+f 4 5 13
+f 4 13 12
+f 4 20 19 5
+f 5 6 14
+f 5 14 13
+f 5 19 6
+f 6 7 15
+f 6 15 14
+f 6 19 18 7
+f 7 8 16
+f 7 16 15
+f 7 18 8
+f 8 9 16
+f 9 10 22
+f 9 22 21 16
+f 10 11 23 22
+f 11 12 23
+f 12 13 24 23
+f 13 14 24
+f 14 15 21 24
+f 15 16 21
+f 17 18 19 20
+f 21 22 23 24
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n45R.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n45R.obj
new file mode 100644
index 00000000..5b7ea3ed
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n45R.obj
@@ -0,0 +1,58 @@
+v -0.36349134 -0.87754573 0.31270999
+v -0.87754573 -0.36349134 0.31270999
+v -0.87754573 0.36349134 0.31270999
+v -0.36349134 0.87754573 0.31270999
+v 0.36349134 0.87754573 0.31270999
+v 0.87754573 0.36349134 0.31270999
+v 0.87754573 -0.36349134 0.31270999
+v 0.36349134 -0.87754573 0.31270999
+v 0.00000000 -0.94984865 -0.31270999
+v -0.67164442 -0.67164442 -0.31270999
+v -0.94984865 -0.00000000 -0.31270999
+v -0.67164442 0.67164442 -0.31270999
+v 0.00000000 0.94984865 -0.31270999
+v 0.67164442 0.67164442 -0.31270999
+v 0.94984865 -0.00000000 -0.31270999
+v 0.67164442 -0.67164442 -0.31270999
+v -0.36349134 -0.36349134 0.82676438
+v 0.36349134 -0.36349134 0.82676438
+v 0.36349134 0.36349134 0.82676438
+v -0.36349134 0.36349134 0.82676438
+v 0.19672010 -0.47492433 -0.82676438
+v -0.47492433 -0.19672010 -0.82676438
+v -0.19672010 0.47492433 -0.82676438
+v 0.47492433 0.19672010 -0.82676438
+f 1 2 10
+f 1 10 9
+f 1 9 8
+f 1 8 18 17
+f 1 17 2
+f 2 3 11
+f 2 11 10
+f 2 17 20 3
+f 3 4 12
+f 3 12 11
+f 3 20 4
+f 4 5 13
+f 4 13 12
+f 4 20 19 5
+f 5 6 14
+f 5 14 13
+f 5 19 6
+f 6 7 15
+f 6 15 14
+f 6 19 18 7
+f 7 8 16
+f 7 16 15
+f 7 18 8
+f 8 9 16
+f 9 10 22 21
+f 9 21 16
+f 10 11 22
+f 11 12 23 22
+f 12 13 23
+f 13 14 24 23
+f 14 15 24
+f 15 16 21 24
+f 17 18 19 20
+f 21 22 23 24
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n46L.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n46L.obj
new file mode 100644
index 00000000..c36513d3
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n46L.obj
@@ -0,0 +1,72 @@
+v -0.29859575 -0.91898322 -0.25750808
+v -0.78173382 -0.56796287 -0.25750808
+v -0.96627614 0.00000000 -0.25750808
+v -0.78173382 0.56796287 -0.25750808
+v -0.29859575 0.91898322 -0.25750808
+v 0.29859575 0.91898322 -0.25750808
+v 0.78173382 0.56796287 -0.25750808
+v 0.96627614 0.00000000 -0.25750808
+v 0.78173382 -0.56796287 -0.25750808
+v 0.29859575 -0.91898322 -0.25750808
+v -0.29859575 -0.41098179 -0.57147023
+v -0.48313807 0.15698108 -0.57147023
+v 0.00000000 0.50800143 -0.57147023
+v 0.48313807 0.15698108 -0.57147023
+v 0.29859575 -0.41098179 -0.57147023
+v -0.56796287 -0.78173382 0.25750808
+v 0.00000000 -0.96627614 0.25750808
+v 0.56796287 -0.78173382 0.25750808
+v 0.91898322 -0.29859575 0.25750808
+v 0.91898322 0.29859575 0.25750808
+v 0.56796287 0.78173382 0.25750808
+v -0.00000000 0.96627614 0.25750808
+v -0.56796287 0.78173382 0.25750808
+v -0.91898322 0.29859575 0.25750808
+v -0.91898322 -0.29859575 0.25750808
+v -0.41098179 -0.29859575 0.57147023
+v 0.15698108 -0.48313807 0.57147023
+v 0.50800143 -0.00000000 0.57147023
+v 0.15698107 0.48313807 0.57147023
+v -0.41098179 0.29859575 0.57147023
+f 1 2 11
+f 1 11 15 10
+f 1 10 17
+f 1 17 16
+f 1 16 2
+f 2 3 12 11
+f 2 16 25
+f 2 25 3
+f 3 4 12
+f 3 25 24
+f 3 24 4
+f 4 5 13 12
+f 4 24 23
+f 4 23 5
+f 5 6 13
+f 5 23 22
+f 5 22 6
+f 6 7 14 13
+f 6 22 21
+f 6 21 7
+f 7 8 14
+f 7 21 20
+f 7 20 8
+f 8 9 15 14
+f 8 20 19
+f 8 19 9
+f 9 10 15
+f 9 19 18
+f 9 18 10
+f 10 18 17
+f 11 12 13 14 15
+f 16 17 27 26
+f 16 26 25
+f 17 18 27
+f 18 19 28 27
+f 19 20 28
+f 20 21 29 28
+f 21 22 29
+f 22 23 30 29
+f 23 24 30
+f 24 25 26 30
+f 26 27 28 29 30
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n46R.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n46R.obj
new file mode 100644
index 00000000..ce2cc058
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n46R.obj
@@ -0,0 +1,72 @@
+v -0.29859575 -0.91898322 -0.25750808
+v -0.78173382 -0.56796287 -0.25750808
+v -0.96627614 0.00000000 -0.25750808
+v -0.78173382 0.56796287 -0.25750808
+v -0.29859575 0.91898322 -0.25750808
+v 0.29859575 0.91898322 -0.25750808
+v 0.78173382 0.56796287 -0.25750808
+v 0.96627614 0.00000000 -0.25750808
+v 0.78173382 -0.56796287 -0.25750808
+v 0.29859575 -0.91898322 -0.25750808
+v -0.29859575 -0.41098179 -0.57147023
+v -0.48313807 0.15698108 -0.57147023
+v 0.00000000 0.50800143 -0.57147023
+v 0.48313807 0.15698108 -0.57147023
+v 0.29859575 -0.41098179 -0.57147023
+v -0.56796287 -0.78173382 0.25750808
+v 0.00000000 -0.96627614 0.25750808
+v 0.56796287 -0.78173382 0.25750808
+v 0.91898322 -0.29859575 0.25750808
+v 0.91898322 0.29859575 0.25750808
+v 0.56796286 0.78173382 0.25750808
+v -0.00000000 0.96627614 0.25750808
+v -0.56796287 0.78173382 0.25750808
+v -0.91898322 0.29859575 0.25750808
+v -0.91898322 -0.29859575 0.25750808
+v -0.15698107 -0.48313807 0.57147023
+v 0.41098179 -0.29859575 0.57147023
+v 0.41098179 0.29859575 0.57147023
+v -0.15698108 0.48313807 0.57147023
+v -0.50800143 0.00000000 0.57147023
+f 1 2 11
+f 1 11 15 10
+f 1 10 17
+f 1 17 16
+f 1 16 2
+f 2 3 12 11
+f 2 16 25
+f 2 25 3
+f 3 4 12
+f 3 25 24
+f 3 24 4
+f 4 5 13 12
+f 4 24 23
+f 4 23 5
+f 5 6 13
+f 5 23 22
+f 5 22 6
+f 6 7 14 13
+f 6 22 21
+f 6 21 7
+f 7 8 14
+f 7 21 20
+f 7 20 8
+f 8 9 15 14
+f 8 20 19
+f 8 19 9
+f 9 10 15
+f 9 19 18
+f 9 18 10
+f 10 18 17
+f 11 12 13 14 15
+f 16 17 26
+f 16 26 30 25
+f 17 18 27 26
+f 18 19 27
+f 19 20 28 27
+f 20 21 28
+f 21 22 29 28
+f 22 23 29
+f 23 24 30 29
+f 24 25 30
+f 26 27 28 29 30
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n47L.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n47L.obj
new file mode 100644
index 00000000..e2fa72f6
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n47L.obj
@@ -0,0 +1,82 @@
+v -0.28129438 -0.86573510 -0.41397609
+v -0.73643826 -0.53505372 -0.41397609
+v -0.91028775 0.00000000 -0.41397609
+v -0.73643826 0.53505372 -0.41397609
+v -0.28129439 0.86573510 -0.41397609
+v 0.28129438 0.86573510 -0.41397609
+v 0.73643826 0.53505372 -0.41397609
+v 0.91028775 0.00000000 -0.41397609
+v 0.73643826 -0.53505372 -0.41397609
+v 0.28129439 -0.86573510 -0.41397609
+v -0.28129438 -0.38716851 -0.70974651
+v -0.45514388 0.14788521 -0.70974651
+v 0.00000000 0.47856659 -0.70974651
+v 0.45514388 0.14788521 -0.70974651
+v 0.28129439 -0.38716851 -0.70974651
+v -0.53505372 -0.73643826 0.07119878
+v 0.00000000 -0.91028775 0.07119878
+v 0.53505372 -0.73643826 0.07119878
+v 0.86573510 -0.28129439 0.07119878
+v 0.86573510 0.28129438 0.07119877
+v 0.53505371 0.73643826 0.07119877
+v -0.00000000 0.91028775 0.07119877
+v -0.53505372 0.73643826 0.07119877
+v -0.86573510 0.28129439 0.07119878
+v -0.86573510 -0.28129439 0.07119878
+v -0.77433701 0.00000000 0.54976537
+v -0.23928330 -0.73643826 0.54976537
+v 0.62645180 -0.45514388 0.54976537
+v 0.62645180 0.45514388 0.54976537
+v -0.23928330 0.73643826 0.54976537
+v -0.38716851 -0.28129439 0.84553579
+v 0.14788521 -0.45514388 0.84553579
+v 0.47856659 -0.00000000 0.84553579
+v 0.14788521 0.45514388 0.84553579
+v -0.38716851 0.28129439 0.84553579
+f 1 2 11
+f 1 11 15 10
+f 1 10 17
+f 1 17 16
+f 1 16 2
+f 2 3 12 11
+f 2 16 25
+f 2 25 3
+f 3 4 12
+f 3 25 24
+f 3 24 4
+f 4 5 13 12
+f 4 24 23
+f 4 23 5
+f 5 6 13
+f 5 23 22
+f 5 22 6
+f 6 7 14 13
+f 6 22 21
+f 6 21 7
+f 7 8 14
+f 7 21 20
+f 7 20 8
+f 8 9 15 14
+f 8 20 19
+f 8 19 9
+f 9 10 15
+f 9 19 18
+f 9 18 10
+f 10 18 17
+f 11 12 13 14 15
+f 16 17 27
+f 16 27 31 26 25
+f 17 18 28 32 27
+f 18 19 28
+f 19 20 29 33 28
+f 20 21 29
+f 21 22 30 34 29
+f 22 23 30
+f 23 24 26 35 30
+f 24 25 26
+f 26 31 35
+f 27 32 31
+f 28 33 32
+f 29 34 33
+f 30 35 34
+f 31 32 33 34 35
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n47R.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n47R.obj
new file mode 100644
index 00000000..2ab53743
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n47R.obj
@@ -0,0 +1,82 @@
+v -0.28129438 -0.86573510 -0.41397609
+v -0.73643826 -0.53505372 -0.41397609
+v -0.91028775 0.00000000 -0.41397609
+v -0.73643826 0.53505372 -0.41397609
+v -0.28129439 0.86573510 -0.41397609
+v 0.28129438 0.86573510 -0.41397609
+v 0.73643826 0.53505372 -0.41397609
+v 0.91028775 0.00000000 -0.41397609
+v 0.73643826 -0.53505372 -0.41397609
+v 0.28129439 -0.86573510 -0.41397609
+v -0.28129438 -0.38716851 -0.70974651
+v -0.45514387 0.14788521 -0.70974651
+v 0.00000000 0.47856659 -0.70974651
+v 0.45514388 0.14788521 -0.70974651
+v 0.28129439 -0.38716851 -0.70974651
+v -0.53505372 -0.73643826 0.07119878
+v 0.00000000 -0.91028775 0.07119878
+v 0.53505372 -0.73643826 0.07119878
+v 0.86573510 -0.28129439 0.07119878
+v 0.86573510 0.28129439 0.07119877
+v 0.53505371 0.73643826 0.07119877
+v -0.00000000 0.91028775 0.07119877
+v -0.53505372 0.73643826 0.07119877
+v -0.86573510 0.28129439 0.07119878
+v -0.86573510 -0.28129439 0.07119878
+v -0.62645180 -0.45514388 0.54976537
+v 0.23928330 -0.73643826 0.54976537
+v 0.77433701 -0.00000000 0.54976537
+v 0.23928329 0.73643826 0.54976537
+v -0.62645180 0.45514388 0.54976537
+v -0.14788521 -0.45514388 0.84553579
+v 0.38716851 -0.28129439 0.84553579
+v 0.38716850 0.28129439 0.84553579
+v -0.14788521 0.45514388 0.84553579
+v -0.47856659 0.00000000 0.84553579
+f 1 2 11
+f 1 11 15 10
+f 1 10 17
+f 1 17 16
+f 1 16 2
+f 2 3 12 11
+f 2 16 25
+f 2 25 3
+f 3 4 12
+f 3 25 24
+f 3 24 4
+f 4 5 13 12
+f 4 24 23
+f 4 23 5
+f 5 6 13
+f 5 23 22
+f 5 22 6
+f 6 7 14 13
+f 6 22 21
+f 6 21 7
+f 7 8 14
+f 7 21 20
+f 7 20 8
+f 8 9 15 14
+f 8 20 19
+f 8 19 9
+f 9 10 15
+f 9 19 18
+f 9 18 10
+f 10 18 17
+f 11 12 13 14 15
+f 16 17 27 31 26
+f 16 26 25
+f 17 18 27
+f 18 19 28 32 27
+f 19 20 28
+f 20 21 29 33 28
+f 21 22 29
+f 22 23 30 34 29
+f 23 24 30
+f 24 25 26 35 30
+f 26 31 35
+f 27 32 31
+f 28 33 32
+f 29 34 33
+f 30 35 34
+f 31 32 33 34 35
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n48L.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n48L.obj
new file mode 100644
index 00000000..b2c4ece1
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n48L.obj
@@ -0,0 +1,92 @@
+v -0.25028317 -0.77029241 -0.21584346
+v -0.65524986 -0.47606689 -0.21584346
+v -0.80993337 0.00000000 -0.21584346
+v -0.65524986 0.47606689 -0.21584346
+v -0.25028318 0.77029241 -0.21584346
+v 0.25028317 0.77029241 -0.21584346
+v 0.65524986 0.47606689 -0.21584346
+v 0.80993337 0.00000000 -0.21584346
+v 0.65524986 -0.47606689 -0.21584346
+v 0.25028318 -0.77029241 -0.21584346
+v 0.00000000 -0.68897047 -0.64165063
+v -0.65524986 -0.21290358 -0.64165063
+v -0.40496668 0.55738882 -0.64165063
+v 0.40496668 0.55738882 -0.64165063
+v 0.65524986 -0.21290358 -0.64165063
+v -0.25028317 -0.34448524 -0.90481393
+v -0.40496668 0.13158165 -0.90481393
+v 0.00000000 0.42580717 -0.90481393
+v 0.40496668 0.13158165 -0.90481393
+v 0.25028318 -0.34448524 -0.90481393
+v -0.47606689 -0.65524986 0.21584346
+v 0.00000000 -0.80993337 0.21584346
+v 0.47606689 -0.65524986 0.21584346
+v 0.77029241 -0.25028318 0.21584346
+v 0.77029241 0.25028317 0.21584346
+v 0.47606689 0.65524986 0.21584346
+v -0.00000000 0.80993337 0.21584346
+v -0.47606689 0.65524986 0.21584346
+v -0.77029241 0.25028317 0.21584346
+v -0.77029241 -0.25028317 0.21584346
+v -0.68897047 0.00000000 0.64165063
+v -0.21290358 -0.65524986 0.64165063
+v 0.55738882 -0.40496668 0.64165063
+v 0.55738882 0.40496668 0.64165063
+v -0.21290359 0.65524986 0.64165063
+v -0.34448524 -0.25028317 0.90481393
+v 0.13158165 -0.40496668 0.90481393
+v 0.42580717 -0.00000000 0.90481393
+v 0.13158165 0.40496668 0.90481393
+v -0.34448524 0.25028317 0.90481393
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 22
+f 1 22 21
+f 1 21 2
+f 2 3 12
+f 2 21 30
+f 2 30 3
+f 3 4 13 17 12
+f 3 30 29
+f 3 29 4
+f 4 5 13
+f 4 29 28
+f 4 28 5
+f 5 6 14 18 13
+f 5 28 27
+f 5 27 6
+f 6 7 14
+f 6 27 26
+f 6 26 7
+f 7 8 15 19 14
+f 7 26 25
+f 7 25 8
+f 8 9 15
+f 8 25 24
+f 8 24 9
+f 9 10 11 20 15
+f 9 24 23
+f 9 23 10
+f 10 23 22
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
+f 21 22 32
+f 21 32 36 31 30
+f 22 23 33 37 32
+f 23 24 33
+f 24 25 34 38 33
+f 25 26 34
+f 26 27 35 39 34
+f 27 28 35
+f 28 29 31 40 35
+f 29 30 31
+f 31 36 40
+f 32 37 36
+f 33 38 37
+f 34 39 38
+f 35 40 39
+f 36 37 38 39 40
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n48R.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n48R.obj
new file mode 100644
index 00000000..004d8254
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n48R.obj
@@ -0,0 +1,92 @@
+v -0.25028317 -0.77029241 -0.21584346
+v -0.65524986 -0.47606689 -0.21584346
+v -0.80993337 0.00000000 -0.21584346
+v -0.65524986 0.47606689 -0.21584346
+v -0.25028317 0.77029241 -0.21584346
+v 0.25028317 0.77029241 -0.21584346
+v 0.65524986 0.47606689 -0.21584346
+v 0.80993337 0.00000000 -0.21584346
+v 0.65524986 -0.47606689 -0.21584346
+v 0.25028318 -0.77029241 -0.21584346
+v 0.00000000 -0.68897047 -0.64165063
+v -0.65524986 -0.21290358 -0.64165063
+v -0.40496668 0.55738882 -0.64165063
+v 0.40496668 0.55738882 -0.64165063
+v 0.65524986 -0.21290359 -0.64165063
+v -0.25028317 -0.34448524 -0.90481393
+v -0.40496668 0.13158165 -0.90481393
+v 0.00000000 0.42580717 -0.90481393
+v 0.40496668 0.13158165 -0.90481393
+v 0.25028318 -0.34448524 -0.90481393
+v -0.47606689 -0.65524986 0.21584346
+v 0.00000000 -0.80993337 0.21584346
+v 0.47606689 -0.65524986 0.21584346
+v 0.77029241 -0.25028317 0.21584346
+v 0.77029240 0.25028317 0.21584346
+v 0.47606689 0.65524986 0.21584346
+v -0.00000000 0.80993337 0.21584346
+v -0.47606689 0.65524986 0.21584346
+v -0.77029241 0.25028317 0.21584346
+v -0.77029241 -0.25028317 0.21584346
+v -0.55738882 -0.40496668 0.64165063
+v 0.21290359 -0.65524986 0.64165063
+v 0.68897047 -0.00000000 0.64165063
+v 0.21290358 0.65524986 0.64165063
+v -0.55738882 0.40496668 0.64165063
+v -0.13158165 -0.40496668 0.90481393
+v 0.34448524 -0.25028317 0.90481393
+v 0.34448524 0.25028317 0.90481393
+v -0.13158165 0.40496668 0.90481393
+v -0.42580717 0.00000000 0.90481393
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 22
+f 1 22 21
+f 1 21 2
+f 2 3 12
+f 2 21 30
+f 2 30 3
+f 3 4 13 17 12
+f 3 30 29
+f 3 29 4
+f 4 5 13
+f 4 29 28
+f 4 28 5
+f 5 6 14 18 13
+f 5 28 27
+f 5 27 6
+f 6 7 14
+f 6 27 26
+f 6 26 7
+f 7 8 15 19 14
+f 7 26 25
+f 7 25 8
+f 8 9 15
+f 8 25 24
+f 8 24 9
+f 9 10 11 20 15
+f 9 24 23
+f 9 23 10
+f 10 23 22
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
+f 21 22 32 36 31
+f 21 31 30
+f 22 23 32
+f 23 24 33 37 32
+f 24 25 33
+f 25 26 34 38 33
+f 26 27 34
+f 27 28 35 39 34
+f 28 29 35
+f 29 30 31 40 35
+f 31 36 40
+f 32 37 36
+f 33 38 37
+f 34 39 38
+f 35 40 39
+f 36 37 38 39 40
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n49.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n49.obj
new file mode 100644
index 00000000..6cedb9f8
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n49.obj
@@ -0,0 +1,15 @@
+v -0.43001399 -0.41061161 0.57060708
+v 0.14059309 0.57770884 0.57060708
+v 0.71120016 -0.41061161 0.57060708
+v -0.43001399 -0.41061161 -0.57060708
+v 0.14059309 0.57770884 -0.57060708
+v 0.71120016 -0.41061161 -0.57060708
+v -0.84355854 0.48702875 -0.00000000
+f 1 4 6 3
+f 1 3 2
+f 1 2 7
+f 1 7 4
+f 2 3 6 5
+f 2 5 7
+f 4 5 6
+f 4 7 5
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n50.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n50.obj
new file mode 100644
index 00000000..f7c4ccbc
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n50.obj
@@ -0,0 +1,19 @@
+v -0.53205720 -0.43963661 0.53205720
+v 0.00000000 0.48191351 0.53205720
+v 0.53205720 -0.43963661 0.53205720
+v -0.53205720 -0.43963661 -0.53205720
+v 0.00000000 0.48191351 -0.53205720
+v 0.53205720 -0.43963661 -0.53205720
+v -0.91766294 0.39735971 -0.00000000
+v 0.91766294 0.39735971 -0.00000000
+f 1 4 6 3
+f 1 3 2
+f 1 2 7
+f 1 7 4
+f 2 5 7
+f 2 3 8
+f 2 8 5
+f 3 6 8
+f 4 5 6
+f 4 7 5
+f 5 8 6
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n51.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n51.obj
new file mode 100644
index 00000000..86483d6d
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n51.obj
@@ -0,0 +1,23 @@
+v -0.50211798 -0.28989795 0.50211798
+v 0.00000000 0.57979590 0.50211798
+v 0.50211798 -0.28989795 0.50211798
+v -0.50211798 -0.28989795 -0.50211798
+v 0.00000000 0.57979590 -0.50211798
+v 0.50211798 -0.28989795 -0.50211798
+v -0.86602540 0.50000000 -0.00000000
+v 0.86602540 0.50000000 -0.00000000
+v -0.00000000 -1.00000000 -0.00000000
+f 1 3 2
+f 1 2 7
+f 1 7 4
+f 1 4 9
+f 1 9 3
+f 2 5 7
+f 2 3 8
+f 2 8 5
+f 3 6 8
+f 3 9 6
+f 4 7 5
+f 4 5 6
+f 4 6 9
+f 5 8 6
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n52.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n52.obj
new file mode 100644
index 00000000..8e67dd58
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n52.obj
@@ -0,0 +1,21 @@
+v -0.29907545 -0.51164204 0.39418110
+v -0.54269277 0.23813497 0.39418110
+v 0.09510565 0.70152264 0.39418110
+v 0.73290407 0.23813497 0.39418110
+v 0.48928675 -0.51164204 0.39418110
+v -0.29907545 -0.51164204 -0.39418110
+v -0.54269277 0.23813497 -0.39418110
+v 0.09510565 0.70152264 -0.39418110
+v 0.73290407 0.23813497 -0.39418110
+v 0.48928675 -0.51164204 -0.39418110
+v -0.95105652 -0.30901699 -0.00000000
+f 1 6 10 5
+f 1 5 4 3 2
+f 1 2 11
+f 1 11 6
+f 2 3 8 7
+f 2 7 11
+f 3 4 9 8
+f 4 5 10 9
+f 6 7 8 9 10
+f 6 11 7
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n53.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n53.obj
new file mode 100644
index 00000000..cd266e99
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n53.obj
@@ -0,0 +1,25 @@
+v -0.33296747 -0.54286675 0.36369162
+v -0.55774125 0.14891583 0.36369162
+v 0.03072416 0.57646097 0.36369162
+v 0.61918957 0.14891583 0.36369162
+v 0.39441578 -0.54286675 0.36369162
+v -0.33296747 -0.54286675 -0.36369162
+v -0.55774125 0.14891583 -0.36369162
+v 0.03072416 0.57646097 -0.36369162
+v 0.61918957 0.14891583 -0.36369162
+v 0.39441578 -0.54286675 -0.36369162
+v -0.93451851 -0.35591453 -0.00000000
+v 0.62727693 0.77879628 -0.00000000
+f 1 6 10 5
+f 1 5 4 3 2
+f 1 2 11
+f 1 11 6
+f 2 3 8 7
+f 2 7 11
+f 3 4 12
+f 3 12 8
+f 4 5 10 9
+f 4 9 12
+f 6 7 8 9 10
+f 6 11 7
+f 8 12 9
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n54.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n54.obj
new file mode 100644
index 00000000..4377b1ff
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n54.obj
@@ -0,0 +1,24 @@
+v -0.27215490 -0.55471945 0.34432368
+v -0.61647858 0.04166667 0.34432368
+v -0.27215490 0.63805278 0.34432368
+v 0.41649247 0.63805278 0.34432368
+v 0.76081615 0.04166667 0.34432368
+v 0.41649247 -0.55471945 0.34432368
+v -0.27215490 -0.55471945 -0.34432368
+v -0.61647858 0.04166667 -0.34432368
+v -0.27215490 0.63805278 -0.34432368
+v 0.41649247 0.63805278 -0.34432368
+v 0.76081615 0.04166667 -0.34432368
+v 0.41649247 -0.55471945 -0.34432368
+v -0.86602540 -0.50000000 -0.00000000
+f 1 7 12 6
+f 1 6 5 4 3 2
+f 1 2 13
+f 1 13 7
+f 2 3 9 8
+f 2 8 13
+f 3 4 10 9
+f 4 5 11 10
+f 5 6 12 11
+f 7 8 9 10 11 12
+f 7 13 8
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n55.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n55.obj
new file mode 100644
index 00000000..cfde17fe
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n55.obj
@@ -0,0 +1,28 @@
+v -0.31783725 -0.55051026 0.31783725
+v -0.63567449 0.00000000 0.31783725
+v -0.31783725 0.55051026 0.31783725
+v 0.31783725 0.55051026 0.31783725
+v 0.63567449 -0.00000000 0.31783725
+v 0.31783725 -0.55051026 0.31783725
+v -0.31783725 -0.55051026 -0.31783725
+v -0.63567449 0.00000000 -0.31783725
+v -0.31783725 0.55051026 -0.31783725
+v 0.31783725 0.55051026 -0.31783725
+v 0.63567449 -0.00000000 -0.31783725
+v 0.31783725 -0.55051026 -0.31783725
+v -0.86602540 -0.50000000 -0.00000000
+v 0.86602540 0.50000000 0.00000000
+f 1 7 12 6
+f 1 6 5 4 3 2
+f 1 2 13
+f 1 13 7
+f 2 3 9 8
+f 2 8 13
+f 3 4 10 9
+f 4 5 14
+f 4 14 10
+f 5 6 12 11
+f 5 11 14
+f 7 8 9 10 11 12
+f 7 13 8
+f 10 14 11
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n56.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n56.obj
new file mode 100644
index 00000000..7bae7915
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n56.obj
@@ -0,0 +1,28 @@
+v -0.26491443 -0.60668951 0.32893287
+v -0.59384731 -0.03696106 0.32893287
+v -0.26491443 0.53276739 0.32893287
+v 0.39295131 0.53276739 0.32893287
+v 0.72188419 -0.03696106 0.32893287
+v 0.39295131 -0.60668951 0.32893287
+v -0.26491443 -0.60668951 -0.32893287
+v -0.59384731 -0.03696106 -0.32893287
+v -0.26491443 0.53276739 -0.32893287
+v 0.39295131 0.53276739 -0.32893287
+v 0.72188419 -0.03696106 -0.32893287
+v 0.39295131 -0.60668951 -0.32893287
+v -0.83223972 -0.55441595 -0.00000000
+v 0.06401844 0.99794872 -0.00000000
+f 1 7 12 6
+f 1 6 5 4 3 2
+f 1 2 13
+f 1 13 7
+f 2 3 9 8
+f 2 8 13
+f 3 4 14
+f 3 14 9
+f 4 5 11 10
+f 4 10 14
+f 5 6 12 11
+f 7 8 9 10 11 12
+f 7 13 8
+f 9 14 10
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n57.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n57.obj
new file mode 100644
index 00000000..036ae2e3
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n57.obj
@@ -0,0 +1,32 @@
+v -0.31783725 -0.55051026 0.31783725
+v -0.63567449 0.00000000 0.31783725
+v -0.31783725 0.55051026 0.31783725
+v 0.31783725 0.55051026 0.31783725
+v 0.63567449 -0.00000000 0.31783725
+v 0.31783725 -0.55051026 0.31783725
+v -0.31783725 -0.55051026 -0.31783725
+v -0.63567449 0.00000000 -0.31783725
+v -0.31783725 0.55051026 -0.31783725
+v 0.31783725 0.55051026 -0.31783725
+v 0.63567449 -0.00000000 -0.31783725
+v 0.31783725 -0.55051026 -0.31783725
+v -0.86602540 -0.50000000 -0.00000000
+v 0.00000000 1.00000000 -0.00000000
+v 0.86602540 -0.50000000 -0.00000000
+f 1 7 12 6
+f 1 6 5 4 3 2
+f 1 2 13
+f 1 13 7
+f 2 3 9 8
+f 2 8 13
+f 3 4 14
+f 3 14 9
+f 4 5 11 10
+f 4 10 14
+f 5 6 15
+f 5 15 11
+f 6 12 15
+f 7 8 9 10 11 12
+f 7 13 8
+f 9 14 10
+f 11 15 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n58.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n58.obj
new file mode 100644
index 00000000..a7350853
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n58.obj
@@ -0,0 +1,37 @@
+v -0.32026891 -0.44081234 0.66324934
+v 0.32026891 -0.44081234 0.66324934
+v 0.51820598 -0.71324934 0.11837533
+v 0.00000000 -0.88162467 -0.21837533
+v -0.51820598 -0.71324934 0.11837533
+v -0.51820598 0.16837533 0.66324934
+v 0.51820598 0.16837533 0.66324934
+v 0.83847489 -0.27243701 -0.21837533
+v -0.00000000 -0.54487401 -0.76324934
+v -0.83847489 -0.27243701 -0.21837533
+v -0.83847489 0.27243701 0.11837533
+v -0.00000000 0.54487401 0.66324934
+v 0.83847489 0.27243701 0.11837533
+v 0.51820598 -0.16837533 -0.76324934
+v -0.51820598 -0.16837533 -0.76324934
+v -0.51820598 0.71324934 -0.21837533
+v 0.00000000 0.88162467 0.11837533
+v 0.51820598 0.71324934 -0.21837533
+v 0.32026891 0.44081234 -0.76324934
+v -0.32026891 0.44081234 -0.76324934
+v 0.00000000 0.00000000 1.00000000
+f 1 6 11 10 5
+f 1 5 4 3 2
+f 1 2 21
+f 1 21 6
+f 2 3 8 13 7
+f 2 7 21
+f 3 4 9 14 8
+f 4 5 10 15 9
+f 6 12 17 16 11
+f 6 21 12
+f 7 13 18 17 12
+f 7 12 21
+f 8 14 19 18 13
+f 9 15 20 19 14
+f 10 11 16 20 15
+f 16 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n59.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n59.obj
new file mode 100644
index 00000000..9981d0b4
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n59.obj
@@ -0,0 +1,42 @@
+v -0.30501801 -0.41982127 0.67928509
+v 0.30501801 -0.41982127 0.67928509
+v 0.49352950 -0.67928509 0.16035746
+v 0.00000000 -0.83964254 -0.16035746
+v -0.49352950 -0.67928509 0.16035746
+v -0.49352950 0.16035746 0.67928509
+v 0.49352950 0.16035746 0.67928509
+v 0.79854751 -0.25946382 -0.16035746
+v -0.00000000 -0.51892763 -0.67928509
+v -0.79854751 -0.25946382 -0.16035746
+v -0.79854751 0.25946382 0.16035746
+v -0.00000000 0.51892763 0.67928509
+v 0.79854751 0.25946382 0.16035746
+v 0.49352950 -0.16035746 -0.67928509
+v -0.49352950 -0.16035746 -0.67928509
+v -0.49352950 0.67928509 -0.16035746
+v 0.00000000 0.83964254 0.16035746
+v 0.49352950 0.67928509 -0.16035746
+v 0.30501801 0.41982127 -0.67928509
+v -0.30501801 0.41982127 -0.67928509
+v 0.00000000 0.00000000 1.00000000
+v -0.00000000 0.00000000 -1.00000000
+f 1 6 11 10 5
+f 1 5 4 3 2
+f 1 2 21
+f 1 21 6
+f 2 3 8 13 7
+f 2 7 21
+f 3 4 9 14 8
+f 4 5 10 15 9
+f 6 12 17 16 11
+f 6 21 12
+f 7 13 18 17 12
+f 7 12 21
+f 8 14 19 18 13
+f 9 15 22
+f 9 22 14
+f 10 11 16 20 15
+f 14 22 19
+f 15 20 22
+f 16 17 18 19 20
+f 19 22 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n60.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n60.obj
new file mode 100644
index 00000000..27819bd4
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n60.obj
@@ -0,0 +1,42 @@
+v -0.35223599 -0.44314381 0.67043614
+v 0.27297981 -0.44314381 0.67043614
+v 0.46618212 -0.70906397 0.13859581
+v -0.03962809 -0.87341167 -0.19009959
+v -0.54543830 -0.70906397 0.13859581
+v -0.54543830 0.15147175 0.67043614
+v 0.46618212 0.15147175 0.67043614
+v 0.77879002 -0.27879611 -0.19009959
+v -0.03962809 -0.54471627 -0.72193992
+v -0.85804620 -0.27879611 -0.19009959
+v -0.85804620 0.25304422 0.13859581
+v -0.03962809 0.51896438 0.67043614
+v 0.77879002 0.25304422 0.13859581
+v 0.46618212 -0.17722365 -0.72193992
+v -0.54543830 -0.17722365 -0.72193992
+v -0.54543830 0.68331208 -0.19009959
+v -0.03962809 0.84765978 0.13859581
+v 0.46618212 0.68331208 -0.19009959
+v 0.27297981 0.41739192 -0.72193992
+v -0.35223599 0.41739192 -0.72193992
+v -0.03962809 -0.01287595 0.99913154
+v 0.83218983 0.27039487 -0.48409369
+f 1 6 11 10 5
+f 1 5 4 3 2
+f 1 2 21
+f 1 21 6
+f 2 3 8 13 7
+f 2 7 21
+f 3 4 9 14 8
+f 4 5 10 15 9
+f 6 12 17 16 11
+f 6 21 12
+f 7 13 18 17 12
+f 7 12 21
+f 8 14 22
+f 8 22 13
+f 9 15 20 19 14
+f 10 11 16 20 15
+f 13 22 18
+f 14 19 22
+f 16 17 18 19 20
+f 18 22 19
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n61.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n61.obj
new file mode 100644
index 00000000..9668c496
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n61.obj
@@ -0,0 +1,47 @@
+v -0.32052320 -0.40210626 0.67760869
+v 0.29214730 -0.40210626 0.67760869
+v 0.48147290 -0.66269059 0.15644003
+v -0.01418795 -0.82374057 -0.16565992
+v -0.50984880 -0.66269059 0.15644003
+v -0.50984880 0.18057801 0.67760869
+v 0.48147290 0.18057801 0.67760869
+v 0.78780815 -0.24105629 -0.16565992
+v -0.01418795 -0.50164062 -0.68682858
+v -0.81618406 -0.24105629 -0.16565992
+v -0.81618406 0.28011237 0.15644003
+v -0.01418795 0.54069670 0.67760869
+v 0.78780815 0.28011237 0.15644003
+v 0.48147290 -0.14152193 -0.68682858
+v -0.50984880 -0.14152193 -0.68682858
+v -0.50984880 0.70174667 -0.16565992
+v -0.01418795 0.86279665 0.15644003
+v 0.48147290 0.70174667 -0.16565992
+v 0.29214730 0.44116234 -0.68682858
+v -0.32052320 0.44116234 -0.68682858
+v -0.01418795 0.01952804 0.99970864
+v 0.84013646 0.29711487 -0.45375487
+v -0.54218948 -0.70720371 -0.45375487
+f 1 6 11 10 5
+f 1 5 4 3 2
+f 1 2 21
+f 1 21 6
+f 2 3 8 13 7
+f 2 7 21
+f 3 4 9 14 8
+f 4 5 23
+f 4 23 9
+f 5 10 23
+f 6 12 17 16 11
+f 6 21 12
+f 7 13 18 17 12
+f 7 12 21
+f 8 14 22
+f 8 22 13
+f 9 15 20 19 14
+f 9 23 15
+f 10 11 16 20 15
+f 10 15 23
+f 13 22 18
+f 14 19 22
+f 16 17 18 19 20
+f 18 22 19
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n62.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n62.obj
new file mode 100644
index 00000000..270b879b
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n62.obj
@@ -0,0 +1,22 @@
+v -0.48194883 -0.71402076 0.32797613
+v 0.00000000 -0.87061543 -0.49196420
+v 0.00000000 -0.05067510 -0.99871519
+v -0.48194883 0.61267056 -0.49196420
+v -0.77980959 0.20270040 0.32797613
+v 0.48194883 -0.71402076 0.32797613
+v 0.77980959 0.20270040 0.32797613
+v 0.48194883 0.61267056 -0.49196420
+v -0.00000000 0.76926523 0.32797613
+v 0.00000000 -0.05067510 0.83472713
+f 1 5 4 3 2
+f 1 2 6
+f 1 6 10
+f 1 10 5
+f 2 3 8 7 6
+f 3 4 8
+f 4 5 9
+f 4 9 8
+f 5 10 9
+f 6 7 10
+f 7 8 9
+f 7 9 10
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n63.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n63.obj
new file mode 100644
index 00000000..ee44b2b3
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n63.obj
@@ -0,0 +1,17 @@
+v -0.50051680 -0.74737722 0.43693274
+v 0.00000000 -0.91000499 -0.41459730
+v -0.00000000 -0.05847495 -0.94087181
+v -0.50051680 0.63042733 -0.41459730
+v -0.80985320 0.20466231 0.43693274
+v 0.50051680 -0.74737722 0.43693274
+v 0.80985320 0.20466231 0.43693274
+v 0.50051680 0.63042733 -0.41459730
+v 0.00000000 0.79305510 0.43693274
+f 1 2 6
+f 1 6 7 9 5
+f 1 5 4 3 2
+f 2 3 8 7 6
+f 3 4 8
+f 4 5 9
+f 4 9 8
+f 7 8 9
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n64.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n64.obj
new file mode 100644
index 00000000..f1aadc5c
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n64.obj
@@ -0,0 +1,20 @@
+v -0.34047064 -0.39925597 0.27637473
+v 0.00000000 -0.50988159 -0.30286852
+v -0.00000000 0.06936166 -0.66086054
+v -0.34047064 0.53797929 -0.30286852
+v -0.55089306 0.24835767 0.27637473
+v 0.34047064 -0.39925597 0.27637473
+v 0.55089306 0.24835767 0.27637473
+v 0.34047064 0.53797929 -0.30286852
+v 0.00000000 0.64860491 0.27637473
+v 0.00000000 -0.98224695 0.18759247
+f 1 6 7 9 5
+f 1 5 4 3 2
+f 1 2 10
+f 1 10 6
+f 2 3 8 7 6
+f 2 6 10
+f 3 4 8
+f 4 5 9
+f 4 9 8
+f 7 8 9
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n65.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n65.obj
new file mode 100644
index 00000000..e5e0ba78
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n65.obj
@@ -0,0 +1,29 @@
+v -0.35007002 -0.41770024 0.49544036
+v -0.70014004 0.18863882 0.49544036
+v -0.35007002 0.79497788 0.49544036
+v 0.35007002 0.79497788 0.49544036
+v 0.70014004 0.18863882 0.49544036
+v 0.35007002 -0.41770024 0.49544036
+v -0.70014004 -0.21558722 -0.07622159
+v 0.00000000 0.99709090 -0.07622159
+v 0.70014004 -0.21558722 -0.07622159
+v -0.35007002 -0.01347420 -0.64788354
+v 0.00000000 0.59286486 -0.64788354
+v 0.35007002 -0.01347420 -0.64788354
+v -0.00000000 -0.88929729 0.11433239
+v -0.35007002 -0.68718427 -0.45732956
+v 0.35007002 -0.68718427 -0.45732956
+f 1 6 5 4 3 2
+f 1 2 7
+f 1 7 14 13
+f 1 13 6
+f 2 3 8 11 10 7
+f 3 4 8
+f 4 5 9 12 11 8
+f 5 6 9
+f 6 13 15 9
+f 7 10 14
+f 9 15 12
+f 10 11 12
+f 10 12 15 14
+f 13 14 15
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n66.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n66.obj
new file mode 100644
index 00000000..8bcd109e
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n66.obj
@@ -0,0 +1,50 @@
+v -0.15528707 -0.51338206 0.61130639
+v -0.51338206 -0.15528707 0.61130639
+v -0.51338206 0.35113572 0.61130639
+v -0.15528707 0.70923071 0.61130639
+v 0.35113572 0.70923071 0.61130639
+v 0.70923071 0.35113572 0.61130639
+v 0.70923071 -0.15528707 0.61130639
+v 0.35113572 -0.51338206 0.61130639
+v 0.09792433 -0.76659346 0.25321140
+v -0.76659346 0.09792433 0.25321140
+v 0.09792433 0.96244211 0.25321140
+v 0.96244211 0.09792433 0.25321140
+v 0.09792433 -0.76659346 -0.25321140
+v -0.76659346 0.09792433 -0.25321140
+v 0.09792433 0.96244211 -0.25321140
+v 0.96244211 0.09792433 -0.25321140
+v -0.15528707 -0.51338206 -0.61130639
+v -0.51338206 -0.15528707 -0.61130639
+v -0.51338206 0.35113572 -0.61130639
+v -0.15528707 0.70923071 -0.61130639
+v 0.35113572 0.70923071 -0.61130639
+v 0.70923071 0.35113572 -0.61130639
+v 0.70923071 -0.15528707 -0.61130639
+v 0.35113572 -0.51338206 -0.61130639
+v -0.33433456 -0.84075736 0.00000000
+v -0.58754596 -0.58754596 0.35809499
+v -0.84075736 -0.33433456 0.00000000
+v -0.58754596 -0.58754596 -0.35809499
+f 1 9 8
+f 1 8 7 6 5 4 3 2
+f 1 2 26
+f 1 26 25 9
+f 2 3 10
+f 2 10 27 26
+f 3 4 11 15 20 19 14 10
+f 4 5 11
+f 5 6 12 16 22 21 15 11
+f 6 7 12
+f 7 8 9 13 24 23 16 12
+f 9 25 13
+f 10 14 27
+f 13 17 24
+f 13 25 28 17
+f 14 19 18
+f 14 18 28 27
+f 15 21 20
+f 16 23 22
+f 17 18 19 20 21 22 23 24
+f 17 28 18
+f 25 26 27 28
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n67.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n67.obj
new file mode 100644
index 00000000..58572003
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n67.obj
@@ -0,0 +1,62 @@
+v -0.24502111 -0.59153329 0.59153329
+v -0.59153329 -0.24502111 0.59153329
+v -0.59153329 0.24502111 0.59153329
+v -0.24502111 0.59153329 0.59153329
+v 0.24502111 0.59153329 0.59153329
+v 0.59153329 0.24502111 0.59153329
+v 0.59153329 -0.24502111 0.59153329
+v 0.24502111 -0.59153329 0.59153329
+v 0.00000000 -0.83655440 0.24502111
+v -0.83655441 0.00000000 0.24502111
+v 0.00000000 0.83655440 0.24502111
+v 0.83655441 -0.00000000 0.24502111
+v -0.00000000 -0.83655440 -0.24502111
+v -0.83655441 0.00000000 -0.24502111
+v 0.00000000 0.83655440 -0.24502111
+v 0.83655441 -0.00000000 -0.24502111
+v -0.24502111 -0.59153329 -0.59153329
+v -0.59153329 -0.24502111 -0.59153329
+v -0.59153329 0.24502111 -0.59153329
+v -0.24502111 0.59153329 -0.59153329
+v 0.24502111 0.59153329 -0.59153329
+v 0.59153329 0.24502111 -0.59153329
+v 0.59153329 -0.24502111 -0.59153329
+v 0.24502111 -0.59153329 -0.59153329
+v -0.41827720 -0.90831943 -0.00000000
+v -0.66329831 -0.66329831 0.34651218
+v -0.90831943 -0.41827720 0.00000000
+v -0.66329832 -0.66329831 -0.34651218
+v 0.41827720 0.90831943 -0.00000000
+v 0.66329831 0.66329831 0.34651218
+v 0.90831943 0.41827720 0.00000000
+v 0.66329831 0.66329831 -0.34651218
+f 1 9 8
+f 1 8 7 6 5 4 3 2
+f 1 2 26
+f 1 26 25 9
+f 2 3 10
+f 2 10 27 26
+f 3 4 11 15 20 19 14 10
+f 4 5 11
+f 5 6 30
+f 5 30 29 11
+f 6 7 12
+f 6 12 31 30
+f 7 8 9 13 24 23 16 12
+f 9 25 13
+f 10 14 27
+f 11 29 15
+f 12 16 31
+f 13 17 24
+f 13 25 28 17
+f 14 19 18
+f 14 18 28 27
+f 15 21 20
+f 15 29 32 21
+f 16 23 22
+f 16 22 32 31
+f 17 18 19 20 21 22 23 24
+f 17 28 18
+f 21 32 22
+f 25 26 27 28
+f 29 30 31 32
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n68.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n68.obj
new file mode 100644
index 00000000..fbf46178
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n68.obj
@@ -0,0 +1,107 @@
+v -0.15790394 -0.48597835 0.71307107
+v -0.41339788 -0.30035114 0.71307107
+v -0.51098788 0.00000000 0.71307107
+v -0.41339788 0.30035114 0.71307107
+v -0.15790394 0.48597835 0.71307107
+v 0.15790394 0.48597835 0.71307107
+v 0.41339788 0.30035114 0.71307107
+v 0.51098788 0.00000000 0.71307107
+v 0.41339788 -0.30035114 0.71307107
+v 0.15790394 -0.48597835 0.71307107
+v -0.00000000 -0.70331448 0.54704104
+v -0.00000000 -0.86934451 0.27839881
+v 0.15790394 -0.92065061 0.00975659
+v 0.41339788 -0.83763559 -0.15627344
+v 0.66889182 -0.65200838 -0.15627344
+v 0.82679576 -0.43467225 0.00975659
+v 0.82679576 -0.26864223 0.27839881
+v 0.66889182 -0.21733613 0.54704104
+v -0.15790394 -0.92065061 0.00975659
+v -0.41339788 -0.83763559 -0.15627344
+v -0.66889182 -0.65200838 -0.15627344
+v -0.82679576 -0.43467225 0.00975659
+v -0.82679576 -0.26864223 0.27839881
+v -0.66889182 -0.21733613 0.54704104
+v -0.92438576 -0.13432111 0.00975659
+v -0.92438576 0.13432111 -0.15627344
+v -0.82679576 0.43467225 -0.15627344
+v -0.66889182 0.65200838 0.00975659
+v -0.51098788 0.70331448 0.27839881
+v -0.41339788 0.56899337 0.54704104
+v -0.41339788 0.83763559 0.00975659
+v -0.15790394 0.92065061 -0.15627344
+v 0.15790394 0.92065060 -0.15627344
+v 0.41339788 0.83763559 0.00975659
+v 0.51098788 0.70331448 0.27839881
+v 0.41339788 0.56899337 0.54704104
+v 0.66889182 0.65200838 0.00975659
+v 0.82679576 0.43467225 -0.15627344
+v 0.92438576 0.13432111 -0.15627344
+v 0.92438576 -0.13432111 0.00975659
+v 0.51098788 -0.70331448 -0.42491566
+v 0.41339788 -0.56899337 -0.69355789
+v 0.15790394 -0.48597835 -0.85958792
+v -0.15790394 -0.48597835 -0.85958792
+v -0.41339788 -0.56899337 -0.69355789
+v -0.51098788 -0.70331448 -0.42491566
+v -0.41339788 -0.30035114 -0.85958792
+v -0.51098788 0.00000000 -0.85958792
+v -0.66889182 0.21733613 -0.69355789
+v -0.82679576 0.26864223 -0.42491566
+v -0.41339788 0.30035114 -0.85958792
+v -0.15790394 0.48597835 -0.85958792
+v 0.00000000 0.70331448 -0.69355789
+v 0.00000000 0.86934451 -0.42491566
+v 0.15790394 0.48597835 -0.85958792
+v 0.41339788 0.30035114 -0.85958792
+v 0.66889182 0.21733613 -0.69355789
+v 0.82679576 0.26864223 -0.42491566
+v 0.51098788 -0.00000000 -0.85958792
+v 0.41339788 -0.30035114 -0.85958792
+v -0.15790394 -0.21733613 0.87910109
+v 0.15790394 -0.21733613 0.87910109
+v 0.25549394 0.08301501 0.87910109
+v 0.00000000 0.26864223 0.87910109
+v -0.25549394 0.08301501 0.87910109
+f 1 2 24 23 22 21 20 19 12 11
+f 1 11 10
+f 1 10 62 61
+f 1 61 2
+f 2 3 24
+f 2 61 65 3
+f 3 4 30 29 28 27 26 25 23 24
+f 3 65 4
+f 4 5 30
+f 4 65 64 5
+f 5 6 36 35 34 33 32 31 29 30
+f 5 64 6
+f 6 7 36
+f 6 64 63 7
+f 7 8 18 17 40 39 38 37 35 36
+f 7 63 8
+f 8 9 18
+f 8 63 62 9
+f 9 10 11 12 13 14 15 16 17 18
+f 9 62 10
+f 12 19 13
+f 13 19 20 46 45 44 43 42 41 14
+f 14 41 15
+f 15 41 42 60 59 57 58 39 40 16
+f 16 40 17
+f 20 21 46
+f 21 22 25 26 50 49 48 47 45 46
+f 22 23 25
+f 26 27 50
+f 27 28 31 32 54 53 52 51 49 50
+f 28 29 31
+f 32 33 54
+f 33 34 37 38 58 57 56 55 53 54
+f 34 35 37
+f 38 39 58
+f 42 43 60
+f 43 44 47 48 51 52 55 56 59 60
+f 44 45 47
+f 48 49 51
+f 52 53 55
+f 56 57 59
+f 61 62 63 64 65
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n69.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n69.obj
new file mode 100644
index 00000000..2e11a375
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n69.obj
@@ -0,0 +1,122 @@
+v -0.15957569 -0.49112347 0.79465447
+v -0.41777458 -0.30353100 0.79465447
+v -0.51639778 0.00000000 0.79465447
+v -0.41777458 0.30353100 0.79465447
+v -0.15957569 0.49112347 0.79465447
+v 0.15957569 0.49112347 0.79465447
+v 0.41777458 0.30353100 0.79465447
+v 0.51639778 0.00000000 0.79465447
+v 0.41777458 -0.30353100 0.79465447
+v 0.15957569 -0.49112347 0.79465447
+v -0.00000000 -0.71076057 0.62686666
+v -0.00000000 -0.87854838 0.35538028
+v 0.15957569 -0.93039766 0.08389390
+v 0.41777458 -0.84650376 -0.08389390
+v 0.67597347 -0.65891128 -0.08389390
+v 0.83554916 -0.43927419 0.08389390
+v 0.83554916 -0.27148638 0.35538028
+v 0.67597347 -0.21963709 0.62686666
+v -0.15957569 -0.93039766 0.08389390
+v -0.41777458 -0.84650376 -0.08389390
+v -0.67597347 -0.65891128 -0.08389390
+v -0.83554916 -0.43927419 0.08389391
+v -0.83554916 -0.27148638 0.35538028
+v -0.67597347 -0.21963709 0.62686666
+v -0.93417236 -0.13574319 0.08389390
+v -0.93417236 0.13574319 -0.08389390
+v -0.83554916 0.43927419 -0.08389390
+v -0.67597347 0.65891128 0.08389390
+v -0.51639778 0.71076057 0.35538028
+v -0.41777458 0.57501738 0.62686666
+v -0.41777458 0.84650376 0.08389390
+v -0.15957569 0.93039766 -0.08389390
+v 0.15957569 0.93039766 -0.08389390
+v 0.41777458 0.84650376 0.08389390
+v 0.51639778 0.71076057 0.35538028
+v 0.41777458 0.57501738 0.62686666
+v 0.67597347 0.65891128 0.08389390
+v 0.83554916 0.43927419 -0.08389390
+v 0.93417236 0.13574319 -0.08389390
+v 0.93417236 -0.13574319 0.08389390
+v 0.51639778 -0.71076057 -0.35538028
+v 0.41777458 -0.57501738 -0.62686666
+v 0.15957569 -0.49112347 -0.79465447
+v -0.15957569 -0.49112347 -0.79465447
+v -0.41777458 -0.57501738 -0.62686666
+v -0.51639778 -0.71076057 -0.35538028
+v -0.41777458 -0.30353100 -0.79465447
+v -0.51639778 0.00000000 -0.79465447
+v -0.67597347 0.21963709 -0.62686666
+v -0.83554916 0.27148638 -0.35538028
+v -0.41777458 0.30353100 -0.79465447
+v -0.15957569 0.49112347 -0.79465447
+v -0.00000000 0.71076057 -0.62686666
+v -0.00000000 0.87854838 -0.35538028
+v 0.15957569 0.49112347 -0.79465447
+v 0.41777458 0.30353100 -0.79465447
+v 0.67597347 0.21963709 -0.62686666
+v 0.83554916 0.27148638 -0.35538028
+v 0.51639778 -0.00000000 -0.79465447
+v 0.41777458 -0.30353100 -0.79465447
+v -0.15957569 -0.21963709 0.96244228
+v 0.15957569 -0.21963709 0.96244228
+v 0.25819889 0.08389390 0.96244228
+v -0.00000000 0.27148638 0.96244228
+v -0.25819889 0.08389390 0.96244228
+v -0.00000000 -0.27148638 -0.96244228
+v -0.25819889 -0.08389390 -0.96244228
+v -0.15957569 0.21963709 -0.96244228
+v 0.15957569 0.21963709 -0.96244228
+v 0.25819889 -0.08389390 -0.96244228
+f 1 2 24 23 22 21 20 19 12 11
+f 1 11 10
+f 1 10 62 61
+f 1 61 2
+f 2 3 24
+f 2 61 65 3
+f 3 4 30 29 28 27 26 25 23 24
+f 3 65 4
+f 4 5 30
+f 4 65 64 5
+f 5 6 36 35 34 33 32 31 29 30
+f 5 64 6
+f 6 7 36
+f 6 64 63 7
+f 7 8 18 17 40 39 38 37 35 36
+f 7 63 8
+f 8 9 18
+f 8 63 62 9
+f 9 10 11 12 13 14 15 16 17 18
+f 9 62 10
+f 12 19 13
+f 13 19 20 46 45 44 43 42 41 14
+f 14 41 15
+f 15 41 42 60 59 57 58 39 40 16
+f 16 40 17
+f 20 21 46
+f 21 22 25 26 50 49 48 47 45 46
+f 22 23 25
+f 26 27 50
+f 27 28 31 32 54 53 52 51 49 50
+f 28 29 31
+f 32 33 54
+f 33 34 37 38 58 57 56 55 53 54
+f 34 35 37
+f 38 39 58
+f 42 43 60
+f 43 44 66
+f 43 66 70 60
+f 44 45 47
+f 44 47 67 66
+f 47 48 67
+f 48 49 51
+f 48 51 68 67
+f 51 52 68
+f 52 53 55
+f 52 55 69 68
+f 55 56 69
+f 56 57 59
+f 56 59 70 69
+f 59 60 70
+f 61 62 63 64 65
+f 66 67 68 69 70
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n70.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n70.obj
new file mode 100644
index 00000000..62c1da41
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n70.obj
@@ -0,0 +1,122 @@
+v -0.21398275 -0.46330675 0.74252390
+v -0.46736036 -0.27921715 0.74252390
+v -0.56414199 0.01864609 0.74252390
+v -0.46736036 0.31650933 0.74252390
+v -0.21398275 0.50059894 0.74252390
+v 0.09920920 0.50059894 0.74252390
+v 0.35258680 0.31650933 0.74252390
+v 0.44936843 0.01864609 0.74252390
+v 0.35258680 -0.27921715 0.74252390
+v 0.09920920 -0.46330675 0.74252390
+v -0.05738678 -0.67884262 0.57786915
+v -0.05738678 -0.84349737 0.31145217
+v 0.09920920 -0.89437848 0.04503519
+v 0.35258680 -0.81205111 -0.11961956
+v 0.60596441 -0.62796150 -0.11961956
+v 0.76256038 -0.41242564 0.04503519
+v 0.76256038 -0.24777089 0.31145217
+v 0.60596441 -0.19688977 0.57786915
+v -0.21398275 -0.89437848 0.04503519
+v -0.46736036 -0.81205111 -0.11961956
+v -0.72073796 -0.62796150 -0.11961956
+v -0.87733393 -0.41242564 0.04503519
+v -0.87733393 -0.24777089 0.31145217
+v -0.72073796 -0.19688977 0.57786915
+v -0.97411557 -0.11456240 0.04503519
+v -0.97411557 0.15185459 -0.11961956
+v -0.87733393 0.44971782 -0.11961956
+v -0.72073796 0.66525369 0.04503519
+v -0.56414199 0.71613481 0.31145217
+v -0.46736036 0.58292632 0.57786915
+v -0.46736036 0.84934330 0.04503519
+v -0.21398275 0.93167067 -0.11961956
+v 0.09920920 0.93167067 -0.11961956
+v 0.35258680 0.84934330 0.04503519
+v 0.44936843 0.71613481 0.31145217
+v 0.35258680 0.58292632 0.57786915
+v 0.60596441 0.66525369 0.04503519
+v 0.76256038 0.44971782 -0.11961956
+v 0.85934201 0.15185458 -0.11961956
+v 0.85934201 -0.11456240 0.04503519
+v 0.44936843 -0.67884262 -0.38603654
+v 0.35258680 -0.54563413 -0.65245352
+v 0.09920920 -0.46330675 -0.81710827
+v -0.21398275 -0.46330675 -0.81710827
+v -0.46736036 -0.54563413 -0.65245352
+v -0.56414199 -0.67884262 -0.38603654
+v -0.46736035 -0.27921715 -0.81710827
+v -0.56414199 0.01864609 -0.81710827
+v -0.72073796 0.23418196 -0.65245352
+v -0.87733393 0.28506308 -0.38603654
+v -0.46736035 0.31650933 -0.81710827
+v -0.21398275 0.50059894 -0.81710827
+v -0.05738678 0.71613481 -0.65245352
+v -0.05738678 0.88078955 -0.38603654
+v 0.09920919 0.50059894 -0.81710827
+v 0.35258680 0.31650933 -0.81710827
+v 0.60596441 0.23418196 -0.65245353
+v 0.76256038 0.28506307 -0.38603654
+v 0.44936843 0.01864609 -0.81710827
+v 0.35258680 -0.27921715 -0.81710827
+v -0.21398275 -0.19688977 0.90717865
+v 0.09920920 -0.19688977 0.90717865
+v 0.19599083 0.10097347 0.90717865
+v -0.05738678 0.28506308 0.90717865
+v -0.31076438 0.10097347 0.90717865
+v 0.78931016 -0.42111717 -0.26689125
+v 0.63271419 -0.47199828 -0.53330823
+v 0.63271419 -0.20558130 -0.69796298
+v 0.78931016 0.00995456 -0.53330823
+v 0.88609180 -0.12325393 -0.26689125
+f 1 2 24 23 22 21 20 19 12 11
+f 1 11 10
+f 1 10 62 61
+f 1 61 2
+f 2 3 24
+f 2 61 65 3
+f 3 4 30 29 28 27 26 25 23 24
+f 3 65 4
+f 4 5 30
+f 4 65 64 5
+f 5 6 36 35 34 33 32 31 29 30
+f 5 64 6
+f 6 7 36
+f 6 64 63 7
+f 7 8 18 17 40 39 38 37 35 36
+f 7 63 8
+f 8 9 18
+f 8 63 62 9
+f 9 10 11 12 13 14 15 16 17 18
+f 9 62 10
+f 12 19 13
+f 13 19 20 46 45 44 43 42 41 14
+f 14 41 15
+f 15 41 67 66
+f 15 66 16
+f 16 40 17
+f 16 66 70 40
+f 20 21 46
+f 21 22 25 26 50 49 48 47 45 46
+f 22 23 25
+f 26 27 50
+f 27 28 31 32 54 53 52 51 49 50
+f 28 29 31
+f 32 33 54
+f 33 34 37 38 58 57 56 55 53 54
+f 34 35 37
+f 38 39 58
+f 39 40 70
+f 39 70 69 58
+f 41 42 67
+f 42 43 60
+f 42 60 68 67
+f 43 44 47 48 51 52 55 56 59 60
+f 44 45 47
+f 48 49 51
+f 52 53 55
+f 56 57 59
+f 57 58 69
+f 57 69 68 59
+f 59 68 60
+f 61 62 63 64 65
+f 66 67 68 69 70
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n71.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n71.obj
new file mode 100644
index 00000000..331009af
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n71.obj
@@ -0,0 +1,137 @@
+v -0.17974856 -0.51787354 0.78493349
+v -0.43698164 -0.33098277 0.78493349
+v -0.53523593 -0.02858715 0.78493349
+v -0.43698164 0.27380847 0.78493349
+v -0.17974856 0.46069924 0.78493349
+v 0.13820900 0.46069924 0.78493349
+v 0.39544208 0.27380847 0.78493349
+v 0.49369637 -0.02858715 0.78493349
+v 0.39544208 -0.33098277 0.78493349
+v 0.13820900 -0.51787354 0.78493349
+v -0.02076978 -0.73668906 0.61777331
+v -0.02076978 -0.90384925 0.34730244
+v 0.13820900 -0.95550458 0.07683158
+v 0.39544208 -0.87192449 -0.09032860
+v 0.65267515 -0.68503372 -0.09032860
+v 0.81165394 -0.46621820 0.07683158
+v 0.81165394 -0.29905801 0.34730244
+v 0.65267515 -0.24740267 0.61777331
+v -0.17974856 -0.95550458 0.07683158
+v -0.43698164 -0.87192449 -0.09032860
+v -0.69421472 -0.68503372 -0.09032860
+v -0.85319350 -0.46621820 0.07683158
+v -0.85319350 -0.29905801 0.34730244
+v -0.69421472 -0.24740267 0.61777331
+v -0.95144779 -0.16382258 0.07683158
+v -0.95144779 0.10664828 -0.09032860
+v -0.85319350 0.40904390 -0.09032860
+v -0.69421472 0.62785942 0.07683158
+v -0.53523593 0.67951476 0.34730244
+v -0.43698164 0.54427933 0.61777331
+v -0.43698164 0.81475019 0.07683158
+v -0.17974856 0.89833028 -0.09032860
+v 0.13820900 0.89833028 -0.09032860
+v 0.39544208 0.81475019 0.07683158
+v 0.49369637 0.67951476 0.34730244
+v 0.39544208 0.54427933 0.61777331
+v 0.65267515 0.62785942 0.07683158
+v 0.81165394 0.40904390 -0.09032860
+v 0.90990823 0.10664828 -0.09032860
+v 0.90990823 -0.16382258 0.07683158
+v 0.49369637 -0.73668906 -0.36079947
+v 0.39544208 -0.60145363 -0.63127033
+v 0.13820900 -0.51787354 -0.79843051
+v -0.17974856 -0.51787354 -0.79843051
+v -0.43698164 -0.60145363 -0.63127033
+v -0.53523593 -0.73668906 -0.36079947
+v -0.43698164 -0.33098277 -0.79843051
+v -0.53523593 -0.02858715 -0.79843051
+v -0.69421472 0.19022837 -0.63127033
+v -0.85319350 0.24188371 -0.36079947
+v -0.43698164 0.27380847 -0.79843051
+v -0.17974856 0.46069924 -0.79843051
+v -0.02076978 0.67951476 -0.63127033
+v -0.02076978 0.84667494 -0.36079947
+v 0.13820900 0.46069923 -0.79843051
+v 0.39544208 0.27380847 -0.79843051
+v 0.65267515 0.19022837 -0.63127033
+v 0.81165394 0.24188371 -0.36079947
+v 0.49369637 -0.02858715 -0.79843051
+v 0.39544208 -0.33098277 -0.79843051
+v -0.17974856 -0.24740267 0.95209368
+v 0.13820900 -0.24740267 0.95209368
+v 0.23646329 0.05499294 0.95209368
+v -0.02076978 0.24188371 0.95209368
+v -0.27800286 0.05499294 0.95209368
+v 0.83881076 -0.47504198 -0.23984122
+v 0.67983197 -0.52669732 -0.51031208
+v 0.67983197 -0.25622646 -0.67747227
+v 0.83881076 -0.03741094 -0.51031208
+v 0.93706505 -0.17264637 -0.23984122
+v -0.71099855 0.65096039 -0.23984122
+v -0.45376548 0.83785116 -0.23984122
+v -0.29478669 0.78619582 -0.51031208
+v -0.45376548 0.56738030 -0.67747227
+v -0.71099855 0.48380020 -0.51031208
+f 1 2 24 23 22 21 20 19 12 11
+f 1 11 10
+f 1 10 62 61
+f 1 61 2
+f 2 3 24
+f 2 61 65 3
+f 3 4 30 29 28 27 26 25 23 24
+f 3 65 4
+f 4 5 30
+f 4 65 64 5
+f 5 6 36 35 34 33 32 31 29 30
+f 5 64 6
+f 6 7 36
+f 6 64 63 7
+f 7 8 18 17 40 39 38 37 35 36
+f 7 63 8
+f 8 9 18
+f 8 63 62 9
+f 9 10 11 12 13 14 15 16 17 18
+f 9 62 10
+f 12 19 13
+f 13 19 20 46 45 44 43 42 41 14
+f 14 41 15
+f 15 41 67 66
+f 15 66 16
+f 16 40 17
+f 16 66 70 40
+f 20 21 46
+f 21 22 25 26 50 49 48 47 45 46
+f 22 23 25
+f 26 27 50
+f 27 28 71
+f 27 71 75 50
+f 28 29 31
+f 28 31 72 71
+f 31 32 72
+f 32 33 54
+f 32 54 73 72
+f 33 34 37 38 58 57 56 55 53 54
+f 34 35 37
+f 38 39 58
+f 39 40 70
+f 39 70 69 58
+f 41 42 67
+f 42 43 60
+f 42 60 68 67
+f 43 44 47 48 51 52 55 56 59 60
+f 44 45 47
+f 48 49 51
+f 49 50 75
+f 49 75 74 51
+f 51 74 52
+f 52 53 55
+f 52 74 73 53
+f 53 73 54
+f 56 57 59
+f 57 58 69
+f 57 69 68 59
+f 59 68 60
+f 61 62 63 64 65
+f 66 67 68 69 70
+f 71 72 73 74 75
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n72.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n72.obj
new file mode 100644
index 00000000..ad80a06d
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n72.obj
@@ -0,0 +1,122 @@
+v -0.22391898 -0.68915176 0.68915176
+v -0.58622750 -0.42591921 0.68915176
+v -0.72461704 0.00000000 0.68915176
+v -0.58622750 0.42591921 0.68915176
+v -0.22391898 0.68915176 0.68915176
+v 0.22391898 0.68915176 0.68915176
+v 0.58622750 0.42591921 0.68915176
+v 0.72461704 0.00000000 0.68915176
+v 0.58622750 -0.42591921 0.68915176
+v 0.22391898 -0.68915176 0.68915176
+v -0.22391898 -0.92459411 0.30819804
+v -0.81014648 -0.49867490 0.30819804
+v -0.94853602 -0.07275569 0.30819804
+v -0.72461704 0.61639607 0.30819804
+v -0.36230852 0.87962862 0.30819804
+v 0.36230852 0.87962862 0.30819804
+v 0.72461704 0.61639607 0.30819804
+v 0.94853602 -0.07275569 0.30819804
+v 0.81014648 -0.49867490 0.30819804
+v 0.22391898 -0.92459411 0.30819804
+v 0.00000000 -0.99734979 -0.07275569
+v -0.58622750 -0.80687293 0.07275569
+v -0.94853602 0.30819804 0.07275569
+v 0.00000000 0.99734979 0.07275569
+v 0.94853602 0.30819804 0.07275569
+v 0.58622750 -0.80687293 0.07275569
+v -0.36230852 -0.87962862 -0.30819804
+v -0.22391898 -0.68915176 -0.68915176
+v -0.22391898 -0.30819804 -0.92459411
+v -0.36230852 0.11772117 -0.92459411
+v -0.58622750 0.42591921 -0.68915176
+v -0.81014648 0.49867490 -0.30819804
+v 0.36230852 -0.87962862 -0.30819804
+v 0.22391898 -0.68915176 -0.68915176
+v 0.22391898 -0.30819804 -0.92459411
+v 0.36230852 0.11772117 -0.92459411
+v 0.58622750 0.42591921 -0.68915176
+v 0.81014648 0.49867490 -0.30819804
+v -0.00000000 0.38095372 -0.92459410
+v -0.22391898 0.68915176 -0.68915176
+v 0.22391898 0.68915176 -0.68915176
+v -0.22391898 0.92459411 -0.30819804
+v 0.22391898 0.92459411 -0.30819804
+v 0.58622750 0.80687293 -0.07275569
+v -0.58622750 0.80687293 -0.07275569
+v 0.00000000 -0.38095372 0.92459411
+v 0.36230852 -0.11772117 0.92459411
+v 0.22391898 0.30819804 0.92459411
+v -0.22391898 0.30819804 0.92459411
+v -0.36230852 -0.11772117 0.92459411
+v -0.94853602 -0.30819803 -0.07275569
+v -0.94853602 0.07275569 -0.30819804
+v -0.72461704 0.00000000 -0.68915176
+v -0.58622750 -0.42591921 -0.68915176
+v -0.72461704 -0.61639607 -0.30819804
+v 0.98678595 -0.08518384 -0.13783035
+v 0.84839641 -0.51110305 -0.13783035
+v 0.62447743 -0.58385874 -0.51878407
+v 0.62447743 -0.20290502 -0.75422642
+v 0.84839641 0.10529302 -0.51878407
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 46
+f 1 46 50 2
+f 2 3 13 12
+f 2 50 3
+f 3 4 14 23 13
+f 3 50 49 4
+f 4 5 15 14
+f 4 49 5
+f 5 6 16 24 15
+f 5 49 48 6
+f 6 7 17 16
+f 6 48 7
+f 7 8 18 25 17
+f 7 48 47 8
+f 8 9 19 18
+f 8 47 9
+f 9 10 20 26 19
+f 9 47 46 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 51
+f 12 51 55 22
+f 13 23 52 51
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 57 56
+f 18 56 25
+f 19 26 57
+f 20 21 33 26
+f 21 27 28 34 33
+f 22 55 27
+f 23 32 52
+f 24 43 42
+f 25 56 60 38
+f 26 33 58 57
+f 27 55 54 28
+f 28 29 35 34
+f 28 54 29
+f 29 30 39 36 35
+f 29 54 53 30
+f 30 31 40 39
+f 30 53 31
+f 31 32 45 42 40
+f 31 53 52 32
+f 33 34 58
+f 34 35 59 58
+f 35 36 59
+f 36 39 41 37
+f 36 37 60 59
+f 37 41 43 44 38
+f 37 38 60
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
+f 51 52 53 54 55
+f 56 57 58 59 60
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n73.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n73.obj
new file mode 100644
index 00000000..d65e44ca
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n73.obj
@@ -0,0 +1,122 @@
+v -0.22391898 -0.68915175 0.68915175
+v -0.58622750 -0.42591921 0.68915175
+v -0.72461704 -0.00000000 0.68915175
+v -0.58622750 0.42591921 0.68915175
+v -0.22391898 0.68915175 0.68915175
+v 0.22391898 0.68915175 0.68915175
+v 0.58622749 0.42591921 0.68915175
+v 0.72461703 -0.00000000 0.68915175
+v 0.58622749 -0.42591921 0.68915175
+v 0.22391898 -0.68915175 0.68915175
+v -0.22391898 -0.92459410 0.30819803
+v -0.81014648 -0.49867489 0.30819803
+v -0.94853602 -0.07275569 0.30819803
+v -0.72461704 0.61639607 0.30819803
+v -0.36230852 0.87962861 0.30819803
+v 0.36230852 0.87962861 0.30819803
+v 0.72461703 0.61639607 0.30819803
+v 0.94853601 -0.07275569 0.30819803
+v 0.81014647 -0.49867489 0.30819803
+v 0.22391898 -0.92459410 0.30819803
+v -0.00000000 -0.99734979 -0.07275569
+v -0.58622750 -0.80687293 0.07275569
+v -0.94853602 -0.30819803 -0.07275569
+v -0.94853602 0.30819803 0.07275569
+v -0.58622750 0.80687293 -0.07275569
+v -0.00000000 0.99734979 0.07275569
+v 0.58622749 0.80687293 -0.07275569
+v 0.94853601 0.30819803 0.07275569
+v 0.94853601 -0.30819803 -0.07275569
+v 0.58622749 -0.80687293 0.07275569
+v 0.36230852 -0.87962861 -0.30819803
+v -0.36230852 -0.87962861 -0.30819803
+v -0.72461704 -0.61639607 -0.30819803
+v -0.94853601 0.07275569 -0.30819803
+v -0.81014648 0.49867489 -0.30819803
+v -0.22391898 0.92459410 -0.30819803
+v 0.22391898 0.92459410 -0.30819803
+v 0.81014647 0.49867489 -0.30819803
+v 0.94853601 0.07275569 -0.30819803
+v 0.72461703 -0.61639607 -0.30819803
+v -0.22391898 -0.68915175 -0.68915175
+v -0.58622750 -0.42591921 -0.68915175
+v -0.72461703 0.00000000 -0.68915175
+v -0.58622748 0.42591921 -0.68915175
+v -0.22391896 0.68915175 -0.68915175
+v 0.22391899 0.68915175 -0.68915175
+v 0.58622751 0.42591921 -0.68915175
+v 0.72461704 0.00000000 -0.68915175
+v 0.58622750 -0.42591921 -0.68915175
+v 0.22391898 -0.68915175 -0.68915175
+v -0.22391898 -0.30819803 0.92459410
+v 0.22391898 -0.30819803 0.92459410
+v 0.36230852 0.11772117 0.92459410
+v -0.00000000 0.38095372 0.92459410
+v -0.36230852 0.11772117 0.92459410
+v 0.00000000 -0.38095372 -0.92459410
+v -0.36230851 -0.11772117 -0.92459410
+v -0.22391897 0.30819803 -0.92459410
+v 0.22391899 0.30819803 -0.92459410
+v 0.36230852 -0.11772117 -0.92459410
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 52 51
+f 1 51 2
+f 2 3 13 12
+f 2 51 55 3
+f 3 4 14 24 13
+f 3 55 4
+f 4 5 15 14
+f 4 55 54 5
+f 5 6 16 26 15
+f 5 54 6
+f 6 7 17 16
+f 6 54 53 7
+f 7 8 18 28 17
+f 7 53 8
+f 8 9 19 18
+f 8 53 52 9
+f 9 10 20 30 19
+f 9 52 10
+f 11 22 32 21
+f 11 21 20
+f 12 13 23
+f 12 23 33 22
+f 13 24 34 23
+f 14 15 25
+f 14 25 35 24
+f 15 26 36 25
+f 16 17 27
+f 16 27 37 26
+f 17 28 38 27
+f 18 19 29
+f 18 29 39 28
+f 19 30 40 29
+f 20 21 31 30
+f 21 32 41 50 31
+f 22 33 32
+f 23 34 43 42 33
+f 24 35 34
+f 25 36 45 44 35
+f 26 37 36
+f 27 38 47 46 37
+f 28 39 38
+f 29 40 49 48 39
+f 30 31 40
+f 31 50 49 40
+f 32 33 42 41
+f 34 35 44 43
+f 36 37 46 45
+f 38 39 48 47
+f 41 42 57 56
+f 41 56 50
+f 42 43 57
+f 43 44 58 57
+f 44 45 58
+f 45 46 59 58
+f 46 47 59
+f 47 48 60 59
+f 48 49 60
+f 49 50 56 60
+f 51 52 53 54 55
+f 56 57 58 59 60
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n74.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n74.obj
new file mode 100644
index 00000000..b0a6ff58
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n74.obj
@@ -0,0 +1,122 @@
+v -0.22391898 -0.68915176 0.68915176
+v -0.58622750 -0.42591921 0.68915176
+v -0.72461704 -0.00000000 0.68915176
+v -0.58622750 0.42591921 0.68915176
+v -0.22391898 0.68915176 0.68915176
+v 0.22391898 0.68915176 0.68915176
+v 0.58622750 0.42591921 0.68915176
+v 0.72461704 -0.00000000 0.68915176
+v 0.58622750 -0.42591921 0.68915176
+v 0.22391898 -0.68915176 0.68915176
+v -0.22391898 -0.92459411 0.30819804
+v -0.81014648 -0.49867490 0.30819804
+v -0.94853602 -0.07275569 0.30819804
+v -0.72461704 0.61639607 0.30819804
+v -0.36230852 0.87962862 0.30819804
+v 0.36230852 0.87962862 0.30819804
+v 0.72461704 0.61639607 0.30819804
+v 0.94853602 -0.07275569 0.30819804
+v 0.81014648 -0.49867490 0.30819804
+v 0.22391898 -0.92459411 0.30819804
+v 0.00000000 -0.99734979 -0.07275569
+v -0.58622750 -0.80687293 0.07275569
+v -0.94853602 0.30819804 0.07275569
+v 0.00000000 0.99734979 0.07275569
+v 0.94853602 0.30819803 0.07275569
+v 0.58622750 -0.80687293 0.07275569
+v -0.36230852 -0.87962862 -0.30819804
+v -0.22391898 -0.68915176 -0.68915176
+v -0.22391898 -0.30819803 -0.92459411
+v -0.36230852 0.11772118 -0.92459411
+v -0.58622750 0.42591921 -0.68915176
+v -0.81014648 0.49867490 -0.30819804
+v 0.36230852 -0.87962862 -0.30819804
+v 0.22391898 -0.68915176 -0.68915176
+v 0.22391898 -0.30819804 -0.92459411
+v 0.36230852 0.11772117 -0.92459411
+v 0.58622750 0.42591921 -0.68915176
+v 0.81014648 0.49867490 -0.30819804
+v -0.00000000 0.38095372 -0.92459410
+v -0.22391898 0.68915176 -0.68915176
+v 0.22391898 0.68915176 -0.68915176
+v -0.22391898 0.92459411 -0.30819804
+v 0.22391898 0.92459411 -0.30819804
+v 0.58622750 0.80687293 -0.07275569
+v -0.58622750 0.80687293 -0.07275569
+v 0.00000000 -0.38095372 0.92459411
+v 0.36230852 -0.11772117 0.92459411
+v 0.22391898 0.30819804 0.92459411
+v -0.22391898 0.30819804 0.92459411
+v -0.36230852 -0.11772117 0.92459411
+v -0.84839641 -0.51110305 -0.13783035
+v -0.98678595 -0.08518384 -0.13783035
+v -0.84839641 0.10529302 -0.51878407
+v -0.62447743 -0.20290502 -0.75422642
+v -0.62447743 -0.58385874 -0.51878407
+v 0.98678595 -0.08518384 -0.13783035
+v 0.84839641 -0.51110305 -0.13783035
+v 0.62447743 -0.58385874 -0.51878407
+v 0.62447743 -0.20290502 -0.75422642
+v 0.84839641 0.10529302 -0.51878407
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 46
+f 1 46 50 2
+f 2 3 13 12
+f 2 50 3
+f 3 4 14 23 13
+f 3 50 49 4
+f 4 5 15 14
+f 4 49 5
+f 5 6 16 24 15
+f 5 49 48 6
+f 6 7 17 16
+f 6 48 7
+f 7 8 18 25 17
+f 7 48 47 8
+f 8 9 19 18
+f 8 47 9
+f 9 10 20 26 19
+f 9 47 46 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 52 51
+f 12 51 22
+f 13 23 52
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 57 56
+f 18 56 25
+f 19 26 57
+f 20 21 33 26
+f 21 27 28 34 33
+f 22 51 55 27
+f 23 32 53 52
+f 24 43 42
+f 25 56 60 38
+f 26 33 58 57
+f 27 55 28
+f 28 29 35 34
+f 28 55 54 29
+f 29 30 39 36 35
+f 29 54 30
+f 30 31 40 39
+f 30 54 53 31
+f 31 32 45 42 40
+f 31 53 32
+f 33 34 58
+f 34 35 59 58
+f 35 36 59
+f 36 39 41 37
+f 36 37 60 59
+f 37 41 43 44 38
+f 37 38 60
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
+f 51 52 53 54 55
+f 56 57 58 59 60
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n75.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n75.obj
new file mode 100644
index 00000000..a6eca558
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n75.obj
@@ -0,0 +1,122 @@
+v -0.22391898 -0.68915176 0.68915176
+v -0.58622750 -0.42591921 0.68915176
+v -0.72461704 -0.00000000 0.68915176
+v -0.58622750 0.42591921 0.68915176
+v -0.22391898 0.68915176 0.68915176
+v 0.22391898 0.68915176 0.68915176
+v 0.58622750 0.42591921 0.68915176
+v 0.72461704 -0.00000000 0.68915176
+v 0.58622750 -0.42591921 0.68915176
+v 0.22391898 -0.68915176 0.68915176
+v -0.22391898 -0.92459411 0.30819804
+v -0.81014648 -0.49867490 0.30819804
+v -0.94853602 -0.07275569 0.30819804
+v -0.72461704 0.61639607 0.30819804
+v -0.36230852 0.87962862 0.30819804
+v 0.36230852 0.87962862 0.30819804
+v 0.72461704 0.61639607 0.30819804
+v 0.94853602 -0.07275569 0.30819804
+v 0.81014648 -0.49867490 0.30819804
+v 0.22391898 -0.92459411 0.30819804
+v -0.00000000 -0.99734979 -0.07275569
+v -0.58622750 -0.80687293 0.07275569
+v -0.94853602 0.30819804 0.07275569
+v 0.00000000 0.99734979 0.07275569
+v 0.94853602 0.30819804 0.07275569
+v 0.58622750 -0.80687293 0.07275569
+v -0.36230852 -0.87962862 -0.30819804
+v -0.22391898 -0.68915176 -0.68915176
+v -0.22391898 -0.30819803 -0.92459411
+v -0.36230852 0.11772118 -0.92459411
+v -0.58622750 0.42591921 -0.68915176
+v -0.81014648 0.49867490 -0.30819804
+v 0.36230852 -0.87962862 -0.30819804
+v 0.22391898 -0.68915176 -0.68915176
+v 0.22391898 -0.30819804 -0.92459411
+v 0.36230852 0.11772117 -0.92459411
+v 0.58622750 0.42591921 -0.68915176
+v 0.81014648 0.49867490 -0.30819804
+v -0.00000000 0.38095372 -0.92459410
+v -0.22391898 0.68915176 -0.68915176
+v 0.22391898 0.68915176 -0.68915176
+v -0.22391898 0.92459411 -0.30819804
+v 0.22391898 0.92459411 -0.30819804
+v 0.58622750 0.80687293 -0.07275569
+v -0.58622750 0.80687293 -0.07275569
+v -0.22391898 -0.30819804 0.92459411
+v 0.22391898 -0.30819804 0.92459411
+v 0.36230852 0.11772117 0.92459411
+v 0.00000000 0.38095372 0.92459411
+v -0.36230852 0.11772117 0.92459411
+v -0.84839641 -0.51110305 -0.13783035
+v -0.98678595 -0.08518384 -0.13783035
+v -0.84839641 0.10529302 -0.51878407
+v -0.62447743 -0.20290502 -0.75422642
+v -0.62447743 -0.58385874 -0.51878407
+v 0.98678595 -0.08518384 -0.13783035
+v 0.84839641 -0.51110305 -0.13783035
+v 0.62447743 -0.58385874 -0.51878407
+v 0.62447743 -0.20290502 -0.75422642
+v 0.84839641 0.10529302 -0.51878407
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 47 46
+f 1 46 2
+f 2 3 13 12
+f 2 46 50 3
+f 3 4 14 23 13
+f 3 50 4
+f 4 5 15 14
+f 4 50 49 5
+f 5 6 16 24 15
+f 5 49 6
+f 6 7 17 16
+f 6 49 48 7
+f 7 8 18 25 17
+f 7 48 8
+f 8 9 19 18
+f 8 48 47 9
+f 9 10 20 26 19
+f 9 47 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 52 51
+f 12 51 22
+f 13 23 52
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 57 56
+f 18 56 25
+f 19 26 57
+f 20 21 33 26
+f 21 27 28 34 33
+f 22 51 55 27
+f 23 32 53 52
+f 24 43 42
+f 25 56 60 38
+f 26 33 58 57
+f 27 55 28
+f 28 29 35 34
+f 28 55 54 29
+f 29 30 39 36 35
+f 29 54 30
+f 30 31 40 39
+f 30 54 53 31
+f 31 32 45 42 40
+f 31 53 32
+f 33 34 58
+f 34 35 59 58
+f 35 36 59
+f 36 39 41 37
+f 36 37 60 59
+f 37 41 43 44 38
+f 37 38 60
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
+f 51 52 53 54 55
+f 56 57 58 59 60
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n76.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n76.obj
new file mode 100644
index 00000000..6ae6abe0
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n76.obj
@@ -0,0 +1,107 @@
+v -0.14383464 -0.67226446 0.61486772
+v -0.48573906 -0.42385636 0.61486772
+v -0.61633492 -0.02192360 0.61486772
+v -0.48573906 0.38000915 0.61486772
+v -0.14383464 0.62841725 0.61486772
+v 0.27878247 0.62841725 0.61486772
+v 0.62068689 0.38000915 0.61486772
+v 0.75128276 -0.02192360 0.61486772
+v 0.62068689 -0.42385636 0.61486772
+v 0.27878247 -0.67226446 0.61486772
+v -0.14383464 -0.89444742 0.25536813
+v -0.69704761 -0.49251467 0.25536813
+v -0.82764348 -0.09058192 0.25536813
+v -0.61633492 0.55975894 0.25536813
+v -0.27443050 0.80816704 0.25536813
+v 0.40937834 0.80816704 0.25536813
+v 0.75128276 0.55975894 0.25536813
+v 0.96259131 -0.09058192 0.25536813
+v 0.83199544 -0.49251467 0.25536813
+v 0.27878247 -0.89444742 0.25536813
+v 0.06747392 -0.96310573 -0.10413145
+v -0.48573906 -0.78335594 0.03318517
+v -0.82764348 0.26891767 0.03318517
+v 0.06747392 0.91925852 0.03318517
+v 0.96259131 0.26891767 0.03318517
+v 0.62068689 -0.78335594 0.03318517
+v -0.27443050 -0.85201425 -0.32631441
+v -0.14383464 -0.67226446 -0.68581399
+v -0.14383464 -0.31276488 -0.90799695
+v -0.27443050 0.08916788 -0.90799695
+v -0.48573906 0.38000915 -0.68581399
+v -0.69704761 0.44866746 -0.32631441
+v 0.40937834 -0.85201425 -0.32631441
+v 0.27878247 -0.67226446 -0.68581399
+v 0.27878247 -0.31276488 -0.90799695
+v 0.40937834 0.08916788 -0.90799695
+v 0.62068689 0.38000915 -0.68581399
+v 0.83199544 0.44866746 -0.32631441
+v 0.06747392 0.33757598 -0.90799695
+v -0.14383464 0.62841725 -0.68581399
+v 0.27878247 0.62841725 -0.68581399
+v -0.14383464 0.85060021 -0.32631441
+v 0.27878247 0.85060021 -0.32631441
+v 0.62068689 0.73950873 -0.10413145
+v -0.48573906 0.73950873 -0.10413145
+v 0.06747392 -0.38142319 0.83705068
+v 0.40937834 -0.13301509 0.83705068
+v 0.27878247 0.26891767 0.83705068
+v -0.14383464 0.26891767 0.83705068
+v -0.27443050 -0.13301508 0.83705068
+v -0.82764348 -0.31276488 -0.10413145
+v -0.82764348 0.04673471 -0.32631441
+v -0.61633492 -0.02192360 -0.68581399
+v -0.48573906 -0.42385636 -0.68581399
+v -0.61633492 -0.60360615 -0.32631441
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 46
+f 1 46 50 2
+f 2 3 13 12
+f 2 50 3
+f 3 4 14 23 13
+f 3 50 49 4
+f 4 5 15 14
+f 4 49 5
+f 5 6 16 24 15
+f 5 49 48 6
+f 6 7 17 16
+f 6 48 7
+f 7 8 18 25 17
+f 7 48 47 8
+f 8 9 19 18
+f 8 47 9
+f 9 10 20 26 19
+f 9 47 46 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 51
+f 12 51 55 22
+f 13 23 52 51
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 26 33 34 35 36 37 38 25
+f 20 21 33 26
+f 21 27 28 34 33
+f 22 55 27
+f 23 32 52
+f 24 43 42
+f 27 55 54 28
+f 28 29 35 34
+f 28 54 29
+f 29 30 39 36 35
+f 29 54 53 30
+f 30 31 40 39
+f 30 53 31
+f 31 32 45 42 40
+f 31 53 52 32
+f 36 39 41 37
+f 37 41 43 44 38
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
+f 51 52 53 54 55
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n77.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n77.obj
new file mode 100644
index 00000000..14c23ffd
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n77.obj
@@ -0,0 +1,107 @@
+v -0.21130855 -0.65034085 0.57102051
+v -0.55321297 -0.40193275 0.57102051
+v -0.68380884 -0.00000000 0.57102051
+v -0.55321297 0.40193275 0.57102051
+v -0.21130855 0.65034085 0.57102051
+v 0.21130855 0.65034085 0.57102051
+v 0.55321297 0.40193275 0.57102051
+v 0.68380884 -0.00000000 0.57102051
+v 0.55321297 -0.40193275 0.57102051
+v 0.21130855 -0.65034085 0.57102051
+v -0.21130855 -0.87252381 0.21152092
+v -0.76452153 -0.47059106 0.21152092
+v -0.89511739 -0.06865831 0.21152092
+v -0.68380884 0.58168254 0.21152092
+v -0.34190442 0.83009064 0.21152092
+v 0.34190442 0.83009064 0.21152092
+v 0.68380884 0.58168254 0.21152092
+v 0.89511739 -0.06865831 0.21152092
+v 0.76452152 -0.47059106 0.21152092
+v 0.21130855 -0.87252381 0.21152092
+v -0.00000000 -0.94118212 -0.14797866
+v -0.55321297 -0.76143233 -0.01066204
+v -0.89511739 -0.29084127 -0.14797866
+v -0.89511739 0.29084127 -0.01066204
+v -0.55321297 0.76143233 -0.14797866
+v -0.00000000 0.94118212 -0.01066204
+v 0.55321297 0.76143233 -0.14797866
+v 0.89511739 0.29084127 -0.01066204
+v 0.89511739 -0.29084127 -0.14797866
+v 0.55321297 -0.76143233 -0.01066204
+v 0.34190442 -0.83009064 -0.37016162
+v -0.34190442 -0.83009064 -0.37016162
+v -0.68380884 -0.58168254 -0.37016162
+v -0.89511739 0.06865831 -0.37016162
+v -0.76452153 0.47059106 -0.37016162
+v -0.21130855 0.87252381 -0.37016162
+v 0.21130855 0.87252381 -0.37016162
+v 0.76452153 0.47059106 -0.37016162
+v 0.89511739 0.06865831 -0.37016162
+v 0.68380884 -0.58168254 -0.37016162
+v -0.21130855 -0.65034085 -0.72966120
+v -0.55321297 -0.40193275 -0.72966120
+v -0.68380884 0.00000000 -0.72966120
+v -0.55321297 0.40193275 -0.72966120
+v -0.21130855 0.65034085 -0.72966120
+v 0.21130855 0.65034085 -0.72966120
+v 0.55321297 0.40193275 -0.72966120
+v 0.68380884 -0.00000000 -0.72966120
+v 0.55321297 -0.40193275 -0.72966120
+v 0.21130855 -0.65034085 -0.72966120
+v -0.21130855 -0.29084127 0.79320347
+v 0.21130855 -0.29084127 0.79320347
+v 0.34190442 0.11109148 0.79320347
+v -0.00000000 0.35949958 0.79320347
+v -0.34190442 0.11109148 0.79320347
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 52 51
+f 1 51 2
+f 2 3 13 12
+f 2 51 55 3
+f 3 4 14 24 13
+f 3 55 4
+f 4 5 15 14
+f 4 55 54 5
+f 5 6 16 26 15
+f 5 54 6
+f 6 7 17 16
+f 6 54 53 7
+f 7 8 18 28 17
+f 7 53 8
+f 8 9 19 18
+f 8 53 52 9
+f 9 10 20 30 19
+f 9 52 10
+f 11 22 32 21
+f 11 21 20
+f 12 13 23
+f 12 23 33 22
+f 13 24 34 23
+f 14 15 25
+f 14 25 35 24
+f 15 26 36 25
+f 16 17 27
+f 16 27 37 26
+f 17 28 38 27
+f 18 19 29
+f 18 29 39 28
+f 19 30 40 29
+f 20 21 31 30
+f 21 32 41 50 31
+f 22 33 32
+f 23 34 43 42 33
+f 24 35 34
+f 25 36 45 44 35
+f 26 37 36
+f 27 38 47 46 37
+f 28 39 38
+f 29 40 49 48 39
+f 30 31 40
+f 31 50 49 40
+f 32 33 42 41
+f 34 35 44 43
+f 36 37 46 45
+f 38 39 48 47
+f 41 42 43 44 45 46 47 48 49 50
+f 51 52 53 54 55
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n78.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n78.obj
new file mode 100644
index 00000000..7693437a
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n78.obj
@@ -0,0 +1,107 @@
+v -0.14383464 -0.67226446 0.61486772
+v -0.48573906 -0.42385636 0.61486772
+v -0.61633492 -0.02192360 0.61486772
+v -0.48573906 0.38000915 0.61486772
+v -0.14383464 0.62841725 0.61486772
+v 0.27878247 0.62841725 0.61486772
+v 0.62068689 0.38000915 0.61486772
+v 0.75128276 -0.02192360 0.61486772
+v 0.62068689 -0.42385636 0.61486772
+v 0.27878247 -0.67226446 0.61486772
+v -0.14383464 -0.89444742 0.25536813
+v -0.69704761 -0.49251467 0.25536813
+v -0.82764348 -0.09058192 0.25536813
+v -0.61633492 0.55975894 0.25536813
+v -0.27443050 0.80816704 0.25536813
+v 0.40937834 0.80816704 0.25536813
+v 0.75128276 0.55975894 0.25536813
+v 0.96259131 -0.09058192 0.25536813
+v 0.83199544 -0.49251467 0.25536813
+v 0.27878247 -0.89444742 0.25536813
+v 0.06747392 -0.96310573 -0.10413145
+v -0.48573906 -0.78335594 0.03318517
+v -0.82764348 0.26891767 0.03318517
+v 0.06747392 0.91925852 0.03318517
+v 0.96259131 0.26891767 0.03318517
+v 0.62068689 -0.78335594 0.03318517
+v -0.27443050 -0.85201425 -0.32631441
+v -0.14383464 -0.67226446 -0.68581399
+v -0.14383464 -0.31276488 -0.90799695
+v -0.27443050 0.08916788 -0.90799695
+v -0.48573906 0.38000915 -0.68581399
+v -0.69704761 0.44866746 -0.32631441
+v 0.40937834 -0.85201425 -0.32631441
+v 0.27878247 -0.67226446 -0.68581399
+v 0.27878247 -0.31276488 -0.90799695
+v 0.40937834 0.08916788 -0.90799695
+v 0.62068689 0.38000915 -0.68581399
+v 0.83199544 0.44866746 -0.32631441
+v 0.06747392 0.33757598 -0.90799695
+v -0.14383464 0.62841725 -0.68581399
+v 0.27878247 0.62841725 -0.68581399
+v -0.14383464 0.85060021 -0.32631441
+v 0.27878247 0.85060021 -0.32631441
+v 0.62068689 0.73950873 -0.10413145
+v -0.48573906 0.73950873 -0.10413145
+v 0.06747392 -0.38142319 0.83705068
+v 0.40937834 -0.13301509 0.83705068
+v 0.27878247 0.26891767 0.83705068
+v -0.14383464 0.26891767 0.83705068
+v -0.27443050 -0.13301509 0.83705068
+v -0.73314342 -0.50424291 -0.16554131
+v -0.86373929 -0.10231015 -0.16554131
+v -0.73314342 0.07743964 -0.52504089
+v -0.52183487 -0.21340164 -0.74722385
+v -0.52183487 -0.57290122 -0.52504089
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 46
+f 1 46 50 2
+f 2 3 13 12
+f 2 50 3
+f 3 4 14 23 13
+f 3 50 49 4
+f 4 5 15 14
+f 4 49 5
+f 5 6 16 24 15
+f 5 49 48 6
+f 6 7 17 16
+f 6 48 7
+f 7 8 18 25 17
+f 7 48 47 8
+f 8 9 19 18
+f 8 47 9
+f 9 10 20 26 19
+f 9 47 46 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 52 51
+f 12 51 22
+f 13 23 52
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 26 33 34 35 36 37 38 25
+f 20 21 33 26
+f 21 27 28 34 33
+f 22 51 55 27
+f 23 32 53 52
+f 24 43 42
+f 27 55 28
+f 28 29 35 34
+f 28 55 54 29
+f 29 30 39 36 35
+f 29 54 30
+f 30 31 40 39
+f 30 54 53 31
+f 31 32 45 42 40
+f 31 53 32
+f 36 39 41 37
+f 37 41 43 44 38
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
+f 51 52 53 54 55
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n79.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n79.obj
new file mode 100644
index 00000000..5923c300
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n79.obj
@@ -0,0 +1,107 @@
+v -0.14383464 -0.67226446 0.61486772
+v -0.48573906 -0.42385636 0.61486772
+v -0.61633492 -0.02192360 0.61486772
+v -0.48573906 0.38000915 0.61486772
+v -0.14383464 0.62841725 0.61486772
+v 0.27878247 0.62841725 0.61486772
+v 0.62068689 0.38000915 0.61486772
+v 0.75128276 -0.02192360 0.61486772
+v 0.62068689 -0.42385636 0.61486772
+v 0.27878247 -0.67226446 0.61486772
+v -0.14383464 -0.89444742 0.25536813
+v -0.69704761 -0.49251467 0.25536813
+v -0.82764348 -0.09058192 0.25536813
+v -0.61633492 0.55975894 0.25536813
+v -0.27443050 0.80816704 0.25536813
+v 0.40937834 0.80816704 0.25536813
+v 0.75128276 0.55975894 0.25536813
+v 0.96259131 -0.09058192 0.25536813
+v 0.83199544 -0.49251467 0.25536813
+v 0.27878247 -0.89444742 0.25536813
+v 0.06747392 -0.96310573 -0.10413145
+v -0.48573906 -0.78335594 0.03318517
+v -0.82764348 0.26891767 0.03318517
+v 0.06747392 0.91925852 0.03318517
+v 0.96259131 0.26891767 0.03318517
+v 0.62068689 -0.78335594 0.03318517
+v -0.27443050 -0.85201425 -0.32631441
+v -0.14383464 -0.67226446 -0.68581399
+v -0.14383464 -0.31276488 -0.90799695
+v -0.27443050 0.08916788 -0.90799695
+v -0.48573906 0.38000915 -0.68581399
+v -0.69704761 0.44866746 -0.32631441
+v 0.40937834 -0.85201425 -0.32631441
+v 0.27878247 -0.67226446 -0.68581399
+v 0.27878247 -0.31276488 -0.90799695
+v 0.40937834 0.08916788 -0.90799695
+v 0.62068689 0.38000915 -0.68581399
+v 0.83199544 0.44866746 -0.32631441
+v 0.06747392 0.33757598 -0.90799695
+v -0.14383464 0.62841725 -0.68581399
+v 0.27878247 0.62841725 -0.68581399
+v -0.14383464 0.85060021 -0.32631441
+v 0.27878247 0.85060021 -0.32631441
+v 0.62068689 0.73950873 -0.10413145
+v -0.48573906 0.73950873 -0.10413145
+v -0.14383464 -0.31276488 0.83705068
+v 0.27878247 -0.31276488 0.83705068
+v 0.40937834 0.08916788 0.83705068
+v 0.06747392 0.33757598 0.83705068
+v -0.27443050 0.08916788 0.83705068
+v -0.73314342 -0.50424291 -0.16554131
+v -0.86373929 -0.10231015 -0.16554131
+v -0.73314342 0.07743964 -0.52504089
+v -0.52183487 -0.21340164 -0.74722385
+v -0.52183487 -0.57290122 -0.52504089
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 47 46
+f 1 46 2
+f 2 3 13 12
+f 2 46 50 3
+f 3 4 14 23 13
+f 3 50 4
+f 4 5 15 14
+f 4 50 49 5
+f 5 6 16 24 15
+f 5 49 6
+f 6 7 17 16
+f 6 49 48 7
+f 7 8 18 25 17
+f 7 48 8
+f 8 9 19 18
+f 8 48 47 9
+f 9 10 20 26 19
+f 9 47 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 52 51
+f 12 51 22
+f 13 23 52
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 26 33 34 35 36 37 38 25
+f 20 21 33 26
+f 21 27 28 34 33
+f 22 51 55 27
+f 23 32 53 52
+f 24 43 42
+f 27 55 28
+f 28 29 35 34
+f 28 55 54 29
+f 29 30 39 36 35
+f 29 54 30
+f 30 31 40 39
+f 30 54 53 31
+f 31 32 45 42 40
+f 31 53 32
+f 36 39 41 37
+f 37 41 43 44 38
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
+f 51 52 53 54 55
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n80.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n80.obj
new file mode 100644
index 00000000..c6797f3d
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n80.obj
@@ -0,0 +1,92 @@
+v -0.22391898 -0.68915176 0.68915176
+v -0.58622750 -0.42591921 0.68915176
+v -0.72461704 -0.00000000 0.68915176
+v -0.58622750 0.42591921 0.68915176
+v -0.22391898 0.68915176 0.68915176
+v 0.22391898 0.68915176 0.68915176
+v 0.58622750 0.42591921 0.68915176
+v 0.72461704 -0.00000000 0.68915176
+v 0.58622750 -0.42591921 0.68915176
+v 0.22391898 -0.68915176 0.68915176
+v -0.22391898 -0.92459411 0.30819803
+v -0.81014648 -0.49867490 0.30819803
+v -0.94853602 -0.07275569 0.30819803
+v -0.72461704 0.61639607 0.30819803
+v -0.36230852 0.87962862 0.30819803
+v 0.36230852 0.87962862 0.30819803
+v 0.72461704 0.61639607 0.30819803
+v 0.94853602 -0.07275569 0.30819803
+v 0.81014648 -0.49867490 0.30819803
+v 0.22391898 -0.92459411 0.30819803
+v -0.00000000 -0.99734979 -0.07275569
+v -0.58622750 -0.80687293 0.07275569
+v -0.94853602 -0.30819803 -0.07275569
+v -0.94853602 0.30819803 0.07275569
+v -0.58622750 0.80687293 -0.07275569
+v -0.00000000 0.99734979 0.07275569
+v 0.58622750 0.80687293 -0.07275569
+v 0.94853602 0.30819803 0.07275569
+v 0.94853602 -0.30819804 -0.07275569
+v 0.58622750 -0.80687293 0.07275569
+v 0.36230852 -0.87962862 -0.30819803
+v -0.36230852 -0.87962862 -0.30819803
+v -0.72461704 -0.61639607 -0.30819803
+v -0.94853602 0.07275569 -0.30819803
+v -0.81014648 0.49867490 -0.30819803
+v -0.22391898 0.92459411 -0.30819803
+v 0.22391898 0.92459410 -0.30819803
+v 0.81014648 0.49867490 -0.30819803
+v 0.94853602 0.07275569 -0.30819803
+v 0.72461704 -0.61639607 -0.30819803
+v -0.22391898 -0.68915176 -0.68915176
+v -0.58622750 -0.42591921 -0.68915176
+v -0.72461703 0.00000000 -0.68915176
+v -0.58622750 0.42591921 -0.68915176
+v -0.22391898 0.68915176 -0.68915176
+v 0.22391898 0.68915176 -0.68915176
+v 0.58622750 0.42591921 -0.68915176
+v 0.72461704 -0.00000000 -0.68915176
+v 0.58622750 -0.42591921 -0.68915176
+v 0.22391898 -0.68915176 -0.68915176
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 9 8 7 6 5 4 3 2
+f 2 3 13 12
+f 3 4 14 24 13
+f 4 5 15 14
+f 5 6 16 26 15
+f 6 7 17 16
+f 7 8 18 28 17
+f 8 9 19 18
+f 9 10 20 30 19
+f 11 22 32 21
+f 11 21 20
+f 12 13 23
+f 12 23 33 22
+f 13 24 34 23
+f 14 15 25
+f 14 25 35 24
+f 15 26 36 25
+f 16 17 27
+f 16 27 37 26
+f 17 28 38 27
+f 18 19 29
+f 18 29 39 28
+f 19 30 40 29
+f 20 21 31 30
+f 21 32 41 50 31
+f 22 33 32
+f 23 34 43 42 33
+f 24 35 34
+f 25 36 45 44 35
+f 26 37 36
+f 27 38 47 46 37
+f 28 39 38
+f 29 40 49 48 39
+f 30 31 40
+f 31 50 49 40
+f 32 33 42 41
+f 34 35 44 43
+f 36 37 46 45
+f 38 39 48 47
+f 41 42 43 44 45 46 47 48 49 50
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n81.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n81.obj
new file mode 100644
index 00000000..e249e287
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n81.obj
@@ -0,0 +1,92 @@
+v -0.20493237 -0.67749353 0.55503095
+v -0.53651992 -0.43658108 0.55503095
+v -0.66317509 -0.04677654 0.55503095
+v -0.53651992 0.34302799 0.55503095
+v -0.20493237 0.58394044 0.55503095
+v 0.20493237 0.58394044 0.55503095
+v 0.53651992 0.34302799 0.55503095
+v 0.66317509 -0.04677654 0.55503095
+v 0.53651992 -0.43658108 0.55503095
+v 0.20493237 -0.67749353 0.55503095
+v -0.20493237 -0.89297218 0.20637917
+v -0.74145229 -0.50316764 0.20637917
+v -0.86810746 -0.11336311 0.20637917
+v -0.66317509 0.51735388 0.20637917
+v -0.33158754 0.75826633 0.20637917
+v 0.33158754 0.75826633 0.20637917
+v 0.66317509 0.51735388 0.20637917
+v 0.86810746 -0.11336311 0.20637917
+v 0.74145229 -0.50316764 0.20637917
+v 0.20493237 -0.89297218 0.20637917
+v 0.00000000 -0.95955874 -0.14227260
+v -0.53651992 -0.78523286 -0.00909947
+v -0.86810746 0.23528867 -0.00909947
+v 0.00000000 0.86600566 -0.00909947
+v 0.86810746 0.23528867 -0.00909947
+v 0.53651992 -0.78523286 -0.00909947
+v -0.33158754 -0.85181942 -0.35775125
+v -0.20493237 -0.67749353 -0.70640303
+v -0.20493237 -0.32884176 -0.92188167
+v -0.33158754 0.06096278 -0.92188167
+v -0.53651992 0.34302799 -0.70640302
+v -0.74145229 0.40961456 -0.35775125
+v 0.33158754 -0.85181942 -0.35775125
+v 0.20493237 -0.67749353 -0.70640303
+v 0.20493237 -0.32884176 -0.92188167
+v 0.33158754 0.06096278 -0.92188167
+v 0.53651992 0.34302799 -0.70640303
+v 0.74145229 0.40961456 -0.35775125
+v -0.00000000 0.30187523 -0.92188167
+v -0.20493237 0.58394044 -0.70640302
+v 0.20493237 0.58394044 -0.70640303
+v -0.20493237 0.79941909 -0.35775125
+v 0.20493237 0.79941909 -0.35775125
+v 0.53651992 0.69167977 -0.14227260
+v -0.53651992 0.69167977 -0.14227260
+v 0.00000000 -0.39542832 0.77050960
+v 0.33158754 -0.15451587 0.77050960
+v 0.20493237 0.23528867 0.77050960
+v -0.20493237 0.23528867 0.77050960
+v -0.33158754 -0.15451587 0.77050960
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 46
+f 1 46 50 2
+f 2 3 13 12
+f 2 50 3
+f 3 4 14 23 13
+f 3 50 49 4
+f 4 5 15 14
+f 4 49 5
+f 5 6 16 24 15
+f 5 49 48 6
+f 6 7 17 16
+f 6 48 7
+f 7 8 18 25 17
+f 7 48 47 8
+f 8 9 19 18
+f 8 47 9
+f 9 10 20 26 19
+f 9 47 46 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 23 32 31 30 29 28 27 22
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 26 33 34 35 36 37 38 25
+f 20 21 33 26
+f 21 27 28 34 33
+f 24 43 42
+f 28 29 35 34
+f 29 30 39 36 35
+f 30 31 40 39
+f 31 32 45 42 40
+f 36 39 41 37
+f 37 41 43 44 38
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n82.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n82.obj
new file mode 100644
index 00000000..bec40fa7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n82.obj
@@ -0,0 +1,92 @@
+v -0.20493237 -0.67749353 0.55503095
+v -0.53651992 -0.43658108 0.55503095
+v -0.66317509 -0.04677654 0.55503095
+v -0.53651992 0.34302799 0.55503095
+v -0.20493237 0.58394044 0.55503095
+v 0.20493237 0.58394044 0.55503095
+v 0.53651992 0.34302799 0.55503095
+v 0.66317509 -0.04677654 0.55503095
+v 0.53651992 -0.43658108 0.55503095
+v 0.20493237 -0.67749353 0.55503095
+v -0.20493237 -0.89297218 0.20637917
+v -0.74145229 -0.50316764 0.20637917
+v -0.86810746 -0.11336311 0.20637917
+v -0.66317509 0.51735388 0.20637917
+v -0.33158754 0.75826633 0.20637917
+v 0.33158754 0.75826633 0.20637917
+v 0.66317509 0.51735388 0.20637917
+v 0.86810746 -0.11336311 0.20637917
+v 0.74145229 -0.50316764 0.20637917
+v 0.20493237 -0.89297218 0.20637917
+v 0.00000000 -0.95955874 -0.14227260
+v -0.53651992 -0.78523286 -0.00909947
+v -0.86810746 0.23528867 -0.00909947
+v 0.00000000 0.86600566 -0.00909947
+v 0.86810746 0.23528867 -0.00909947
+v 0.53651992 -0.78523286 -0.00909947
+v -0.33158754 -0.85181942 -0.35775125
+v -0.20493237 -0.67749353 -0.70640303
+v -0.20493237 -0.32884176 -0.92188167
+v -0.33158754 0.06096278 -0.92188167
+v -0.53651992 0.34302799 -0.70640302
+v -0.74145229 0.40961456 -0.35775125
+v 0.33158754 -0.85181942 -0.35775125
+v 0.20493237 -0.67749353 -0.70640303
+v 0.20493237 -0.32884176 -0.92188167
+v 0.33158754 0.06096278 -0.92188167
+v 0.53651992 0.34302799 -0.70640303
+v 0.74145229 0.40961456 -0.35775125
+v -0.00000000 0.30187523 -0.92188167
+v -0.20493237 0.58394044 -0.70640302
+v 0.20493237 0.58394044 -0.70640303
+v -0.20493237 0.79941909 -0.35775125
+v 0.20493237 0.79941909 -0.35775125
+v 0.53651992 0.69167977 -0.14227260
+v -0.53651992 0.69167977 -0.14227260
+v -0.20493237 -0.32884176 0.77050960
+v 0.20493237 -0.32884176 0.77050960
+v 0.33158754 0.06096278 0.77050960
+v 0.00000000 0.30187523 0.77050960
+v -0.33158754 0.06096278 0.77050960
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 47 46
+f 1 46 2
+f 2 3 13 12
+f 2 46 50 3
+f 3 4 14 23 13
+f 3 50 4
+f 4 5 15 14
+f 4 50 49 5
+f 5 6 16 24 15
+f 5 49 6
+f 6 7 17 16
+f 6 49 48 7
+f 7 8 18 25 17
+f 7 48 8
+f 8 9 19 18
+f 8 48 47 9
+f 9 10 20 26 19
+f 9 47 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 23 32 31 30 29 28 27 22
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 26 33 34 35 36 37 38 25
+f 20 21 33 26
+f 21 27 28 34 33
+f 24 43 42
+f 28 29 35 34
+f 29 30 39 36 35
+f 30 31 40 39
+f 31 32 45 42 40
+f 36 39 41 37
+f 37 41 43 44 38
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n83.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n83.obj
new file mode 100644
index 00000000..40656942
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n83.obj
@@ -0,0 +1,77 @@
+v -0.21205343 -0.70641331 0.66290442
+v -0.55516310 -0.45712955 0.66290442
+v -0.68621933 -0.05377995 0.66290442
+v -0.55516310 0.34956965 0.66290442
+v -0.21205343 0.59885342 0.66290442
+v 0.21205343 0.59885342 0.66290442
+v 0.55516310 0.34956965 0.66290442
+v 0.68621933 -0.05377995 0.66290442
+v 0.55516310 -0.45712955 0.66290442
+v 0.21205343 -0.70641331 0.66290442
+v -0.21205343 -0.92937949 0.30213757
+v -0.76721653 -0.52602989 0.30213757
+v -0.89827276 -0.12268028 0.30213757
+v -0.68621933 0.52995308 0.30213757
+v -0.34310966 0.77923684 0.30213757
+v 0.34310966 0.77923684 0.30213757
+v 0.68621933 0.52995308 0.30213757
+v 0.89827276 -0.12268028 0.30213757
+v 0.76721653 -0.52602989 0.30213757
+v 0.21205343 -0.92937949 0.30213757
+v 0.00000000 -0.99827982 -0.05862928
+v -0.55516310 -0.81789640 0.07917139
+v -0.89827276 0.23808657 0.07917139
+v 0.00000000 0.89071993 0.07917139
+v 0.89827276 0.23808657 0.07917139
+v 0.55516310 -0.81789640 0.07917139
+v -0.34310966 -0.88679674 -0.28159546
+v -0.21205343 -0.70641331 -0.64236231
+v -0.21205343 -0.34564646 -0.86532848
+v -0.34310967 0.05770314 -0.86532848
+v -0.55516310 0.34956965 -0.64236231
+v -0.76721653 0.41846999 -0.28159546
+v 0.34310966 -0.88679674 -0.28159546
+v 0.21205343 -0.70641331 -0.64236231
+v 0.21205343 -0.34564646 -0.86532848
+v 0.34310966 0.05770314 -0.86532848
+v 0.55516310 0.34956965 -0.64236231
+v 0.76721653 0.41846999 -0.28159546
+v -0.00000000 0.30698691 -0.86532848
+v -0.21205344 0.59885342 -0.64236231
+v 0.21205343 0.59885342 -0.64236231
+v -0.21205343 0.82181959 -0.28159546
+v 0.21205343 0.82181959 -0.28159546
+v 0.55516310 0.71033651 -0.05862928
+v -0.55516310 0.71033650 -0.05862928
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 9 8 7 6 5 4 3 2
+f 2 3 13 12
+f 3 4 14 23 13
+f 4 5 15 14
+f 5 6 16 24 15
+f 6 7 17 16
+f 7 8 18 25 17
+f 8 9 19 18
+f 9 10 20 26 19
+f 11 22 27 21
+f 11 21 20
+f 12 13 23 32 31 30 29 28 27 22
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 26 33 34 35 36 37 38 25
+f 20 21 33 26
+f 21 27 28 34 33
+f 24 43 42
+f 28 29 35 34
+f 29 30 39 36 35
+f 30 31 40 39
+f 31 32 45 42 40
+f 36 39 41 37
+f 37 41 43 44 38
+f 39 40 41
+f 40 42 43 41
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n84.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n84.obj
new file mode 100644
index 00000000..99140d2c
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n84.obj
@@ -0,0 +1,20 @@
+v -0.75649990 -0.43676533 0.48676866
+v -0.21875602 -0.92678633 -0.30530764
+v -0.21875602 0.49463440 0.48676866
+v -0.57471845 0.07921625 -0.43918622
+v 0.47448656 -0.13708534 -0.53435131
+v 0.14100681 0.88189762 -0.44985925
+v 0.31898787 -0.43676533 0.48676866
+v 0.83424915 0.48165406 0.26839843
+f 1 2 7
+f 1 7 3
+f 1 3 4
+f 1 4 2
+f 2 4 5
+f 2 5 7
+f 3 7 8
+f 3 8 6
+f 3 6 4
+f 4 6 5
+f 5 6 8
+f 5 8 7
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n85.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n85.obj
new file mode 100644
index 00000000..88e6e2d9
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n85.obj
@@ -0,0 +1,42 @@
+v -0.40739095 -0.40739110 0.55150049
+v -0.40739095 0.40739118 0.55150049
+v 0.40739133 0.40739118 0.55150049
+v 0.40739133 -0.40739110 0.55150049
+v -0.69897385 -0.69897400 -0.15122917
+v -0.98849816 0.00000004 0.15122929
+v -0.69897385 0.69897408 -0.15122917
+v 0.00000019 0.98849838 0.15122929
+v 0.69897423 0.69897408 -0.15122917
+v 0.98849853 0.00000004 0.15122929
+v 0.69897423 -0.69897400 -0.15122917
+v 0.00000019 -0.98849831 0.15122929
+v -0.57613626 0.00000004 -0.55149955
+v -0.00000043 0.57614036 -0.55150182
+v 0.57613486 -0.00000057 -0.55149925
+v -0.00000043 -0.57614028 -0.55150182
+f 1 2 6
+f 1 6 5
+f 1 5 12
+f 1 12 4
+f 1 4 3 2
+f 2 3 8
+f 2 8 7
+f 2 7 6
+f 3 4 10
+f 3 10 9
+f 3 9 8
+f 4 12 11
+f 4 11 10
+f 5 6 13
+f 5 13 16
+f 5 16 12
+f 6 7 13
+f 7 8 14
+f 7 14 13
+f 8 9 14
+f 9 10 15
+f 9 15 14
+f 10 11 15
+f 11 12 16
+f 11 16 15
+f 13 14 15 16
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n86.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n86.obj
new file mode 100644
index 00000000..0c12e8e4
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n86.obj
@@ -0,0 +1,24 @@
+v 0.15389145 -0.79063961 -0.25122195
+v 0.15389145 0.79063935 -0.25122195
+v -0.08683237 0.00000121 -0.81691859
+v 0.76720476 -0.00000013 -0.29376075
+v -0.34687634 -0.50076793 0.56626173
+v -0.34687634 0.50076766 0.56626173
+v 0.65465925 -0.50076793 0.56626173
+v 0.65465925 0.50076766 0.56626173
+v -0.80186056 -0.50076793 -0.32596185
+v -0.80186056 0.50076766 -0.32596185
+f 1 3 4
+f 1 4 7
+f 1 7 5
+f 1 5 9
+f 1 9 3
+f 2 3 10
+f 2 10 6
+f 2 6 8
+f 2 8 4
+f 2 4 3
+f 3 9 10
+f 4 8 7
+f 5 7 8 6
+f 5 6 10 9
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n87.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n87.obj
new file mode 100644
index 00000000..d6f957ec
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n87.obj
@@ -0,0 +1,28 @@
+v 0.11988005 -0.67749119 -0.31454842
+v 0.11988005 0.67749098 -0.31454842
+v -0.08639380 0.00000104 -0.79928823
+v 0.64542211 -0.00000010 -0.35099950
+v -0.30922289 -0.42910304 0.38594519
+v -0.30922289 0.42910283 0.38594519
+v 0.54898298 -0.42910304 0.38594519
+v 0.54898298 0.42910283 0.38594519
+v -0.69909432 -0.42910304 -0.37859230
+v -0.69909432 0.42910283 -0.37859230
+v 0.11988005 -0.00000010 0.99278838
+f 1 3 4
+f 1 4 7
+f 1 7 5
+f 1 5 9
+f 1 9 3
+f 2 3 10
+f 2 10 6
+f 2 6 8
+f 2 8 4
+f 2 4 3
+f 3 9 10
+f 4 8 7
+f 5 6 10 9
+f 5 7 11
+f 5 11 6
+f 6 11 8
+f 7 8 11
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n88.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n88.obj
new file mode 100644
index 00000000..6b72d3ca
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n88.obj
@@ -0,0 +1,30 @@
+v 0.38077489 -0.65068035 -0.28161977
+v 0.23971953 -0.00000007 -0.65071787
+v 0.69238902 0.00000073 -0.03866788
+v -0.17227827 -0.97677286 0.12741658
+v -0.55290763 -0.38062943 0.40892884
+v -0.55290763 0.38062930 0.40892884
+v -0.17227827 0.97677272 0.12741658
+v 0.38077489 0.65068022 -0.28161977
+v -0.32999437 -0.38062943 -0.31896162
+v -0.32999437 0.38062930 -0.31896162
+v 0.20835110 -0.38062943 0.40892884
+v 0.20835110 0.38062930 0.40892884
+f 1 2 3
+f 1 3 11
+f 1 11 4
+f 1 4 9
+f 1 9 2
+f 2 9 10
+f 2 10 8
+f 2 8 3
+f 3 8 12
+f 3 12 11
+f 4 11 5
+f 4 5 9
+f 5 11 12 6
+f 5 6 10 9
+f 6 12 7
+f 6 7 10
+f 7 12 8
+f 7 8 10
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n89.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n89.obj
new file mode 100644
index 00000000..0b5c2160
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n89.obj
@@ -0,0 +1,35 @@
+v -0.44436584 -0.44436584 0.75893037
+v -0.44436584 0.44436584 0.75893037
+v 0.44436584 0.44436584 0.75893037
+v 0.44436584 -0.44436584 0.75893037
+v -0.97875646 0.00000000 0.20502633
+v 0.97875646 -0.00000000 0.20502633
+v -0.44436584 -0.63708304 -0.10865484
+v 0.44436584 -0.63708304 -0.10865484
+v -0.44436584 0.63708304 -0.10865484
+v 0.44436584 0.63708304 -0.10865484
+v -0.74267577 0.00000000 -0.65177582
+v 0.74267577 -0.00000000 -0.65177582
+v -0.00000000 -0.44436731 -0.85380157
+v 0.00000000 0.44436731 -0.85380157
+f 1 2 5
+f 1 5 7
+f 1 7 8 4
+f 1 4 3 2
+f 2 3 10 9
+f 2 9 5
+f 3 4 6
+f 3 6 10
+f 4 8 6
+f 5 9 11
+f 5 11 7
+f 6 8 12
+f 6 12 10
+f 7 11 13
+f 7 13 8
+f 8 13 12
+f 9 10 14
+f 9 14 11
+f 10 12 14
+f 11 14 13
+f 12 13 14
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n90.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n90.obj
new file mode 100644
index 00000000..12cea9c9
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n90.obj
@@ -0,0 +1,40 @@
+v -0.41242387 -0.58439230 0.69885062
+v 0.41242321 -0.58439230 0.69885062
+v -0.41242387 0.24045478 0.69885062
+v 0.41242321 0.24045478 0.69885062
+v -0.41242387 -0.73037469 -0.11297563
+v 0.41242321 -0.73037469 -0.11297563
+v -0.92917625 -0.17196876 0.20565034
+v 0.92917559 -0.17196876 0.20565034
+v -0.63276502 0.56134326 -0.02837223
+v 0.63276436 0.56134326 -0.02837223
+v -0.63276502 -0.07142283 -0.55750338
+v 0.63276436 -0.07142283 -0.55750338
+v -0.00000033 -0.54083237 -0.80170870
+v 0.00000232 0.26800856 -0.96341536
+v 0.00000232 0.90077466 -0.43428421
+v -0.00000033 0.88477025 0.39040759
+f 1 2 4 3
+f 1 3 7
+f 1 7 5
+f 1 5 6 2
+f 2 6 8
+f 2 8 4
+f 3 4 16
+f 3 16 9
+f 3 9 7
+f 4 8 10
+f 4 10 16
+f 5 7 11
+f 5 11 13
+f 5 13 6
+f 6 13 12
+f 6 12 8
+f 7 9 11
+f 8 12 10
+f 9 16 15
+f 9 15 14 11
+f 10 12 14 15
+f 10 15 16
+f 11 14 13
+f 12 13 14
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n91.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n91.obj
new file mode 100644
index 00000000..8fa9e15a
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n91.obj
@@ -0,0 +1,28 @@
+v -0.35682209 -0.79465447 0.49112347
+v 0.35682209 -0.79465447 0.49112347
+v 0.57735027 -0.49112347 -0.11593853
+v -0.00000000 -0.30353100 -0.49112347
+v -0.57735027 -0.49112347 -0.11593853
+v -0.57735027 -0.11593852 0.49112347
+v 0.57735027 -0.11593853 0.49112347
+v 0.57735027 0.11593853 -0.49112347
+v -0.57735027 0.11593853 -0.49112347
+v 0.00000000 0.30353100 0.49112347
+v 0.57735027 0.49112347 0.11593853
+v 0.35682209 0.79465447 -0.49112347
+v -0.35682209 0.79465447 -0.49112347
+v -0.57735027 0.49112347 0.11593852
+f 1 2 7 10 6
+f 1 6 5
+f 1 5 4 3 2
+f 2 3 7
+f 3 4 8
+f 3 8 11 7
+f 4 5 9
+f 4 9 13 12 8
+f 5 6 14 9
+f 6 10 14
+f 7 11 10
+f 8 12 11
+f 9 14 13
+f 10 11 12 13 14
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n92.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n92.obj
new file mode 100644
index 00000000..1f85374b
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/n92.obj
@@ -0,0 +1,38 @@
+v -0.33030437 -0.57210395 -0.43569542
+v 0.33030437 -0.57210395 -0.43569542
+v 0.66060874 0.00000000 -0.43569542
+v 0.33030437 0.57210395 -0.43569542
+v -0.33030437 0.57210395 -0.43569542
+v -0.66060874 -0.00000000 -0.43569542
+v -0.53444370 -0.68996385 0.18142700
+v 0.00000000 -0.99852506 -0.05429279
+v 0.53444370 -0.68996385 0.18142700
+v 0.86474807 -0.11785990 0.18142700
+v 0.86474807 0.49926253 -0.05429279
+v 0.33030437 0.80782374 0.18142700
+v -0.33030437 0.80782374 0.18142700
+v -0.86474807 0.49926253 -0.05429279
+v -0.86474807 -0.11785990 0.18142700
+v -0.33030437 -0.19070132 0.56282964
+v 0.33030437 -0.19070132 0.56282964
+v 0.00000000 0.38140263 0.56282964
+f 1 2 8
+f 1 8 7
+f 1 7 15 6
+f 1 6 5 4 3 2
+f 2 3 10 9
+f 2 9 8
+f 3 4 11
+f 3 11 10
+f 4 5 13 12
+f 4 12 11
+f 5 6 14
+f 5 14 13
+f 6 15 14
+f 7 8 9 17 16
+f 7 16 15
+f 9 10 17
+f 10 11 12 18 17
+f 12 13 18
+f 13 14 15 16 18
+f 16 17 18
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p03.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p03.obj
new file mode 100644
index 00000000..2dfa2604
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p03.obj
@@ -0,0 +1,11 @@
+v -0.65465367 -0.37796447 0.65465367
+v 0.00000000 0.75592895 0.65465367
+v 0.65465367 -0.37796447 0.65465367
+v -0.65465367 -0.37796447 -0.65465367
+v 0.00000000 0.75592895 -0.65465367
+v 0.65465367 -0.37796447 -0.65465367
+f 1 2 5 4
+f 1 4 6 3
+f 1 3 2
+f 2 3 6 5
+f 4 5 6
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p04.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p04.obj
new file mode 100644
index 00000000..c42c1d1f
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p04.obj
@@ -0,0 +1,14 @@
+v -0.57735027 -0.57735027 0.57735027
+v -0.57735027 0.57735027 0.57735027
+v 0.57735027 0.57735027 0.57735027
+v 0.57735027 -0.57735027 0.57735027
+v -0.57735027 -0.57735027 -0.57735027
+v -0.57735027 0.57735027 -0.57735027
+v 0.57735027 0.57735027 -0.57735027
+v 0.57735027 -0.57735027 -0.57735027
+f 1 2 6 5
+f 1 5 8 4
+f 1 4 3 2
+f 2 3 7 6
+f 3 4 8 7
+f 5 6 7 8
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p05.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p05.obj
new file mode 100644
index 00000000..e7731809
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p05.obj
@@ -0,0 +1,17 @@
+v -0.50673185 -0.69745656 0.50673185
+v -0.81990936 0.26640470 0.50673185
+v 0.00000000 0.86210372 0.50673185
+v 0.81990936 0.26640470 0.50673185
+v 0.50673185 -0.69745656 0.50673185
+v -0.50673185 -0.69745656 -0.50673185
+v -0.81990936 0.26640470 -0.50673185
+v 0.00000000 0.86210372 -0.50673185
+v 0.81990936 0.26640470 -0.50673185
+v 0.50673185 -0.69745656 -0.50673185
+f 1 2 7 6
+f 1 6 10 5
+f 1 5 4 3 2
+f 2 3 8 7
+f 3 4 9 8
+f 4 5 10 9
+f 6 7 8 9 10
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p06.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p06.obj
new file mode 100644
index 00000000..6b1fc4e7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p06.obj
@@ -0,0 +1,20 @@
+v -0.44721360 -0.77459667 0.44721360
+v -0.89442719 0.00000000 0.44721360
+v -0.44721360 0.77459667 0.44721360
+v 0.44721360 0.77459667 0.44721360
+v 0.89442719 -0.00000000 0.44721360
+v 0.44721360 -0.77459667 0.44721360
+v -0.44721360 -0.77459667 -0.44721360
+v -0.89442719 0.00000000 -0.44721360
+v -0.44721360 0.77459667 -0.44721360
+v 0.44721360 0.77459667 -0.44721360
+v 0.89442719 -0.00000000 -0.44721360
+v 0.44721360 -0.77459667 -0.44721360
+f 1 2 8 7
+f 1 7 12 6
+f 1 6 5 4 3 2
+f 2 3 9 8
+f 3 4 10 9
+f 4 5 11 10
+f 5 6 12 11
+f 7 8 9 10 11 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p07.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p07.obj
new file mode 100644
index 00000000..b11e3f11
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p07.obj
@@ -0,0 +1,23 @@
+v -0.39803250 -0.82652300 0.39803250
+v -0.89437090 -0.20413432 0.39803250
+v -0.71722978 0.57197166 0.39803250
+v 0.00000000 0.91737132 0.39803250
+v 0.71722978 0.57197166 0.39803250
+v 0.89437090 -0.20413432 0.39803250
+v 0.39803250 -0.82652300 0.39803250
+v -0.39803250 -0.82652300 -0.39803250
+v -0.89437090 -0.20413432 -0.39803250
+v -0.71722978 0.57197166 -0.39803250
+v 0.00000000 0.91737132 -0.39803250
+v 0.71722978 0.57197166 -0.39803250
+v 0.89437090 -0.20413432 -0.39803250
+v 0.39803250 -0.82652300 -0.39803250
+f 1 2 9 8
+f 1 8 14 7
+f 1 7 6 5 4 3 2
+f 2 3 10 9
+f 3 4 11 10
+f 4 5 12 11
+f 5 6 13 12
+f 6 7 14 13
+f 8 9 10 11 12 13 14
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p08.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p08.obj
new file mode 100644
index 00000000..3b99bc23
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p08.obj
@@ -0,0 +1,26 @@
+v -0.35740674 -0.86285621 0.35740674
+v -0.86285621 -0.35740674 0.35740674
+v -0.86285621 0.35740674 0.35740674
+v -0.35740674 0.86285621 0.35740674
+v 0.35740674 0.86285621 0.35740674
+v 0.86285621 0.35740674 0.35740674
+v 0.86285621 -0.35740674 0.35740674
+v 0.35740674 -0.86285621 0.35740674
+v -0.35740674 -0.86285621 -0.35740674
+v -0.86285621 -0.35740674 -0.35740674
+v -0.86285621 0.35740674 -0.35740674
+v -0.35740674 0.86285621 -0.35740674
+v 0.35740674 0.86285621 -0.35740674
+v 0.86285621 0.35740674 -0.35740674
+v 0.86285621 -0.35740674 -0.35740674
+v 0.35740674 -0.86285621 -0.35740674
+f 1 2 10 9
+f 1 9 16 8
+f 1 8 7 6 5 4 3 2
+f 2 3 11 10
+f 3 4 12 11
+f 4 5 13 12
+f 5 6 14 13
+f 6 7 15 14
+f 7 8 16 15
+f 9 10 11 12 13 14 15 16
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p09.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p09.obj
new file mode 100644
index 00000000..e00153ab
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p09.obj
@@ -0,0 +1,29 @@
+v -0.32361558 -0.88912649 0.32361558
+v -0.81942341 -0.47309432 0.32361558
+v -0.93181392 0.16430393 0.32361558
+v -0.60819834 0.72482256 0.32361558
+v 0.00000000 0.94618865 0.32361558
+v 0.60819834 0.72482256 0.32361558
+v 0.93181392 0.16430393 0.32361558
+v 0.81942341 -0.47309432 0.32361558
+v 0.32361558 -0.88912649 0.32361558
+v -0.32361558 -0.88912649 -0.32361558
+v -0.81942341 -0.47309432 -0.32361558
+v -0.93181392 0.16430393 -0.32361558
+v -0.60819834 0.72482256 -0.32361558
+v 0.00000000 0.94618865 -0.32361558
+v 0.60819834 0.72482256 -0.32361558
+v 0.93181392 0.16430393 -0.32361558
+v 0.81942341 -0.47309432 -0.32361558
+v 0.32361558 -0.88912649 -0.32361558
+f 1 2 11 10
+f 1 10 18 9
+f 1 9 8 7 6 5 4 3 2
+f 2 3 12 11
+f 3 4 13 12
+f 4 5 14 13
+f 5 6 15 14
+f 6 7 16 15
+f 7 8 17 16
+f 8 9 18 17
+f 10 11 12 13 14 15 16 17 18
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p10.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p10.obj
new file mode 100644
index 00000000..31941eda
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/p10.obj
@@ -0,0 +1,32 @@
+v -0.29524181 -0.90866085 0.29524181
+v -0.77295309 -0.56158329 0.29524181
+v -0.95542256 0.00000000 0.29524181
+v -0.77295309 0.56158329 0.29524181
+v -0.29524181 0.90866085 0.29524181
+v 0.29524181 0.90866085 0.29524181
+v 0.77295309 0.56158329 0.29524181
+v 0.95542256 -0.00000000 0.29524181
+v 0.77295309 -0.56158329 0.29524181
+v 0.29524181 -0.90866085 0.29524181
+v -0.29524181 -0.90866085 -0.29524181
+v -0.77295309 -0.56158329 -0.29524181
+v -0.95542256 0.00000000 -0.29524181
+v -0.77295309 0.56158329 -0.29524181
+v -0.29524181 0.90866085 -0.29524181
+v 0.29524181 0.90866085 -0.29524181
+v 0.77295309 0.56158329 -0.29524181
+v 0.95542256 -0.00000000 -0.29524181
+v 0.77295309 -0.56158329 -0.29524181
+v 0.29524181 -0.90866085 -0.29524181
+f 1 2 12 11
+f 1 11 20 10
+f 1 10 9 8 7 6 5 4 3 2
+f 2 3 13 12
+f 3 4 14 13
+f 4 5 15 14
+f 5 6 16 15
+f 6 7 17 16
+f 7 8 18 17
+f 8 9 19 18
+f 9 10 20 19
+f 11 12 13 14 15 16 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r01.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r01.obj
new file mode 100644
index 00000000..2edf33c5
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r01.obj
@@ -0,0 +1,8 @@
+v -0.81649658 -0.47140452 0.33333333
+v 0.81649658 -0.47140452 0.33333333
+v 0.00000000 0.00000000 -1.00000000
+v 0.00000000 0.94280904 0.33333333
+f 1 2 4
+f 1 4 3
+f 1 3 2
+f 2 3 4
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r02.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r02.obj
new file mode 100644
index 00000000..85bbede8
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r02.obj
@@ -0,0 +1,14 @@
+v -0.70710678 -0.70710678 0.00000000
+v -0.70710678 0.70710678 0.00000000
+v 0.70710678 0.70710678 0.00000000
+v 0.70710678 -0.70710678 0.00000000
+v 0.00000000 0.00000000 -1.00000000
+v 0.00000000 0.00000000 1.00000000
+f 1 2 5
+f 1 5 4
+f 1 4 6
+f 1 6 2
+f 2 3 5
+f 2 6 3
+f 3 4 5
+f 3 6 4
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r03.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r03.obj
new file mode 100644
index 00000000..c42c1d1f
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r03.obj
@@ -0,0 +1,14 @@
+v -0.57735027 -0.57735027 0.57735027
+v -0.57735027 0.57735027 0.57735027
+v 0.57735027 0.57735027 0.57735027
+v 0.57735027 -0.57735027 0.57735027
+v -0.57735027 -0.57735027 -0.57735027
+v -0.57735027 0.57735027 -0.57735027
+v 0.57735027 0.57735027 -0.57735027
+v 0.57735027 -0.57735027 -0.57735027
+f 1 2 6 5
+f 1 5 8 4
+f 1 4 3 2
+f 2 3 7 6
+f 3 4 8 7
+f 5 6 7 8
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r04.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r04.obj
new file mode 100644
index 00000000..56a0c40c
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r04.obj
@@ -0,0 +1,32 @@
+v -0.35682209 -0.49112347 0.79465447
+v 0.35682209 -0.49112347 0.79465447
+v 0.57735027 -0.79465447 0.18759247
+v 0.00000000 -0.98224695 -0.18759247
+v -0.57735027 -0.79465447 0.18759247
+v -0.57735027 0.18759247 0.79465447
+v 0.57735027 0.18759247 0.79465447
+v 0.93417236 -0.30353100 -0.18759247
+v -0.00000000 -0.60706200 -0.79465447
+v -0.93417236 -0.30353100 -0.18759247
+v -0.93417236 0.30353100 0.18759247
+v 0.00000000 0.60706200 0.79465447
+v 0.93417236 0.30353100 0.18759247
+v 0.57735027 -0.18759247 -0.79465447
+v -0.57735027 -0.18759247 -0.79465447
+v -0.57735027 0.79465447 -0.18759247
+v 0.00000000 0.98224695 0.18759247
+v 0.57735027 0.79465447 -0.18759247
+v 0.35682209 0.49112347 -0.79465447
+v -0.35682209 0.49112347 -0.79465447
+f 1 2 7 12 6
+f 1 6 11 10 5
+f 1 5 4 3 2
+f 2 3 8 13 7
+f 3 4 9 14 8
+f 4 5 10 15 9
+f 6 12 17 16 11
+f 7 13 18 17 12
+f 8 14 19 18 13
+f 9 15 20 19 14
+f 10 11 16 20 15
+f 16 17 18 19 20
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r05.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r05.obj
new file mode 100644
index 00000000..fd013dc2
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/r05.obj
@@ -0,0 +1,32 @@
+v -0.52573111 -0.72360680 0.44721360
+v -0.85065081 0.27639320 0.44721360
+v -0.00000000 0.89442719 0.44721360
+v 0.85065081 0.27639320 0.44721360
+v 0.52573111 -0.72360680 0.44721360
+v 0.00000000 -0.89442719 -0.44721360
+v -0.85065081 -0.27639320 -0.44721360
+v -0.52573111 0.72360680 -0.44721360
+v 0.52573111 0.72360680 -0.44721360
+v 0.85065081 -0.27639320 -0.44721360
+v 0.00000000 0.00000000 1.00000000
+v -0.00000000 0.00000000 -1.00000000
+f 1 2 7
+f 1 7 6
+f 1 6 5
+f 1 5 11
+f 1 11 2
+f 2 3 8
+f 2 8 7
+f 2 11 3
+f 3 4 9
+f 3 9 8
+f 3 11 4
+f 4 5 10
+f 4 10 9
+f 4 11 5
+f 5 6 10
+f 6 7 12
+f 6 12 10
+f 7 8 12
+f 8 9 12
+f 9 10 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s01.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s01.obj
new file mode 100644
index 00000000..f493d9c7
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s01.obj
@@ -0,0 +1,26 @@
+v -0.50000000 -0.86602540 -0.00000000
+v -1.00000000 0.00000000 -0.00000000
+v -0.50000000 0.86602540 -0.00000000
+v 0.50000000 0.86602540 -0.00000000
+v 1.00000000 0.00000000 -0.00000000
+v 0.50000000 -0.86602540 -0.00000000
+v -0.50000000 -0.28867513 -0.81649658
+v 0.00000000 0.57735027 -0.81649658
+v 0.50000000 -0.28867513 -0.81649658
+v 0.00000000 -0.57735027 0.81649658
+v 0.50000000 0.28867513 0.81649658
+v -0.50000000 0.28867513 0.81649658
+f 1 2 7
+f 1 7 9 6
+f 1 6 10
+f 1 10 12 2
+f 2 3 8 7
+f 2 12 3
+f 3 4 8
+f 3 12 11 4
+f 4 5 9 8
+f 4 11 5
+f 5 6 9
+f 5 11 10 6
+f 7 8 9
+f 10 11 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s02.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s02.obj
new file mode 100644
index 00000000..cc2dc6cb
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s02.obj
@@ -0,0 +1,62 @@
+v -0.30901699 -0.95105652 -0.00000000
+v -0.80901699 -0.58778525 -0.00000000
+v -1.00000000 0.00000000 -0.00000000
+v -0.80901699 0.58778525 -0.00000000
+v -0.30901700 0.95105652 -0.00000000
+v 0.30901699 0.95105652 -0.00000000
+v 0.80901699 0.58778525 -0.00000000
+v 1.00000000 0.00000000 -0.00000000
+v 0.80901699 -0.58778525 -0.00000000
+v 0.30901699 -0.95105652 -0.00000000
+v 0.00000000 -0.85065081 -0.52573111
+v -0.80901699 -0.26286556 -0.52573111
+v -0.50000000 0.68819096 -0.52573111
+v 0.50000000 0.68819096 -0.52573111
+v 0.80901699 -0.26286556 -0.52573111
+v -0.30901699 -0.42532540 -0.85065081
+v -0.50000000 0.16245985 -0.85065081
+v 0.00000000 0.52573111 -0.85065081
+v 0.50000000 0.16245985 -0.85065081
+v 0.30901699 -0.42532540 -0.85065081
+v -0.50000000 -0.68819096 0.52573111
+v 0.50000000 -0.68819096 0.52573111
+v 0.80901699 0.26286556 0.52573111
+v -0.00000000 0.85065081 0.52573111
+v -0.80901699 0.26286556 0.52573111
+v 0.00000000 -0.52573111 0.85065081
+v 0.50000000 -0.16245985 0.85065081
+v 0.30901699 0.42532540 0.85065081
+v -0.30901699 0.42532540 0.85065081
+v -0.50000000 -0.16245985 0.85065081
+f 1 2 12 16 11
+f 1 11 10
+f 1 10 22 26 21
+f 1 21 2
+f 2 3 12
+f 2 21 30 25 3
+f 3 4 13 17 12
+f 3 25 4
+f 4 5 13
+f 4 25 29 24 5
+f 5 6 14 18 13
+f 5 24 6
+f 6 7 14
+f 6 24 28 23 7
+f 7 8 15 19 14
+f 7 23 8
+f 8 9 15
+f 8 23 27 22 9
+f 9 10 11 20 15
+f 9 22 10
+f 11 16 20
+f 12 17 16
+f 13 18 17
+f 14 19 18
+f 15 20 19
+f 16 17 18 19 20
+f 21 26 30
+f 22 27 26
+f 23 28 27
+f 24 29 28
+f 25 30 29
+f 26 27 28 29 30
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s03.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s03.obj
new file mode 100644
index 00000000..0663c724
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s03.obj
@@ -0,0 +1,20 @@
+v -0.42640143 -0.73854895 0.52223297
+v -0.85280287 0.00000000 0.52223297
+v -0.42640143 0.73854895 0.52223297
+v 0.42640143 0.73854895 0.52223297
+v 0.85280287 -0.00000000 0.52223297
+v 0.42640143 -0.73854895 0.52223297
+v -0.85280287 -0.49236596 -0.17407766
+v 0.00000000 0.98473193 -0.17407766
+v 0.85280287 -0.49236596 -0.17407766
+v -0.42640143 -0.24618298 -0.87038828
+v 0.00000000 0.49236596 -0.87038828
+v 0.42640143 -0.24618298 -0.87038828
+f 1 2 7
+f 1 7 10 12 9 6
+f 1 6 5 4 3 2
+f 2 3 8 11 10 7
+f 3 4 8
+f 4 5 9 12 11 8
+f 5 6 9
+f 10 11 12
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s04.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s04.obj
new file mode 100644
index 00000000..58e0fa0c
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s04.obj
@@ -0,0 +1,38 @@
+v -0.31622777 -0.54772256 0.77459667
+v -0.63245553 0.00000000 0.77459667
+v -0.31622777 0.54772256 0.77459667
+v 0.31622777 0.54772256 0.77459667
+v 0.63245553 -0.00000000 0.77459667
+v 0.31622777 -0.54772256 0.77459667
+v -0.31622777 -0.91287093 0.25819889
+v -0.94868330 0.18257419 0.25819889
+v -0.63245553 0.73029674 0.25819889
+v 0.63245553 0.73029674 0.25819889
+v 0.94868330 0.18257419 0.25819889
+v 0.31622777 -0.91287093 0.25819889
+v -0.63245553 -0.73029674 -0.25819889
+v -0.94868330 -0.18257419 -0.25819889
+v -0.31622777 0.91287093 -0.25819889
+v 0.31622777 0.91287093 -0.25819889
+v 0.94868330 -0.18257419 -0.25819889
+v 0.63245553 -0.73029674 -0.25819889
+v -0.31622777 -0.54772256 -0.77459667
+v -0.63245553 0.00000000 -0.77459667
+v -0.31622777 0.54772256 -0.77459667
+v 0.31622777 0.54772256 -0.77459667
+v 0.63245553 -0.00000000 -0.77459667
+v 0.31622777 -0.54772256 -0.77459667
+f 1 7 12 6
+f 1 6 5 4 3 2
+f 1 2 8 14 13 7
+f 2 3 9 8
+f 3 4 10 16 15 9
+f 4 5 11 10
+f 5 6 12 18 17 11
+f 7 13 19 24 18 12
+f 8 9 15 21 20 14
+f 10 11 17 23 22 16
+f 13 14 20 19
+f 15 16 22 21
+f 17 18 24 23
+f 19 20 21 22 23 24
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s05.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s05.obj
new file mode 100644
index 00000000..a2ec5ff1
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s05.obj
@@ -0,0 +1,38 @@
+v -0.28108464 -0.67859834 0.67859834
+v -0.67859834 -0.28108464 0.67859834
+v -0.67859834 0.28108464 0.67859834
+v -0.28108464 0.67859834 0.67859834
+v 0.28108464 0.67859834 0.67859834
+v 0.67859834 0.28108464 0.67859834
+v 0.67859834 -0.28108464 0.67859834
+v 0.28108464 -0.67859834 0.67859834
+v 0.00000000 -0.95968298 0.28108464
+v -0.95968298 0.00000000 0.28108464
+v 0.00000000 0.95968298 0.28108464
+v 0.95968298 -0.00000000 0.28108464
+v -0.00000000 -0.95968298 -0.28108464
+v -0.95968298 0.00000000 -0.28108464
+v 0.00000000 0.95968298 -0.28108464
+v 0.95968298 -0.00000000 -0.28108464
+v -0.28108464 -0.67859834 -0.67859834
+v -0.67859834 -0.28108464 -0.67859834
+v -0.67859834 0.28108464 -0.67859834
+v -0.28108464 0.67859834 -0.67859834
+v 0.28108464 0.67859834 -0.67859834
+v 0.67859834 0.28108464 -0.67859834
+v 0.67859834 -0.28108464 -0.67859834
+v 0.28108464 -0.67859834 -0.67859834
+f 1 2 10 14 18 17 13 9
+f 1 9 8
+f 1 8 7 6 5 4 3 2
+f 2 3 10
+f 3 4 11 15 20 19 14 10
+f 4 5 11
+f 5 6 12 16 22 21 15 11
+f 6 7 12
+f 7 8 9 13 24 23 16 12
+f 13 17 24
+f 14 19 18
+f 15 21 20
+f 16 23 22
+f 17 18 19 20 21 22 23 24
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s06.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s06.obj
new file mode 100644
index 00000000..4167cae1
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s06.obj
@@ -0,0 +1,92 @@
+v -0.20177411 -0.27771823 0.93923362
+v -0.40354821 -0.55543646 0.72707577
+v -0.20177411 -0.83315470 0.51491792
+v 0.20177411 -0.83315470 0.51491792
+v 0.40354821 -0.55543646 0.72707577
+v 0.20177411 -0.27771823 0.93923362
+v -0.32647736 0.10607893 0.93923362
+v -0.65295472 0.21215785 0.72707577
+v -0.85472883 -0.06556038 0.51491792
+v -0.73002557 -0.44935754 0.51491792
+v -0.73002557 -0.66151539 0.17163931
+v -0.40354821 -0.89871508 0.17163931
+v -0.20177411 -0.96427546 -0.17163931
+v 0.20177411 -0.96427546 -0.17163931
+v 0.40354821 -0.89871508 0.17163931
+v 0.73002557 -0.66151539 0.17163931
+v 0.73002557 -0.44935754 0.51491792
+v 0.85472883 -0.06556038 0.51491792
+v 0.65295472 0.21215785 0.72707577
+v 0.32647736 0.10607893 0.93923362
+v -0.00000000 0.34327861 0.93923362
+v -0.65295472 0.55543646 0.51491792
+v -0.85472883 0.48987608 0.17163931
+v -0.97943209 0.10607893 0.17163931
+v -0.97943209 -0.10607892 -0.17163931
+v -0.85472883 -0.48987608 -0.17163931
+v -0.65295472 -0.55543646 -0.51491792
+v -0.32647736 -0.79263615 -0.51491792
+v -0.00000000 -0.68655723 -0.72707577
+v 0.32647736 -0.79263615 -0.51491792
+v 0.65295472 -0.55543646 -0.51491792
+v 0.85472883 -0.48987608 -0.17163931
+v 0.97943209 -0.10607893 -0.17163931
+v 0.97943209 0.10607893 0.17163931
+v 0.85472883 0.48987608 0.17163931
+v 0.65295472 0.55543646 0.51491792
+v 0.32647736 0.79263615 0.51491792
+v 0.00000000 0.68655723 0.72707577
+v -0.32647736 0.79263615 0.51491792
+v -0.73002557 0.66151539 -0.17163931
+v -0.73002557 0.44935754 -0.51491792
+v -0.85472883 0.06556038 -0.51491792
+v -0.65295472 -0.21215785 -0.72707577
+v -0.32647736 -0.10607892 -0.93923362
+v 0.00000000 -0.34327861 -0.93923362
+v 0.32647736 -0.10607892 -0.93923362
+v 0.65295472 -0.21215785 -0.72707577
+v 0.85472883 0.06556038 -0.51491792
+v 0.73002557 0.44935754 -0.51491792
+v 0.73002557 0.66151539 -0.17163931
+v 0.40354821 0.89871508 -0.17163931
+v 0.20177411 0.96427546 0.17163931
+v -0.20177411 0.96427546 0.17163931
+v -0.40354821 0.89871508 -0.17163931
+v -0.20177411 0.83315469 -0.51491792
+v -0.40354821 0.55543646 -0.72707577
+v -0.20177411 0.27771823 -0.93923362
+v 0.20177410 0.27771823 -0.93923362
+v 0.40354821 0.55543646 -0.72707577
+v 0.20177411 0.83315469 -0.51491792
+f 1 6 20 21 7
+f 1 7 8 9 10 2
+f 1 2 3 4 5 6
+f 2 10 11 12 3
+f 3 12 13 14 15 4
+f 4 15 16 17 5
+f 5 17 18 19 20 6
+f 7 21 38 39 22 8
+f 8 22 23 24 9
+f 9 24 25 26 11 10
+f 11 26 27 28 13 12
+f 13 28 29 30 14
+f 14 30 31 32 16 15
+f 16 32 33 34 18 17
+f 18 34 35 36 19
+f 19 36 37 38 21 20
+f 22 39 53 54 40 23
+f 23 40 41 42 25 24
+f 25 42 43 27 26
+f 27 43 44 45 29 28
+f 29 45 46 47 31 30
+f 31 47 48 33 32
+f 33 48 49 50 35 34
+f 35 50 51 52 37 36
+f 37 52 53 39 38
+f 40 54 55 56 41
+f 41 56 57 44 43 42
+f 44 57 58 46 45
+f 46 58 59 49 48 47
+f 49 59 60 51 50
+f 51 60 55 54 53 52
+f 55 60 59 58 57 56
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s07.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s07.obj
new file mode 100644
index 00000000..5820f529
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s07.obj
@@ -0,0 +1,92 @@
+v -0.16838141 -0.51822468 0.83850515
+v -0.44082824 -0.32028047 0.83850515
+v -0.54489368 0.00000000 0.83850515
+v -0.44082824 0.32028047 0.83850515
+v -0.16838141 0.51822468 0.83850515
+v 0.16838141 0.51822468 0.83850515
+v 0.44082824 0.32028047 0.83850515
+v 0.54489368 0.00000000 0.83850515
+v 0.44082824 -0.32028047 0.83850515
+v 0.16838141 -0.51822468 0.83850515
+v 0.00000000 -0.74998180 0.66145846
+v -0.00000000 -0.92702849 0.37499090
+v 0.16838141 -0.98173893 0.08852334
+v 0.44082824 -0.89321558 -0.08852334
+v 0.71327508 -0.69527137 -0.08852334
+v 0.88165649 -0.46351425 0.08852334
+v 0.88165649 -0.28646756 0.37499090
+v 0.71327508 -0.23175712 0.66145846
+v -0.16838141 -0.98173893 0.08852334
+v -0.44082824 -0.89321558 -0.08852334
+v -0.71327508 -0.69527137 -0.08852334
+v -0.88165649 -0.46351425 0.08852334
+v -0.88165649 -0.28646756 0.37499090
+v -0.71327508 -0.23175712 0.66145846
+v -0.98572192 -0.14323378 0.08852334
+v -0.98572192 0.14323378 -0.08852334
+v -0.88165649 0.46351425 -0.08852334
+v -0.71327508 0.69527137 0.08852334
+v -0.54489368 0.74998180 0.37499090
+v -0.44082824 0.60674802 0.66145846
+v -0.44082824 0.89321558 0.08852334
+v -0.16838141 0.98173893 -0.08852334
+v 0.16838141 0.98173893 -0.08852334
+v 0.44082824 0.89321558 0.08852334
+v 0.54489368 0.74998180 0.37499090
+v 0.44082824 0.60674802 0.66145846
+v 0.71327508 0.69527137 0.08852334
+v 0.88165649 0.46351425 -0.08852334
+v 0.98572192 0.14323378 -0.08852334
+v 0.98572192 -0.14323378 0.08852334
+v 0.54489368 -0.74998180 -0.37499090
+v 0.44082824 -0.60674802 -0.66145846
+v 0.16838141 -0.51822468 -0.83850515
+v -0.16838141 -0.51822468 -0.83850515
+v -0.44082824 -0.60674802 -0.66145846
+v -0.54489368 -0.74998180 -0.37499090
+v -0.44082824 -0.32028047 -0.83850515
+v -0.54489367 0.00000000 -0.83850515
+v -0.71327508 0.23175712 -0.66145846
+v -0.88165649 0.28646756 -0.37499090
+v -0.44082824 0.32028047 -0.83850515
+v -0.16838141 0.51822468 -0.83850515
+v 0.00000000 0.74998180 -0.66145846
+v 0.00000000 0.92702849 -0.37499090
+v 0.16838141 0.51822468 -0.83850515
+v 0.44082824 0.32028047 -0.83850515
+v 0.71327508 0.23175712 -0.66145846
+v 0.88165649 0.28646756 -0.37499090
+v 0.54489368 -0.00000000 -0.83850515
+v 0.44082824 -0.32028047 -0.83850515
+f 1 2 24 23 22 21 20 19 12 11
+f 1 11 10
+f 1 10 9 8 7 6 5 4 3 2
+f 2 3 24
+f 3 4 30 29 28 27 26 25 23 24
+f 4 5 30
+f 5 6 36 35 34 33 32 31 29 30
+f 6 7 36
+f 7 8 18 17 40 39 38 37 35 36
+f 8 9 18
+f 9 10 11 12 13 14 15 16 17 18
+f 12 19 13
+f 13 19 20 46 45 44 43 42 41 14
+f 14 41 15
+f 15 41 42 60 59 57 58 39 40 16
+f 16 40 17
+f 20 21 46
+f 21 22 25 26 50 49 48 47 45 46
+f 22 23 25
+f 26 27 50
+f 27 28 31 32 54 53 52 51 49 50
+f 28 29 31
+f 32 33 54
+f 33 34 37 38 58 57 56 55 53 54
+f 34 35 37
+f 38 39 58
+f 42 43 60
+f 43 44 47 48 51 52 55 56 59 60
+f 44 45 47
+f 48 49 51
+f 52 53 55
+f 56 57 59
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s08.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s08.obj
new file mode 100644
index 00000000..8441f42c
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s08.obj
@@ -0,0 +1,50 @@
+v -0.35740674 -0.86285621 0.35740674
+v -0.86285621 -0.35740674 0.35740674
+v -0.86285621 0.35740674 0.35740674
+v -0.35740674 0.86285621 0.35740674
+v 0.35740674 0.86285621 0.35740674
+v 0.86285621 0.35740674 0.35740674
+v 0.86285621 -0.35740674 0.35740674
+v 0.35740674 -0.86285621 0.35740674
+v -0.35740674 -0.86285621 -0.35740674
+v -0.86285621 -0.35740674 -0.35740674
+v -0.86285621 0.35740674 -0.35740674
+v -0.35740674 0.86285621 -0.35740674
+v 0.35740674 0.86285621 -0.35740674
+v 0.86285621 0.35740674 -0.35740674
+v 0.86285621 -0.35740674 -0.35740674
+v 0.35740674 -0.86285621 -0.35740674
+v -0.35740674 -0.35740674 0.86285621
+v 0.35740674 -0.35740674 0.86285621
+v 0.35740674 0.35740674 0.86285621
+v -0.35740674 0.35740674 0.86285621
+v -0.35740674 -0.35740674 -0.86285621
+v -0.35740674 0.35740674 -0.86285621
+v 0.35740674 0.35740674 -0.86285621
+v 0.35740674 -0.35740674 -0.86285621
+f 1 2 10 9
+f 1 9 16 8
+f 1 8 18 17
+f 1 17 2
+f 2 3 11 10
+f 2 17 20 3
+f 3 4 12 11
+f 3 20 4
+f 4 5 13 12
+f 4 20 19 5
+f 5 6 14 13
+f 5 19 6
+f 6 7 15 14
+f 6 19 18 7
+f 7 8 16 15
+f 7 18 8
+f 9 10 21
+f 9 21 24 16
+f 10 11 22 21
+f 11 12 22
+f 12 13 23 22
+f 13 14 23
+f 14 15 24 23
+f 15 16 24
+f 17 18 19 20
+f 21 22 23 24
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s09.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s09.obj
new file mode 100644
index 00000000..40f8fdd8
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s09.obj
@@ -0,0 +1,122 @@
+v -0.22391898 -0.68915176 0.68915176
+v -0.58622750 -0.42591921 0.68915176
+v -0.72461704 -0.00000000 0.68915176
+v -0.58622750 0.42591921 0.68915176
+v -0.22391898 0.68915176 0.68915176
+v 0.22391898 0.68915176 0.68915176
+v 0.58622750 0.42591921 0.68915176
+v 0.72461704 -0.00000000 0.68915176
+v 0.58622750 -0.42591921 0.68915176
+v 0.22391898 -0.68915176 0.68915176
+v -0.22391898 -0.92459411 0.30819804
+v -0.81014648 -0.49867490 0.30819804
+v -0.94853602 -0.07275569 0.30819804
+v -0.72461704 0.61639607 0.30819804
+v -0.36230852 0.87962862 0.30819804
+v 0.36230852 0.87962862 0.30819804
+v 0.72461704 0.61639607 0.30819804
+v 0.94853602 -0.07275569 0.30819804
+v 0.81014648 -0.49867490 0.30819804
+v 0.22391898 -0.92459411 0.30819804
+v 0.00000000 -0.99734979 -0.07275569
+v -0.58622750 -0.80687293 0.07275569
+v -0.94853602 0.30819804 0.07275569
+v 0.00000000 0.99734979 0.07275569
+v 0.94853602 0.30819803 0.07275569
+v 0.58622750 -0.80687293 0.07275569
+v -0.36230852 -0.87962862 -0.30819804
+v -0.22391898 -0.68915176 -0.68915176
+v -0.22391898 -0.30819804 -0.92459411
+v -0.36230852 0.11772117 -0.92459411
+v -0.58622750 0.42591921 -0.68915176
+v -0.81014648 0.49867490 -0.30819804
+v 0.36230852 -0.87962862 -0.30819804
+v 0.22391898 -0.68915176 -0.68915176
+v 0.22391898 -0.30819803 -0.92459411
+v 0.36230852 0.11772117 -0.92459411
+v 0.58622750 0.42591921 -0.68915176
+v 0.81014648 0.49867490 -0.30819804
+v -0.00000000 0.38095372 -0.92459410
+v -0.22391898 0.68915176 -0.68915176
+v 0.22391898 0.68915176 -0.68915176
+v -0.22391898 0.92459411 -0.30819804
+v 0.22391898 0.92459411 -0.30819804
+v 0.58622750 0.80687293 -0.07275569
+v -0.58622750 0.80687293 -0.07275569
+v 0.00000000 -0.38095372 0.92459411
+v 0.36230852 -0.11772117 0.92459411
+v 0.22391898 0.30819804 0.92459411
+v -0.22391898 0.30819804 0.92459411
+v -0.36230852 -0.11772117 0.92459411
+v -0.94853602 -0.30819804 -0.07275569
+v -0.94853602 0.07275569 -0.30819804
+v -0.72461704 -0.00000000 -0.68915176
+v -0.58622750 -0.42591921 -0.68915176
+v -0.72461704 -0.61639607 -0.30819804
+v 0.94853602 -0.30819804 -0.07275569
+v 0.72461704 -0.61639607 -0.30819804
+v 0.58622750 -0.42591921 -0.68915176
+v 0.72461704 0.00000000 -0.68915176
+v 0.94853602 0.07275569 -0.30819804
+f 1 2 12 22 11
+f 1 11 20 10
+f 1 10 46
+f 1 46 50 2
+f 2 3 13 12
+f 2 50 3
+f 3 4 14 23 13
+f 3 50 49 4
+f 4 5 15 14
+f 4 49 5
+f 5 6 16 24 15
+f 5 49 48 6
+f 6 7 17 16
+f 6 48 7
+f 7 8 18 25 17
+f 7 48 47 8
+f 8 9 19 18
+f 8 47 9
+f 9 10 20 26 19
+f 9 47 46 10
+f 11 22 27 21
+f 11 21 20
+f 12 13 51
+f 12 51 55 22
+f 13 23 52 51
+f 14 15 45
+f 14 45 32 23
+f 15 24 42 45
+f 16 17 44
+f 16 44 43 24
+f 17 25 38 44
+f 18 19 56
+f 18 56 60 25
+f 19 26 57 56
+f 20 21 33 26
+f 21 27 28 34 33
+f 22 55 27
+f 23 32 52
+f 24 43 42
+f 25 60 38
+f 26 33 57
+f 27 55 54 28
+f 28 29 35 34
+f 28 54 29
+f 29 30 39 36 35
+f 29 54 53 30
+f 30 31 40 39
+f 30 53 31
+f 31 32 45 42 40
+f 31 53 52 32
+f 33 34 58 57
+f 34 35 58
+f 35 36 59 58
+f 36 39 41 37
+f 36 37 59
+f 37 41 43 44 38
+f 37 38 60 59
+f 39 40 41
+f 40 42 43 41
+f 46 47 48 49 50
+f 51 52 53 54 55
+f 56 57 58 59 60
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s10.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s10.obj
new file mode 100644
index 00000000..c9027972
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s10.obj
@@ -0,0 +1,74 @@
+v -0.21573941 -0.52084100 0.82594259
+v -0.52084100 -0.21573941 0.82594259
+v -0.52084100 0.21573941 0.82594259
+v -0.21573941 0.52084100 0.82594259
+v 0.21573941 0.52084100 0.82594259
+v 0.52084100 0.21573941 0.82594259
+v 0.52084100 -0.21573941 0.82594259
+v 0.21573941 -0.52084100 0.82594259
+v -0.21573941 -0.82594259 0.52084100
+v -0.82594259 -0.21573941 0.52084100
+v -0.82594259 0.21573941 0.52084100
+v -0.21573941 0.82594259 0.52084100
+v 0.21573941 0.82594259 0.52084100
+v 0.82594259 0.21573941 0.52084100
+v 0.82594259 -0.21573941 0.52084100
+v 0.21573941 -0.82594259 0.52084100
+v -0.52084100 -0.82594259 0.21573941
+v -0.82594259 -0.52084100 0.21573941
+v -0.82594259 0.52084100 0.21573941
+v -0.52084100 0.82594259 0.21573941
+v 0.52084100 0.82594259 0.21573941
+v 0.82594259 0.52084100 0.21573941
+v 0.82594259 -0.52084100 0.21573941
+v 0.52084100 -0.82594259 0.21573941
+v 0.52084100 -0.82594259 -0.21573941
+v 0.21573940 -0.82594259 -0.52084100
+v -0.21573941 -0.82594259 -0.52084100
+v -0.52084100 -0.82594259 -0.21573941
+v -0.82594259 -0.52084100 -0.21573941
+v -0.82594259 -0.21573941 -0.52084100
+v -0.82594259 0.21573941 -0.52084100
+v -0.82594259 0.52084100 -0.21573941
+v -0.52084100 0.82594259 -0.21573941
+v -0.21573941 0.82594259 -0.52084100
+v 0.21573941 0.82594259 -0.52084100
+v 0.52084100 0.82594259 -0.21573941
+v 0.82594259 0.52084100 -0.21573941
+v 0.82594259 0.21573941 -0.52084100
+v 0.82594259 -0.21573941 -0.52084100
+v 0.82594259 -0.52084100 -0.21573941
+v 0.52084100 -0.21573941 -0.82594259
+v 0.52084100 0.21573941 -0.82594259
+v 0.21573941 0.52084100 -0.82594259
+v -0.21573941 0.52084100 -0.82594259
+v -0.52084100 0.21573941 -0.82594259
+v -0.52084100 -0.21573941 -0.82594259
+v -0.21573941 -0.52084100 -0.82594259
+v 0.21573940 -0.52084100 -0.82594259
+f 1 2 10 18 17 9
+f 1 9 16 8
+f 1 8 7 6 5 4 3 2
+f 2 3 11 10
+f 3 4 12 20 19 11
+f 4 5 13 12
+f 5 6 14 22 21 13
+f 6 7 15 14
+f 7 8 16 24 23 15
+f 9 17 28 27 26 25 24 16
+f 10 11 19 32 31 30 29 18
+f 12 13 21 36 35 34 33 20
+f 14 15 23 40 39 38 37 22
+f 17 18 29 28
+f 19 20 33 32
+f 21 22 37 36
+f 23 24 25 40
+f 25 26 48 41 39 40
+f 26 27 47 48
+f 27 28 29 30 46 47
+f 30 31 45 46
+f 31 32 33 34 44 45
+f 34 35 43 44
+f 35 36 37 38 42 43
+f 38 39 41 42
+f 41 48 47 46 45 44 43 42
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s11.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s11.obj
new file mode 100644
index 00000000..496cd08e
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s11.obj
@@ -0,0 +1,182 @@
+v -0.13149606 -0.40470333 0.90494412
+v -0.34426119 -0.25012042 0.90494412
+v -0.42553024 -0.00000001 0.90494412
+v -0.34426119 0.25012040 0.90494412
+v -0.13149606 0.40470332 0.90494412
+v 0.13149611 0.40470332 0.90494412
+v 0.34426124 0.25012040 0.90494412
+v 0.42553028 -0.00000001 0.90494412
+v 0.34426124 -0.25012042 0.90494412
+v 0.13149611 -0.40470333 0.90494412
+v -0.13149606 -0.62841783 0.76668096
+v -0.34426119 -0.69754941 0.62841780
+v -0.42553024 -0.80940666 0.40470330
+v -0.34426119 -0.92126391 0.18098881
+v -0.13149606 -0.99039549 0.04272564
+v 0.13149611 -0.99039549 0.04272564
+v 0.34426124 -0.92126391 0.18098881
+v 0.42553028 -0.80940666 0.40470330
+v 0.34426124 -0.69754941 0.62841780
+v 0.13149611 -0.62841783 0.76668096
+v -0.55702632 -0.54296650 0.62841780
+v -0.55702632 -0.31925200 0.76668096
+v -0.63829537 -0.06913159 0.76668096
+v -0.76979145 0.11185724 0.62841780
+v -0.90128753 0.15458291 0.40470330
+v -0.98255658 0.04272566 0.18098880
+v -0.98255658 -0.18098884 0.04272564
+v -0.90128753 -0.43110925 0.04272564
+v -0.76979145 -0.61209808 0.18098881
+v -0.63829537 -0.65482375 0.40470330
+v -0.82001848 0.54296648 0.18098881
+v -0.82001848 0.40470332 0.40470330
+v -0.68852240 0.36197765 0.62841780
+v -0.47575727 0.43110923 0.76668096
+v -0.26299214 0.58569215 0.76668096
+v -0.13149606 0.76668098 0.62841780
+v -0.13149606 0.90494414 0.40470330
+v -0.26299214 0.94766981 0.18098881
+v -0.47575727 0.87853823 0.04272564
+v -0.68852240 0.72395531 0.04272564
+v 0.47575732 0.87853821 0.04272564
+v 0.26299219 0.94766979 0.18098880
+v 0.13149611 0.90494413 0.40470330
+v 0.13149611 0.76668098 0.62841780
+v 0.26299219 0.58569215 0.76668096
+v 0.47575732 0.43110923 0.76668096
+v 0.68852245 0.36197765 0.62841780
+v 0.82001853 0.40470330 0.40470331
+v 0.82001853 0.54296646 0.18098881
+v 0.68852245 0.72395529 0.04272564
+v 0.63829541 -0.65482375 0.40470330
+v 0.76979150 -0.61209808 0.18098881
+v 0.90128758 -0.43110925 0.04272564
+v 0.98255663 -0.18098884 0.04272564
+v 0.98255647 0.04272561 0.18098879
+v 0.90128750 0.15458288 0.40470331
+v 0.76979150 0.11185724 0.62841780
+v 0.63829541 -0.06913159 0.76668096
+v 0.55702637 -0.31925200 0.76668096
+v 0.55702637 -0.54296650 0.62841780
+v -0.47575727 -0.87853824 -0.04272569
+v -0.68852240 -0.72395533 -0.04272569
+v -0.82001848 -0.54296650 -0.18098886
+v -0.82001848 -0.40470333 -0.40470335
+v -0.68852240 -0.36197767 -0.62841785
+v -0.47575727 -0.43110925 -0.76668101
+v -0.26299214 -0.58569216 -0.76668101
+v -0.13149605 -0.76668099 -0.62841784
+v -0.13149606 -0.90494416 -0.40470335
+v -0.26299214 -0.94766982 -0.18098885
+v -0.90128753 -0.15458292 -0.40470335
+v -0.98255658 -0.04272567 -0.18098885
+v -0.98255658 0.18098882 -0.04272569
+v -0.90128753 0.43110923 -0.04272569
+v -0.76979145 0.61209806 -0.18098885
+v -0.63829536 0.65482373 -0.40470335
+v -0.55702632 0.54296648 -0.62841785
+v -0.55702632 0.31925199 -0.76668101
+v -0.63829537 0.06913157 -0.76668101
+v -0.76979145 -0.11185726 -0.62841785
+v -0.13149606 0.62841781 -0.76668101
+v -0.34426119 0.69754940 -0.62841785
+v -0.42553023 0.80940665 -0.40470335
+v -0.34426119 0.92126389 -0.18098885
+v -0.13149606 0.99039547 -0.04272569
+v 0.13149611 0.99039546 -0.04272569
+v 0.34426124 0.92126387 -0.18098886
+v 0.42553028 0.80940661 -0.40470335
+v 0.34426124 0.69754939 -0.62841785
+v 0.13149611 0.62841781 -0.76668101
+v 0.76979153 -0.11185725 -0.62841782
+v 0.63829541 0.06913155 -0.76668097
+v 0.55702634 0.31925197 -0.76668097
+v 0.55702635 0.54296649 -0.62841782
+v 0.63829541 0.65482370 -0.40470335
+v 0.76979149 0.61209803 -0.18098885
+v 0.90128750 0.43110919 -0.04272571
+v 0.98255648 0.18098877 -0.04272572
+v 0.98255640 -0.04272561 -0.18098874
+v 0.90128711 -0.15458281 -0.40470320
+v 0.26299219 -0.94766982 -0.18098885
+v 0.13149611 -0.90494416 -0.40470335
+v 0.13149611 -0.76668098 -0.62841784
+v 0.26299219 -0.58569215 -0.76668099
+v 0.47575682 -0.43110886 -0.76668009
+v 0.68852237 -0.36197738 -0.62841730
+v 0.82001805 -0.40470325 -0.40470322
+v 0.82001853 -0.54296650 -0.18098885
+v 0.68852245 -0.72395533 -0.04272569
+v 0.47575732 -0.87853824 -0.04272569
+v -0.13149606 -0.40470333 -0.90494417
+v -0.34426119 -0.25012042 -0.90494417
+v -0.42553024 -0.00000000 -0.90494417
+v -0.34426119 0.25012040 -0.90494417
+v -0.13149606 0.40470332 -0.90494417
+v 0.13149611 0.40470332 -0.90494417
+v 0.34426120 0.25012038 -0.90494414
+v 0.42553027 -0.00000003 -0.90494414
+v 0.34426060 -0.25012001 -0.90494332
+v 0.13149611 -0.40470332 -0.90494416
+f 1 2 22 21 12 11
+f 1 11 20 10
+f 1 10 9 8 7 6 5 4 3 2
+f 2 3 23 22
+f 3 4 34 33 24 23
+f 4 5 35 34
+f 5 6 45 44 36 35
+f 6 7 46 45
+f 7 8 58 57 47 46
+f 8 9 59 58
+f 9 10 20 19 60 59
+f 11 12 13 14 15 16 17 18 19 20
+f 12 21 30 13
+f 13 30 29 62 61 14
+f 14 61 70 15
+f 15 70 69 102 101 16
+f 16 101 110 17
+f 17 110 109 52 51 18
+f 18 51 60 19
+f 21 22 23 24 25 26 27 28 29 30
+f 24 33 32 25
+f 25 32 31 74 73 26
+f 26 73 72 27
+f 27 72 71 64 63 28
+f 28 63 62 29
+f 31 32 33 34 35 36 37 38 39 40
+f 31 40 75 74
+f 36 44 43 37
+f 37 43 42 86 85 38
+f 38 85 84 39
+f 39 84 83 76 75 40
+f 41 42 43 44 45 46 47 48 49 50
+f 41 50 96 95 88 87
+f 41 87 86 42
+f 47 57 56 48
+f 48 56 55 98 97 49
+f 49 97 96 50
+f 51 52 53 54 55 56 57 58 59 60
+f 52 109 108 53
+f 53 108 107 100 99 54
+f 54 99 98 55
+f 61 62 63 64 65 66 67 68 69 70
+f 64 71 80 65
+f 65 80 79 113 112 66
+f 66 112 111 67
+f 67 111 120 104 103 68
+f 68 103 102 69
+f 71 72 73 74 75 76 77 78 79 80
+f 76 83 82 77
+f 77 82 81 115 114 78
+f 78 114 113 79
+f 81 82 83 84 85 86 87 88 89 90
+f 81 90 116 115
+f 88 95 94 89
+f 89 94 93 117 116 90
+f 91 92 93 94 95 96 97 98 99 100
+f 91 100 107 106
+f 91 106 105 119 118 92
+f 92 118 117 93
+f 101 102 103 104 105 106 107 108 109 110
+f 104 120 119 105
+f 111 112 113 114 115 116 117 118 119 120
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s12L.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s12L.obj
new file mode 100644
index 00000000..aaee84e5
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s12L.obj
@@ -0,0 +1,62 @@
+v -0.37210275 -0.37210283 0.85033943
+v -0.37210275 0.37210284 0.85033943
+v 0.37210291 0.37210284 0.85033943
+v 0.37210291 -0.37210283 0.85033943
+v -0.68440375 -0.68440382 0.25135842
+v -0.88671195 0.00000000 0.46232019
+v -0.68440375 0.68440383 0.25135842
+v 0.00000008 0.88671203 0.46232019
+v 0.68440391 0.68440383 0.25135842
+v 0.88671211 0.00000000 0.46232019
+v 0.68440391 -0.68440382 0.25135842
+v 0.00000008 -0.88671202 0.46232019
+v -0.74420553 -0.48209560 -0.46232023
+v -0.94651373 0.20230822 -0.25135846
+v -0.48209559 0.74420581 -0.46232023
+v 0.20230824 0.94651401 -0.25135846
+v 0.74420550 0.48209553 -0.46232032
+v 0.94651368 -0.20230824 -0.25135852
+v 0.48209586 -0.74420614 -0.46232018
+v -0.20230823 -0.94651406 -0.25135841
+v -0.51460872 0.10999275 -0.85033925
+v 0.10999269 0.51461005 -0.85033999
+v 0.51460748 -0.10999294 -0.85033865
+v -0.10999264 -0.51460945 -0.85033947
+f 1 2 6
+f 1 6 5
+f 1 5 12
+f 1 12 4
+f 1 4 3 2
+f 2 3 8
+f 2 8 7
+f 2 7 6
+f 3 4 10
+f 3 10 9
+f 3 9 8
+f 4 12 11
+f 4 11 10
+f 5 6 14 13
+f 5 13 20
+f 5 20 12
+f 6 7 14
+f 7 8 16 15
+f 7 15 14
+f 8 9 16
+f 9 17 16
+f 9 10 18 17
+f 10 11 18
+f 11 12 20 19
+f 11 19 18
+f 13 14 21
+f 13 21 24
+f 13 24 20
+f 14 15 21
+f 15 16 22
+f 15 22 21
+f 16 17 22
+f 17 23 22
+f 17 18 23
+f 18 19 23
+f 19 20 24
+f 19 24 23
+f 21 22 23 24
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s12R.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s12R.obj
new file mode 100644
index 00000000..8cdb06b6
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s12R.obj
@@ -0,0 +1,62 @@
+v -0.37210283 -0.37210275 0.85033943
+v 0.37210284 -0.37210275 0.85033943
+v 0.37210284 0.37210291 0.85033943
+v -0.37210283 0.37210291 0.85033943
+v -0.68440382 -0.68440374 0.25135842
+v 0.00000000 -0.88671194 0.46232019
+v 0.68440383 -0.68440374 0.25135842
+v 0.88671203 0.00000008 0.46232019
+v 0.68440383 0.68440391 0.25135842
+v 0.00000001 0.88671211 0.46232019
+v -0.68440382 0.68440391 0.25135842
+v -0.88671202 0.00000008 0.46232019
+v -0.48209560 -0.74420553 -0.46232022
+v 0.20230822 -0.94651373 -0.25135846
+v 0.74420581 -0.48209559 -0.46232022
+v 0.94651401 0.20230824 -0.25135846
+v 0.48209553 0.74420550 -0.46232032
+v -0.20230824 0.94651368 -0.25135852
+v -0.74420614 0.48209586 -0.46232018
+v -0.94651406 -0.20230823 -0.25135841
+v 0.10999275 -0.51460872 -0.85033925
+v 0.51461005 0.10999269 -0.85033999
+v -0.10999294 0.51460747 -0.85033864
+v -0.51460944 -0.10999264 -0.85033947
+f 1 4 12
+f 1 12 5
+f 1 5 6
+f 1 6 2
+f 1 2 3 4
+f 2 6 7
+f 2 7 8
+f 2 8 3
+f 3 8 9
+f 3 9 10
+f 3 10 4
+f 4 10 11
+f 4 11 12
+f 5 12 20
+f 5 20 13
+f 5 13 14 6
+f 6 14 7
+f 7 14 15
+f 7 15 16 8
+f 8 16 9
+f 9 16 17
+f 9 17 18 10
+f 10 18 11
+f 11 18 19
+f 11 19 20 12
+f 13 20 24
+f 13 24 21
+f 13 21 14
+f 14 21 15
+f 15 21 22
+f 15 22 16
+f 16 22 17
+f 17 22 23
+f 17 23 18
+f 18 23 19
+f 19 23 24
+f 19 24 20
+f 21 24 23 22
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s13L.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s13L.obj
new file mode 100644
index 00000000..fe10910d
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s13L.obj
@@ -0,0 +1,152 @@
+v -0.23192831 -0.31922195 0.91886098
+v -0.37526789 0.12193192 0.91886098
+v 0.00000001 0.39458001 0.91886098
+v 0.37526790 0.12193192 0.91886098
+v 0.23192832 -0.31922195 0.91886098
+v -0.64379514 -0.20918173 0.73605007
+v -0.72920227 0.23693218 0.64197045
+v -0.39788728 0.54764486 0.73605007
+v 0.00000001 0.76672864 0.64197045
+v 0.39788729 0.54764486 0.73605007
+v 0.72920229 0.23693218 0.64197045
+v 0.64379516 -0.20918173 0.73605007
+v 0.45067180 -0.62029652 0.64197045
+v 0.00000001 -0.67692629 0.73605007
+v -0.45067179 -0.62029652 0.64197045
+v -0.80031956 -0.46310151 0.38082081
+v -0.68774804 0.61804289 0.38082081
+v 0.37526790 0.84507302 0.38082081
+v 0.91967637 -0.09575906 0.38082081
+v 0.19312336 -0.90425538 0.38082081
+v -0.53607892 -0.81262648 0.22859680
+v -0.80975412 -0.58290795 -0.06719747
+v -0.98246410 -0.17391866 0.06719745
+v -0.93851120 0.25872595 0.22859680
+v -0.80460617 0.58999346 -0.06719747
+v -0.46900456 0.88063506 0.06719744
+v -0.04395289 0.97252791 0.22859680
+v 0.31248017 0.94754396 -0.06719747
+v 0.69260335 0.71818105 0.06719745
+v 0.91134683 0.34232934 0.22859680
+v 0.99772955 -0.00437911 -0.06719747
+v 0.89705698 -0.43677477 0.06719744
+v 0.60719621 -0.76095675 0.22859680
+v 0.30415062 -0.95025041 -0.06719747
+v -0.13819163 -0.98812271 0.06719745
+v -0.46900456 -0.85309854 -0.22859683
+v -0.89001331 -0.25070046 -0.38082083
+v -0.95627530 0.18242790 -0.22859683
+v -0.51345952 0.76898225 -0.38082083
+v -0.12200607 0.96584518 -0.22859683
+v 0.57267787 0.72595761 -0.38082083
+v 0.88087142 0.41449724 -0.22859683
+v 0.86739393 -0.32031578 -0.38082083
+v 0.66641454 -0.70967180 -0.22859683
+v -0.03659893 -0.92392370 -0.38082084
+v -0.33866894 -0.68787802 -0.64197048
+v -0.59886666 -0.31557553 -0.73605009
+v -0.75886533 0.10952730 -0.64197048
+v -0.48519013 0.47203783 -0.73605009
+v -0.13033561 0.75556961 -0.64197047
+v 0.29900267 0.60731094 -0.73605008
+v 0.67831351 0.35744039 -0.64197048
+v 0.66998396 -0.09669904 -0.73605009
+v 0.54955640 -0.53465933 -0.64197049
+v 0.11507018 -0.66707429 -0.73605010
+v -0.17428848 -0.35400123 -0.91886092
+v -0.39053340 0.05636580 -0.91886108
+v -0.06707427 0.38883710 -0.91886080
+v 0.34907940 0.18394910 -0.91886141
+v 0.28281632 -0.27515023 -0.91886006
+f 1 2 6
+f 1 6 15
+f 1 15 14
+f 1 14 5
+f 1 5 4 3 2
+f 2 3 8
+f 2 8 7
+f 2 7 6
+f 3 4 10
+f 3 10 9
+f 3 9 8
+f 4 5 12
+f 4 12 11
+f 4 11 10
+f 5 14 13
+f 5 13 12
+f 6 7 24 23 16
+f 6 16 15
+f 7 8 17
+f 7 17 24
+f 8 9 27 26 17
+f 9 10 18
+f 9 18 27
+f 10 11 30 29 18
+f 11 12 19
+f 11 19 30
+f 12 13 33 32 19
+f 13 14 20
+f 13 20 33
+f 14 15 21 35 20
+f 15 16 21
+f 16 23 22
+f 16 22 21
+f 17 26 25
+f 17 25 24
+f 18 29 28
+f 18 28 27
+f 19 32 31
+f 19 31 30
+f 20 35 34
+f 20 34 33
+f 21 22 36
+f 21 36 35
+f 22 23 37
+f 22 37 47 46 36
+f 23 24 38
+f 23 38 37
+f 24 25 38
+f 25 26 39
+f 25 39 49 48 38
+f 26 27 40
+f 26 40 39
+f 27 28 40
+f 28 29 41
+f 28 41 51 50 40
+f 29 30 42
+f 29 42 41
+f 30 31 42
+f 31 43 53 52 42
+f 31 32 43
+f 32 44 43
+f 32 33 44
+f 33 34 44
+f 34 35 45
+f 34 45 55 54 44
+f 35 36 45
+f 36 46 45
+f 37 38 48
+f 37 48 47
+f 39 40 50
+f 39 50 49
+f 41 42 52
+f 41 52 51
+f 43 44 54
+f 43 54 53
+f 45 46 55
+f 46 47 56
+f 46 56 55
+f 47 48 57
+f 47 57 56
+f 48 49 57
+f 49 50 58
+f 49 58 57
+f 50 51 58
+f 51 59 58
+f 51 52 59
+f 52 53 59
+f 53 54 60
+f 53 60 59
+f 54 55 60
+f 55 56 60
+f 56 57 58 59 60
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s13R.obj b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s13R.obj
new file mode 100644
index 00000000..fa9be1b3
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/s13R.obj
@@ -0,0 +1,152 @@
+v -0.23192837 -0.31922203 0.91886124
+v 0.23192838 -0.31922203 0.91886124
+v 0.37526800 0.12193196 0.91886124
+v 0.00000000 0.39458012 0.91886124
+v -0.37526799 0.12193196 0.91886124
+v 0.00000000 -0.67692647 0.73605027
+v 0.45067192 -0.62029668 0.64197064
+v 0.64379533 -0.20918178 0.73605027
+v 0.72920248 0.23693225 0.64197064
+v 0.39788740 0.54764501 0.73605027
+v 0.00000000 0.76672886 0.64197064
+v -0.39788739 0.54764501 0.73605027
+v -0.72920248 0.23693225 0.64197064
+v -0.64379532 -0.20918178 0.73605027
+v -0.45067191 -0.62029668 0.64197064
+v -0.19312341 -0.90425562 0.38082092
+v 0.80031978 -0.46310163 0.38082092
+v 0.68774824 0.61804307 0.38082092
+v -0.37526799 0.84507325 0.38082092
+v -0.91967661 -0.09575908 0.38082092
+v -0.60719637 -0.76095695 0.22859687
+v -0.30415069 -0.95025066 -0.06719748
+v 0.13819168 -0.98812298 0.06719747
+v 0.53607907 -0.81262670 0.22859687
+v 0.80975434 -0.58290810 -0.06719748
+v 0.98246437 -0.17391870 0.06719747
+v 0.93851146 0.25872603 0.22859687
+v 0.80460641 0.58999364 -0.06719748
+v 0.46900470 0.88063531 0.06719747
+v 0.04395291 0.97252818 0.22859687
+v -0.31248024 0.94754422 -0.06719748
+v -0.69260352 0.71818125 0.06719747
+v -0.91134706 0.34232943 0.22859687
+v -0.99772981 -0.00437910 -0.06719748
+v -0.89705721 -0.43677489 0.06719747
+v -0.66641472 -0.70967199 -0.22859688
+v 0.03659896 -0.92392391 -0.38082093
+v 0.46900470 -0.85309878 -0.22859688
+v 0.89001354 -0.25070051 -0.38082093
+v 0.95627558 0.18242795 -0.22859688
+v 0.51345966 0.76898245 -0.38082093
+v 0.12200611 0.96584547 -0.22859688
+v -0.57267800 0.72595780 -0.38082093
+v -0.88087165 0.41449736 -0.22859688
+v -0.86739415 -0.32031586 -0.38082093
+v -0.54955655 -0.53465945 -0.64197064
+v -0.11507021 -0.66707442 -0.73605028
+v 0.33866904 -0.68787822 -0.64197064
+v 0.59886681 -0.31557561 -0.73605027
+v 0.75886555 0.10952733 -0.64197063
+v 0.48519026 0.47203794 -0.73605027
+v 0.13033567 0.75556984 -0.64197064
+v -0.29900272 0.60731111 -0.73605027
+v -0.67831368 0.35744049 -0.64197064
+v -0.66998413 -0.09669906 -0.73605027
+v -0.28281717 -0.27515070 -0.91886123
+v 0.17428857 -0.35400135 -0.91886120
+v 0.39053348 0.05636583 -0.91886122
+v 0.06707433 0.38883729 -0.91886104
+v -0.34907938 0.18394906 -0.91886143
+f 1 5 14
+f 1 14 15
+f 1 15 6
+f 1 6 2
+f 1 2 3 4 5
+f 2 6 7
+f 2 7 8
+f 2 8 3
+f 3 8 9
+f 3 9 10
+f 3 10 4
+f 4 10 11
+f 4 11 12
+f 4 12 5
+f 5 12 13
+f 5 13 14
+f 6 15 16
+f 6 16 23 24 7
+f 7 24 17
+f 7 17 8
+f 8 17 26 27 9
+f 9 27 18
+f 9 18 10
+f 10 18 29 30 11
+f 11 30 19
+f 11 19 12
+f 12 19 32 33 13
+f 13 33 20
+f 13 20 14
+f 14 20 35 21 15
+f 15 21 16
+f 16 21 22
+f 16 22 23
+f 17 24 25
+f 17 25 26
+f 18 27 28
+f 18 28 29
+f 19 30 31
+f 19 31 32
+f 20 33 34
+f 20 34 35
+f 21 35 36
+f 21 36 22
+f 22 36 46 47 37
+f 22 37 23
+f 23 37 38
+f 23 38 24
+f 24 38 25
+f 25 38 48 49 39
+f 25 39 26
+f 26 39 40
+f 26 40 27
+f 27 40 28
+f 28 41 29
+f 28 40 50 51 41
+f 29 42 30
+f 29 41 42
+f 30 42 31
+f 31 42 52 53 43
+f 31 43 32
+f 32 43 44
+f 32 44 33
+f 33 44 34
+f 34 44 54 55 45
+f 34 45 35
+f 35 45 36
+f 36 45 46
+f 37 47 48
+f 37 48 38
+f 39 49 50
+f 39 50 40
+f 41 52 42
+f 41 51 52
+f 43 53 54
+f 43 54 44
+f 45 55 46
+f 46 56 47
+f 46 55 56
+f 47 56 57
+f 47 57 48
+f 48 57 49
+f 49 58 50
+f 49 57 58
+f 50 58 51
+f 51 58 59
+f 51 59 52
+f 52 59 53
+f 53 59 60
+f 53 60 54
+f 54 60 55
+f 55 60 56
+f 56 60 59 58 57
diff --git a/texmf-dist/scripts/ketpic/data/polyhedrons_obj/整面凸多面体データ.pdf b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/整面凸多面体データ.pdf
new file mode 100644
index 00000000..e2b52ddd
--- /dev/null
+++ b/texmf-dist/scripts/ketpic/data/polyhedrons_obj/整面凸多面体データ.pdf
Binary files differ