ndd-url_checker 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/LICENSE.txt +18 -17
  4. data/README.md +14 -7
  5. data/lib/ndd/url_checker.rb +6 -0
  6. data/lib/ndd/url_checker/reporting_url_checker.rb +4 -0
  7. data/lib/ndd/url_checker/status.rb +1 -0
  8. data/lib/ndd/url_checker/status_decorator.rb +11 -0
  9. data/lib/ndd/url_checker/version.rb +5 -0
  10. metadata +9 -249
  11. data/.document +0 -5
  12. data/.rspec +0 -1
  13. data/.ruby-gemset +0 -1
  14. data/.ruby-version +0 -1
  15. data/.travis.yml +0 -16
  16. data/Gemfile +0 -50
  17. data/Gemfile.lock +0 -162
  18. data/Guardfile +0 -38
  19. data/Rakefile +0 -51
  20. data/VERSION +0 -1
  21. data/lib/ndd/url_checker/reporting_url_checker.csv.erb +0 -4
  22. data/lib/ndd/url_checker/reporting_url_checker.html.erb +0 -188
  23. data/lib/ndd/url_checker/reporting_url_checker.json.erb +0 -27
  24. data/ndd-url_checker.gemspec +0 -134
  25. data/spec/ndd/url_checker/abstract_url_checker_spec.rb +0 -11
  26. data/spec/ndd/url_checker/blocking_url_checker_spec.rb +0 -12
  27. data/spec/ndd/url_checker/forked_url_checker_spec.rb +0 -12
  28. data/spec/ndd/url_checker/parallel_url_checker_spec.rb +0 -62
  29. data/spec/ndd/url_checker/reporting_url_checker/custom.txt.erb +0 -8
  30. data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.csv +0 -6
  31. data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.html +0 -246
  32. data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.json +0 -49
  33. data/spec/ndd/url_checker/reporting_url_checker/multiple_urls.txt +0 -26
  34. data/spec/ndd/url_checker/reporting_url_checker/single_url.csv +0 -2
  35. data/spec/ndd/url_checker/reporting_url_checker/single_url.html +0 -182
  36. data/spec/ndd/url_checker/reporting_url_checker/single_url.json +0 -25
  37. data/spec/ndd/url_checker/reporting_url_checker/single_url.txt +0 -6
  38. data/spec/ndd/url_checker/reporting_url_checker_spec.rb +0 -131
  39. data/spec/ndd/url_checker/status_decorator_spec.rb +0 -208
  40. data/spec/ndd/url_checker/status_spec.rb +0 -510
  41. data/spec/ndd/url_checker/threaded_url_checker_spec.rb +0 -13
  42. data/spec/spec_helper.rb +0 -81
  43. data/spec/support/multiple_url_checker_spec.rb +0 -58
  44. data/spec/support/single_url_checker_spec.rb +0 -252
