plplot 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +115 -0
- data/examples/x01.rb +284 -0
- data/examples/x02.rb +134 -0
- data/examples/x03.rb +81 -0
- data/examples/x04.rb +98 -0
- data/examples/x05.rb +33 -0
- data/examples/x06.rb +62 -0
- data/examples/x07.rb +69 -0
- data/examples/x08.rb +179 -0
- data/examples/x09.rb +371 -0
- data/examples/x10.rb +29 -0
- data/examples/x11.rb +151 -0
- data/examples/x12.rb +65 -0
- data/examples/x13.rb +86 -0
- data/examples/x14.rb +391 -0
- data/examples/x15.rb +266 -0
- data/examples/x16.rb +349 -0
- data/examples/x18.rb +146 -0
- data/examples/x20.rb +360 -0
- data/examples/x21.rb +280 -0
- data/examples/x22.rb +242 -0
- data/examples/x23.rb +361 -0
- data/examples/x24.rb +126 -0
- data/examples/x25.rb +114 -0
- data/examples/x26.rb +180 -0
- data/examples/x27.rb +124 -0
- data/examples/x28.rb +369 -0
- data/examples/x30.rb +141 -0
- data/examples/x31.rb +238 -0
- data/examples/x32.rb +159 -0
- data/ext/depend +1 -0
- data/ext/extconf.rb +75 -0
- data/ext/rbplplot.c +4982 -0
- data/lib/plplot.rb +101 -0
- metadata +115 -0
data/examples/x03.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'plplot'
|
6
|
+
include PLplot
|
7
|
+
include NMath
|
8
|
+
|
9
|
+
# Polar plot demo.
|
10
|
+
#
|
11
|
+
# Generates polar plot, with 1-1 scaling.
|
12
|
+
|
13
|
+
n = 361
|
14
|
+
|
15
|
+
dtr = PI / 180.0
|
16
|
+
x0 = cos(NArray.float(n).indgen!.mul!(dtr))
|
17
|
+
y0 = sin(NArray.float(n).indgen!.mul!(dtr))
|
18
|
+
r = sin(NArray.float(n).indgen!.mul!(5*dtr))
|
19
|
+
|
20
|
+
# Parse and process command line arguments
|
21
|
+
|
22
|
+
PLOptionParser.parse!
|
23
|
+
|
24
|
+
# Set orientation to landscape - note not all device drivers
|
25
|
+
# support this, in particular most interactive drivers do not
|
26
|
+
plsori(1)
|
27
|
+
|
28
|
+
# Initialize plplot
|
29
|
+
|
30
|
+
plinit
|
31
|
+
|
32
|
+
# Set up viewport and window, but do not draw box
|
33
|
+
|
34
|
+
plenv(-1.3, 1.3, -1.3, 1.3, 1, -2)
|
35
|
+
|
36
|
+
# Draw circles for polar grid
|
37
|
+
#
|
38
|
+
1.upto(10) {|i| plarc(0.0, 0.0, 0.1 * i, 0.1 * i, 0.0, 360.0, 0)}
|
39
|
+
|
40
|
+
plcol0(2)
|
41
|
+
12.times do |i|
|
42
|
+
theta = 30.0 * i
|
43
|
+
dx = cos(dtr * theta)
|
44
|
+
dy = sin(dtr * theta)
|
45
|
+
|
46
|
+
# Draw radial spokes for polar grid
|
47
|
+
|
48
|
+
pljoin(0.0, 0.0, dx, dy)
|
49
|
+
text = theta.round.to_s
|
50
|
+
|
51
|
+
# Write labels for angle
|
52
|
+
|
53
|
+
if (theta < 9.99)
|
54
|
+
offset = 0.45
|
55
|
+
elsif (theta < 99.9)
|
56
|
+
offset = 0.30
|
57
|
+
else
|
58
|
+
offset = 0.15
|
59
|
+
end
|
60
|
+
|
61
|
+
# Slightly off zero to avoid floating point logic flips at 90 and 270 deg.
|
62
|
+
if (dx >= -0.00001)
|
63
|
+
plptex(dx, dy, dx, dy, -offset, text)
|
64
|
+
else
|
65
|
+
plptex(dx, dy, -dx, -dy, offset+1, text)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Draw the graph
|
70
|
+
|
71
|
+
x = r * x0
|
72
|
+
y = r * y0
|
73
|
+
plcol0(3)
|
74
|
+
plline(x, y)
|
75
|
+
|
76
|
+
plcol0(4)
|
77
|
+
plmtex("t", 2.0, 0.5, 0.5, "#frPLplot Example 3 - r(#gh)=sin 5#gh")
|
78
|
+
|
79
|
+
# Close the plot at end
|
80
|
+
|
81
|
+
plend
|
data/examples/x04.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'plplot'
|
6
|
+
include PLplot
|
7
|
+
include NMath
|
8
|
+
|
9
|
+
# Log plot demo.
|
10
|
+
#
|
11
|
+
# Illustration of logarithmic axes, and redefinition of window.
|
12
|
+
|
13
|
+
# Makes transliteration from C example easier
|
14
|
+
def pow(a,b)
|
15
|
+
a ** b
|
16
|
+
end
|
17
|
+
|
18
|
+
#--------------------------------------------------------------------------*\
|
19
|
+
# plot1
|
20
|
+
#
|
21
|
+
# Log-linear plot.
|
22
|
+
#--------------------------------------------------------------------------*/
|
23
|
+
|
24
|
+
def plot1(type)
|
25
|
+
|
26
|
+
n = 101
|
27
|
+
freql = NArray.float(n)
|
28
|
+
ampl = NArray.float(n)
|
29
|
+
phase = NArray.float(n)
|
30
|
+
|
31
|
+
pladv(0)
|
32
|
+
|
33
|
+
# Set up data for log plot
|
34
|
+
|
35
|
+
f0 = 1.0
|
36
|
+
n.times do |i|
|
37
|
+
freql[i] = -2.0 + i / 20.0
|
38
|
+
freq = pow(10.0, freql[i])
|
39
|
+
ampl[i] = 20.0 * log10(1.0 / sqrt(1.0 + pow((freq / f0), 2.0)))
|
40
|
+
phase[i] = -(180.0 / PI) * atan(freq / f0)
|
41
|
+
end
|
42
|
+
|
43
|
+
plvpor(0.15, 0.85, 0.1, 0.9)
|
44
|
+
plwind(-2.0, 3.0, -80.0, 0.0)
|
45
|
+
|
46
|
+
# Try different axis and labelling styles.
|
47
|
+
|
48
|
+
plcol0(1)
|
49
|
+
case (type)
|
50
|
+
when 0
|
51
|
+
plbox("bclnst", 0.0, 0, "bnstv", 0.0, 0)
|
52
|
+
when 1
|
53
|
+
plbox("bcfghlnst", 0.0, 0, "bcghnstv", 0.0, 0)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Plot ampl vs freq
|
57
|
+
|
58
|
+
plcol0(2)
|
59
|
+
plline(freql, ampl)
|
60
|
+
plcol0(1)
|
61
|
+
plptex(1.6, -30.0, 1.0, -20.0, 0.5, "-20 dB/decade")
|
62
|
+
|
63
|
+
# Put labels on
|
64
|
+
|
65
|
+
plcol0(1)
|
66
|
+
plmtex("b", 3.2, 0.5, 0.5, "Frequency")
|
67
|
+
plmtex("t", 2.0, 0.5, 0.5, "Single Pole Low-Pass Filter")
|
68
|
+
plcol0(2)
|
69
|
+
plmtex("l", 5.0, 0.5, 0.5, "Amplitude (dB)")
|
70
|
+
|
71
|
+
# For the gridless case, put phase vs freq on same plot
|
72
|
+
|
73
|
+
if (type == 0)
|
74
|
+
plcol0(1)
|
75
|
+
plwind(-2.0, 3.0, -100.0, 0.0)
|
76
|
+
plbox("", 0.0, 0, "cmstv", 30.0, 3)
|
77
|
+
plcol0(3)
|
78
|
+
plline(freql, phase)
|
79
|
+
plcol0(3)
|
80
|
+
plmtex("r", 5.0, 0.5, 0.5, "Phase shift (degrees)")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Parse and process command line arguments
|
85
|
+
|
86
|
+
PLOptionParser.parse!
|
87
|
+
|
88
|
+
# Initialize plplot
|
89
|
+
|
90
|
+
plinit
|
91
|
+
plfont(2)
|
92
|
+
|
93
|
+
# Make log plots using two different styles.
|
94
|
+
|
95
|
+
plot1(0)
|
96
|
+
plot1(1)
|
97
|
+
|
98
|
+
plend
|
data/examples/x05.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'plplot'
|
5
|
+
include PLplot
|
6
|
+
include NMath
|
7
|
+
|
8
|
+
# Histogram demo.
|
9
|
+
#
|
10
|
+
# Draws a histogram from sample data.
|
11
|
+
|
12
|
+
NPTS = 2047
|
13
|
+
|
14
|
+
# Parse and process command line arguments
|
15
|
+
|
16
|
+
PLOptionParser.parse!
|
17
|
+
|
18
|
+
# Initialize plplot
|
19
|
+
|
20
|
+
plinit
|
21
|
+
|
22
|
+
# Fill up data points
|
23
|
+
|
24
|
+
delta = 2.0 * PI / NPTS
|
25
|
+
data = sin(NArray.float(NPTS).indgen!.mul!(delta))
|
26
|
+
|
27
|
+
plcol0(1)
|
28
|
+
plhist(data, 44, -1.1 .. 1.1)
|
29
|
+
plcol0(2)
|
30
|
+
pllab("#frValue", "#frFrequency",
|
31
|
+
"#frPLplot Example 5 - Probability function of Oscillator")
|
32
|
+
|
33
|
+
plend
|
data/examples/x06.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'plplot'
|
6
|
+
include PLplot
|
7
|
+
|
8
|
+
# --------------------------------------------------------------------------
|
9
|
+
# Font demo.
|
10
|
+
#
|
11
|
+
# Displays the entire "plpoin" symbol (font) set.
|
12
|
+
# --------------------------------------------------------------------------
|
13
|
+
|
14
|
+
# Parse and process command line arguments
|
15
|
+
|
16
|
+
PLOptionParser.parse!
|
17
|
+
|
18
|
+
# Initialize plplot
|
19
|
+
|
20
|
+
plinit
|
21
|
+
|
22
|
+
pladv(0)
|
23
|
+
|
24
|
+
# Set up viewport and window
|
25
|
+
|
26
|
+
plcol0(2)
|
27
|
+
plvpor(0.1, 1.0, 0.1, 0.9)
|
28
|
+
plwind(0.0, 1.0, 0.0, 1.3)
|
29
|
+
|
30
|
+
# Draw the grid using plbox
|
31
|
+
|
32
|
+
plbox("bcg", 0.1, 0, "bcg", 0.1, 0)
|
33
|
+
|
34
|
+
# Write the digits below the frame
|
35
|
+
|
36
|
+
plcol0(15)
|
37
|
+
10.times do |i|
|
38
|
+
plmtex("b", 1.5, (0.1 * i + 0.05), 0.5, i)
|
39
|
+
end
|
40
|
+
|
41
|
+
k = 0
|
42
|
+
13.times do |i|
|
43
|
+
|
44
|
+
# Write the digits to the left of the frame
|
45
|
+
|
46
|
+
plmtex("lv", 1.0, (1.0 - (2 * i + 1) / 26.0), 1.0, 10*i)
|
47
|
+
|
48
|
+
10.times do |j|
|
49
|
+
x = 0.1 * j + 0.05
|
50
|
+
y = 1.25 - 0.1 * i
|
51
|
+
|
52
|
+
# Display the symbols (plpoin accepts scalars as well as NArrays
|
53
|
+
|
54
|
+
if (k < 128)
|
55
|
+
plpoin(x, y, k)
|
56
|
+
end
|
57
|
+
k = k + 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
plmtex("t", 1.5, 0.5, 0.5, "PLplot Example 6 - plpoin symbols")
|
62
|
+
plend
|
data/examples/x07.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'plplot'
|
6
|
+
include PLplot
|
7
|
+
include NMath
|
8
|
+
|
9
|
+
# --------------------------------------------------------------------------*\
|
10
|
+
# Font demo.
|
11
|
+
#
|
12
|
+
# Displays the entire "plsym" symbol (font) set.
|
13
|
+
# --------------------------------------------------------------------------*/
|
14
|
+
|
15
|
+
base = [
|
16
|
+
0, 200, 500, 600, 700, 800, 900,
|
17
|
+
2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900
|
18
|
+
]
|
19
|
+
|
20
|
+
# Parse and process command line arguments
|
21
|
+
|
22
|
+
PLOptionParser.parse!
|
23
|
+
|
24
|
+
# Initialize plplot
|
25
|
+
|
26
|
+
plinit
|
27
|
+
|
28
|
+
plfontld(1)
|
29
|
+
|
30
|
+
17.times do |l|
|
31
|
+
pladv(0)
|
32
|
+
|
33
|
+
# Set up viewport and window
|
34
|
+
|
35
|
+
plcol0(2)
|
36
|
+
plvpor(0.15, 0.95, 0.1, 0.9)
|
37
|
+
plwind(0.0, 1.0, 0.0, 1.0)
|
38
|
+
|
39
|
+
# Draw the grid using plbox
|
40
|
+
|
41
|
+
plbox("bcg", 0.1, 0, "bcg", 0.1, 0)
|
42
|
+
|
43
|
+
# Write the digits below the frame
|
44
|
+
|
45
|
+
plcol0(15)
|
46
|
+
10.times do |i|
|
47
|
+
plmtex("b", 1.5, (0.1 * i + 0.05), 0.5, i)
|
48
|
+
end
|
49
|
+
|
50
|
+
k = 0
|
51
|
+
10.times do |i|
|
52
|
+
|
53
|
+
# Write the digits to the left of the frame
|
54
|
+
|
55
|
+
plmtex("lv", 1.0, (0.95 - 0.1 * i), 1.0, base[l] + 10 * i)
|
56
|
+
10.times do |j|
|
57
|
+
x = 0.1 * j + 0.05
|
58
|
+
y = 0.95 - 0.1 * i
|
59
|
+
|
60
|
+
# Display the symbols
|
61
|
+
|
62
|
+
plsym(x, y, base[l] + k)
|
63
|
+
k = k + 1
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
plmtex("t", 1.5, 0.5, 0.5, "PLplot Example 7 - PLSYM symbols")
|
68
|
+
end
|
69
|
+
plend
|
data/examples/x08.rb
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true if $0 == __FILE__
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'plplot'
|
6
|
+
include PLplot
|
7
|
+
include NMath
|
8
|
+
|
9
|
+
# 3-d plot demo.
|
10
|
+
#
|
11
|
+
# Copyright (C) 2004 Alan W. Irwin
|
12
|
+
# Copyright (C) 2004 Rafael Laboissiere
|
13
|
+
#
|
14
|
+
# This file is part of PLplot.
|
15
|
+
#
|
16
|
+
# PLplot is free software; you can redistribute it and/or modify
|
17
|
+
# it under the terms of the GNU General Library Public License as published
|
18
|
+
# by the Free Software Foundation; either version 2 of the License, or
|
19
|
+
# (at your option) any later version.
|
20
|
+
#
|
21
|
+
# PLplot is distributed in the hope that it will be useful,
|
22
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
23
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
24
|
+
# GNU Library General Public License for more details.
|
25
|
+
#
|
26
|
+
# You should have received a copy of the GNU Library General Public License
|
27
|
+
# along with PLplot; if not, write to the Free Software
|
28
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
29
|
+
|
30
|
+
XPTS = 35 # Data points in x
|
31
|
+
YPTS = 46 # Data points in y
|
32
|
+
|
33
|
+
alt = [60.0, 20.0]
|
34
|
+
az = [30.0, 60.0]
|
35
|
+
|
36
|
+
title = [
|
37
|
+
"#frPLplot Example 8 - Alt=60, Az=30",
|
38
|
+
"#frPLplot Example 8 - Alt=20, Az=60",
|
39
|
+
]
|
40
|
+
|
41
|
+
# Makes transliteration from C example easier
|
42
|
+
def pow(a,b)
|
43
|
+
a ** b
|
44
|
+
end
|
45
|
+
|
46
|
+
#--------------------------------------------------------------------------
|
47
|
+
# cmap1_init1
|
48
|
+
#
|
49
|
+
# Initializes color map 1 in HLS space.
|
50
|
+
# Basic grayscale variation from half-dark (which makes more interesting
|
51
|
+
# looking plot compared to dark) to light.
|
52
|
+
# An interesting variation on this:
|
53
|
+
# s[1] = 1.0
|
54
|
+
#--------------------------------------------------------------------------
|
55
|
+
|
56
|
+
def cmap1_init(gray)
|
57
|
+
|
58
|
+
i = [0.0, 1.0]; # [left, right] boundaries
|
59
|
+
|
60
|
+
if (gray==1)
|
61
|
+
h = [0.0, 0.0] # hue -- low: red (arbitrary if s=0)
|
62
|
+
l = [0.5, 1.0] # lightness -- low: half-dark
|
63
|
+
s = [0.0, 0.0] # minimum saturation
|
64
|
+
else
|
65
|
+
h = [240, 0] # blue -> green -> yellow -> red
|
66
|
+
l = [0.6, 0.6]
|
67
|
+
s = [0.8, 0.8]
|
68
|
+
end
|
69
|
+
|
70
|
+
plscmap1n(256)
|
71
|
+
plscmap1l(PL::CMAP_HLS, i, h, l, s)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Use PLOptionParser to parse options. Use global variables to track user
|
75
|
+
# options since that matches the C example most closely.
|
76
|
+
|
77
|
+
# Defaults for user options
|
78
|
+
$sombrero = false
|
79
|
+
|
80
|
+
PLOP = PLOptionParser.new do |op|
|
81
|
+
op.separator('')
|
82
|
+
op.separator('x08 options:')
|
83
|
+
op.on('--sombrero', 'Use the "sombrero" function') do
|
84
|
+
$sombrero = true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
LEVELS = 10
|
89
|
+
|
90
|
+
#--------------------------------------------------------------------------
|
91
|
+
# main
|
92
|
+
#
|
93
|
+
# Does a series of 3-d plots for a given data set, with different
|
94
|
+
# viewing options in each plot.
|
95
|
+
#--------------------------------------------------------------------------
|
96
|
+
|
97
|
+
PLOP.parse!
|
98
|
+
rosen = !$sombrero
|
99
|
+
|
100
|
+
plinit
|
101
|
+
|
102
|
+
# Allocate data structures
|
103
|
+
|
104
|
+
x = NArray.float(XPTS).indgen!.div!(XPTS/2.0).sbt!(1)
|
105
|
+
y = NArray.float(YPTS).indgen!.div!(YPTS/2.0).sbt!(1)
|
106
|
+
z = NArray.float(YPTS, XPTS)
|
107
|
+
|
108
|
+
if(rosen)
|
109
|
+
x.mul!(1.5)
|
110
|
+
y.add!(0.5)
|
111
|
+
end
|
112
|
+
|
113
|
+
XPTS.times do |i|
|
114
|
+
xx = x[i]
|
115
|
+
YPTS.times do |j|
|
116
|
+
yy = y[j]
|
117
|
+
if (rosen)
|
118
|
+
z[j,i] = pow(1 - xx, 2) + 100 * pow(yy - pow(xx, 2), 2)
|
119
|
+
# The log argument may be zero for just the right grid.
|
120
|
+
if (z[j,i] > 0)
|
121
|
+
z[j,i] = log(z[j,i])
|
122
|
+
else
|
123
|
+
z[j,i] = -5; # -MAXFLOAT would mess-up up the scale
|
124
|
+
end
|
125
|
+
else
|
126
|
+
r = sqrt(xx * xx + yy * yy)
|
127
|
+
z[j,i] = exp(-r * r) * cos(2.0 * PI * r)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# It would be convenient if narray had a minmax function
|
133
|
+
zmin = z.min
|
134
|
+
zmax = z.max
|
135
|
+
|
136
|
+
nlevel = LEVELS
|
137
|
+
step = (zmax-zmin)/(nlevel+1)
|
138
|
+
clevel = NArray.float(nlevel).indgen!(1).mul!(step).add!(zmin)
|
139
|
+
|
140
|
+
pllightsource(1,1,1)
|
141
|
+
|
142
|
+
2.times do |k|
|
143
|
+
4.times do |ifshade|
|
144
|
+
pladv(0)
|
145
|
+
plvpor(0.0, 1.0, 0.0, 0.9)
|
146
|
+
plwind(-1.0, 1.0, -0.9, 1.1)
|
147
|
+
plcol0(3)
|
148
|
+
plmtex("t", 1.0, 0.5, 0.5, title[k])
|
149
|
+
plcol0(1)
|
150
|
+
if (rosen)
|
151
|
+
plw3d(1.0, 1.0, 1.0, -1.5, 1.5, -0.5, 1.5, zmin, zmax, alt[k], az[k])
|
152
|
+
else
|
153
|
+
plw3d(1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, zmin, zmax, alt[k], az[k])
|
154
|
+
end
|
155
|
+
|
156
|
+
plbox3("bnstu", "x axis", 0.0, 0,
|
157
|
+
"bnstu", "y axis", 0.0, 0,
|
158
|
+
"bcdmnstuv", "z axis", 0.0, 0)
|
159
|
+
plcol0(2)
|
160
|
+
|
161
|
+
if (ifshade == 0) # diffuse light surface plot
|
162
|
+
cmap1_init(1)
|
163
|
+
plsurf3d(x, y, z)
|
164
|
+
elsif (ifshade == 1) # magnitude colored plot
|
165
|
+
cmap1_init(0)
|
166
|
+
plsurf3d(x, y, z, PL::MAG_COLOR)
|
167
|
+
elsif (ifshade == 2) # magnitude colored plot with faceted squares
|
168
|
+
cmap1_init(0)
|
169
|
+
plsurf3d(x, y, z, PL::MAG_COLOR | PL::FACETED)
|
170
|
+
else # magnitude colored plot with contours
|
171
|
+
cmap1_init(0)
|
172
|
+
plsurf3d(x, y, z, PL::MAG_COLOR | PL::SURF_CONT | PL::BASE_CONT, clevel)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# Clean up
|
178
|
+
|
179
|
+
plend
|