markio 0.0.2 → 0.0.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.
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
data/README.md CHANGED
@@ -21,9 +21,12 @@ Or install it yourself as:
21
21
 
22
22
  bookmarks = Markio::parse('/path/to/bookmarks.html')
23
23
  bookmarks.each do |b|
24
- b.title # String with bookmark title
25
- b.href # String with bookmark URL
26
- b.folders # Array of strings - folders (tags)
24
+ b.title # String
25
+ b.href # String with bookmark URL
26
+ b.folders # Array of strings - folders (tags)
27
+ b.add_date # DateTime
28
+ b.last_visit # DateTime
29
+ b.last_modified # DateTime
27
30
  end
28
31
 
29
32
  ## Contributing
@@ -1,9 +1,9 @@
1
1
  require "markio/version"
2
2
  require "markio/bookmark"
3
3
  require "markio/parser"
4
+ require "markio/builder"
4
5
  module Markio
5
- def Markio.parse(file)
6
- parser = Markio::Parser.new file
7
- parser.parse
6
+ def self.parse(data)
7
+ Parser.new(data).parse
8
8
  end
9
9
  end
@@ -1,3 +1,22 @@
1
+ require 'date'
1
2
  class Markio::Bookmark
3
+
2
4
  attr_accessor :title, :href, :add_date, :last_visit, :last_modified, :folders
3
- end
5
+
6
+ def self.create data
7
+ bookmark = new
8
+ bookmark.title = data[:title]
9
+ bookmark.href = data[:href]
10
+ bookmark.add_date = data[:add_date] || DateTime.now
11
+ bookmark.last_visit = data[:add_date]
12
+ bookmark.last_modified = data[:last_modified]
13
+ bookmark.folders = data[:folders] || []
14
+ bookmark
15
+ end
16
+
17
+ def == other
18
+ unless other.nil? or other.class != self.class
19
+ other.href == href
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,51 @@
1
+ require 'nokogiri'
2
+
3
+ class Markio::Builder
4
+
5
+ attr_accessor :bookmarks
6
+
7
+ def initialize(options = {})
8
+ @title = options[:title] || 'Bookmarks'
9
+ @bookmarks = []
10
+ end
11
+
12
+ def build_string
13
+ build
14
+ end
15
+
16
+ def build_file(file)
17
+ File.new(file, 'w') do |f|
18
+ f.write build
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def build
25
+
26
+ docparts = Nokogiri::HTML::DocumentFragment.parse ''
27
+ Nokogiri::HTML::Builder.with(docparts) do |html|
28
+ html.comment <<END
29
+ This is an automatically generated file.
30
+ It will be read and overwritten.
31
+ DO NOT EDIT!
32
+ END
33
+ html.meta('HTTP-EQUIV' => 'Content-Type', 'CONTENT' => 'text/html; charset=UTF-8')
34
+ html.title @title
35
+ html.dl {
36
+ html.p
37
+ @bookmarks.each do |b|
38
+ html.dt {
39
+ params = { :href => b.href }
40
+ params[:add_date] = b.add_date.to_time.to_i if b.add_date
41
+ params[:last_visit] = b.last_visit.to_time.to_i if b.last_visit
42
+ params[:last_modified] = b.last_modified.to_time.to_i if b.last_modified
43
+ html.a(b.title, params)
44
+ }
45
+ end
46
+ }
47
+ end
48
+
49
+ "<!DOCTYPE NETSCAPE-Bookmark-file-1>\n" << docparts.to_html
50
+ end
51
+ end
@@ -1,58 +1,59 @@
1
1
  require 'nokogiri'
2
2
  require 'date'
3
- class Markio::Parser
3
+ module Markio
4
+ class Parser
4
5
 
5
- def initialize(file)
6
- file = File.open(file) unless file.is_a? File
7
- @document = Nokogiri::HTML(file)
8
- end
6
+ def initialize data
7
+ @document = Nokogiri::HTML data
8
+ end
9
9
 
10
- def parse
11
- bookmarks = []
12
- traverse(@document, []) do |bookmark|
13
- bookmarks << bookmark
10
+ def parse
11
+ bookmarks = []
12
+ traverse(@document, []) do |bookmark|
13
+ bookmarks << bookmark
14
+ end
15
+ bookmarks
14
16
  end
15
- bookmarks
16
- end
17
17
 
18
- private
19
-
20
- def traverse(node, folders, &block)
21
- node.xpath("./*").each do |child|
22
- case child.name.downcase
23
- when 'dl'
24
- traverse child, folders, &block
25
- folders.pop
26
- when 'a'
27
- yield parse_bookmark(child, folders)
28
- when 'h3'
29
- folders << child.text
30
- else
31
- if child.children.any?
18
+ private
19
+
20
+ def traverse node, folders, &block
21
+ node.xpath("./*").each do |child|
22
+ case child.name.downcase
23
+ when 'dl'
32
24
  traverse child, folders, &block
33
- end
25
+ folders.pop
26
+ when 'a'
27
+ yield parse_bookmark(child, folders)
28
+ when 'h3'
29
+ folders << child.text
30
+ else
31
+ if child.children.any?
32
+ traverse child, folders, &block
33
+ end
34
+ end
34
35
  end
36
+
35
37
  end
36
38
 
37
- end
39
+ def parse_bookmark(node, folders)
40
+ data = {}
41
+ node.attributes.each do |k, a|
42
+ data[k.downcase] = a.value
43
+ end
44
+ bookmark = Bookmark.new
45
+ bookmark.href = data['href']
46
+ bookmark.title = node.text
47
+ bookmark.folders = Array.new folders
48
+ bookmark.add_date = parse_timestamp data['add_date']
49
+ bookmark.last_visit = parse_timestamp data['last_visit']
50
+ bookmark.last_modified = parse_timestamp data['last_modified']
51
+ bookmark
52
+ end
38
53
 
