pik 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +36 -0
- data/Manifest.txt +42 -0
- data/README.rdoc +174 -0
- data/Rakefile +37 -0
- data/bin/pik +33 -0
- data/lib/pik.rb +30 -0
- data/lib/pik/batch_file.rb +70 -0
- data/lib/pik/checkup.rb +11 -0
- data/lib/pik/commands.rb +35 -0
- data/lib/pik/commands/add_command.rb +65 -0
- data/lib/pik/commands/batch_file_editor.rb +62 -0
- data/lib/pik/commands/checkup_command.rb +67 -0
- data/lib/pik/commands/command.rb +166 -0
- data/lib/pik/commands/config_command.rb +28 -0
- data/lib/pik/commands/config_file_editor.rb +12 -0
- data/lib/pik/commands/default_command.rb +22 -0
- data/lib/pik/commands/gemsync_command.rb +69 -0
- data/lib/pik/commands/help_command.rb +44 -0
- data/lib/pik/commands/implode_command.rb +16 -0
- data/lib/pik/commands/list_command.rb +34 -0
- data/lib/pik/commands/remove_command.rb +29 -0
- data/lib/pik/commands/run_command.rb +37 -0
- data/lib/pik/commands/switch_command.rb +49 -0
- data/lib/pik/config_file.rb +21 -0
- data/lib/pik/core_ext/pathname.rb +15 -0
- data/lib/pik/options.rb +56 -0
- data/lib/pik/runner.rb +16 -0
- data/lib/pik/search_path.rb +51 -0
- data/lib/pik/windows_env.rb +64 -0
- data/spec/add_command_spec.rb +15 -0
- data/spec/batch_file_spec.rb +31 -0
- data/spec/command_spec.rb +34 -0
- data/spec/commands_spec.rb +44 -0
- data/spec/default_command_spec.rb +6 -0
- data/spec/gemsync_command_spec.rb +15 -0
- data/spec/help_command_spec.rb +30 -0
- data/spec/list_command_spec.rb +33 -0
- data/spec/remove_command_spec.rb +25 -0
- data/spec/run_command_spec.rb +36 -0
- data/spec/search_path_spec.rb +121 -0
- data/spec/spec.opts +3 -0
- data/spec/switch_command_spec.rb +44 -0
- metadata +143 -0
data/History.txt
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
=== 0.1.0 / 2009-09-24
|
2
|
+
|
3
|
+
* removed jruby support for the time being (lack of win32ole is a problem)
|
4
|
+
* added more helpful messages to pik add
|
5
|
+
* renamed gemdup to gemsync. fixed the code up a bit
|
6
|
+
* added default and implode commands, shortcuts for switch, more specs, lots of refactors
|
7
|
+
* removed add_gem_home command. GEM_HOME can be configured with pik config
|
8
|
+
* change remove 'force' to 'quiet'
|
9
|
+
* added simpler switch semantics (`pik 191 p243` instead of `pik switch 191 p243`)
|
10
|
+
* added gemdup command
|
11
|
+
* option parsing is now done with optparse and not a regex
|
12
|
+
* rewrote pik to use classes for each command in the hopes that my code would be easier to read
|
13
|
+
* Added post install instructions - issue 5. Switched to Hoe.spec for Hoe compatibility. added Hoe-git plugin.
|
14
|
+
* added verbose output and current version specifier to 'list'
|
15
|
+
* added 'use' as an alias for 'switch'
|
16
|
+
* cleaner method of remvoving .pik/pik batch file, fixed some long lines
|
17
|
+
|
18
|
+
=== 0.0.3 / 2009-06-10
|
19
|
+
|
20
|
+
* added 'add_gem_home' command
|
21
|
+
due to changes in the config, you'll have to delete your "%HOME%\.pik\config.yml" and recreate it.
|
22
|
+
* don't use GEM_HOME on XP with rubygems 1.3.4, wait for 1.3.5, or point them to a path without spaces.
|
23
|
+
|
24
|
+
=== 0.0.2 / 2009-06-02
|
25
|
+
|
26
|
+
* several minor enhancements
|
27
|
+
*updated help messages
|
28
|
+
*updated readme
|
29
|
+
*some formatting of output
|
30
|
+
|
31
|
+
=== 0.0.1 / 2009-06-02
|
32
|
+
|
33
|
+
* 1 major enhancement
|
34
|
+
|
35
|
+
* Birthday!
|
36
|
+
|
data/Manifest.txt
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.rdoc
|
4
|
+
Rakefile
|
5
|
+
bin/pik
|
6
|
+
lib/pik.rb
|
7
|
+
lib/pik/batch_file.rb
|
8
|
+
lib/pik/checkup.rb
|
9
|
+
lib/pik/commands.rb
|
10
|
+
lib/pik/commands/add_command.rb
|
11
|
+
lib/pik/commands/batch_file_editor.rb
|
12
|
+
lib/pik/commands/checkup_command.rb
|
13
|
+
lib/pik/commands/command.rb
|
14
|
+
lib/pik/commands/config_command.rb
|
15
|
+
lib/pik/commands/config_file_editor.rb
|
16
|
+
lib/pik/commands/default_command.rb
|
17
|
+
lib/pik/commands/gemsync_command.rb
|
18
|
+
lib/pik/commands/help_command.rb
|
19
|
+
lib/pik/commands/implode_command.rb
|
20
|
+
lib/pik/commands/list_command.rb
|
21
|
+
lib/pik/commands/remove_command.rb
|
22
|
+
lib/pik/commands/run_command.rb
|
23
|
+
lib/pik/commands/switch_command.rb
|
24
|
+
lib/pik/config_file.rb
|
25
|
+
lib/pik/core_ext/pathname.rb
|
26
|
+
lib/pik/options.rb
|
27
|
+
lib/pik/runner.rb
|
28
|
+
lib/pik/search_path.rb
|
29
|
+
lib/pik/windows_env.rb
|
30
|
+
spec/add_command_spec.rb
|
31
|
+
spec/batch_file_spec.rb
|
32
|
+
spec/command_spec.rb
|
33
|
+
spec/commands_spec.rb
|
34
|
+
spec/default_command_spec.rb
|
35
|
+
spec/gemsync_command_spec.rb
|
36
|
+
spec/help_command_spec.rb
|
37
|
+
spec/list_command_spec.rb
|
38
|
+
spec/remove_command_spec.rb
|
39
|
+
spec/run_command_spec.rb
|
40
|
+
spec/search_path_spec.rb
|
41
|
+
spec/spec.opts
|
42
|
+
spec/switch_command_spec.rb
|
data/README.rdoc
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
= pik
|
2
|
+
|
3
|
+
http://github.com/vertiginous/pik
|
4
|
+
|
5
|
+
Gordon Thiesfeld
|
6
|
+
|
7
|
+
== DESCRIPTION:
|
8
|
+
|
9
|
+
Pik is a tool to switch between multiple versions of ruby on Windows.
|
10
|
+
|
11
|
+
Or to put it another way
|
12
|
+
|
13
|
+
doskey rvm=pik $* # (sort of)
|
14
|
+
|
15
|
+
You have to tell it where your different ruby versions live using
|
16
|
+
'pik add'. Then you can change to one by using 'pik switch'.
|
17
|
+
|
18
|
+
It also has a "sort of" multiruby functionality in 'pik run'.
|
19
|
+
|
20
|
+
|
21
|
+
== FEATURES/PROBLEMS:
|
22
|
+
|
23
|
+
Changes are to the open cmd session only.
|
24
|
+
|
25
|
+
Only works on MRI at present, support for JRuby, and maybe IronRuby are planned.
|
26
|
+
|
27
|
+
== SYNOPSIS:
|
28
|
+
|
29
|
+
C:\>pik help commands
|
30
|
+
|
31
|
+
add Adds another ruby location to pik.
|
32
|
+
checkup|cu Checks your environment for current Ruby best practices.
|
33
|
+
config Adds/modifies configuration options.
|
34
|
+
default switches back to the default settings
|
35
|
+
gemsync Duplicates gems from the current version to the one specified.
|
36
|
+
help Displays help information.
|
37
|
+
implode Removes your pik configuration.
|
38
|
+
list|ls Lists ruby versions that pik is aware of.
|
39
|
+
remove|rm Removes a ruby location from pik.
|
40
|
+
run Runs command with all version of ruby that pik is aware of.
|
41
|
+
switch|sw|use Switches ruby versions based on patterns.
|
42
|
+
|
43
|
+
For help on a particular command, use 'pik help COMMAND'.
|
44
|
+
|
45
|
+
== REQUIREMENTS:
|
46
|
+
|
47
|
+
Windows, more than one version of Ruby (otherwise, what's the point?) and Rubygems
|
48
|
+
|
49
|
+
== INSTALL:
|
50
|
+
|
51
|
+
1. gem install pik
|
52
|
+
2. pik add # adds your current ruby's bin dir
|
53
|
+
3. pik add path\to\some\other\ruby\bin # for another version
|
54
|
+
4. repeat step 3 for each version of ruby you have, or use 'pik add -i' for super-fancy interactive mode!
|
55
|
+
5. pik run "gem install vertiginous-pik"
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
== EXAMPLES:
|
60
|
+
|
61
|
+
pik add
|
62
|
+
|
63
|
+
C:\>ruby -v
|
64
|
+
ruby 1.8.6 (2009-03-31 patchlevel 368) [i386-mingw32]
|
65
|
+
|
66
|
+
C:\>pik add
|
67
|
+
Adding: 186: ruby 1.8.6 (2009-03-31 patchlevel 368) [i386-mingw32]'
|
68
|
+
Located at: c:/ruby/186-p368-mingw32/bin
|
69
|
+
|
70
|
+
C:\>pik add C:\ruby\191-p243-mingw32\bin
|
71
|
+
Adding: 191: ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]'
|
72
|
+
Located at: C:/ruby/191-p243-mingw32/bin
|
73
|
+
|
74
|
+
pik list
|
75
|
+
|
76
|
+
C:\>pik list
|
77
|
+
185: ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]
|
78
|
+
186: ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32]
|
79
|
+
186: ruby 1.8.6 (2009-03-31 patchlevel 368) [i386-mingw32] *
|
80
|
+
191: ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mingw32]
|
81
|
+
191: ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
|
82
|
+
|
83
|
+
or
|
84
|
+
|
85
|
+
C:\>pik list -v
|
86
|
+
185: ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]
|
87
|
+
path: C:/ruby/185-p012-mswin32/bin
|
88
|
+
|
89
|
+
186: ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32]
|
90
|
+
path: C:/ruby/186-p287-mswin32/bin
|
91
|
+
|
92
|
+
186: ruby 1.8.6 (2009-03-31 patchlevel 368) [i386-mingw32] *
|
93
|
+
path: C:/ruby/186-p368-mingw32/bin
|
94
|
+
|
95
|
+
191: ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mingw32]
|
96
|
+
path: C:/ruby/191-p129-mingw32/bin
|
97
|
+
|
98
|
+
191: ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
|
99
|
+
path: C:/ruby/191-p243-mingw32/bin
|
100
|
+
|
101
|
+
pik switch
|
102
|
+
|
103
|
+
C:\>pik switch 191 p129
|
104
|
+
== Switching to ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mingw32] ==
|
105
|
+
|
106
|
+
or
|
107
|
+
|
108
|
+
C:\>pik sw 185
|
109
|
+
== Switching to ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] ==
|
110
|
+
|
111
|
+
or
|
112
|
+
|
113
|
+
C:\>pik use 186 ms
|
114
|
+
== Switching to ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32] ==
|
115
|
+
|
116
|
+
or
|
117
|
+
|
118
|
+
C:\>pik 191 p2
|
119
|
+
== Switching to ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] ==
|
120
|
+
|
121
|
+
or
|
122
|
+
|
123
|
+
C:\>pik default
|
124
|
+
== Switching to ruby 1.8.6 (2009-03-31 patchlevel 368) [i386-mingw32] ==
|
125
|
+
|
126
|
+
pik run
|
127
|
+
|
128
|
+
C:\>pik run "gem in hpricot"
|
129
|
+
== Running with ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32] ==
|
130
|
+
Successfully installed hpricot-0.8.1-x86-mswin32
|
131
|
+
1 gem installed
|
132
|
+
|
133
|
+
== Running with ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32] ==
|
134
|
+
Successfully installed hpricot-0.8.1-x86-mswin32
|
135
|
+
1 gem installed
|
136
|
+
|
137
|
+
== Running with ruby 1.8.6 (2009-03-31 patchlevel 368) [i386-mingw32] ==
|
138
|
+
Building native extensions. This could take a while...
|
139
|
+
Successfully installed hpricot-0.8.1
|
140
|
+
1 gem installed
|
141
|
+
|
142
|
+
== Running with ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mingw32] ==
|
143
|
+
Building native extensions. This could take a while...
|
144
|
+
Successfully installed hpricot-0.8.1
|
145
|
+
1 gem installed
|
146
|
+
|
147
|
+
== Running with ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] ==
|
148
|
+
Successfully installed hpricot-0.8.1
|
149
|
+
1 gem installed
|
150
|
+
|
151
|
+
== LICENSE:
|
152
|
+
|
153
|
+
(The MIT License)
|
154
|
+
|
155
|
+
Copyright (c) 2009 Gordon Thiesfeld
|
156
|
+
|
157
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
158
|
+
a copy of this software and associated documentation files (the
|
159
|
+
'Software'), to deal in the Software without restriction, including
|
160
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
161
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
162
|
+
permit persons to whom the Software is furnished to do so, subject to
|
163
|
+
the following conditions:
|
164
|
+
|
165
|
+
The above copyright notice and this permission notice shall be
|
166
|
+
included in all copies or substantial portions of the Software.
|
167
|
+
|
168
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
169
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
170
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
171
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
172
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
173
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
174
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift('lib')
|
7
|
+
require 'pik'
|
8
|
+
|
9
|
+
Hoe.plugin :git
|
10
|
+
|
11
|
+
Hoe.spec('pik') do
|
12
|
+
|
13
|
+
developer('Gordon Thiesfeld', 'gthiesfeld@gmail.com')
|
14
|
+
|
15
|
+
self.extra_deps = {'highline' => '>= 0.0.0'}
|
16
|
+
self.readme_file = 'README.rdoc'
|
17
|
+
self.post_install_message =<<-PIM
|
18
|
+
|
19
|
+
----------------------------------------------------------------------------
|
20
|
+
|
21
|
+
1. Use 'pik add' to add all versions of ruby to your pik config,
|
22
|
+
or use 'pik add -i' for an interactive console to do the same.
|
23
|
+
The current ruby version is added by default.
|
24
|
+
|
25
|
+
see 'pik help add' for more info
|
26
|
+
|
27
|
+
2. Run 'pik run "gem install pik"' to install pik to all Ruby versions.
|
28
|
+
|
29
|
+
3. Run 'pik help' for help.
|
30
|
+
|
31
|
+
----------------------------------------------------------------------------
|
32
|
+
|
33
|
+
PIM
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
# vim: syntax=Ruby
|
data/bin/pik
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'pik')
|
3
|
+
|
4
|
+
include Pik
|
5
|
+
|
6
|
+
args = ARGV
|
7
|
+
|
8
|
+
Command.clean_gem_batch
|
9
|
+
|
10
|
+
begin
|
11
|
+
config = ConfigFile.new
|
12
|
+
|
13
|
+
args << 'help' if args.empty?
|
14
|
+
|
15
|
+
command = if Command.choose_from(args, config)
|
16
|
+
Switch
|
17
|
+
elsif (cmd = Commands.find(args.shift))
|
18
|
+
cmd
|
19
|
+
else
|
20
|
+
Help
|
21
|
+
end
|
22
|
+
|
23
|
+
cmd = command.new(args, config)
|
24
|
+
cmd.execute
|
25
|
+
rescue QuitError
|
26
|
+
puts "\nQuitting..."
|
27
|
+
rescue => e
|
28
|
+
puts "\nThere was an error"
|
29
|
+
puts " Error: #{e.message}\n\n"
|
30
|
+
puts e.backtrace
|
31
|
+
ensure
|
32
|
+
cmd.close if cmd
|
33
|
+
end
|
data/lib/pik.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Pik
|
2
|
+
VERSION = '0.1.0'
|
3
|
+
end
|
4
|
+
|
5
|
+
require 'highline'
|
6
|
+
require 'pathname'
|
7
|
+
require 'rbconfig'
|
8
|
+
|
9
|
+
require 'pik/core_ext/pathname'
|
10
|
+
require 'pik/commands'
|
11
|
+
require 'pik/commands/config_file_editor'
|
12
|
+
require 'pik/commands/batch_file_editor'
|
13
|
+
require 'pik/commands/command'
|
14
|
+
require 'pik/commands/list_command'
|
15
|
+
require 'pik/commands/add_command'
|
16
|
+
require 'pik/commands/help_command'
|
17
|
+
require 'pik/commands/switch_command'
|
18
|
+
require 'pik/commands/run_command'
|
19
|
+
require 'pik/commands/remove_command'
|
20
|
+
require 'pik/commands/checkup_command'
|
21
|
+
require 'pik/commands/config_command'
|
22
|
+
require 'pik/commands/gemsync_command'
|
23
|
+
require 'pik/commands/default_command'
|
24
|
+
require 'pik/commands/implode_command'
|
25
|
+
require 'pik/config_file'
|
26
|
+
require 'pik/windows_env'
|
27
|
+
require 'pik/batch_file'
|
28
|
+
require 'pik/search_path'
|
29
|
+
|
30
|
+
PIK_HOME = Pathname.new( ENV['HOME'] || ENV['USERPROFILE'] ) + '.pik'
|
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
class BatchFile
|
3
|
+
|
4
|
+
def self.open(file)
|
5
|
+
bf = new(file, :open)
|
6
|
+
yield bf if block_given?
|
7
|
+
bf
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :file_data, :file_name, :ruby_dir
|
11
|
+
|
12
|
+
def initialize(file, mode=:new)
|
13
|
+
@rubyw_exe = 'rubyw.exe'
|
14
|
+
@ruby_exe = 'ruby.exe'
|
15
|
+
@file = Pathname.new(file)
|
16
|
+
case mode
|
17
|
+
when :open
|
18
|
+
@file_data = File.read(@file).split("\n")
|
19
|
+
when :new
|
20
|
+
@file_data = [header]
|
21
|
+
end
|
22
|
+
yield self if block_given?
|
23
|
+
end
|
24
|
+
|
25
|
+
def path
|
26
|
+
@file
|
27
|
+
end
|
28
|
+
|
29
|
+
def header
|
30
|
+
string = "@ECHO OFF\n\n"
|
31
|
+
string << ":: This batch file generated by Pik, the\n"
|
32
|
+
string << ":: Ruby Manager for Windows\n"
|
33
|
+
end
|
34
|
+
|
35
|
+
def ftype(files={ 'rbfile' => @ruby_exe, 'rbwfile' => @rubyw_exe })
|
36
|
+
files.sort.each do |filetype, open_with|
|
37
|
+
@file_data << "FTYPE #{filetype}=#{open_with} \"%1\" %*\n"
|
38
|
+
end
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def call(bat)
|
43
|
+
@file_data << "CALL #{bat}\n"
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
def set(items)
|
48
|
+
items.each{|k,v| @file_data << "SET #{k}=#{v}" }
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def echo(string)
|
53
|
+
string = ' ' + string unless string == '.'
|
54
|
+
@file_data << "ECHO#{string}"
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def remove_line(re)
|
59
|
+
@file_data.reject!{ |i| i =~ re }
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_s
|
63
|
+
@file_data.join("\n")
|
64
|
+
end
|
65
|
+
|
66
|
+
def write
|
67
|
+
File.open(@file, 'w+'){|f| f.puts self.to_s }
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
data/lib/pik/checkup.rb
ADDED
data/lib/pik/commands.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Pik
|
2
|
+
|
3
|
+
module Commands
|
4
|
+
|
5
|
+
def self.clear
|
6
|
+
commands.clear
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.add(command)
|
10
|
+
commands << command
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.find(command)
|
14
|
+
commands.find{ |cmd| cmd.names.include?(command.to_sym) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.list
|
18
|
+
commands.map{|c| c.names }.flatten
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.description
|
22
|
+
commands.sort_by{|c| c.name }.map do |cmd|
|
23
|
+
" %-15s %s" % [cmd.names.join('|'), cmd.summary]
|
24
|
+
end.join("\n") +
|
25
|
+
"\n\nFor help on a particular command, use 'pik help COMMAND'."
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.commands
|
29
|
+
@commands ||= []
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|