pry 0.9.7.4-i386-mswin32 → 0.9.8-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/.gitignore +2 -3
  2. data/CHANGELOG +43 -0
  3. data/README.markdown +3 -1
  4. data/Rakefile +51 -32
  5. data/bin/pry +2 -80
  6. data/lib/pry.rb +33 -26
  7. data/lib/pry/cli.rb +152 -0
  8. data/lib/pry/code.rb +351 -0
  9. data/lib/pry/command.rb +422 -0
  10. data/lib/pry/command_set.rb +259 -129
  11. data/lib/pry/commands.rb +0 -1
  12. data/lib/pry/config.rb +43 -9
  13. data/lib/pry/default_commands/context.rb +109 -92
  14. data/lib/pry/default_commands/documentation.rb +174 -63
  15. data/lib/pry/default_commands/easter_eggs.rb +26 -2
  16. data/lib/pry/default_commands/gems.rb +65 -37
  17. data/lib/pry/default_commands/input.rb +175 -243
  18. data/lib/pry/default_commands/introspection.rb +173 -112
  19. data/lib/pry/default_commands/ls.rb +96 -114
  20. data/lib/pry/default_commands/shell.rb +175 -70
  21. data/lib/pry/helpers/base_helpers.rb +7 -2
  22. data/lib/pry/helpers/command_helpers.rb +71 -77
  23. data/lib/pry/helpers/options_helpers.rb +10 -41
  24. data/lib/pry/helpers/text.rb +24 -4
  25. data/lib/pry/history.rb +55 -17
  26. data/lib/pry/history_array.rb +2 -0
  27. data/lib/pry/hooks.rb +252 -0
  28. data/lib/pry/indent.rb +9 -5
  29. data/lib/pry/method.rb +149 -50
  30. data/lib/pry/plugins.rb +12 -4
  31. data/lib/pry/pry_class.rb +69 -26
  32. data/lib/pry/pry_instance.rb +187 -115
  33. data/lib/pry/version.rb +1 -1
  34. data/lib/pry/wrapped_module.rb +73 -0
  35. data/man/pry.1 +195 -0
  36. data/man/pry.1.html +204 -0
  37. data/man/pry.1.ronn +141 -0
  38. data/pry.gemspec +29 -32
  39. data/test/helper.rb +32 -36
  40. data/test/test_cli.rb +78 -0
  41. data/test/test_code.rb +201 -0
  42. data/test/test_command.rb +327 -0
  43. data/test/test_command_integration.rb +512 -0
  44. data/test/test_command_set.rb +338 -12
  45. data/test/test_completion.rb +1 -1
  46. data/test/test_default_commands.rb +1 -2
  47. data/test/test_default_commands/test_context.rb +27 -5
  48. data/test/test_default_commands/test_documentation.rb +20 -8
  49. data/test/test_default_commands/test_input.rb +84 -45
  50. data/test/test_default_commands/test_introspection.rb +74 -17
  51. data/test/test_default_commands/test_ls.rb +9 -36
  52. data/test/test_default_commands/test_shell.rb +240 -13
  53. data/test/test_hooks.rb +490 -0
  54. data/test/test_indent.rb +2 -0
  55. data/test/test_method.rb +60 -0
  56. data/test/test_pry.rb +29 -904
  57. data/test/test_pry_defaults.rb +380 -0
  58. data/test/test_pry_history.rb +24 -24
  59. data/test/test_syntax_checking.rb +63 -0
  60. data/test/test_wrapped_module.rb +71 -0
  61. metadata +50 -39
  62. data/lib/pry/command_context.rb +0 -53
  63. data/lib/pry/command_processor.rb +0 -181
  64. data/lib/pry/extended_commands/user_command_api.rb +0 -65
  65. data/test/test_command_processor.rb +0 -176
data/lib/pry/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Pry
2
- VERSION = "0.9.7.4"
2
+ VERSION = "0.9.8"
3
3
  end