39
- def parse_bookmark(node, folders)
40
- data = {}
41
- node.attributes.each do |k, a|
42
- data[k.downcase] = a.value
54
+ def parse_timestamp(timestamp)
55
+ Time.at(timestamp.to_i).to_datetime if timestamp
43
56
  end
44
- bookmark = Markio::Bookmark.new
45
- bookmark.href = data['href']
46
- bookmark.title = node.text
47
- bookmark.folders = Array.new folders
48
- bookmark.add_date = parse_timestamp data['add_date']
49
- bookmark.last_visit = parse_timestamp data['last_visit']
50
- bookmark.last_modified = parse_timestamp data['last_modified']
51
- bookmark
52
- end
53
57
 
54
- def parse_timestamp(timestamp)
55
- Time.at(timestamp.to_i).to_datetime if timestamp
56
58
  end
57
-
58
59
  end
@@ -1,3 +1,3 @@
1
1
  module Markio
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -20,5 +20,6 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency 'nokogiri'
21
21
  gem.add_development_dependency 'rspec', '~> 2.11'
22
22
  gem.add_development_dependency 'pry-nav'
23
+ gem.add_development_dependency 'guard-rspec'
23
24
 
24
25
  end
@@ -0,0 +1,11 @@
1
+ This archive contains a snapshot release of MacVim 7.3. It requires
2
+ Mac OS X 10.8 (Mountain Lion) or later. It will NOT run on earlier versions of
3
+ Mac OS X!
4
+
5
+ To install, drag the MacVim icon into the Applications folder.
6
+
7
+ For usage instructions, please start MacVim and type ":h macvim" (without the
8
+ quotes).
9
+
10
+ This archive also contains the script "mvim" which can be used to start MacVim
11
+ from Terminal. Type ":h mvim" in MacVim for help on how to install it.
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'date'
3
+
4
+ module Markio
5
+ describe Builder do
6
+ it 'should build empty bookmarks' do
7
+ builder = Builder.new
8
+ file_contents = builder.build_string
9
+ file_contents.length.should_not be_nil
10
+ file_contents.should match "DOCTYPE NETSCAPE-Bookmark-file-1"
11
+ end
12
+
13
+ it 'should build single bookmark without tags' do
14
+ builder = Builder.new
15
+ builder.bookmarks << Bookmark.create({
16
+ :title => "Test bookmark",
17
+ :href => "http://test.com",
18
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
19
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
20
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
21
+ })
22
+ file_contents = builder.build_string
23
+ file_contents.length.should_not be_nil
24
+ file_contents.should match "Test bookmark"
25
+ file_contents.should match "test\.com"
26
+ file_contents.should match "add_date"
27
+ file_contents.should match "last_visit"
28
+ file_contents.should match "last_modified"
29
+ end
30
+
31
+
32
+ it 'should be able to parse what it builds' do
33
+ builder = Builder.new
34
+ builder.bookmarks << Bookmark.create({
35
+ :title => "Test bookmark",
36
+ :href => "http://test.com"
37
+ })
38
+ builder.bookmarks << Bookmark.create({
39
+ :title => "Test bookmark",
40
+ :href => "http://test.com",
41
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
42
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
43
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
44
+ })
45
+ file_contents = builder.build_string
46
+ bookmarks = Markio.parse file_contents
47
+ bookmarks.length.should eq builder.bookmarks.length
48
+ bookmarks.each do |b|
49
+ builder.bookmarks.should include b
50
+ end
51
+ end
52
+
53
+ it 'should be reflexive' do
54
+ builder = Builder.new
55
+ builder.bookmarks << Bookmark.create({
56
+ :title => "Test bookmark",
57
+ :href => "http://test.com"
58
+ })
59
+ builder.bookmarks << Bookmark.create({
60
+ :title => "Test bookmark",
61
+ :href => "http://test.com",
62
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
63
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
64
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
65
+ })
66
+ file_contents = builder.build_string
67
+ bookmarks = Markio.parse file_contents
68
+ builder = Builder.new
69
+ builder.bookmarks = bookmarks
70
+ builder.build_string.should eq file_contents
71
+ end
72
+ end
73
+ end
@@ -1,38 +1,49 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe 'parser' do
4
- it 'should parse single bookmark' do
5
- bookmarks = Markio.parse("spec/test_data/one_bookmark.html")
6
-
7
- bookmarks.should_not be_nil
8
- bookmarks.class.should be Array
9
- bookmarks.length.should eq 1
10
- bookmark = bookmarks[0]
11
- bookmark.title.should eq 'Save It - Simple, secure bookmarks'
12
- bookmark.href.should eq 'https://saveit.in/'
13
- bookmark.folders.length.should eq 0
14
- bookmark.add_date.should_not be_nil
15
- bookmark.last_visit.should_not be_nil
16
- bookmark.last_modified.should_not be_nil
17
- bookmark.add_date.class.should be DateTime
18
- bookmark.last_visit.class.should be DateTime
19
- bookmark.last_modified.class.should be DateTime
20
- end
3
+ module Markio
4
+ describe Parser do
5
+ it 'should parse single bookmark' do
6
+ bookmarks = Markio.parse File.open "spec/assets/one_bookmark.html"
21
7
 
22
- it 'should parse multiple bookmarks' do
23
- bookmarks = Markio.parse("spec/test_data/many_bookmarks.html")
24
- bookmarks.length.should eq 11
25
- bookmarks.first.folders.length.should eq 1
26
- bookmarks.first.folders.first.should eq "Bookmarks Bar"
27
- bookmarks.last.folders.length.should eq 2
28
- end
8
+ bookmarks.should_not be_nil
9
+ bookmarks.class.should be Array
10
+ bookmarks.length.should eq 1
11
+ bookmark = bookmarks[0]
12
+ bookmark.title.should eq 'Save It - Simple, secure bookmarks'
13
+ bookmark.href.should eq 'https://saveit.in/'
14
+ bookmark.folders.length.should eq 0
15
+ bookmark.add_date.should_not be_nil
16
+ bookmark.last_visit.should_not be_nil
17
+ bookmark.last_modified.should_not be_nil
18
+ bookmark.add_date.class.should be DateTime
19
+ bookmark.last_visit.class.should be DateTime
20
+ bookmark.last_modified.class.should be DateTime
21
+ end
29
22
 
