virgo 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/virgo/install/install_generator.rb +20 -0
  3. data/lib/generators/virgo/migrations/migrations_generator.rb +19 -0
  4. data/lib/generators/virgo/schedule/schedule_generator.rb +15 -0
  5. data/lib/generators/virgo/views/views_generator.rb +22 -0
  6. data/lib/tasks/virgo_tasks.rake +7 -0
  7. data/lib/virgo.rb +4 -0
  8. data/lib/virgo/development_mail_interceptor.rb +6 -0
  9. data/lib/virgo/email_validator.rb +6 -0
  10. data/lib/virgo/engine.rb +64 -0
  11. data/lib/virgo/reduce_validator.rb +6 -0
  12. data/lib/virgo/upload_helpers.rb +89 -0
  13. data/lib/virgo/version.rb +3 -0
  14. data/lib/virgo/view_help.rb +3 -0
  15. data/vendor/gems/shortcode/Appraisals +15 -0
  16. data/vendor/gems/shortcode/CHANGELOG.md +162 -0
  17. data/vendor/gems/shortcode/Gemfile +6 -0
  18. data/vendor/gems/shortcode/Gemfile.lock +168 -0
  19. data/vendor/gems/shortcode/LICENSE.txt +22 -0
  20. data/vendor/gems/shortcode/README.md +268 -0
  21. data/vendor/gems/shortcode/Rakefile +3 -0
  22. data/vendor/gems/shortcode/gemfiles/rails_3.2.gemfile +8 -0
  23. data/vendor/gems/shortcode/gemfiles/rails_4.0.gemfile +8 -0
  24. data/vendor/gems/shortcode/gemfiles/rails_4.1.gemfile +8 -0
  25. data/vendor/gems/shortcode/gemfiles/rails_4.2.gemfile +8 -0
  26. data/vendor/gems/shortcode/lib/shortcode.rb +53 -0
  27. data/vendor/gems/shortcode/lib/shortcode/configuration.rb +36 -0
  28. data/vendor/gems/shortcode/lib/shortcode/exceptions.rb +9 -0
  29. data/vendor/gems/shortcode/lib/shortcode/parser.rb +43 -0
  30. data/vendor/gems/shortcode/lib/shortcode/presenter.rb +49 -0
  31. data/vendor/gems/shortcode/lib/shortcode/processor.rb +17 -0
  32. data/vendor/gems/shortcode/lib/shortcode/railtie.rb +3 -0
  33. data/vendor/gems/shortcode/lib/shortcode/tag.rb +54 -0
  34. data/vendor/gems/shortcode/lib/shortcode/template_binding.rb +33 -0
  35. data/vendor/gems/shortcode/lib/shortcode/transformer.rb +17 -0
  36. data/vendor/gems/shortcode/lib/shortcode/version.rb +3 -0
  37. data/vendor/gems/shortcode/shortcode.gemspec +30 -0
  38. data/vendor/gems/shortcode/spec/parser_spec.rb +267 -0
  39. data/vendor/gems/shortcode/spec/performance_spec.rb +41 -0
  40. data/vendor/gems/shortcode/spec/presenter_spec.rb +126 -0
  41. data/vendor/gems/shortcode/spec/rails_helpers_spec.rb +72 -0
  42. data/vendor/gems/shortcode/spec/shortcode_spec.rb +57 -0
  43. data/vendor/gems/shortcode/spec/spec_helper.rb +32 -0
  44. data/vendor/gems/shortcode/spec/support/fixtures.rb +9 -0
  45. data/vendor/gems/shortcode/spec/support/fixtures/block_with_whitespace.txt +2 -0
  46. data/vendor/gems/shortcode/spec/support/fixtures/block_with_whitespace_output.html +2 -0
  47. data/vendor/gems/shortcode/spec/support/fixtures/complex_snippet.txt +13 -0
  48. data/vendor/gems/shortcode/spec/support/fixtures/complex_snippet_output.html +33 -0
  49. data/vendor/gems/shortcode/spec/support/fixtures/custom_helper.txt +1 -0
  50. data/vendor/gems/shortcode/spec/support/fixtures/custom_helper_output.html +1 -0
  51. data/vendor/gems/shortcode/spec/support/fixtures/full_quote.txt +1 -0
  52. data/vendor/gems/shortcode/spec/support/fixtures/full_quote_output.html +7 -0
  53. data/vendor/gems/shortcode/spec/support/fixtures/item.txt +1 -0
  54. data/vendor/gems/shortcode/spec/support/fixtures/item_presenter_attributes_output.html +4 -0
  55. data/vendor/gems/shortcode/spec/support/fixtures/item_presenter_output.html +4 -0
  56. data/vendor/gems/shortcode/spec/support/fixtures/long_text.txt +39 -0
  57. data/vendor/gems/shortcode/spec/support/fixtures/quote_with_extras.txt +1 -0
  58. data/vendor/gems/shortcode/spec/support/fixtures/quote_with_extras_output.html +7 -0
  59. data/vendor/gems/shortcode/spec/support/fixtures/rails_helper.txt +1 -0
  60. data/vendor/gems/shortcode/spec/support/fixtures/rails_helper_output_erb.html +1 -0
  61. data/vendor/gems/shortcode/spec/support/fixtures/rails_helper_output_haml.html +1 -0
  62. data/vendor/gems/shortcode/spec/support/fixtures/rails_helper_output_slim.html +1 -0
  63. data/vendor/gems/shortcode/spec/support/fixtures/simple_list.txt +5 -0
  64. data/vendor/gems/shortcode/spec/support/fixtures/simple_list_output.html +15 -0
  65. data/vendor/gems/shortcode/spec/support/fixtures/simple_quote.txt +1 -0
  66. data/vendor/gems/shortcode/spec/support/fixtures/simple_quote_output.html +3 -0
  67. data/vendor/gems/shortcode/spec/support/fixtures/simple_quote_presenter_attributes_output.html +6 -0
  68. data/vendor/gems/shortcode/spec/support/fixtures/simple_quote_presenter_output.html +6 -0
  69. data/vendor/gems/shortcode/spec/support/fixtures/timeline_event.txt +1 -0
  70. data/vendor/gems/shortcode/spec/support/fixtures/timeline_event_output.html +15 -0
  71. data/vendor/gems/shortcode/spec/support/fixtures/timeline_info.txt +1 -0
  72. data/vendor/gems/shortcode/spec/support/fixtures/timeline_info_output.html +14 -0
  73. data/vendor/gems/shortcode/spec/support/fixtures/timeline_person.txt +4 -0
  74. data/vendor/gems/shortcode/spec/support/fixtures/timeline_person_output.html +23 -0
  75. data/vendor/gems/shortcode/spec/support/fixtures/without_quotes.txt +1 -0
  76. data/vendor/gems/shortcode/spec/support/presenters/missing_attributes_presenter.rb +12 -0
  77. data/vendor/gems/shortcode/spec/support/presenters/missing_content_presenter.rb +12 -0
  78. data/vendor/gems/shortcode/spec/support/presenters/missing_for_presenter.rb +12 -0
  79. data/vendor/gems/shortcode/spec/support/presenters/missing_initialize_presenter.rb +12 -0
  80. data/vendor/gems/shortcode/spec/support/presenters/multiple_presenter.rb +19 -0
  81. data/vendor/gems/shortcode/spec/support/presenters/my_presenter.rb +19 -0
  82. data/vendor/gems/shortcode/spec/support/presenters/other_presenter.rb +19 -0
  83. data/vendor/gems/shortcode/spec/support/templates/erb/collapsible_list.html.erb +3 -0
  84. data/vendor/gems/shortcode/spec/support/templates/erb/custom_helper.html.erb +1 -0
  85. data/vendor/gems/shortcode/spec/support/templates/erb/item.html.erb +4 -0
  86. data/vendor/gems/shortcode/spec/support/templates/erb/quote.html.erb +13 -0
  87. data/vendor/gems/shortcode/spec/support/templates/erb/rails_helper.html.erb +1 -0
  88. data/vendor/gems/shortcode/spec/support/templates/erb/timeline_event.html.erb +17 -0
  89. data/vendor/gems/shortcode/spec/support/templates/erb/timeline_info.html.erb +15 -0
  90. data/vendor/gems/shortcode/spec/support/templates/erb/timeline_person.html.erb +23 -0
  91. data/vendor/gems/shortcode/spec/support/templates/haml/quote.html.haml +8 -0
  92. data/vendor/gems/shortcode/spec/support/templates/haml/rails_helper.html.haml +1 -0
  93. data/vendor/gems/shortcode/spec/support/templates/slim/quote.html.slim +8 -0
  94. data/vendor/gems/shortcode/spec/support/templates/slim/rails_helper.html.slim +1 -0
  95. data/vendor/gems/shortcode/spec/tag_spec.rb +67 -0
  96. data/vendor/gems/shortcode/spec/template_parsers_spec.rb +46 -0
  97. data/vendor/gems/shortcode/spec/transformer_spec.rb +122 -0
  98. metadata +97 -1
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'parslet/rig/rspec'
3
+ require 'pp'
4
+ require 'benchmark'
5
+
6
+ # Uncomment to run performace specs
7
+
8
+
9
+ # describe Shortcode do
10
+
11
+ # let(:long_text) { load_fixture :long_text }
12
+ # let(:parser) { Shortcode::Parser.new }
13
+ # let(:transformer) { Shortcode::Transformer.new }
14
+
15
+ # context "parser" do
16
+
17
+ # before { long_text }
18
+
19
+ # it "runs quickly" do
20
+ # Benchmark.realtime {
21
+ # parser.parse long_text
22
+ # }.should < 1.5
23
+ # end
24
+
25
+ # end
26
+
27
+ # context "transformer" do
28
+
29
+ # let(:parsed_hash) { parser.parse long_text }
30
+
31
+ # before { parsed_hash }
32
+
33
+ # it "runs quickly" do
34
+ # Benchmark.realtime {
35
+ # transformer.apply(parsed_hash, additional_attributes: nil)
36
+ # }.should < 0.1
37
+ # end
38
+
39
+ # end
40
+
41
+ # end
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+ require 'parslet/rig/rspec'
3
+ require 'pp'
4
+
5
+ require 'support/presenters/my_presenter'
6
+ require 'support/presenters/other_presenter'
7
+ require 'support/presenters/multiple_presenter'
8
+ require 'support/presenters/missing_for_presenter'
9
+ require 'support/presenters/missing_initialize_presenter'
10
+ require 'support/presenters/missing_content_presenter'
11
+ require 'support/presenters/missing_attributes_presenter'
12
+
13
+ describe Shortcode::Presenter do
14
+
15
+ let(:simple_quote) { load_fixture :simple_quote }
16
+ let(:item) { load_fixture :item }
17
+
18
+ describe "using a custom presenter" do
19
+
20
+ let(:presenter_output) { load_fixture :simple_quote_presenter_output, :html }
21
+ let(:attributes_output) { load_fixture :simple_quote_presenter_attributes_output, :html }
22
+
23
+ before do
24
+ Shortcode.register_presenter MyPresenter
25
+ end
26
+
27
+ it "uses the custom attributes" do
28
+ expect(Shortcode.process(simple_quote).gsub("\n",'')).to eq(presenter_output)
29
+ end
30
+
31
+ it "passes through additional attributes" do
32
+ expect(Shortcode.process(simple_quote, { title: 'Additional attribute title' }).gsub("\n",'')).to eq(attributes_output)
33
+ end
34
+
35
+ end
36
+
37
+ describe "using a single presenter for multiple shortcodes" do
38
+
39
+ let(:quote_presenter_output) { load_fixture :simple_quote_presenter_output, :html }
40
+ let(:item_presenter_output) { load_fixture :item_presenter_output, :html }
41
+
42
+ let(:quote_attributes_output) { load_fixture :simple_quote_presenter_attributes_output, :html }
43
+ let(:item_attributes_output) { load_fixture :item_presenter_attributes_output, :html }
44
+
45
+ before do
46
+ Shortcode.register_presenter MultiplePresenter
47
+ end
48
+
49
+ it "uses the custom attributes" do
50
+ expect(Shortcode.process(simple_quote ).gsub("\n",'')).to eq(quote_presenter_output)
51
+ expect(Shortcode.process(item ).gsub("\n",'')).to eq(item_presenter_output)
52
+ end
53
+
54
+ it "passes through additional attributes" do
55
+ expect(Shortcode.process(simple_quote, { title: 'Additional attribute title' }).gsub("\n",'')).to eq(quote_attributes_output)
56
+ expect(Shortcode.process(item, { title: 'Additional attribute title' }).gsub("\n",'')).to eq(item_attributes_output)
57
+ end
58
+
59
+ end
60
+
61
+ context "presenter registration" do
62
+
63
+ describe "registering a single presenter" do
64
+
65
+ before do
66
+ Shortcode.register_presenter MyPresenter
67
+ end
68
+
69
+ it "adds the presenter to the list" do
70
+ expect(Shortcode::Presenter.presenters).to include(MyPresenter.for)
71
+ end
72
+
73
+ end
74
+
75
+ describe "registering multiple presenters" do
76
+
77
+ before do
78
+ Shortcode.register_presenter(MyPresenter, OtherPresenter)
79
+ end
80
+
81
+ it "adds the presenter to the list" do
82
+ expect(Shortcode::Presenter.presenters).to include(MyPresenter.for)
83
+ expect(Shortcode::Presenter.presenters).to include(OtherPresenter.for)
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+
90
+ context "presenter validation" do
91
+
92
+ describe "missing #for class method" do
93
+
94
+ it "raises an exception" do
95
+ expect { Shortcode.register_presenter MissingForPresenter }.to raise_error(ArgumentError, "The presenter must define the class method #for")
96
+ end
97
+
98
+ end
99
+
100
+ describe "missing #initialize method" do
101
+
102
+ it "raises an exception" do
103
+ expect { Shortcode.register_presenter MissingInitializePresenter }.to raise_error(ArgumentError, "The presenter must define an initialize method")
104
+ end
105
+
106
+ end
107
+
108
+ describe "missing #content method" do
109
+
110
+ it "raises an exception" do
111
+ expect { Shortcode.register_presenter MissingContentPresenter }.to raise_error(ArgumentError, "The presenter must define the method #content")
112
+ end
113
+
114
+ end
115
+
116
+ describe "missing #attributes method" do
117
+
118
+ it "raises an exception" do
119
+ expect { Shortcode.register_presenter MissingAttributesPresenter }.to raise_error(ArgumentError, "The presenter must define the method #attributes")
120
+ end
121
+
122
+ end
123
+
124
+ end
125
+
126
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ module ShortcodeSpecViewHelper
4
+ def wrap_in_p(content)
5
+ content_tag :p, content
6
+ end
7
+ end
8
+
9
+ describe "rails helpers" do
10
+
11
+ let(:template) { load_fixture :rails_helper }
12
+
13
+ let(:erb_output) { load_fixture :rails_helper_output_erb, :html }
14
+ let(:haml_output) { load_fixture :rails_helper_output_haml, :html }
15
+ let(:slim_output) { load_fixture :rails_helper_output_slim, :html }
16
+
17
+ describe "erb" do
18
+
19
+ it "are accessible within erb templates" do
20
+ expect(Shortcode.process(template).gsub("\n",'')).to eq(erb_output)
21
+ end
22
+
23
+ end
24
+
25
+ describe "haml" do
26
+
27
+ before(:each) do
28
+ Shortcode.setup do |config|
29
+ config.template_parser = :haml
30
+ config.template_paths = [File.join(File.dirname(__FILE__), "support/templates/haml")]
31
+ end
32
+ end
33
+
34
+ it "are accessible within haml templates" do
35
+ expect(Shortcode.process(template).gsub("\n",'')).to eq(haml_output)
36
+ end
37
+
38
+ end
39
+
40
+ describe "slim" do
41
+
42
+ before(:each) do
43
+ Shortcode.setup do |config|
44
+ config.template_parser = :slim
45
+ config.template_paths = [File.join(File.dirname(__FILE__), "support/templates/slim")]
46
+ end
47
+ end
48
+
49
+ it "are accessible within slim templates" do
50
+ expect(Shortcode.process(template).gsub("\n",'')).to eq(slim_output)
51
+ end
52
+
53
+ end
54
+
55
+ describe "using a custom helper module" do
56
+
57
+ let(:template) { load_fixture :custom_helper }
58
+ let(:output) { load_fixture :custom_helper_output, :html }
59
+
60
+ before(:each) do
61
+ Shortcode.setup do |config|
62
+ config.helpers = [ShortcodeSpecViewHelper]
63
+ end
64
+ end
65
+
66
+ it "is accessible within templates" do
67
+ expect(Shortcode.process(template).gsub("\n",'')).to eq(output)
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+ require 'parslet/rig/rspec'
3
+ require 'pp'
4
+
5
+ describe Shortcode do
6
+
7
+ let(:simple_quote) { load_fixture :simple_quote }
8
+ let(:simple_quote_output) { load_fixture :simple_quote_output, :html }
9
+
10
+ context "simple_quote" do
11
+
12
+ it "converts into html" do
13
+ expect(Shortcode.process(simple_quote).gsub("\n",'')).to eq(simple_quote_output)
14
+ end
15
+
16
+ end
17
+
18
+ context "erb templates" do
19
+
20
+ it "converts into html" do
21
+ expect(Shortcode.process(simple_quote).gsub("\n",'')).to eq(simple_quote_output)
22
+ end
23
+ end
24
+
25
+ context "configuration" do
26
+
27
+ describe "block_tags" do
28
+
29
+ before do
30
+ Shortcode.setup do |config|
31
+ config.block_tags = []
32
+ end
33
+ end
34
+
35
+ it "handles an empty array" do
36
+ expect { Shortcode.process(simple_quote) }.to_not raise_error
37
+ end
38
+
39
+ end
40
+
41
+ describe "self_closing_tags" do
42
+
43
+ before do
44
+ Shortcode.setup do |config|
45
+ config.self_closing_tags = []
46
+ end
47
+ end
48
+
49
+ it "handles an empty array" do
50
+ expect { Shortcode.process(simple_quote) }.to_not raise_error
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,32 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+
3
+ if ENV["CI"]
4
+ require 'coveralls'
5
+ Coveralls.wear!
6
+ end
7
+
8
+ require 'rspec'
9
+ require 'rails'
10
+ require 'action_view'
11
+ require 'shortcode'
12
+ require 'support/fixtures'
13
+
14
+ # Set slim's attribute quotes to use single quotes so it's the same as haml
15
+ Slim::Engine.set_default_options attr_quote: "'"
16
+
17
+ RSpec.configure do |config|
18
+ config.order = "random"
19
+
20
+ config.before(:each) do
21
+ Shortcode::Presenter.presenters = {}
22
+ Shortcode.setup do |config|
23
+ config.template_parser = :erb
24
+ config.template_paths = [File.join(File.dirname(__FILE__), "support/templates/erb")]
25
+ config.templates = nil
26
+ config.block_tags = [:quote, :collapsible_list, :item, :timeline_person, :rails_helper, :custom_helper]
27
+ config.self_closing_tags = [:timeline_event, :timeline_info]
28
+ config.attribute_quote_type = '"'
29
+ config.use_attribute_quotes = true
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ RSpec.configure do |config|
2
+
3
+ def load_fixture(name, type='txt')
4
+ type = type.to_s
5
+ string = File.read(File.join(File.dirname(__FILE__), 'fixtures', "#{name}.#{type}"))
6
+ type == 'txt' ? string : string.gsub("\n",'')
7
+ end
8
+
9
+ end
@@ -0,0 +1,2 @@
1
+ [rails_helper]this is bold[/rails_helper] and this is not bold.
2
+ [rails_helper]this is italic[/rails_helper]without a space.
@@ -0,0 +1,2 @@
1
+ <b>this is bold</b> and this is not bold.
2
+ <b>this is italic</b>without a space.
@@ -0,0 +1,13 @@
1
+ <h3>A page title</h3>
2
+ <p>Some text</p>
3
+ [collapsible_list]
4
+ [item title="Example title 1"]
5
+ [quote author="Jamie Dyer" title="King of England"]A quote[/quote]
6
+ I'm inbetween 2 quotes!
7
+ [quote author="Forrest Gump" title="Idiot"]Life is like...[/quote]
8
+ [/item]
9
+ [item title="Example title 2"]Example content 2[/item]
10
+ [item title="Example title 3"]Example content 3[/item]
11
+ [/collapsible_list]
12
+
13
+ <p>Some more text</p>
@@ -0,0 +1,33 @@
1
+ <h3>A page title</h3>
2
+ <p>Some text</p>
3
+ <div class='collapsible'>
4
+ <section>
5
+ <h5>Example title 1</h5>
6
+ <div><blockquote>
7
+ <p class='quotation'>A quote</p>
8
+ <p class='citation'>
9
+ <span class='author'>Jamie Dyer</span>
10
+ <span class='position'>King of England</span>
11
+ </p>
12
+ </blockquote>
13
+ I'm inbetween 2 quotes!
14
+ <blockquote>
15
+ <p class='quotation'>Life is like...</p>
16
+ <p class='citation'>
17
+ <span class='author'>Forrest Gump</span>
18
+ <span class='position'>Idiot</span>
19
+ </p>
20
+ </blockquote>
21
+ </div>
22
+ </section>
23
+ <section>
24
+ <h5>Example title 2</h5>
25
+ <div>Example content 2</div>
26
+ </section>
27
+ <section>
28
+ <h5>Example title 3</h5>
29
+ <div>Example content 3</div>
30
+ </section>
31
+
32
+ </div>
33
+ <p>Some more text</p>
@@ -0,0 +1 @@
1
+ [custom_helper]something[/custom_helper]
@@ -0,0 +1 @@
1
+ [quote author="Jamie Dyer" title="King of England"]A quote[/quote]
@@ -0,0 +1,7 @@
1
+ <blockquote>
2
+ <p class='quotation'>A quote</p>
3
+ <p class='citation'>
4
+ <span class='author'>Jamie Dyer</span>
5
+ <span class='position'>King of England</span>
6
+ </p>
7
+ </blockquote>
@@ -0,0 +1 @@
1
+ [item title="Example title 1"]Example content 1[/item]
@@ -0,0 +1,4 @@
1
+ <section>
2
+ <h5>Additional attribute title</h5>
3
+ <div>Example content 1</div>
4
+ </section>
@@ -0,0 +1,4 @@
1
+ <section>
2
+ <h5>my custom title</h5>
3
+ <div>Example content 1</div>
4
+ </section>
@@ -0,0 +1,39 @@
1
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi pulvinar ac orci at pulvinar. Nullam at felis augue. Aenean sed vehicula mauris, sit amet rhoncus neque. In placerat commodo dolor, at vulputate urna venenatis ut. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vitae justo ultrices, convallis massa ac, dictum leo. Cras dignissim bibendum facilisis. Aliquam et aliquet felis. Quisque laoreet commodo libero, eget tincidunt quam sagittis sit amet. Fusce leo risus, tristique vel ante sed, feugiat vulputate ante. Aenean aliquam erat ut augue feugiat, eu tempus ante adipiscing. Aliquam sed erat quis sapien posuere euismod. Cras dignissim luctus nisi, id imperdiet elit consequat eget. Duis condimentum rhoncus commodo. Donec hendrerit fermentum dolor sed accumsan.
2
+
3
+ Maecenas consectetur tempus imperdiet. Vivamus posuere pellentesque mauris nec volutpat. Morbi scelerisque ante mauris, aliquam condimentum eros mollis et. Pellentesque mattis turpis urna, a viverra mi elementum quis. Mauris ut vulputate diam. Nullam mauris augue, tincidunt non nunc id, eleifend aliquet sapien. Vivamus molestie risus eu risus adipiscing mollis. Quisque tincidunt venenatis odio, eget hendrerit metus semper non. Etiam et massa ligula. Sed vitae odio enim. Curabitur ac cursus ante. Praesent orci sapien, hendrerit nec lectus ac, luctus sollicitudin mauris. Duis dolor massa, interdum at orci eget, rhoncus bibendum quam. Aenean sed diam lorem.
4
+
5
+ Cras ac libero nec turpis auctor aliquam. Aenean mauris orci, porta imperdiet mauris eget, facilisis auctor velit. Vivamus quis sapien sit amet turpis mattis eleifend. Sed sed leo erat. Etiam nec volutpat tortor. Integer quis nulla elementum, placerat velit elementum, faucibus mauris. Sed pharetra tortor ut orci tempus, in volutpat est rhoncus.
6
+
7
+ Sed non iaculis lorem, eget molestie quam. Mauris eget est at dolor scelerisque ultricies. Aenean dapibus interdum elit, sed commodo ipsum. In porttitor cursus leo, at malesuada lorem vehicula sed. Maecenas faucibus blandit ante, ac fringilla libero pellentesque nec. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet dignissim felis. In eget ligula iaculis, placerat tortor sed, pulvinar nulla. Vestibulum et justo in lorem dapibus accumsan. Donec egestas, lacus a dignissim iaculis, velit justo eleifend purus, eu faucibus nisl quam congue sem. Maecenas erat elit, feugiat a massa sed, viverra fringilla orci. Duis id nibh justo. Fusce felis velit, mollis sed malesuada eu, tincidunt et diam. Phasellus feugiat mi non lacus accumsan ultrices. Sed auctor, purus quis convallis pellentesque, magna est facilisis augue, vel dapibus velit nibh id libero.
8
+
9
+ Nunc aliquam sagittis nibh quis tempus. Donec quis gravida massa, et accumsan eros. Quisque vitae tellus sit amet mauris consequat iaculis. Mauris convallis molestie ante, id mollis arcu scelerisque congue. Sed in dapibus quam. Nam faucibus purus at tortor tempus porttitor quis quis odio. Pellentesque vel justo a ipsum gravida accumsan. Phasellus tincidunt vehicula quam, in varius erat.
10
+
11
+ Donec volutpat imperdiet consectetur. Nullam commodo, magna in elementum ullamcorper, lorem urna posuere felis, vitae volutpat odio orci ac est. Nam pellentesque orci sollicitudin, mattis nisi non, aliquet mi. Quisque mollis eros sed ultricies pretium. Aenean cursus lorem leo, lobortis aliquet mauris hendrerit a. Aenean non metus lectus. Donec dolor justo, elementum et nibh eget, feugiat lacinia ante. Nulla facilisi. Etiam quam sem, ornare in convallis vitae, ultricies et purus. Donec fringilla, enim sit amet tempus vulputate, urna ipsum malesuada orci, non euismod libero enim nec leo. Nunc vestibulum nisi a nunc congue placerat. Morbi dui massa, imperdiet vel quam sed, interdum egestas sem. Cras lobortis at mi sed eleifend. Proin nec erat pretium, tristique sapien in, convallis tellus. Aenean id varius velit. Integer eleifend molestie pharetra.
12
+
13
+ Aliquam sodales sollicitudin imperdiet. Quisque sapien massa, pulvinar sed lorem et, euismod porttitor metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam interdum cursus tellus, vel porta justo fermentum vel. Nam rutrum posuere purus et adipiscing. Nullam iaculis cursus placerat. Aliquam erat volutpat.
14
+
15
+ Quisque a sapien dictum, rutrum ipsum nec, eleifend sem. Sed pellentesque vehicula dolor, sed consequat tortor elementum id. Mauris dapibus, magna at gravida interdum, turpis est bibendum diam, non accumsan odio eros a velit. In at congue mi. Ut vel ultricies mauris. Nulla viverra convallis vestibulum. Suspendisse vel massa turpis. Curabitur lobortis ante at lorem aliquet, rhoncus viverra mi consequat. Mauris quis lectus dolor.
16
+
17
+ Quisque vitae ultricies magna. Fusce non egestas nisl. Nulla facilisi. Donec et ante eleifend, tempus dolor in, condimentum quam. Integer suscipit malesuada augue ut vestibulum. In aliquam, velit sed malesuada dapibus, libero ligula commodo sapien, non euismod sem velit id arcu. Nulla dapibus accumsan justo ac ultrices. Pellentesque sit amet laoreet ipsum. Aliquam at tristique lacus, vel congue turpis. Vivamus porta sem vel porta pulvinar. Vestibulum egestas ante quis mauris dictum, a imperdiet mauris venenatis.
18
+
19
+ Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis consequat facilisis arcu, ut blandit mauris lobortis a. Proin nunc leo, suscipit ut sem eu, consequat vestibulum nunc. Duis metus risus, dignissim et volutpat sit amet, faucibus in mi. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam eu lobortis felis, nec tincidunt tellus. Aenean felis tortor, dignissim at sagittis vitae, malesuada id nisi. Vivamus dui mauris, interdum ut fermentum in, lobortis vel lacus. Cras sit amet sagittis purus, et vulputate tellus. Vestibulum fringilla quis dolor in egestas. Mauris sed adipiscing est. Integer ut luctus metus. Vivamus accumsan est metus, ac sagittis arcu ornare id. Nullam ultrices mi ligula, in eleifend diam pharetra vel. Nullam quis sagittis eros.
20
+
21
+ Nullam elit nibh, accumsan non pharetra sit amet, laoreet mattis lacus. Vestibulum porta porttitor libero, id cursus eros fringilla vestibulum. Donec iaculis mauris sed tellus congue volutpat. Nullam vitae dolor eget sapien semper pellentesque. Pellentesque eu enim ullamcorper dui pulvinar porta. Integer sit amet dictum sapien, at mollis sem. Sed a mi dictum, tempor erat vitae, vulputate tellus. In lacus urna, ullamcorper eu ullamcorper non, commodo nec urna. Aliquam purus lorem, dictum eu dignissim ut, malesuada et nisi. Nam condimentum vestibulum leo, ut scelerisque lorem. Nulla imperdiet ipsum turpis, a tempus ante tempor nec. Aliquam et urna at felis ultrices rutrum ut nec metus. Nam ullamcorper sollicitudin imperdiet. Quisque consequat lacinia turpis, eget euismod dolor rhoncus nec. Cras et malesuada nibh.
22
+
23
+ Phasellus sed massa augue. Pellentesque dapibus nisi ac elit luctus, id fringilla lorem aliquet. Sed in metus elementum, pharetra nisl vitae, hendrerit lectus. Curabitur quis eros enim. Cras sem ligula, iaculis ac orci vel, tristique vulputate mauris. Proin ullamcorper sapien eu sem elementum ultricies. Aenean porta risus sed massa venenatis, sed dapibus enim pretium. Vivamus ullamcorper enim pulvinar ligula consequat porttitor. Nullam libero leo, ultrices sit amet lacus ut, elementum consectetur ligula.
24
+
25
+ Mauris convallis faucibus nibh, non dapibus sem mattis nec. Quisque in mattis neque. Sed egestas vitae augue vitae ullamcorper. In nec nulla tincidunt, sodales neque in, accumsan ante. Nunc vitae sodales diam, quis accumsan nulla. Nulla vel magna tincidunt, pellentesque neque et, luctus lacus. Integer tincidunt semper dolor, ac consectetur ante fringilla eu.
26
+
27
+ Vestibulum in est suscipit, tincidunt quam quis, gravida enim. Ut eu condimentum velit. Proin a orci nec ante pulvinar fringilla. Donec scelerisque libero nulla, ut ullamcorper neque condimentum vel. Donec condimentum placerat diam, placerat posuere risus lobortis at. Donec sodales malesuada ultricies. Mauris rutrum luctus mattis. Nullam rutrum, neque at interdum malesuada, ante mauris pulvinar arcu, id tincidunt erat leo quis nunc. Suspendisse eleifend sagittis malesuada. Phasellus ullamcorper tellus vel felis ultricies eleifend. Vivamus eget rutrum elit. Suspendisse rhoncus gravida nulla, ac tincidunt enim pellentesque ac.
28
+
29
+ Etiam vitae hendrerit metus, et ornare nibh. Sed eget fermentum enim, sit amet tempor ipsum. Maecenas massa nisi, convallis quis sapien et, iaculis euismod lectus. Vestibulum non augue sed tortor accumsan mollis. Duis bibendum, mi sit amet tristique adipiscing, dui risus convallis magna, sed adipiscing velit sem nec velit. Curabitur pellentesque risus commodo, elementum purus id, tempus lorem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vivamus ac leo nec dui hendrerit pulvinar. Integer in libero eget ipsum pretium ultricies. Nullam sollicitudin viverra enim ut posuere. In hac habitasse platea dictumst. Nulla quis tortor a velit vehicula semper eu eu magna. Suspendisse mattis sit amet magna nec mollis. Vestibulum vel ultricies orci. Duis lobortis nibh nec porttitor laoreet.
30
+
31
+ Nullam dui lectus, viverra non leo sit amet, tempus adipiscing ante. Vivamus luctus nunc ac enim vehicula, nec condimentum lorem pretium. Sed nisi magna, varius quis egestas eu, bibendum non eros. Morbi dictum mollis diam, id venenatis orci sodales sit amet. Etiam elementum porttitor arcu, id adipiscing odio luctus id. Donec a erat sodales, fermentum dui consequat, imperdiet ante. Nunc interdum pellentesque sodales. Suspendisse sagittis lacus risus, a convallis nibh interdum at. Aenean et purus at risus eleifend pulvinar vitae vitae eros. Vivamus quis justo tincidunt, dapibus mi eu, aliquet est.
32
+
33
+ Nam consectetur semper sodales. Praesent accumsan velit ac arcu fringilla commodo. Etiam bibendum, nibh a auctor ullamcorper, dui orci dictum turpis, eu suscipit nulla orci quis sapien. In a turpis blandit, imperdiet velit sit amet, adipiscing mi. Nulla id quam commodo, aliquet nibh imperdiet, semper ipsum. Suspendisse in laoreet diam. Nulla facilisi. Integer viverra erat id nisi hendrerit vulputate.
34
+
35
+ Phasellus risus urna, sodales et gravida sed, imperdiet et erat. Phasellus ac libero eu odio congue hendrerit. Pellentesque gravida urna vitae consectetur gravida. Suspendisse potenti. Integer vulputate euismod massa, ac accumsan turpis venenatis id. Aliquam interdum tristique metus, et luctus libero placerat ut. Curabitur iaculis odio sed felis eleifend, ut varius arcu molestie. Aenean ultrices quis urna et dapibus. Aenean laoreet nisi augue, sed bibendum massa posuere non. Duis pulvinar tempus arcu vel pretium. In vel aliquet est. Integer auctor velit quis arcu varius, tristique accumsan massa semper. Suspendisse nisi neque, tristique vitae vehicula at, accumsan sed lorem. Sed eu blandit neque.
36
+
37
+ Praesent eget turpis vel leo fermentum auctor non nec nibh. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean dignissim dapibus pulvinar. Aliquam semper tincidunt ante et volutpat. Cras tempus mi sit amet leo adipiscing mattis. Nullam ullamcorper mi id quam cursus pharetra. Maecenas sollicitudin scelerisque metus suscipit faucibus. Aenean id ultrices diam. Cras lorem lorem, consectetur sit amet vulputate at, accumsan nec eros. Nunc ante nunc, semper ut leo ut, commodo adipiscing neque. Proin viverra nisi id arcu feugiat mollis. Mauris blandit erat sed eros hendrerit, ac pellentesque lorem luctus. Morbi sollicitudin scelerisque ante. Morbi dignissim sem sit amet velit ultrices, quis lobortis lectus molestie. Pellentesque non sapien orci.
38
+
39
+ Praesent odio metus, lacinia vel justo sed, elementum dictum nisi. Duis ut orci nunc. Sed quis risus bibendum quam varius congue nec id quam. Pellentesque eget condimentum magna. Morbi leo felis, varius ut pharetra at, mattis non augue. Mauris cursus interdum purus et pulvinar. Nunc at mi nec urna mollis consequat. Morbi viverra mi in nulla placerat imperdiet. Etiam semper fringilla odio. Praesent facilisis eleifend cursus. Maecenas sagittis sed magna id lacinia. Curabitur commodo convallis tellus, vel fermentum ligula venenatis id.