@@ -0,0 +1,73 @@
1
+ class Pry
2
+ class WrappedModule
3
+
4
+ attr_reader :wrapped
5
+ private :wrapped
6
+
7
+ # Create a new WrappedModule
8
+ # @raise ArgumentError, if the argument is not a Module
9
+ # @param [Module]
10
+ def initialize(mod)
11
+ raise ArgumentError, "Tried to initialize a WrappedModule with a non-module #{mod.inspect}" unless ::Module === mod
12
+ @wrapped = mod
13
+ end
14
+
15
+ # The prefix that would appear before methods defined on this class.
16
+ #
17
+ # i.e. the "String." or "String#" in String.new and String#initialize.
18
+ #
19
+ # @return String
20
+ def method_prefix
21
+ if singleton_class?
22
+ if Module === singleton_instance
23
+ "#{WrappedModule.new(singleton_instance).nonblank_name}."
24
+ else
25
+ "self."
26
+ end
27
+ else
28
+ "#{nonblank_name}#"
29
+ end
30
+ end
31
+
32
+ # The name of the Module if it has one, otherwise #<Class:0xf00>.
33
+ #
34
+ # @return [String]
35
+ def nonblank_name
36
+ if name.to_s == ""
37
+ wrapped.inspect
38
+ else
39
+ name
40
+ end
41
+ end
42
+
43
+ # Is this a singleton class?
44
+ # @return [Boolean]
45
+ def singleton_class?
46
+ wrapped != wrapped.ancestors.first
47
+ end
48
+
49
+ # Get the instance associated with this singleton class.
50
+ #
51
+ # @raise ArgumentError: tried to get instance of non singleton class
52
+ #
53
+ # @return [Object]
54
+ def singleton_instance
55
+ raise ArgumentError, "tried to get instance of non singleton class" unless singleton_class?
56
+
57
+ if Helpers::BaseHelpers.jruby?
58
+ wrapped.to_java.attached
59
+ else
60
+ @singleton_instance ||= ObjectSpace.each_object(wrapped).detect{ |x| (class << x; self; end) == wrapped }
61
+ end
62
+ end
63
+
64
+ # Forward method invocations to the wrapped module
65
+ def method_missing(method_name, *args, &block)
66
+ wrapped.send(method_name, *args, &block)
67
+ end
68
+
69
+ def respond_to?(method_name)
70
+ super || wrapped.send(method_name, *args, &block)
71
+ end
72
+ end
73
+ end
data/man/pry.1 ADDED
@@ -0,0 +1,195 @@
1
+ .\" generated with Ronn/v0.7.3
2
+ .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
+ .
4
+ .TH "PRY" "1" "November 2011" "" ""
5
+ .
6
+ .SH "NAME"
7
+ \fBPRY\fR \- A Reference to the PRY repl\.
8
+ .
9
+ .SH "Synopsis"
10
+ \fBpry\fR [\fB\-\-version\fR] [\fB\-\-exec\fR] [\fB\-\-no\-pager\fR] [\fB\-\-no\-history\fR] [\fB\-\-no\-color\fR] [\fB\-f\fR] [\fB\-\-no\-plugins\fR] [\fB\-\-installed\-plugins\fR] [\fB\-\-simple\-prompt\fR] [\fB\-\-require\fR \fIfile\fR] [\fB\-I\fR] [\fB\-\-context\fR] [\fB\-\-help\fR]
11
+ .
12
+ .SH "DESCRIPTION"
13
+ Pry is a powerful alternative to the standard IRB shell for Ruby\. It is written from scratch to provide a number of advanced features\.
14
+ .
15
+ .SH "HOMEPAGE"
16
+ http://pry\.github\.com/
17
+ .
18
+ .SH "OPTIONS"
19
+ .
20
+ .TP
21
+ \fB\-v \-\-version\fR
22
+ Prints the version of Pry\.
23
+ .
24
+ .TP
25
+ \fB\-e \-\-exec\fR
26
+ Executes argument in context before the session starts\.
27
+ .
28
+ .TP
29
+ \fB\-\-no\-pager\fR
30
+ Disable pager for long output\.
31
+ .
32
+ .TP
33
+ \fB\-\-no\-history\fR
34
+ Disable history loading\.
35
+ .
36
+ .TP
37
+ \fB\-\-no\-color\fR
38
+ Disable syntax highlighting for session\.
39
+ .
40
+ .TP
41
+ \fB\-f\fR
42
+ Prevent loading of ~/\.pryrc for session\.
43
+ .
44
+ .TP
45
+ \fB\-\-no\-plugins\fR
46
+ Supress loading of plugins\.
47
+ .
48
+ .TP
49
+ \fB\-\-installed\-plugins\fR
50
+ List installed plugins\.
51
+ .
52
+ .TP
53
+ \fB\-\-simple\-prompt\fR
54
+ Enable simple prompt mode (eg, >>)\.
55
+ .
56
+ .TP
57
+ \fB\-r \-\-require\fR
58
+ Require a ruby script at startup\.
59
+ .
60
+ .TP
61
+ \fB\-I\fR
62
+ Add a path to the $LOAD_PATH
63
+ .
64
+ .TP
65
+ \fB\-c \-\-context\fR
66
+ Start the session in the specified context\. Equivalent to \fBcontext\.pry\fR in a session\.
67
+ .
68
+ .SH "FILES"
69
+ ~/\.pryrc Personal pry initialization
70
+ .
71
+ .SH "EXAMPLES"
72
+ .
73
+ .SS "Basic Usage"
74
+ .
75
+ .nf
76
+
77
+ $ pry
78
+ [1] pry(main)>4 + 5
79
+ => 9
80
+ [2] pry(main)> def hello_world
81
+ [2] pry(main)* puts "Hello, World!"
82
+ [2] pry(main)* end
83
+ => nil
84
+ [3] pry(main)> hello_world
85
+ Hello, World!
86
+ => nil
87
+ .
88
+ .fi
89
+ .
90
+ .SS "Command Line Interaction"
91
+ Prefix any command you want your shell to execute with a period and pry will return the results from your shell\.
92
+ .
93
+ .IP "" 4
94
+ .
95
+ .nf
96
+
97
+ [1] pry(main)> \.date
98
+ Fri Nov 11 09:52:07 EST 2011
99
+ .
100
+ .fi
101
+ .
102
+ .IP "" 0
103
+ .
104
+ .P
105
+ On the command line enter \fBshell\-mode\fR to incorporate the current working directory into the Pry prompt\.
106
+ .
107
+ .IP "" 4
108
+ .
109
+ .nf
110
+
111
+ pry(main)> shell\-mode
112
+ pry main:/Users/john/ruby/projects/pry $ \.cd \.\.
113
+ pry main:/Users/john/ruby/projects $ \.cd ~
114
+ pry main:/Users/john $ \.pwd
115
+ /Users/john
116
+ pry main:/Users/john $ shell\-mode
117
+ pry(main)>
118
+ .
119
+ .fi
120
+ .
121
+ .IP "" 0
122
+ .
123
+ .SS "State Navigation"
124
+ The cd command is used to move into a new object (or scope) inside a Pry session\. When inside the new scope it becomes the self for the session and all commands and methods will operate on this new self\.
125
+ .
126
+ .IP "" 4
127
+ .
128
+ .nf
129
+
130
+ pry(main)> self
131
+ => main
132
+ pry(main)> cd Pry
133
+ pry(Pry):1> self
134
+ => Pry
135
+ pry(Pry):1> cd \.\.
136
+ pry(main)>
137
+ .
138
+ .fi
139
+ .
140
+ .IP "" 0
141
+ .
142
+ .P
143
+ The ls command is essentially a unified wrapper to a number of Ruby\'s introspection mechanisms, including (but not limited to) the following methods: methods, instance_variables, constants, local_variables, instance_methods, class_variables and all the various permutations thereof\.
144
+ .
145
+ .P
146
+ By default typing ls will return a list of just the local and instance variables available in the current context\.
147
+ .
148
+ .IP "\(bu" 4
149
+ The \-M option selects public instance methods (if available)\.
150
+ .
151
+ .IP "\(bu" 4
152
+ The \-m option selects public methods\.
153
+ .
154
+ .IP "\(bu" 4
155
+ The \-c option selects constants\.
156
+ .
157
+ .IP "\(bu" 4
158
+ The \-i option select just instance variables\.
159
+ .
160
+ .IP "\(bu" 4
161
+ The \-l option selects just local variables\.
162
+ .
163
+ .IP "\(bu" 4
164
+ The \-s option modifies the \-c and \-m and \-M options to go up the superclass chain (excluding Object)\.
165
+ .
166
+ .IP "\(bu" 4
167
+ The \-\-grep REGEX prunes the list to items that match the regex\.
168
+ .
169
+ .IP "" 0
170
+ .
171
+ .SS "Source Browsing"
172
+ Simply typing show\-method method_name will pull the source for the method and display it with syntax highlighting\. You can also look up the source for multiple methods at the same time, by typing show\-method method1 method2\. As a convenience, Pry looks up both instance methods and class methods using this syntax, with priority given to instance methods\.
173
+ .
174
+ .IP "" 4
175
+ .
176
+ .nf
177
+
178
+ pry(Pry):1> show\-method rep
179
+
180
+ From: /Users/john/ruby/projects/pry/lib/pry/pry_instance\.rb @ line 191:
181
+ Number of lines: 6
182
+
183
+ def rep(target=TOPLEVEL_BINDING)
184
+ target = Pry\.binding_for(target)
185
+ result = re(target)
186
+
187
+ show_result(result) if should_print?
188
+ end
189
+ .
190
+ .fi
191
+ .
192
+ .IP "" 0
193
+ .
194
+ .SH "AUTHORS"
195
+ Pry is primarily the work of John Mair (banisterfiend)
data/man/pry.1.html ADDED
@@ -0,0 +1,204 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv='content-type' value='text/html;charset=utf8'>
5
+ <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
6
+ <title>PRY(1) - A Reference to the PRY repl.</title>
7
+ <style type='text/css' media='all'>
8
+ /* style: man */
9
+ body#manpage {margin:0}
10
+ .mp {max-width:100ex;padding:0 9ex 1ex 4ex}
11
+ .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
12
+ .mp h2 {margin:10px 0 0 0}
13
+ .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
14
+ .mp h3 {margin:0 0 0 4ex}
15
+ .mp dt {margin:0;clear:left}
16
+ .mp dt.flush {float:left;width:8ex}
17
+ .mp dd {margin:0 0 0 9ex}
18
+ .mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
19
+ .mp pre {margin-bottom:20px}
20
+ .mp pre+h2,.mp pre+h3 {margin-top:22px}
21
+ .mp h2+pre,.mp h3+pre {margin-top:5px}
22
+ .mp img {display:block;margin:auto}
23
+ .mp h1.man-title {display:none}
24
+ .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
25
+ .mp h2 {font-size:16px;line-height:1.25}
26
+ .mp h1 {font-size:20px;line-height:2}
27
+ .mp {text-align:justify;background:#fff}
28
+ .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
29
+ .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
30
+ .mp u {text-decoration:underline}
31
+ .mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
32
+ .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
33
+ .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
34
+ .mp b.man-ref {font-weight:normal;color:#434241}
35
+ .mp pre {padding:0 4ex}
36
+ .mp pre code {font-weight:normal;color:#434241}
37
+ .mp h2+pre,h3+pre {padding-left:0}
38
+ ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
39
+ ol.man-decor {width:100%}
40
+ ol.man-decor li.tl {text-align:left}
41
+ ol.man-decor li.tc {text-align:center;letter-spacing:4px}
42
+ ol.man-decor li.tr {text-align:right;float:right}
43
+ </style>
44
+ </head>
45
+ <!--
46
+ The following styles are deprecated and will be removed at some point:
47
+ div#man, div#man ol.man, div#man ol.head, div#man ol.man.
48
+
49
+ The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
50
+ .man-navigation should be used instead.
51
+ -->
52
+ <body id='manpage'>
53
+ <div class='mp' id='man'>
54
+
55
+ <div class='man-navigation' style='display:none'>
56
+ <a href="#NAME">NAME</a>
57
+ <a href="#Synopsis">Synopsis</a>
58
+ <a href="#DESCRIPTION">DESCRIPTION</a>
59
+ <a href="#HOMEPAGE">HOMEPAGE</a>
60
+ <a href="#OPTIONS">OPTIONS</a>
61
+ <a href="#FILES">FILES</a>
62
+ <a href="#EXAMPLES">EXAMPLES</a>
63
+ <a href="#AUTHORS">AUTHORS</a>
64
+ </div>
65
+
66
+ <ol class='man-decor man-head man head'>
67
+ <li class='tl'>PRY(1)</li>
68
+ <li class='tc'></li>
69
+ <li class='tr'>PRY(1)</li>
70
+ </ol>
71
+
72
+ <h2 id="NAME">NAME</h2>
73
+ <p class="man-name">
74
+ <code>PRY</code> - <span class="man-whatis">A Reference to the PRY repl.</span>
75
+ </p>
76
+
77
+ <h2 id="Synopsis">Synopsis</h2>
78
+
79
+ <p><code>pry</code> [<code>--version</code>] [<code>--exec</code>] [<code>--no-pager</code>] [<code>--no-history</code>] [<code>--no-color</code>] [<code>-f</code>] [<code>--no-plugins</code>] [<code>--installed-plugins</code>] [<code>--simple-prompt</code>] [<code>--require</code> <em>file</em>] [<code>-I</code>] [<code>--context</code>] [<code>--help</code>]</p>
80
+
81
+ <h2 id="DESCRIPTION">DESCRIPTION</h2>
82
+
83
+ <p>Pry is a powerful alternative to the standard IRB shell for Ruby. It is written from scratch to provide a number of advanced features.</p>
84
+
85
+ <h2 id="HOMEPAGE">HOMEPAGE</h2>
86
+
87
+ <p>http://pry.github.com/</p>
88
+
89
+ <h2 id="OPTIONS">OPTIONS</h2>
90
+
91
+ <dl>
92
+ <dt><code>-v --version</code></dt><dd><p>Prints the version of Pry.</p></dd>
93
+ <dt><code>-e --exec</code></dt><dd><p>Executes argument in context before the session starts.</p></dd>
94
+ <dt><code>--no-pager</code></dt><dd><p>Disable pager for long output.</p></dd>
95
+ <dt><code>--no-history</code></dt><dd><p>Disable history loading.</p></dd>
96
+ <dt><code>--no-color</code></dt><dd><p>Disable syntax highlighting for session.</p></dd>
97
+ <dt class="flush"><code>-f</code></dt><dd><p>Prevent loading of ~/.pryrc for session.</p></dd>
98
+ <dt><code>--no-plugins</code></dt><dd><p>Supress loading of plugins.</p></dd>
99
+ <dt><code>--installed-plugins</code></dt><dd><p>List installed plugins.</p></dd>
100
+ <dt><code>--simple-prompt</code></dt><dd><p>Enable simple prompt mode (eg, >>).</p></dd>
101
+ <dt><code>-r --require</code></dt><dd><p>Require a ruby script at startup.</p></dd>
102
+ <dt class="flush"><code>-I</code></dt><dd><p>Add a path to the $LOAD_PATH</p></dd>
103
+ <dt><code>-c --context</code></dt><dd><p>Start the session in the specified context. Equivalent to <code>context.pry</code> in a session.</p></dd>
104
+ </dl>
105
+
106
+
107
+ <h2 id="FILES">FILES</h2>
108
+
109
+ <p>~/.pryrc Personal pry initialization</p>
110
+
111
+ <h2 id="EXAMPLES">EXAMPLES</h2>
112
+
113
+ <h3 id="Basic-Usage">Basic Usage</h3>
114
+
115
+ <pre><code>$ pry
116
+ [1] pry(main)&gt;4 + 5
117
+ =&gt; 9
118
+ [2] pry(main)&gt; def hello_world
119
+ [2] pry(main)* puts "Hello, World!"
120
+ [2] pry(main)* end
121
+ =&gt; nil
122
+ [3] pry(main)&gt; hello_world
123
+ Hello, World!
124
+ =&gt; nil
125
+ </code></pre>
126
+
127
+ <h3 id="Command-Line-Interaction">Command Line Interaction</h3>
128
+
129
+ <p>Prefix any command you want your shell to execute with a period and pry will return the results from your shell.</p>
130
+
131
+ <pre><code>[1] pry(main)&gt; .date
132
+ Fri Nov 11 09:52:07 EST 2011
133
+ </code></pre>
134
+
135
+ <p>On the command line enter <code>shell-mode</code> to incorporate the current working directory into the Pry prompt.</p>
136
+
137
+ <pre><code>pry(main)&gt; shell-mode
138
+ pry main:/Users/john/ruby/projects/pry $ .cd ..
139
+ pry main:/Users/john/ruby/projects $ .cd ~
140
+ pry main:/Users/john $ .pwd
141
+ /Users/john
142
+ pry main:/Users/john $ shell-mode
143
+ pry(main)&gt;
144
+ </code></pre>
145
+
146
+ <h3 id="State-Navigation">State Navigation</h3>
147
+
148
+ <p>The cd command is used to move into a new object (or scope) inside a Pry session. When inside the new scope it becomes the self for the session and all commands and methods will operate on this new self.</p>
149
+
150
+ <pre><code>pry(main)&gt; self
151
+ =&gt; main
152
+ pry(main)&gt; cd Pry
153
+ pry(Pry):1&gt; self
154
+ =&gt; Pry
155
+ pry(Pry):1&gt; cd ..
156
+ pry(main)&gt;
157
+ </code></pre>
158
+
159
+ <p>The ls command is essentially a unified wrapper to a number of Ruby's introspection mechanisms, including (but not limited to) the following methods: methods, instance_variables, constants, local_variables, instance_methods, class_variables and all the various permutations thereof.</p>
160
+
161
+ <p>By default typing ls will return a list of just the local and instance variables available in the current context.</p>
162
+
163
+ <ul>
164
+ <li>The -M option selects public instance methods (if available).</li>
165
+ <li>The -m option selects public methods.</li>
166
+ <li>The -c option selects constants.</li>
167
+ <li>The -i option select just instance variables.</li>
168
+ <li>The -l option selects just local variables.</li>
169
+ <li>The -s option modifies the -c and -m and -M options to go up the superclass chain (excluding Object).</li>
170
+ <li>The --grep REGEX prunes the list to items that match the regex.</li>
171
+ </ul>
172
+
173
+
174
+ <h3 id="Source-Browsing">Source Browsing</h3>
175
+
176
+ <p>Simply typing show-method method_name will pull the source for the method and display it with syntax highlighting. You can also look up the source for multiple methods at the same time, by typing show-method method1 method2. As a convenience, Pry looks up both instance methods and class methods using this syntax, with priority given to instance methods.</p>
177
+
178
+ <pre><code>pry(Pry):1&gt; show-method rep
179
+
180
+ From: /Users/john/ruby/projects/pry/lib/pry/pry_instance.rb @ line 191:
181
+ Number of lines: 6
182
+
183
+ def rep(target=TOPLEVEL_BINDING)
184
+ target = Pry.binding_for(target)
185
+ result = re(target)
186
+
187
+ show_result(result) if should_print?
188
+ end
189
+ </code></pre>
190
+
191
+ <h2 id="AUTHORS">AUTHORS</h2>
192
+
193
+ <p>Pry is primarily the work of John Mair (banisterfiend)</p>
194
+
195
+
196
+ <ol class='man-decor man-foot man foot'>
197
+ <li class='tl'></li>
198
+ <li class='tc'>November 2011</li>
199
+ <li class='tr'>PRY(1)</li>
200
+ </ol>
201
+
202
+ </div>
203
+ </body>
204
+ </html>