30
- it 'should parse nested bookmarks' do
31
- bookmarks = Markio.parse("spec/test_data/nested_bookmarks.html")
23
+ it 'should parse multiple bookmarks' do
24
+ bookmarks = Markio.parse File.open "spec/assets/many_bookmarks.html"
25
+ bookmarks.length.should eq 11
26
+ bookmarks.first.folders.length.should eq 1
27
+ bookmarks.first.folders.first.should eq "Bookmarks Bar"
28
+ bookmarks.last.folders.length.should eq 2
29
+ end
32
30
 
33
- bookmarks.length.should eq 10
34
- bookmarks.first.folders.length.should eq 0
35
- bookmarks.last.folders.length.should eq 2
36
- end
31
+ it 'should parse nested bookmarks' do
32
+ bookmarks = Markio.parse File.open "spec/assets/nested_bookmarks.html"
33
+
34
+ bookmarks.length.should eq 10
35
+ bookmarks.first.folders.length.should eq 0
36
+ bookmarks.last.folders.length.should eq 2
37
+ end
37
38
 
38
- end
39
+ it 'should raise error for non existing files' do
40
+ expect { Markio.parse File.open "spec/assets/not_found.html" }.to raise_error
41
+ end
42
+
43
+ it 'should handle corrupted data' do
44
+ bookmarks = Markio.parse File.open "spec/assets/corrupted.html"
45
+ bookmarks.should eq []
46
+ end
47
+
48
+ end
49
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-23 00:00:00.000000000 Z
12
+ date: 2012-10-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: guard-rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
62
78
  description: Import/export utility for Netscape Bookmark Format
63
79
  email:
64
80
  - tomas.varaneckas@gmail.com
@@ -68,20 +84,23 @@ extra_rdoc_files: []
68
84
  files:
69
85
  - .gitignore
70
86
  - Gemfile
87
+ - Guardfile
71
88
  - LICENSE.txt
72
89
  - README.md
73
90
  - Rakefile
74
91
  - lib/markio.rb
75
92
  - lib/markio/bookmark.rb
93
+ - lib/markio/builder.rb
76
94
  - lib/markio/parser.rb
77
95
  - lib/markio/version.rb
78
96
  - markio.gemspec
97
+ - spec/assets/corrupted.html
98
+ - spec/assets/many_bookmarks.html
99
+ - spec/assets/nested_bookmarks.html
100
+ - spec/assets/one_bookmark.html
101
+ - spec/builder_spec.rb
79
102
  - spec/parser_spec.rb
80
103
  - spec/spec_helper.rb
81
- - spec/test_data/many_bookmarks.html
82
- - spec/test_data/many_bookmarks2.html
83
- - spec/test_data/nested_bookmarks.html
84
- - spec/test_data/one_bookmark.html
85
104
  homepage: ''
86
105
  licenses: []
87
106
  post_install_message:
@@ -107,10 +126,10 @@ signing_key:
107
126
  specification_version: 3
108
127
  summary: Import/export utility for Netscape Bookmark Format
109
128
  test_files:
129
+ - spec/assets/corrupted.html
130
+ - spec/assets/many_bookmarks.html
131
+ - spec/assets/nested_bookmarks.html
132
+ - spec/assets/one_bookmark.html
133
+ - spec/builder_spec.rb
110
134
  - spec/parser_spec.rb
111
135
  - spec/spec_helper.rb