@@ -1,27 +0,0 @@
1
- {
2
- "benchmark": {
3
- "total_duration": <%= benchmark.total_duration %>,
4
- "average_duration": <%= benchmark.average_duration %>,
5
- "average_throughput": <%= benchmark.average_throughput %>
6
- },
7
- "statistics": {
8
- "count": <%= urls.count %>,
9
- "valid_count": <%= urls.valid_count %>,
10
- "direct_count": <%= urls.direct_count %>,
11
- "redirected_count": <%= urls.redirected_count %>,
12
- "invalid_count": <%= urls.invalid_count %>,
13
- "failed_count": <%= urls.failed_count %>,
14
- "too_many_redirects_count": <%= urls.too_many_redirects_count %>,
15
- "unknown_host_count": <%= urls.unknown_host_count %>
16
- },
17
- "results": [
18
- <% statuses.each_with_index do |status, index| %>
19
- {
20
- "index": <%= index+1 %>,
21
- "url": "<%= status.uri %>",
22
- "code": "<%= status.code %>",
23
- "details": "<% if status.invalid? %><%= status.error %><% end %>"
24
- }<% if index < statuses.size - 1 %>,<% end %>
25
- <% end %>
26
- ]
27
- }
@@ -1,134 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
- # stub: ndd-url_checker 0.3.2 ruby lib
6
-
7
- Gem::Specification.new do |s|
8
- s.name = "ndd-url_checker"
9
- s.version = "0.3.2"
10
-
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
- s.authors = ["David DIDIER"]
14
- s.date = "2016-01-08"
15
- s.description = "Validate URLs"
16
- s.email = "c_inconnu2@yahoo.fr"
17
- s.extra_rdoc_files = [
18
- "LICENSE.txt",
19
- "README.md"
20
- ]
21
- s.files = [
22
- ".document",
23
- ".rspec",
24
- ".ruby-gemset",
25
- ".ruby-version",
26
- ".travis.yml",
27
- "CHANGELOG.md",
28
- "Gemfile",
29
- "Gemfile.lock",
30
- "Guardfile",
31
- "LICENSE.txt",
32
- "README.md",
33
- "Rakefile",
34
- "VERSION",
35
- "lib/ndd/url_checker.rb",
36
- "lib/ndd/url_checker/abstract_url_checker.rb",
37
- "lib/ndd/url_checker/blocking_url_checker.rb",
38
- "lib/ndd/url_checker/forked_url_checker.rb",
39
- "lib/ndd/url_checker/parallel_url_checker.rb",
40
- "lib/ndd/url_checker/reporting_url_checker.csv.erb",
41
- "lib/ndd/url_checker/reporting_url_checker.html.erb",
42
- "lib/ndd/url_checker/reporting_url_checker.json.erb",
43
- "lib/ndd/url_checker/reporting_url_checker.rb",
44
- "lib/ndd/url_checker/status.rb",
45
- "lib/ndd/url_checker/status_decorator.rb",
46
- "lib/ndd/url_checker/threaded_url_checker.rb",
47
- "ndd-url_checker.gemspec",
48
- "spec/ndd/url_checker/abstract_url_checker_spec.rb",
49
- "spec/ndd/url_checker/blocking_url_checker_spec.rb",
50
- "spec/ndd/url_checker/forked_url_checker_spec.rb",
51
- "spec/ndd/url_checker/parallel_url_checker_spec.rb",
52
- "spec/ndd/url_checker/reporting_url_checker/custom.txt.erb",
53
- "spec/ndd/url_checker/reporting_url_checker/multiple_urls.csv",
54
- "spec/ndd/url_checker/reporting_url_checker/multiple_urls.html",
55
- "spec/ndd/url_checker/reporting_url_checker/multiple_urls.json",
56
- "spec/ndd/url_checker/reporting_url_checker/multiple_urls.txt",
57
- "spec/ndd/url_checker/reporting_url_checker/single_url.csv",
58
- "spec/ndd/url_checker/reporting_url_checker/single_url.html",
59
- "spec/ndd/url_checker/reporting_url_checker/single_url.json",
60
- "spec/ndd/url_checker/reporting_url_checker/single_url.txt",
61
- "spec/ndd/url_checker/reporting_url_checker_spec.rb",
62
- "spec/ndd/url_checker/status_decorator_spec.rb",
63
- "spec/ndd/url_checker/status_spec.rb",
64
- "spec/ndd/url_checker/threaded_url_checker_spec.rb",
65
- "spec/spec_helper.rb",
66
- "spec/support/multiple_url_checker_spec.rb",
67
- "spec/support/single_url_checker_spec.rb"
68
- ]
69
- s.homepage = "http://github.com/ddidier/ndd-url_checker"
70
- s.licenses = ["MIT"]
71
- s.rubygems_version = "2.5.0"
72
- s.summary = "Validate URLs"
73
-
74
- if s.respond_to? :specification_version then
75
- s.specification_version = 4
76
-
77
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
78
- s.add_runtime_dependency(%q<cod>, ["~> 0.6"])
79
- s.add_runtime_dependency(%q<logging>, ["~> 1.8"])
80
- s.add_development_dependency(%q<bundler>, ["~> 1.7"])
81
- s.add_development_dependency(%q<guard>, ["~> 2.13"])
82
- s.add_development_dependency(%q<guard-bundler>, ["~> 2.0"])
83
- s.add_development_dependency(%q<guard-rspec>, ["~> 4.6"])
84
- s.add_development_dependency(%q<guard-spork>, ["~> 2.0"])
85
- s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
86
- s.add_development_dependency(%q<rdoc>, ["~> 4.1"])
87
- s.add_development_dependency(%q<rspec>, ["~> 3.3"])
88
- s.add_development_dependency(%q<rspec-collection_matchers>, ["~> 1.1"])
89
- s.add_development_dependency(%q<simplecov>, ["~> 0.9"])
90
- s.add_development_dependency(%q<spork>, ["~> 0.9"])
91
- s.add_development_dependency(%q<webmock>, ["~> 1.20"])
92
- s.add_development_dependency(%q<yard>, ["~> 0.8"])
93
- s.add_development_dependency(%q<libnotify>, [">= 0"])
94
- s.add_development_dependency(%q<rb-inotify>, [">= 0"])
95
- else
96
- s.add_dependency(%q<cod>, ["~> 0.6"])
97
- s.add_dependency(%q<logging>, ["~> 1.8"])
98
- s.add_dependency(%q<bundler>, ["~> 1.7"])
99
- s.add_dependency(%q<guard>, ["~> 2.13"])
100
- s.add_dependency(%q<guard-bundler>, ["~> 2.0"])
101
- s.add_dependency(%q<guard-rspec>, ["~> 4.6"])
102
- s.add_dependency(%q<guard-spork>, ["~> 2.0"])
103
- s.add_dependency(%q<jeweler>, ["~> 2.0"])
104
- s.add_dependency(%q<rdoc>, ["~> 4.1"])
105
- s.add_dependency(%q<rspec>, ["~> 3.3"])
106
- s.add_dependency(%q<rspec-collection_matchers>, ["~> 1.1"])
107
- s.add_dependency(%q<simplecov>, ["~> 0.9"])
108
- s.add_dependency(%q<spork>, ["~> 0.9"])
109
- s.add_dependency(%q<webmock>, ["~> 1.20"])
110
- s.add_dependency(%q<yard>, ["~> 0.8"])
111
- s.add_dependency(%q<libnotify>, [">= 0"])
112
- s.add_dependency(%q<rb-inotify>, [">= 0"])
113
- end
114
- else
115
- s.add_dependency(%q<cod>, ["~> 0.6"])
116
- s.add_dependency(%q<logging>, ["~> 1.8"])
117
- s.add_dependency(%q<bundler>, ["~> 1.7"])
118
- s.add_dependency(%q<guard>, ["~> 2.13"])
119
- s.add_dependency(%q<guard-bundler>, ["~> 2.0"])
120
- s.add_dependency(%q<guard-rspec>, ["~> 4.6"])
121
- s.add_dependency(%q<guard-spork>, ["~> 2.0"])
122
- s.add_dependency(%q<jeweler>, ["~> 2.0"])
123
- s.add_dependency(%q<rdoc>, ["~> 4.1"])
124
- s.add_dependency(%q<rspec>, ["~> 3.3"])
125
- s.add_dependency(%q<rspec-collection_matchers>, ["~> 1.1"])
126
- s.add_dependency(%q<simplecov>, ["~> 0.9"])
127
- s.add_dependency(%q<spork>, ["~> 0.9"])
128
- s.add_dependency(%q<webmock>, ["~> 1.20"])
129
- s.add_dependency(%q<yard>, ["~> 0.8"])
130
- s.add_dependency(%q<libnotify>, [">= 0"])
131
- s.add_dependency(%q<rb-inotify>, [">= 0"])
132
- end
133
- end
134
-
@@ -1,11 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe NDD::UrlChecker::AbstractUrlChecker do
4
-
5
- context '#check' do
6
- it 'is not implemented' do
7
- expect { subject.check('http://www.valid.mock/') }.to raise_error /must be implemented/
8
- end
9
- end
10
-
11
- end
@@ -1,12 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe NDD::UrlChecker::BlockingUrlChecker do
4
-
5
- before(:all) do
6
- # Logging.logger.root.level = :debug
7
- end
8
-
9
- it_behaves_like 'a single URL checker'
10
- it_behaves_like 'a multiple URL checker'
11
-
12
- end
@@ -1,12 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe NDD::UrlChecker::ForkedUrlChecker do
4
-
5
- before(:all) do
6
- # Logging.logger.root.level = :debug
7
- end
8
-
9
- it_behaves_like 'a single URL checker'
10
- it_behaves_like 'a multiple URL checker', skip_verify = true
11
-
12
- end
@@ -1,62 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe NDD::UrlChecker::ParallelUrlChecker do
4
-
5
- before(:all) do
6
- # Logging.logger.root.level = :debug
7
- end
8
-
9
- # ---------------------------------------------------------------------------------------------------------- MRI -----
10
- context 'when running MRI' do
11
-
12
- before(:all) do
13
- @old_engine = RUBY_ENGINE
14
- silence_warnings { RUBY_ENGINE = 'ruby' }
15
- end
16
-
17
- describe '#initialize' do
18
- it 'delegates to a ForkedUrlChecker instance' do
19
- expect(NDD::UrlChecker::ParallelUrlChecker.new.delegate).to be_a NDD::UrlChecker::ForkedUrlChecker
20
- end
21
- end
22
-
23
- it_behaves_like 'a single URL checker'
24
-
25
- after(:all) do
26
- silence_warnings { RUBY_ENGINE = @old_engine }
27
- end
28
- end
29
-
30
- # -------------------------------------------------------------------------------------------------------- JRuby -----
31
- context 'when running JRuby' do
32
- before(:all) do
33
- @old_engine = RUBY_ENGINE
34
- silence_warnings { RUBY_ENGINE = 'jruby' }
35
- end
36
-
37
- describe '#initialize' do
38
- it 'delegates to a ThreadedUrlChecker instance' do
39
- expect(NDD::UrlChecker::ParallelUrlChecker.new.delegate).to be_a NDD::UrlChecker::ThreadedUrlChecker
40
- end
41
- end
42
-
43
- # TODO
44
- # it_behaves_like 'a single URL checker'
45
-
46
- after(:all) do
47
- silence_warnings { RUBY_ENGINE = @old_engine }
48
- end
49
- end
50
-
51
-
52
- # ------------------------------------------------------------------------------------------------------ private -----
53
- private
54
-
55
- def silence_warnings(&block)
56
- warn_level = $VERBOSE
57
- $VERBOSE = nil
58
- result = block.call
59
- $VERBOSE = warn_level
60
- result
61
- end
62
- end
@@ -1,8 +0,0 @@
1
- count = <%= statuses.size %>
2
-
3
- <% statuses.each_with_index do |status, index| %>
4
- - index = <%= index+1 %>
5
- - uri = <%= status.uri %>
6
- - valid = <%= status.valid? %>
7
- - code = <%= status.code %>
8
- <% end %>
@@ -1,6 +0,0 @@
1
- Index,URL,Result,Code,Details
2
- 1,http://www.google.com,valid,redirected,
3
- 2,http://www.google.de,invalid,failed,some error
4
- 3,http://www.google.es,invalid,too_many_redirects,
5
- 4,http://www.google.fr,valid,direct,
6
- 5,http://www.google.it,invalid,unknown_host,
@@ -1,246 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
-
4
- <head>
5
- <meta charset="UTF-8" />
6
-
7
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" />
8
- <style type="text/css">
9
- .popover-title {
10
- font-weight: bold;
11
- }
12
-
13
- .popover-content em {
14
- font-style: normal;
15
- font-weight: bold;
16
- }
17
-
18
- .popover-content ol {
19
- margin-left: -20px;
20
- }
21
- </style>
22
-
23
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
24
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
25
- <script language="JavaScript">
26
- if (!window.ndd_url_checker) {
27
- window.ndd_url_checker = {};
28
- }
29
-
30
- ndd_url_checker.STATES = ['direct', 'redirected', 'failed', 'too-many-redirects', 'unknown-host'];
31
-
32
- ndd_url_checker.displayStates = function () {
33
- var displayStates = {};
34
- $.each(ndd_url_checker.STATES, function (_, state) {
35
- var checked = $('.display-' + state).is(':checked');
36
- displayStates[state] = checked;
37
- });
38
- return displayStates;
39
- }
40
-
41
- ndd_url_checker.filter = function () {
42
- var displayStates = ndd_url_checker.displayStates();
43
-
44
- $.each(displayStates, function (state, display) {
45
- $('.result-' + state).toggle(display);
46
- });
47
- }
48
-
49
- $(document).ready(function () {
50
- // show or hide results depending on their state
51
- $.each(ndd_url_checker.STATES, function (_, state) {
52
- $('.display-' + state).change(function () {
53
- ndd_url_checker.filter();
54
- });
55
- });
56
-
57
- // activate all tooltips
58
- $('[data-toggle="popover"]')
59
- .popover()
60
- .click(function (e) {
61
- e.preventDefault();
62
- });
63
- });
64
- </script>
65
- </head>
66
-
67
-
68
- <body>
69
-
70
- <div class="container">
71
-
72
- <div class="page-header">
73
- <h1>
74
- <span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span>
75
- URL Checker Report
76
- </h1>
77
- </div>
78
-
79
-
80
- <div class="row">
81
- <div class="col-md-4">
82
- <dl class="page-info dl-horizontal">
83
- <dt>Number of URLs</dt>
84
- <dd>5</dd>
85
- <dt>Duration</dt>
86
- <dd>123.456 s</dd>
87
- <dt>Average duration</dt>
88
- <dd>123.456 s/URL</dd>
89
- <dt>Average throughput</dt>
90
- <dd>123.456 URL/s</dd>
91
- </dl>
92
- </div>
93
- <div class="col-md-4">
94
- <dl class="page-info dl-horizontal">
95
- <dt>Valid URLS</dt>
96
- <dd>2</dd>
97
- <dt>direct</dt>
98
- <dd>1</dd>
99
- <dt>redirected</dt>
100
- <dd>1</dd>
101
- </dl>
102
- </div>
103
- <div class="col-md-4">
104
- <dl class="page-info dl-horizontal">
105
- <dt>Invalid URLS</dt>
106
- <dd>3</dd>
107
- <dt>failed</dt>
108
- <dd>1</dd>
109
- <dt>too many redirects</dt>
110
- <dd>1</dd>
111
- <dt>unknown host</dt>
112
- <dd>1</dd>
113
- </dl>
114
- </div>
115
- </div>
116
- <hr />
117
-
118
-
119
- <div class="row page-controls hidden-print">
120
- <div class="col-md-6">
121
- <span>Valid URLs:</span>
122
-
123
- <div class="btn-group page-display" data-toggle="buttons">
124
- <label class="btn btn-default active">
125
- <input type="checkbox" autocomplete="off" class="display-direct" checked="true" />
126
- Direct (1)
127
- </label>
128
- <label class="btn btn-default active">
129
- <input type="checkbox" autocomplete="off" class="display-redirected" checked="true" />
130
- Redirected (1)
131
- </label>
132
- </div>
133
- </div>
134
- <div class="col-md-6">
135
- <span>Invalid URLs:</span>
136
-
137
- <div class="btn-group page-display" data-toggle="buttons">
138
- <label class="btn btn-default active">
139
- <input type="checkbox" autocomplete="off" class="display-failed" checked="true" />
140
- Failed (1)
141
- </label>
142
- <label class="btn btn-default active">
143
- <input type="checkbox" autocomplete="off" class="display-too-many-redirects" checked="true" />
144
- Too many redirects (1)
145
- </label>
146
- <label class="btn btn-default active">
147
- <input type="checkbox" autocomplete="off" class="display-unknown-host" checked="true" />
148
- Unknown host (1)
149
- </label>
150
- </div>
151
- </div>
152
- </div>
153
- <hr />
154
-
155
-
156
- <table id="results" class="table table-condensed table-hover">
157
- <thead>
158
- <tr>
159
- <th>#</th>
160
- <th>URL</th>
161
- <th>Code</th>
162
- <th>Details</th>
163
- </tr>
164
- </thead>
165
- <tbody>
166
-
167
- <tr class="result result-redirected ">
168
- <td>1</td>
169
- <td><a href="http://www.google.com" target="_blank">http://www.google.com</a></td>
170
- <td>redirected</td>
171
- <td>1</td>
172
- <td>
173
- <a href="#" data-toggle="popover" data-placement="left" data-trigger="focus"
174
- data-html="true" title="http://www.google.com" data-content="<p><em>Status:</em> redirected</p>
175
- <p><em>URIs:</em><p>
176
- <ol><li>http://www.google.com</li><li>http://www.google.fr</li></ol>
177
- ">
178
- <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
179
- </a>
180
- </td>
181
- </tr>
182
-
183
- <tr class="result result-failed danger">
184
- <td>2</td>
185
- <td><a href="http://www.google.de" target="_blank">http://www.google.de</a></td>
186
- <td>failed</td>
187
- <td>StandardError</td>
188
- <td>
189
- <a href="#" data-toggle="popover" data-placement="left" data-trigger="focus"
190
- data-html="true" title="http://www.google.de" data-content="<p><em>Status:</em> failed</p>
191
- <p><em>URIs:</em><p>
192
- <ol><li>http://www.google.de</li></ol>
193
- <p><em>Error:</em> StandardError</p>">
194
- <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
195
- </a>
196
- </td>
197
- </tr>
198
-
199
- <tr class="result result-too-many-redirects danger">
200
- <td>3</td>
201
- <td><a href="http://www.google.es" target="_blank">http://www.google.es</a></td>
202
- <td>too_many_redirects</td>
203
- <td>1</td>
204
- <td>
205
- <a href="#" data-toggle="popover" data-placement="left" data-trigger="focus"
206
- data-html="true" title="http://www.google.es" data-content="<p><em>Status:</em> too_many_redirects</p>
207
- <p><em>URIs:</em><p>
208
- <ol><li>http://www.google.es</li><li>http://www.google.fr</li></ol>
209
- ">
210
- <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
211
- </a>
212
- </td>
213
- </tr>
214
-
215
- <tr class="result result-direct ">
216
- <td>4</td>
217
- <td><a href="http://www.google.fr" target="_blank">http://www.google.fr</a></td>
218
- <td>direct</td>
219
- <td></td>
220
- <td>
221
- </td>
222
- </tr>
223
-
224
- <tr class="result result-unknown-host danger">
225
- <td>5</td>
226
- <td><a href="http://www.google.it" target="_blank">http://www.google.it</a></td>
227
- <td>unknown_host</td>
228
- <td>http://www.google.it</td>
229
- <td>
230
- <a href="#" data-toggle="popover" data-placement="left" data-trigger="focus"
231
- data-html="true" title="http://www.google.it" data-content="<p><em>Status:</em> unknown_host</p>
232
- <p><em>URIs:</em><p>
233
- <ol><li>http://www.google.it</li></ol>
234
- ">
235
- <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
236
- </a>
237
- </td>
238
- </tr>
239
-
240
- </tbody>
241
- </table>
242
-
243
- </div>
244
-
245
- </body>
246
- </html>