112
- - spec/test_data/many_bookmarks.html
113
- - spec/test_data/many_bookmarks2.html
114
- - spec/test_data/nested_bookmarks.html
115
- - spec/test_data/one_bookmark.html
116
- has_rdoc:
@@ -1,30 +0,0 @@
1
- <!DOCTYPE NETSCAPE-Bookmark-file-1>
2
- <!-- This is an automatically generated file.
3
- It will be read and overwritten.
4
- DO NOT EDIT! -->
5
- <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
6
- <TITLE>Bookmarks</TITLE>
7
- <H1>Bookmarks</H1>
8
- <DL><p>
9
- <DT><H3 ADD_DATE="1350296505" LAST_MODIFIED="1350743233" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Bar</H3>
10
- <DL><p>
11
- <DT><A HREF="javascript:var%20d%3Ddocument,w%3Dwindow,e%3Dw.getSelection,k%3Dd.getSelection,x%3Dd.selection,s%3D(e%3Fe():(k)%3Fk():(x%3Fx.createRange().text:0)),f%3D%27http://www.tumblr.com/share%27,l%3Dd.location,e%3DencodeURIComponent,p%3D%27%3Fv%3D3%26u%3D%27%2Be(l.href)%20%2B%27%26t%3D%27%2Be(d.title)%20%2B%27%26s%3D%27%2Be(s),u%3Df%2Bp%3Btry%7Bif(!/%5E(.*%5C.)%3Ftumblr%5B%5E.%5D*%24/.test(l.host))throw(0)%3Btstbklt()%3B%7Dcatch(z)%7Ba%20%3Dfunction()%7Bif(!w.open(u,%27t%27,%27toolbar%3D0,resizable%3D0,status%3D1,width%3D450,height%3D430%27))l.href%3Du%3B%7D%3Bif(/Firefox/.test(navigator.userAgent))setTimeout(a,0)%3Belse%20a()%3B%7Dvoid(0)" ADD_DATE="1350296576">Share on Tumblr</A>
12
- <DT><A HREF="http://192.168.0.111:5000/webman/index.cgi" ADD_DATE="1350296576" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHUlEQVQ4jWM8f/+9w5rTL+qvPfniwEAC0JLhORBiKtHIsvLE0/qrjz+TpJmBgYHh0oMPDn///mVg9Gw7/J9UzciA5e+fP5ToZ2D5Q6EBDHbV2/8jA7vq7f/tqrf/P3zpGYoYjI9M21Vv/88Ec4F1xRYG64otDAdbPBj+/PnDYKMrCRdD5iPTf/78YYAb8OfPHwZk9pHLzxmOdvgwdEYbo4ij0/BARA7Mv3/+MBTMPcrAwMDAcGZCCAO6GmQaHohnJoQwMDAwMBjkrGBgYGBguDAlgoGBgYHhyOXnKDbC5GF8Ru30xZSlA0qjkeXP3wFOSEwmKuIH/v75w0AONlERP8A8a3LHw4cvPik8evVB4d+/fwzEYjN1qQNFocaNAHb5GMnZ0/wiAAAAAElFTkSuQmCC">Synology DiskStation - DiskStation</A>
13
- <DT><A HREF="http://www.ruby-doc.org/core-1.9.3/" ADD_DATE="1350572675" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHGlET1QAAAACAAAAAAAAAAgAAAAoAAAACAAAAAgAAAGXIcUm9AAAAWNJREFUOBFsj8tKAlEYx49d3IUIgV1HnRkv44yXoJ2P4Cv0Cr1CCO2CWrjpGRJaRENlkWREELQp6GZJSRCWYOaoM9rUv3OmTLssPr5z+/3+3yEAyJ8iZJCdaSFhFtMKai5HFcspGHeFhPU2ne7vMP/BA+yyHhJnEAugHg3qtYlh6PNzOs5O0VxdiVtwMtnH+k8BIZa5ofAJBmuyoGuxIF7GnGilltA+PjKwn0UroypfE9i6AkIsY00W4layLOp0jeaUhHuXA5XFBSB/CSOz0UYuC31nnetOQIiNbTRJUBClY8uiweCGIqIUDeJ8yA5NXQPKT3g9yKG1s2VidxtQVef3BBWZ5xDxQ1PEdgd+lHhc+d0oBjw45Mex6R6x6sLHmaWgF0WO+xRUw5zzLeyjsGAyuE6TyyEeeQoXKNxb1/TsWebN94gPjCOQiZ2msmRYf6b9QfJizzOKE3ESt1Rw0yP6LfgAAAD//2YravMAAAC6SURBVKWROwvCQBCEr7K3VYx5Bz3jr7ay8Ef4QO1EOQOaYCuI+IpddNyVBBQDGiyWgePmu9k5ASlKl5aNs7RwJd02DPSNCiZmFUPSuV3DxtMRunVEpGvSgzSTe9vB0dfKggGZedc0MUjNYwLwMGSRQiKvng+I6eU9mflyZnxVPleO9kyyykvwDZAlCQgSuvrnCr8AGDKiJEuCnKT13gGXWGys5OanJapZt6CZfozMsa0hmHYglOrhn3kAF/hUdfHDKLMAAAAASUVORK5CYII=">Index of Classes &amp; Methods in Ruby 1.9.3 (Ruby 1.9.3)</A>
14
- <DT><A HREF="http://guides.rubyonrails.org/" ADD_DATE="1350296576">Ruby on Rails Guides</A>
15
- <DT><A HREF="http://lvh.me:3000/" ADD_DATE="1350296576" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACyklEQVQ4jXWSXWxUVRSFv3vOvXc6w51pO1MoSVtwqs1ghYgOf33QIBISjY0RMglNADUaEx9IlMTEmJiY+KZvAkr4DQQEBKTA9KGJRJ4wUh8I1hZTIBOorUpT4rSdzs+9Z/tQmUwK7mQle5+TtdbeZx+oicPdbNj7Kitrzz7rIn62x90mIhb/FxnQv79PVj5Fyp9Q+OoVOgG+WM/iPz/khnzZJtld6czjuBpgx0baup9it2WhtIXT4rH6+WbGty7nXFMslCLWQqvnv9zxZOexCwO56VoBBfDxD9ztvcm7QUAZA60ea7YtJ9sYIokTg8DgWmZB2Ew3PbYDgO+GuZ6M8fPKZrZXby0FkSZQmr6R0ptb9v12eb6Aqi3qFB4GqrDcOQ/fZ6FjngW4+dET50+/0/Fi1eNhcvI13sgs45S2cKuKoShEEnO5CKNT8lNrTHVNlczYwSGzYteZ0UkNcK6bt7Z0cFxbOAhUYYdBOWAMiBBzpA1jCCmJuhLU7x+Y7rMzoFct4j0FGjNnFghlbeFiAN9/ZHUVQ3HoL+sQgB4CaShzekmcdY0hkggcGOSFgXG+6VwY2uwqK4Ix1KL/dmVn5sz9i9UtXLlPOV7hlONSdy/P1c19HOnLMf5ScoG0e8GmWvJU0R9fcfCfnkcecX799XrWbl0WOtEYcdrnj3Dtb7Nn7fHCzocEC1DpdFq5rmvPzMyoVH0hcvKZW6Patl20PTd3YGYHH6je55royZcYq99XbAGw0+m0bdt22PO8cBAE4Wg0WvfAGCf7x9iJ11uLbyMBAEdGIh98b607+3nlx+JInux/f8joVCrlKqViQIPrugkRaRaR9l+CpbMT+aLdFcsn+8fqvj1QWnMUMJdnl17qvSPDk5OTBhCdSCQsz/MolUqilKporYsikgcmbsmi4V8n/GtZ/+mjvqh8oVAoViqVUjwe93O5nAH4F06pHMB3vhJeAAAAAElFTkSuQmCC">lvh.me:3000</A>
16
- <DT><A HREF="javascript:function%20bm_add_newphsvuf2h()%7Bvar%20d%20%3D%20document%3Bvar%20el%20%3D%20d.getElementById(%27bm-notification-id%27)%3Bif%20(el%20%3D%3D%20null)%7Bel%20%3D%20d.createElement(%27div%27)%3Bel.setAttribute(%27id%27,%27bm-notification-id%27)%3Bd.body.appendChild(el)%3B%7Del.innerHTML%20%3D%20%27%3Cstyle%20id%3D%22saveitin-div-style%22%3E%20%20%20%20%23saveitin-top-div%7Bpadding:%2010px%3B-moz-box-shadow:%200%3Bposition:%20fixed%3Btop:%200%3Bz-index:%2099999%3Bmin-height:%2034px%3Bbackground:%20white%3Bwidth:%20100%25%3B-moz-box-shadow:%200%200%2025px%20%23666%3B-webkit-box-shadow:%200%200%2025px%20%23666%3Bbox-shadow:%200%200%2025px%20%23666%3Bfont-family:%20Arial,sans-serif%3Bfont-size:%2012px%3Bcolor:%23333%3Bline-height:18px%3B/*text-align:center%3B*/%20%20%20%20%20%20%20%20vertical-align:middle%3B%7D%23saveitin-inner-div%7Bmargin-left:%20auto%3Bmargin-right:%20auto%3Bwidth:%2050em%3B%7D/*%23saveitin-top-div%20h4%7B*/%20%20%20%20%20%20%20%20/*text-align:%20center%3B*/%20%20%20%20/*%7D*/%20%20%20%20%23saveitin-top-div%20input%5Btype%3Dsubmit%5D,%23saveitin-top-div%20input%5Btype%3Dbutton%5D%7Bbackground-color:%20%2314B1E5%3B-webkit-border-image:%20none%3Bbackground-image:%20-moz-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-ms-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-o-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-webkit-linear-gradient(top,%231BB8EC,%230AA7DB)%3Bbackground-repeat:%20repeat-x%3Bborder:%201px%20solid%20%230AA7DB%3Bborder-radius:%204px%3B-moz-border-radius:%204px%3B-o-border-radius:%204px%3B-webkit-border-radius:%204px%3Bcolor:%20white%3Bfont-family:%20HelveticaNeue-Light,%22Helvetica%20Neue%20Light%22,%22Helvetica%20Neue%22,Arial,Helvetica,sans-serif%3Bfont-weight:%20bold%3Bfont-height:%2013px%3Bpadding:%204px%2010px%3Btext-align:%20center%3Btext-decoration:%20none%3Btext-shadow:%20rgba(0,0,0,0.246094)%200px%20-1px%200px%3Bvertical-align:%20middle%3B%7D%23saveitin-form%7Bdisplay:%20none%3B%7D%23saveitin-form%20label%7Btext-align:%20right%3Bdisplay:%20inline-block%3Bwidth:%208em%3B%7D%23saveitin-form%20input%7Bborder:%201px%20solid%20%23ccc%3Bbackground-color:%20%23fff%3Btext-align:%20left%3Bdisplay:%20inline-block%3B%7D%3C/style%3E%3Cdiv%20id%3D%22saveitin-top-div%22%3E%20%20%3Cdiv%20id%3D%22saveitin-inner-div%22%3E%20%20%20%20%20%20%20%20%3Ch4%3ELoading...%3C/h4%3E%20%20%20%20%3C/div%3E%3C/div%3E%27%3Btry%7Bs%3Dd.createElement(%27sc%27%20%2B%20%27ript%27),l%3Dd.location,t%3Dd.getElementsByTagName(%27title%27)%5B0%5D%3Bvar%20m%3D%20d.getElementsByTagName(%27meta%27)%3Bvar%20desc%20%3D%20%27%27%3Bfor%20(var%20i%20%3D%200%3Bi%20%3C%20m.length%3Bi%2B%2B)%7Bvar%20n%20%3D%20m%5Bi%5D%5B%27name%27%5D%20%7C%7C%20m%5Bi%5D.getAttribute(%27property%27)%3Bif%20(n%20%26%26%20(n.toLowerCase().indexOf(%27description%27)%20!%3D%20-1))%7Bvar%20cnt%20%3D%20m%5Bi%5D%5B%27content%27%5D%3Bif%20(cnt%20%26%26%20(cnt.length%20%3E%20desc.length))%7Bdesc%20%3D%20cnt%3B%7D%7D%7Dif%20(!l%20%7C%7C%20l%20%3D%3D%20%22about:blank%22)%7Bwindow.location.assign(%27https://saveit.in/%27)%3B%7Ds.setAttribute(%27src%27,%27https://saveit.in/bookmarklet%3Fb%3D%27%2B%20encodeURIComponent(l.href)%2B%20%27%26t%3D%27%20%2B%20encodeURIComponent(t%20%3F%20t.innerHTML%20:%20l.href)%2B%20%27%26d%3D%27%20%2B%20encodeURIComponent(desc)%2B%20%27%26s%3D%27%2B(new%20Date().getTime()))%3Bif%20(d.body)%7Bd.body.appendChild(s)%3B%7Delse%7Bwindow.onload%20%3D%20function()%7Bd.body.appendChild(s)%3B%7D%3B%7D%7Dcatch(e)%7Balert(%27error:%20%27%20%2B%20e)%3Bwindow.location.assign(%27https://saveit.in/bookmarklet/failover%3Fb%3D%27%2B%20encodeURIComponent(l.href))%3B%7D%7D%3Bbm_add_newphsvuf2h()%3B" ADD_DATE="1350296576">Save It</A>
17
- <DT><A HREF="javascript:function%20bm_add_new3nrzr6u4()%7Bvar%20d%20%3D%20document%3Bvar%20el%20%3D%20d.getElementById(%27bm-notification-id%27)%3Bif%20(el%20%3D%3D%20null)%7Bel%20%3D%20d.createElement(%27div%27)%3Bel.setAttribute(%27id%27,%27bm-notification-id%27)%3Bd.body.appendChild(el)%3B%7Del.innerHTML%20%3D%20%27%3Cstyle%20id%3D%22saveitin-div-style%22%3E%20%20%20%20%23saveitin-top-div%7Bpadding:%2010px%3B-moz-box-shadow:%200%3Bposition:%20fixed%3Btop:%200%3Bz-index:%2099999%3Bmin-height:%2034px%3Bbackground:%20white%3Bwidth:%20100%25%3B-moz-box-shadow:%200%200%2025px%20%23666%3B-webkit-box-shadow:%200%200%2025px%20%23666%3Bbox-shadow:%200%200%2025px%20%23666%3Bfont-family:%20Arial,sans-serif%3Bfont-size:%2012px%3Bcolor:%23333%3Bline-height:18px%3B/*text-align:center%3B*/%20%20%20%20%20%20%20%20vertical-align:middle%3B%7D%23saveitin-inner-div%7Bmargin-left:%20auto%3Bmargin-right:%20auto%3Bwidth:%2050em%3B%7D/*%23saveitin-top-div%20h4%7B*/%20%20%20%20%20%20%20%20/*text-align:%20center%3B*/%20%20%20%20/*%7D*/%20%20%20%20%23saveitin-top-div%20input%5Btype%3Dsubmit%5D,%23saveitin-top-div%20input%5Btype%3Dbutton%5D%7Bbackground-color:%20%2314B1E5%3B-webkit-border-image:%20none%3Bbackground-image:%20-moz-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-ms-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-o-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-webkit-linear-gradient(top,%231BB8EC,%230AA7DB)%3Bbackground-repeat:%20repeat-x%3Bborder:%201px%20solid%20%230AA7DB%3Bborder-radius:%204px%3B-moz-border-radius:%204px%3B-o-border-radius:%204px%3B-webkit-border-radius:%204px%3Bcolor:%20white%3Bfont-family:%20HelveticaNeue-Light,%22Helvetica%20Neue%20Light%22,%22Helvetica%20Neue%22,Arial,Helvetica,sans-serif%3Bfont-weight:%20bold%3Bfont-height:%2013px%3Bpadding:%204px%2010px%3Btext-align:%20center%3Btext-decoration:%20none%3Btext-shadow:%20rgba(0,0,0,0.246094)%200px%20-1px%200px%3Bvertical-align:%20middle%3B%7D%23saveitin-form%7Bdisplay:%20none%3B%7D%23saveitin-form%20label%7Btext-align:%20right%3Bdisplay:%20inline-block%3Bwidth:%208em%3B%7D%23saveitin-form%20input%7Bborder:%201px%20solid%20%23ccc%3Bbackground-color:%20%23fff%3Btext-align:%20left%3Bdisplay:%20inline-block%3B%7D%3C/style%3E%3Cdiv%20id%3D%22saveitin-top-div%22%3E%20%20%3Cdiv%20id%3D%22saveitin-inner-div%22%3E%20%20%20%20%20%20%20%20%3Ch4%3ELoading...%3C/h4%3E%20%20%20%20%3C/div%3E%3C/div%3E%27%3Btry%7Bs%3Dd.createElement(%27sc%27%20%2B%20%27ript%27),l%3Dd.location,t%3Dd.getElementsByTagName(%27title%27)%5B0%5D%3Bvar%20m%3D%20d.getElementsByTagName(%27meta%27)%3Bvar%20desc%20%3D%20%27%27%3Bfor%20(var%20i%20%3D%200%3Bi%20%3C%20m.length%3Bi%2B%2B)%7Bvar%20n%20%3D%20m%5Bi%5D%5B%27name%27%5D%20%7C%7C%20m%5Bi%5D.getAttribute(%27property%27)%3Bif%20(n%20%26%26%20(n.toLowerCase().indexOf(%27description%27)%20!%3D%20-1))%7Bvar%20cnt%20%3D%20m%5Bi%5D%5B%27content%27%5D%3Bif%20(cnt%20%26%26%20(cnt.length%20%3E%20desc.length))%7Bdesc%20%3D%20cnt%3B%7D%7D%7Dif%20(!l%20%7C%7C%20l%20%3D%3D%20%22about:blank%22)%7Bwindow.location.assign(%27http://dev.saveit.in:3000/%27)%3B%7Ds.setAttribute(%27src%27,%27http://dev.saveit.in:3000/bookmarklet%3Fb%3D%27%2B%20encodeURIComponent(l.href)%2B%20%27%26t%3D%27%20%2B%20encodeURIComponent(t%20%3F%20t.innerHTML%20:%20l.href)%2B%20%27%26d%3D%27%20%2B%20encodeURIComponent(desc)%2B%20%27%26s%3D%27%2B(new%20Date().getTime()))%3Bif%20(d.body)%7Bd.body.appendChild(s)%3B%7Delse%7Bwindow.onload%20%3D%20function()%7Bd.body.appendChild(s)%3B%7D%3B%7D%7Dcatch(e)%7Balert(%27error:%20%27%20%2B%20e)%3Bwindow.location.assign(%27http://dev.saveit.in:3000/bookmarklet/failover%3Fb%3D%27%2B%20encodeURIComponent(l.href))%3B%7D%7D%3Bbm_add_new3nrzr6u4()%3B" ADD_DATE="1350296576">Save It Dev</A>
18
- <DT><A HREF="http://localhost:3000/member/general/register_step2?confirmation=k13bpG6Q6Tj0b4oV2wMY&external_login_type=2&utm_campaign=login&utm_medium=login&utm_source=mojeid" ADD_DATE="1350487106" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHGlET1QAAAACAAAAAAAAAAgAAAAoAAAACAAAAAgAAAI+peJuewAAAgpJREFUOBE8T89P0nEY/nqq/8Brrrp76NKhrWamM8fqq5UidbBNEjHRaIiooWAxhCQCayPHb2JqwFdTFFs2I2urnPMgm2aSIEKJOIoYPz7vG3Lo2Z4fh+d9t4dCRAopqqTohVw29Kn0nGW5qo8nFm7X1jPxa5zPscvsUErcmnjnF/8ov0/7TvGrWUf9Akr+H0fc3ZeiUa1jJaBf+7hhjGuN/ZnBZgFo2iSgbhGBStALNuso8b4YyS+Zn+2HnHZ+8cmRBFnspkN+K2ZDTxBzetwNKpBWcLCyR4gNopECVXhdY8F25zz+dDF5nPNi8qUjG+JyT1PbJ84fD11tXI7XNGFY3JKJ7w2True34cxdGnTMGNbyu0Bn9oDy/Regx33wyOODhJvJpe5JMXiBZlNRYW9ZTCLdSPTLICl5QBbscnJR1Qd1aimsh7/D9IdF2InE0OR0oUAsg84BNfj1Qzkib4aQiNNBHbrdJ/9OuTcz3nlMMSYSdvGIeOIVueV8g1sHSVKYWMQElweK8rNoarwCkfXBLHxtw9+eGxKKZWBKVyfdazjL4J/pjjzM0rDyuhvYjhkcnpyCxYU5sNosIKmqIbqKagi87YF0WpfDsBzTTIOUorTtxzrNM/5vTiXu2+tzu/abGDXSaLQ+Rr19HJ+qlMQwZsC6ikpik90hO3ujuLmlyf06MGBg9eHAPwAAAP//y9NkNgAAAcNJREFUY/j//z9DY3fTlkPtcf+nuHv9meji8m9+dNS/D/du/n/z5s2/27du/vv39++/ZWuW/vNozPmXv2Hnv5zVm3+Xbt//f9KGeY0MIANer4nr/r8/6f+KWO/ffS7+/x9duvLvH1Di18+fQPL//39A3ref3//H9BT+95vQ+y9m9ZHfM7Ys/v9xXSTEgI+bYiL/HUj+/3xRxK+HF07/BetCIv6Cjfv/f+uJ3f/MSyP/Zy1b8uv9vqK/vzcE14FdMHNZg0jn6rn3Jm1b8//IgkV/1mw7+Hvhht2/r99+8OfX799/vn3+/Pffnz///vz/+789JenvjpK4H//f9f5/dbshiYGB4T8j0DIGna03TDp65x997Bv+d2JK6f+goo7/qbUT/9dvP/q/fvmm/6tKK/+cXLX63/Gc4v9fg+L+v15Z8+zi/25FsAtABoAxAwPnt8BQy3Px2XnJJW3dMR0zFsYt2XQwds2uB8XVbf9nmNv+veEb9up1ZOKM2xZBRiA9cAOADLBL4IbBDAXSuedui6Z3Tp5zobzm/5fWjj3IauAGwAUZGJj+NzQwNQAxAxDDxYEG7Sgqyn65avlSoDxLA0gdUAwAHdC5thMbc+wAAAAASUVORK5CYII=">http://localhost:3000/member/general/register_step2?confirmation=k13bpG6Q6Tj0b4oV2wMY&amp;external_login_type=2&amp;utm_campaign=login&amp;utm_medium=login&amp;utm_source=mojeid</A>
19
- <DT><A HREF="javascript:(function()%7Bf%3D%27http://www.delicious.com/save%3Furl%3D%27%2BencodeURIComponent(window.location.href)%2B%27%26title%3D%27%2BencodeURIComponent(document.title)%2B%27%26notes%3D%27%2BencodeURIComponent(%27%27%2B(window.getSelection%3Fwindow.getSelection():document.getSelection%3Fdocument.getSelection():document.selection.createRange().text))%2B%27%26v%3D6%26%27%3Ba%3Dfunction()%7Bif(!window.open(f%2B%27noui%3D1%26jump%3Ddoclose%27,%27deliciousuiv6%27,%27location%3D1,links%3D0,scrollbars%3D0,toolbar%3D0,width%3D710,height%3D660%27))location.href%3Df%2B%27jump%3Dyes%27%7D%3Bif(/Firefox/.test(navigator.userAgent))%7BsetTimeout(a,0)%7Delse%7Ba()%7D%7D)()" ADD_DATE="1350743232">Add to Delicious</A>
20
- <DT><H3 ADD_DATE="1350544318" LAST_MODIFIED="1350927361">MD</H3>
21
- <DL><p>
22
- <DT><A HREF="http://server2.manodrabuziai.lt:8888/issues/3067" ADD_DATE="1350393018" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABZElEQVQ4jdXQPWsUYRTF8d88M5u4M+YTGBsLG22WgIUi2PoG2giCwraKrZ2FkCq2gljkC1hqpY2VhS4LAU0UN5PVbGKKRImIiaLZPBaJkg2ui4WFBy7c4tz/5Rz+pSLB1vyVkki2oHjYsXemo3ixqLgHN8l2m3vor4edLAvLrVyty8w2L0TJk7lhpy/lOm8raj3ffi5lbizyNARZjJbDWuVsKjuaknyufmlkicdJMCT6OLTm8H7e/aI0qUTSdm58rhBbhfquLpKyaqLMfW8V6j1R7jPyjOsNFptcmefA74qJJLPUGtxo8KnJOQijHEq5FtiHO51+zRLfMxoYD4xErkJYosRkZBWvjtPuw7DAo002NnmDBxA+cPc5q7Mc7HKx3zFc4NtXjk1xYprqJEdCwqmM2xusvOT8nwDQpl5lPuVWxuWQsGdHzpVBAKzv8I9lXSZSzkCXpUHXccszvb2vD7D/D/oBMK1rPYlJGacAAAAASUVORK5CYII=">MD platform - Feature #3067: MojeID implementation - Redmine</A>
23
- <DT><H3 ADD_DATE="1350927361" LAST_MODIFIED="1350927374">Nested 2</H3>
24
- <DL><p>
25
- <DT><A HREF="http://www.engineyard.com/blog/2010/getting-started-with-nokogiri/" ADD_DATE="1350927374" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACoUlEQVQ4jZWTXUhTYRjHf+dss52SHZdm0dAMmrmipohZUJTEog8ooiZEM8jqprqqCPJOr6LLqMvsYl1EBV0UhX1AZlgXfYjkZlo7E/FrDt2OW+3Ds7cLZX0K9Vy+z/v8nv/z/t9H0jSt2u/3t8fjcackSfxLCCFQVXXQ5/Mdp62t7X0gEBALRfZrUox3d4qxl53CmJ3NnwcCAdHa2vrOHI/HnS6Xa8FOL7yNZJIRzIWFlHsPU+7Zh7KiHJfLha7rlfLfZBuZDH03bvJk/z6wZDCrClaHndRYiMibZyTCgwBIkoT59+LpkEbHyVN8G/hMgSxhVQpYXGEHIJfJko5O8/piCw3+WwDIPxfro6PcPngIPRaj4ugR1rdcQrZa8/nidWtweLYw8b6HSLAf4IcCIQQPzp3HfeoE7kYvM+EwNqcT7drV+e6zFLlKUUqzCMUE85PnAeHubhx1dUQ+9HDz8hUWAaV7dlNYVkZKHyfSFaTXaMdcZEVPQWlV1a+AsY99fLx7j6QWRpFlMJmYfPSY5Tu2Ee0LkjFyzDzv56thsPHCOSzzo+UBX7q6qPH5KKlYRWJoiJGOp+gfehgJ9OPY1UDvww4Mw6BIXcLa+tr8u5gBEtEo286epWJzfT5Re+Y0k2/f8ar5OKaRT+w8doDETJxkNI125z4rtm7/4YLJYmFV/aY//kNxtRuyWSSRo9i9kWWrHWxo9JLQtF8VKKqadyIVi/FtMkoqGiUTmSRnGHM3pTnHZaWA9HSMxERkDiCEyNMkSUKx21Hsdqh0kp6aYsv168S1AMLIgSwjclkKSkqwLFYQQmBWVXUwGAzW/G0fFi1dykqPh5V4ADDSKRLDQzT49zI4PIzNZhuQQqGQ2+/3t+u6Xvk/62yz2QaampqavwOKmTuSdd4y8wAAAABJRU5ErkJggg==">Getting Started with Nokogiri - Engine Yard Blog | Engine Yard Blog</A>
26
- </DL><p>
27
- <DT><A HREF="http://88.119.11.118:8080/" ADD_DATE="1350544337" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADL0lEQVQ4jW2S329TdRjGn+8539P1tGu3tRPaU0ZbtrRjMGbAKJg0TInCBUHlAolGwmKMIYE7g9F44YX/Adx4RUwUgz8SkREhEL1xy4Blkw42h7Pt2tNf6+npWde1PW3P93jVZVXfyzfv583zPO9L8D8lSVL/gMf7GUfM4YNj4UMcx1sJoOWU4pXp2YUrsizX2rP03/C7Z9/5ptsuvuHuFXFp4rStW6QEJgNjrPvR/OInqrp+Qpbl4wCaAMBvhz84//53wYD/bafIipcvnHFRViem0QQzmgAzIO10WQ+O7t0dTxUOxFZTNwCAa8ORSORoPBF7S85kzJPHDjtbehXf/zKD3x8tdSjM5Au81UrHfT6fu0PBvnB48pVXj3kKSpGMhSSzx2Gj3aIFB/YGYJomCCEAAL9vB16PvCCulyrZmfknM1sKenr7ejLZLJjBNgKSq8tCOQQHdoIXRCTSCgBgJZ4BCMHiigwGI9xhQVPz1NdHa41auaFqG/V2//HTJdy+NwUAKKgaph8uoFbbhEWw2LYvIMfHX3ISpovjLw5zDrsotBfsDwVwceJNAMCRQyNYXElhXzgIQkhh+xnNZDKT/fTS2SGB8n3//QygWKpAKZVAeR663kA6U5jtCHGXz5u8dW/qiH+3v9fT79wCCcdjLvoMd357iGpVRyav4K+YrPw8+eBjrapVtjL44dbdm/PRZ2fWFK0FEKyXNwEAut7AbHQZgwEJTqcNF86dwh+LsZVEIZHrCBEA4rI8++PkrxrtsoPjOTyYW4JF4PHe6dcQHhzA/nAQX357t7SUzOfazJaFoNfr9wZDU2qTetPpTCMclDjTNLmr126iZTQryfRa7uq1n2pz0ZjdOhAacdhEt5LP3iEAuKHQyBeiq//ic6MRR7Ohw9UoqS+PhYS1619jmCf6fb1pcDvca0c3Nvc0ActXu0YFpqnVYmJhiAZ9vtEe//BHNmmPsK5kAdNEFXDdmH6KCYHmDgucxy/Q8nWt4lGZUbcLlLKWgbq+sby6upqn8XT6Se9gtcyMlhum2ZH+MhHKol6t3Hb0lz78/PLzqXRWvf9nqsWi0S5Wr/8NgP0DyjReaJJ20PcAAAAASUVORK5CYII=">Dashboard [Jenkins]</A>
28
- </DL><p>
29
- </DL><p>
30
- </DL><p>