ruby-spark 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +37 -0
  3. data/Gemfile +47 -0
  4. data/Guardfile +5 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +185 -0
  7. data/Rakefile +35 -0
  8. data/TODO.md +7 -0
  9. data/benchmark/aggregate.rb +33 -0
  10. data/benchmark/bisect.rb +88 -0
  11. data/benchmark/custom_marshal.rb +94 -0
  12. data/benchmark/digest.rb +150 -0
  13. data/benchmark/enumerator.rb +88 -0
  14. data/benchmark/performance/prepare.sh +18 -0
  15. data/benchmark/performance/python.py +156 -0
  16. data/benchmark/performance/r.r +69 -0
  17. data/benchmark/performance/ruby.rb +167 -0
  18. data/benchmark/performance/run-all.sh +160 -0
  19. data/benchmark/performance/scala.scala +181 -0
  20. data/benchmark/serializer.rb +82 -0
  21. data/benchmark/sort.rb +43 -0
  22. data/benchmark/sort2.rb +164 -0
  23. data/benchmark/take.rb +28 -0
  24. data/bin/ruby-spark +8 -0
  25. data/example/pi.rb +28 -0
  26. data/ext/ruby_c/extconf.rb +3 -0
  27. data/ext/ruby_c/murmur.c +158 -0
  28. data/ext/ruby_c/murmur.h +9 -0
  29. data/ext/ruby_c/ruby-spark.c +18 -0
  30. data/ext/ruby_java/Digest.java +36 -0
  31. data/ext/ruby_java/Murmur2.java +98 -0
  32. data/ext/ruby_java/RubySparkExtService.java +28 -0
  33. data/ext/ruby_java/extconf.rb +3 -0
  34. data/ext/spark/build.sbt +73 -0
  35. data/ext/spark/project/plugins.sbt +9 -0
  36. data/ext/spark/sbt/sbt +34 -0
  37. data/ext/spark/src/main/scala/Exec.scala +91 -0
  38. data/ext/spark/src/main/scala/MLLibAPI.scala +4 -0
  39. data/ext/spark/src/main/scala/Marshal.scala +52 -0
  40. data/ext/spark/src/main/scala/MarshalDump.scala +113 -0
  41. data/ext/spark/src/main/scala/MarshalLoad.scala +220 -0
  42. data/ext/spark/src/main/scala/RubyAccumulatorParam.scala +69 -0
  43. data/ext/spark/src/main/scala/RubyBroadcast.scala +13 -0
  44. data/ext/spark/src/main/scala/RubyConstant.scala +13 -0
  45. data/ext/spark/src/main/scala/RubyMLLibAPI.scala +55 -0
  46. data/ext/spark/src/main/scala/RubyMLLibUtilAPI.scala +21 -0
  47. data/ext/spark/src/main/scala/RubyPage.scala +34 -0
  48. data/ext/spark/src/main/scala/RubyRDD.scala +364 -0
  49. data/ext/spark/src/main/scala/RubySerializer.scala +14 -0
  50. data/ext/spark/src/main/scala/RubyTab.scala +11 -0
  51. data/ext/spark/src/main/scala/RubyUtils.scala +15 -0
  52. data/ext/spark/src/main/scala/RubyWorker.scala +257 -0
  53. data/ext/spark/src/test/scala/MarshalSpec.scala +84 -0
  54. data/lib/ruby-spark.rb +1 -0
  55. data/lib/spark.rb +198 -0
  56. data/lib/spark/accumulator.rb +260 -0
  57. data/lib/spark/broadcast.rb +98 -0
  58. data/lib/spark/build.rb +43 -0
  59. data/lib/spark/cli.rb +169 -0
  60. data/lib/spark/command.rb +86 -0
  61. data/lib/spark/command/base.rb +154 -0
  62. data/lib/spark/command/basic.rb +345 -0
  63. data/lib/spark/command/pair.rb +124 -0
  64. data/lib/spark/command/sort.rb +51 -0
  65. data/lib/spark/command/statistic.rb +144 -0
  66. data/lib/spark/command_builder.rb +141 -0
  67. data/lib/spark/command_validator.rb +34 -0
  68. data/lib/spark/config.rb +244 -0
  69. data/lib/spark/constant.rb +14 -0
  70. data/lib/spark/context.rb +304 -0
  71. data/lib/spark/error.rb +50 -0
  72. data/lib/spark/ext/hash.rb +41 -0
  73. data/lib/spark/ext/integer.rb +25 -0
  74. data/lib/spark/ext/io.rb +57 -0
  75. data/lib/spark/ext/ip_socket.rb +29 -0
  76. data/lib/spark/ext/module.rb +58 -0
  77. data/lib/spark/ext/object.rb +24 -0
  78. data/lib/spark/ext/string.rb +24 -0
  79. data/lib/spark/helper.rb +10 -0
  80. data/lib/spark/helper/logger.rb +40 -0
  81. data/lib/spark/helper/parser.rb +85 -0
  82. data/lib/spark/helper/serialize.rb +71 -0
  83. data/lib/spark/helper/statistic.rb +93 -0
  84. data/lib/spark/helper/system.rb +42 -0
  85. data/lib/spark/java_bridge.rb +19 -0
  86. data/lib/spark/java_bridge/base.rb +203 -0
  87. data/lib/spark/java_bridge/jruby.rb +23 -0
  88. data/lib/spark/java_bridge/rjb.rb +41 -0
  89. data/lib/spark/logger.rb +76 -0
  90. data/lib/spark/mllib.rb +100 -0
  91. data/lib/spark/mllib/classification/common.rb +31 -0
  92. data/lib/spark/mllib/classification/logistic_regression.rb +223 -0
  93. data/lib/spark/mllib/classification/naive_bayes.rb +97 -0
  94. data/lib/spark/mllib/classification/svm.rb +135 -0
  95. data/lib/spark/mllib/clustering/gaussian_mixture.rb +82 -0
  96. data/lib/spark/mllib/clustering/kmeans.rb +118 -0
  97. data/lib/spark/mllib/matrix.rb +120 -0
  98. data/lib/spark/mllib/regression/common.rb +73 -0
  99. data/lib/spark/mllib/regression/labeled_point.rb +41 -0
  100. data/lib/spark/mllib/regression/lasso.rb +100 -0
  101. data/lib/spark/mllib/regression/linear.rb +124 -0
  102. data/lib/spark/mllib/regression/ridge.rb +97 -0
  103. data/lib/spark/mllib/ruby_matrix/matrix_adapter.rb +53 -0
  104. data/lib/spark/mllib/ruby_matrix/vector_adapter.rb +57 -0
  105. data/lib/spark/mllib/stat/distribution.rb +12 -0
  106. data/lib/spark/mllib/vector.rb +185 -0
  107. data/lib/spark/rdd.rb +1328 -0
  108. data/lib/spark/sampler.rb +92 -0
  109. data/lib/spark/serializer.rb +24 -0
  110. data/lib/spark/serializer/base.rb +170 -0
  111. data/lib/spark/serializer/cartesian.rb +37 -0
  112. data/lib/spark/serializer/marshal.rb +19 -0
  113. data/lib/spark/serializer/message_pack.rb +25 -0
  114. data/lib/spark/serializer/oj.rb +25 -0
  115. data/lib/spark/serializer/pair.rb +27 -0
  116. data/lib/spark/serializer/utf8.rb +25 -0
  117. data/lib/spark/sort.rb +189 -0
  118. data/lib/spark/stat_counter.rb +125 -0
  119. data/lib/spark/storage_level.rb +39 -0
  120. data/lib/spark/version.rb +3 -0
  121. data/lib/spark/worker/master.rb +144 -0
  122. data/lib/spark/worker/spark_files.rb +15 -0
  123. data/lib/spark/worker/worker.rb +197 -0
  124. data/ruby-spark.gemspec +36 -0
  125. data/spec/generator.rb +37 -0
  126. data/spec/inputs/lorem_300.txt +316 -0
  127. data/spec/inputs/numbers/1.txt +50 -0
  128. data/spec/inputs/numbers/10.txt +50 -0
  129. data/spec/inputs/numbers/11.txt +50 -0
  130. data/spec/inputs/numbers/12.txt +50 -0
  131. data/spec/inputs/numbers/13.txt +50 -0
  132. data/spec/inputs/numbers/14.txt +50 -0
  133. data/spec/inputs/numbers/15.txt +50 -0
  134. data/spec/inputs/numbers/16.txt +50 -0
  135. data/spec/inputs/numbers/17.txt +50 -0
  136. data/spec/inputs/numbers/18.txt +50 -0
  137. data/spec/inputs/numbers/19.txt +50 -0
  138. data/spec/inputs/numbers/2.txt +50 -0
  139. data/spec/inputs/numbers/20.txt +50 -0
  140. data/spec/inputs/numbers/3.txt +50 -0
  141. data/spec/inputs/numbers/4.txt +50 -0
  142. data/spec/inputs/numbers/5.txt +50 -0
  143. data/spec/inputs/numbers/6.txt +50 -0
  144. data/spec/inputs/numbers/7.txt +50 -0
  145. data/spec/inputs/numbers/8.txt +50 -0
  146. data/spec/inputs/numbers/9.txt +50 -0
  147. data/spec/inputs/numbers_0_100.txt +101 -0
  148. data/spec/inputs/numbers_1_100.txt +100 -0
  149. data/spec/lib/collect_spec.rb +42 -0
  150. data/spec/lib/command_spec.rb +68 -0
  151. data/spec/lib/config_spec.rb +64 -0
  152. data/spec/lib/context_spec.rb +163 -0
  153. data/spec/lib/ext_spec.rb +72 -0
  154. data/spec/lib/external_apps_spec.rb +45 -0
  155. data/spec/lib/filter_spec.rb +80 -0
  156. data/spec/lib/flat_map_spec.rb +100 -0
  157. data/spec/lib/group_spec.rb +109 -0
  158. data/spec/lib/helper_spec.rb +19 -0
  159. data/spec/lib/key_spec.rb +41 -0
  160. data/spec/lib/manipulation_spec.rb +114 -0
  161. data/spec/lib/map_partitions_spec.rb +87 -0
  162. data/spec/lib/map_spec.rb +91 -0
  163. data/spec/lib/mllib/classification_spec.rb +54 -0
  164. data/spec/lib/mllib/clustering_spec.rb +35 -0
  165. data/spec/lib/mllib/matrix_spec.rb +32 -0
  166. data/spec/lib/mllib/regression_spec.rb +116 -0
  167. data/spec/lib/mllib/vector_spec.rb +77 -0
  168. data/spec/lib/reduce_by_key_spec.rb +118 -0
  169. data/spec/lib/reduce_spec.rb +131 -0
  170. data/spec/lib/sample_spec.rb +46 -0
  171. data/spec/lib/serializer_spec.rb +13 -0
  172. data/spec/lib/sort_spec.rb +58 -0
  173. data/spec/lib/statistic_spec.rb +168 -0
  174. data/spec/lib/whole_text_files_spec.rb +33 -0
  175. data/spec/spec_helper.rb +39 -0
  176. metadata +301 -0
@@ -0,0 +1,15 @@
1
+ class SparkFiles
2
+
3
+ class << self
4
+ attr_accessor :root_directory
5
+ end
6
+
7
+ def self.get(file_name)
8
+ File.join(root_directory, file_name)
9
+ end
10
+
11
+ def self.get_content(file_name)
12
+ File.read(get(file_name))
13
+ end
14
+
15
+ end
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Load root of the gem
4
+ lib = File.expand_path(File.join('..', '..'), File.dirname(__FILE__))
5
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
6
+
7
+ require 'ruby-spark.rb'
8
+ require 'socket'
9
+
10
+ require_relative 'spark_files'
11
+
12
+
13
+ # =================================================================================================
14
+ # Worker
15
+ #
16
+ # Iterator is LAZY !!!
17
+ #
18
+ module Worker
19
+ class Base
20
+
21
+ include Spark::Helper::Serialize
22
+ include Spark::Helper::System
23
+ include Spark::Constant
24
+
25
+ attr_accessor :socket
26
+
27
+ def initialize(port)
28
+ # Open socket to Spark
29
+ @socket = TCPSocket.open('localhost', port)
30
+
31
+ # Send back worker ID
32
+ socket.write_long(id)
33
+ end
34
+
35
+ def run
36
+ begin
37
+ compute
38
+ rescue => e
39
+ send_error(e)
40
+ else
41
+ successful_finish
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def before_start
48
+ # Should be implemented in sub-classes
49
+ end
50
+
51
+ def before_end
52
+ # Should be implemented in sub-classes
53
+ end
54
+
55
+ # These methods must be on one method because iterator is Lazy
56
+ # which mean that exception can be raised at `serializer` or `compute`
57
+ def compute
58
+ before_start
59
+
60
+ # Load split index
61
+ @split_index = socket.read_int
62
+
63
+ # Load files
64
+ SparkFiles.root_directory = socket.read_string
65
+
66
+ # Load broadcast
67
+ count = socket.read_int
68
+ count.times do
69
+ Spark::Broadcast.register(socket.read_long, socket.read_string)
70
+ end
71
+
72
+ # Load command
73
+ @command = socket.read_data
74
+
75
+ # Load iterator
76
+ @iterator = @command.deserializer.load(socket).lazy
77
+
78
+ # Compute
79
+ @iterator = @command.execute(@iterator, @split_index)
80
+
81
+ # Send result
82
+ @command.serializer.dump(@iterator, socket)
83
+ end
84
+
85
+ def send_error(e)
86
+ # Flag
87
+ socket.write_int(WORKER_ERROR)
88
+
89
+ # Message
90
+ socket.write_string(e.message)
91
+
92
+ # Backtrace
93
+ socket.write_int(e.backtrace.size)
94
+ e.backtrace.each do |item|
95
+ socket.write_string(item)
96
+ end
97
+
98
+ socket.flush
99
+
100
+ # Wait for spark
101
+ # Socket is closed before throwing an exception
102
+ # Singal that ruby exception was fully received
103
+ until socket.closed?
104
+ sleep(0.1)
105
+ end
106
+
107
+ # Depend on type of worker
108
+ kill_worker
109
+ end
110
+
111
+ def successful_finish
112
+ # Finish
113
+ socket.write_int(WORKER_DONE)
114
+
115
+ # Send changed accumulator
116
+ changed = Spark::Accumulator.changed
117
+ socket.write_int(changed.size)
118
+ changed.each do |accumulator|
119
+ socket.write_data([accumulator.id, accumulator.value])
120
+ end
121
+
122
+ # Send it
123
+ socket.flush
124
+
125
+ before_end
126
+ end
127
+
128
+ def log(message=nil)
129
+ return if !$DEBUG
130
+
131
+ $stdout.puts %{==> #{Time.now.strftime('%H:%M:%S')} [#{id}] #{message}}
132
+ $stdout.flush
133
+ end
134
+
135
+ end
136
+
137
+ # ===============================================================================================
138
+ # Worker::Process
139
+ #
140
+ class Process < Base
141
+
142
+ def id
143
+ ::Process.pid
144
+ end
145
+
146
+ private
147
+
148
+ def before_start
149
+ $PROGRAM_NAME = 'RubySparkWorker'
150
+ end
151
+
152
+ def kill_worker
153
+ Process.exit(false)
154
+ end
155
+
156
+ end
157
+
158
+ # ===============================================================================================
159
+ # Worker::Thread
160
+ #
161
+ class Thread < Base
162
+
163
+ def id
164
+ ::Thread.current.object_id
165
+ end
166
+
167
+ private
168
+
169
+ def load_command
170
+ $mutex_for_command.synchronize { super }
171
+ end
172
+
173
+ # Threads changing for reading is very slow
174
+ # Faster way is do it one by one
175
+ def load_iterator
176
+ # Wait for incoming connection for preventing deadlock
177
+ if jruby?
178
+ socket.io_wait
179
+ else
180
+ socket.wait_readable
181
+ end
182
+
183
+ $mutex_for_iterator.synchronize { super }
184
+ end
185
+
186
+ def kill_worker
187
+ Thread.current.kill
188
+ end
189
+
190
+ end
191
+ end
192
+
193
+ # Worker is loaded as standalone
194
+ if $PROGRAM_NAME == __FILE__
195
+ worker = Worker::Process.new(ARGV[0])
196
+ worker.run
197
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'spark/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'ruby-spark'
10
+ spec.version = Spark::VERSION
11
+ spec.authors = ['Ondřej Moravčík']
12
+ spec.email = ['moravcik.ondrej@gmail.com']
13
+ spec.summary = %q{Ruby wrapper for Spark}
14
+ spec.description = %q{}
15
+ spec.homepage = ''
16
+ spec.license = 'MIT'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ['lib']
22
+
23
+ if RUBY_PLATFORM =~ /java/
24
+ extensions = ['ext/ruby_java/extconf.rb']
25
+ else
26
+ extensions = ['ext/ruby_c/extconf.rb']
27
+ end
28
+
29
+ spec.extensions = extensions
30
+ spec.required_ruby_version = '>= 2.0'
31
+
32
+ spec.requirements << 'java, scala'
33
+
34
+ spec.add_development_dependency 'bundler', '~> 1.6'
35
+ spec.add_development_dependency 'rake'
36
+ end
data/spec/generator.rb ADDED
@@ -0,0 +1,37 @@
1
+ class Generator
2
+ def self.numbers(size=1000)
3
+ Array.new(size){ rand(1..1000) }
4
+ end
5
+
6
+ def self.numbers_with_zero(size=1000)
7
+ Array.new(size){ rand(0..1000) }
8
+ end
9
+
10
+ def self.words(size=1000)
11
+ Array.new(size) { word }
12
+ end
13
+
14
+ def self.word(size=10)
15
+ Array.new(rand(1..size)){(97+rand(26)).chr}.join
16
+ end
17
+
18
+ def self.lines(size=1000, letters=3)
19
+ Array.new(size) do
20
+ Array.new(rand(50..100)){
21
+ (97+rand(letters)).chr + (" " * (rand(10) == 0 ? 1 : 0))
22
+ }.join
23
+ end
24
+ end
25
+
26
+ def self.hash(size=1000)
27
+ Array.new(size) do
28
+ [word(2), rand(1..10)]
29
+ end
30
+ end
31
+
32
+ def self.hash_with_values(size=1000, values_count=10)
33
+ Array.new(size) do
34
+ [word(2), Array.new(values_count) { rand(1..10) }]
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,316 @@
1
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ligula neque, ultricies et lorem
2
+ vel, accumsan cursus felis. Maecenas ullamcorper, magna eu lobortis gravida, diam leo rutrum diam,
3
+ eget elementum sapien felis non magna. Etiam scelerisque, mauris et cursus fermentum, ipsum nisl
4
+ vulputate nisl, sit amet pulvinar libero sem at lectus. Vivamus nibh lectus, elementum eget dui non,
5
+ fermentum volutpat orci. Nam imperdiet, dui id placerat pellentesque, purus sem semper augue, id
6
+ dictum est ipsum et erat. Integer arcu tortor, ullamcorper ac libero a, iaculis sollicitudin orci.
7
+ Sed dapibus hendrerit neque, ac aliquet arcu elementum sed. Phasellus ornare interdum erat, eget
8
+ fringilla sapien ornare vitae. In condimentum, mi sed condimentum viverra, nisl sapien scelerisque
9
+ mi, vel varius metus dolor eu lorem. Nulla pulvinar ac metus eu volutpat. Suspendisse potenti. Duis
10
+ vitae mauris arcu. Proin et dignissim dolor, eget congue purus. Ut malesuada neque massa. Ut viverra
11
+ faucibus turpis, in pharetra nulla iaculis quis. Morbi imperdiet risus eu eros varius facilisis.
12
+ Aenean nec dapibus sapien. Fusce tempus, risus vitae volutpat faucibus, dolor diam cursus risus, sit
13
+ amet faucibus mauris mauris quis orci. Aliquam massa ante, accumsan non sapien quis, ullamcorper
14
+ fermentum elit. Pellentesque risus orci, rhoncus ac mi sed, volutpat vehicula sem. Mauris suscipit
15
+ odio vel mi scelerisque, at cursus libero ullamcorper. Nulla aliquam metus arcu, in vestibulum sem
16
+ ullamcorper eu. Pellentesque laoreet venenatis metus ut accumsan. Quisque ut enim interdum,
17
+ fringilla lorem nec, dignissim orci. Fusce vel diam sed ante dictum scelerisque. Vestibulum lectus
18
+ enim, gravida sit amet ullamcorper sit amet, rhoncus nec dui. Praesent eget molestie tellus, quis
19
+ iaculis sapien. Sed ut rutrum velit. Pellentesque habitant morbi tristique senectus et netus et
20
+ malesuada fames ac turpis egestas. Donec tortor quam, venenatis ac rhoncus et, gravida non orci. Ut
21
+ lacus dolor, auctor id ante varius, pharetra placerat nulla. Nulla facilisi. Nam quis feugiat nibh,
22
+ ut ultrices est. Nulla at mi nec metus porttitor tempor. Donec leo lorem, rhoncus ut arcu eu,
23
+ venenatis eleifend risus. Phasellus non porttitor neque, sit amet accumsan nisl. Pellentesque non
24
+ urna tempor, interdum orci non, gravida enim. Sed in urna et dolor cursus aliquet et vel magna.
25
+ Quisque vestibulum tortor scelerisque orci mattis, eu aliquet sem condimentum. Proin ac ultricies
26
+ erat. Integer sodales, turpis quis volutpat pretium, justo lacus lobortis mauris, nec commodo orci
27
+ leo sit amet metus. Ut ornare ipsum vitae malesuada aliquam. Quisque lobortis semper elit id
28
+ consectetur. Aenean facilisis sapien eu ipsum adipiscing mattis. Praesent malesuada aliquet
29
+ venenatis. Ut aliquet vel sapien nec euismod. Morbi eros urna, rutrum ut iaculis sed, vulputate sit
30
+ amet nunc. Nulla facilisi. Morbi sagittis nec magna sed scelerisque. Maecenas a euismod eros.
31
+ Vestibulum suscipit pharetra velit porta fermentum. Phasellus euismod auctor metus ut interdum.
32
+ Quisque lectus lorem, tristique ut libero vel, rhoncus tincidunt tellus. Sed malesuada vestibulum
33
+ purus, at tincidunt massa imperdiet vitae. Ut mollis eleifend elit, et sodales nisl facilisis eu.
34
+ Fusce ligula ligula, porta id est sed, tincidunt malesuada odio. Maecenas ultricies dignissim nunc,
35
+ quis adipiscing urna auctor commodo. Phasellus tincidunt odio non nulla luctus sollicitudin. Mauris
36
+ pharetra porttitor est iaculis sollicitudin. Curabitur quam sem, fringilla id tellus vitae,
37
+ elementum convallis eros. Morbi sollicitudin eleifend leo, ut euismod ligula ornare sagittis. Nullam
38
+ luctus, mi eget dapibus elementum, diam purus fringilla lectus, sit amet sodales neque turpis sed
39
+ mi. Sed volutpat sem euismod posuere mollis. Integer viverra egestas lacinia. Quisque viverra metus
40
+ massa, in condimentum sem tincidunt a. Proin ac ipsum non leo sollicitudin consectetur id a sem.
41
+ Cras tempus venenatis nisl sit amet venenatis. Nulla facilisi. Morbi scelerisque mi est, vitae
42
+ lobortis sem ultricies faucibus. In urna ante, faucibus ac eros et, dignissim mollis justo. Quisque
43
+ aliquet tortor sem, ac mattis tortor faucibus sed. Donec tortor lacus, egestas in convallis at,
44
+ vulputate eu nibh. Aenean ligula augue, imperdiet in tempor id, consequat vitae erat. Sed id eros a
45
+ justo semper ultricies. Curabitur nunc nisi, placerat at leo sed, vehicula pulvinar velit. Nullam ut
46
+ ipsum augue. Fusce condimentum quam commodo, venenatis massa eleifend, dignissim neque. Curabitur
47
+ sit amet hendrerit tortor, a condimentum sem. Morbi lobortis porta porttitor. Maecenas mollis ipsum
48
+ ac est venenatis auctor at vel lectus. Mauris luctus euismod dolor. Cras vitae nibh eget sem
49
+ placerat adipiscing. Pellentesque ac molestie ligula. Vivamus sit amet lectus odio. Duis lacinia
50
+ rutrum faucibus. Curabitur luctus ultricies enim, id imperdiet ipsum viverra vitae. Mauris et
51
+ iaculis erat, vel faucibus purus. Fusce non nisl tristique, dignissim lacus id, fermentum velit. Sed
52
+ facilisis sapien at interdum viverra. Aliquam erat volutpat. Maecenas suscipit diam vitae velit
53
+ vulputate tincidunt. Nulla facilisi. Sed eget tortor et ante mollis cursus. Nullam vitae porttitor
54
+ magna. Quisque iaculis massa dui, id rutrum purus blandit eu. Duis convallis ipsum id commodo
55
+ iaculis. Praesent sagittis ut tortor ut varius. Curabitur consequat volutpat scelerisque. Cras
56
+ pharetra lectus eget urna imperdiet ullamcorper. Sed lacinia ut eros non malesuada. Quisque
57
+ hendrerit suscipit convallis. Vivamus posuere vestibulum massa, non accumsan diam tincidunt eu.
58
+ Nulla bibendum dictum mi sit amet faucibus. Nullam egestas lorem nunc, vel malesuada elit imperdiet
59
+ vitae. Sed luctus ligula at erat tempus tristique. Proin varius mi quis libero sollicitudin
60
+ ullamcorper. In hac habitasse platea dictumst. Praesent auctor arcu vel luctus consequat. Curabitur
61
+ consequat magna sit amet ante feugiat dictum. Morbi scelerisque faucibus urna, ac dapibus sem
62
+ ultricies eu. Pellentesque rhoncus sapien nec eros facilisis consectetur. Duis eleifend vestibulum
63
+ suscipit. Morbi orci metus, malesuada sit amet urna ac, laoreet vehicula lacus. Quisque gravida,
64
+ nunc fringilla tincidunt vestibulum, lacus urna commodo nisl, quis sodales lectus ipsum et augue. Ut
65
+ non erat sit amet neque fermentum ultricies. Vestibulum tincidunt est elit, ac dapibus velit
66
+ faucibus id. Praesent in viverra libero. Proin eleifend, odio eget sodales dignissim, nunc arcu
67
+ ullamcorper libero, sit amet sodales diam ipsum in tellus. Suspendisse enim nunc, accumsan non
68
+ ligula et, vulputate viverra ante. Ut id elit eu dui dictum malesuada at id orci. Vivamus sed felis
69
+ aliquam metus consequat euismod nec eu libero. Phasellus mattis malesuada ipsum eu posuere. Nullam
70
+ at massa enim. Duis vitae urna blandit, ultricies nisi in, consequat elit. Quisque nec nibh ut
71
+ tortor pulvinar euismod. Praesent molestie felis ac risus elementum sollicitudin. Donec eu leo in
72
+ augue convallis mattis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur
73
+ ridiculus mus. Integer ut dignissim lectus. Vivamus eros felis, gravida et auctor ut, volutpat vitae
74
+ dui. Nunc adipiscing sapien et lectus rutrum vestibulum. Mauris fermentum, metus eu sollicitudin
75
+ malesuada, lorem diam vestibulum metus, ut elementum metus nibh sed augue. Cras lectus risus,
76
+ feugiat eget fringilla a, cursus et eros. Praesent aliquam justo vel condimentum lacinia. Sed
77
+ condimentum dui nec leo blandit, vel elementum odio laoreet. Quisque suscipit molestie iaculis.
78
+ Nullam dignissim, mauris sit amet condimentum aliquet, magna sapien scelerisque nisl, tincidunt
79
+ auctor purus libero at lectus. Nulla facilisi. Sed egestas erat at dictum egestas. Cras non mauris
80
+ ut dolor interdum condimentum. Fusce quis hendrerit purus, dictum cursus mi. Maecenas mattis, turpis
81
+ sit amet mollis ultricies, mi turpis ornare velit, eget suscipit magna eros sit amet purus. Integer
82
+ ut viverra elit. Praesent eu augue viverra nunc convallis porta. Etiam venenatis dignissim nisl et
83
+ semper. Cras eu nisl vitae justo ornare porttitor vel nec augue. Pellentesque faucibus mollis neque,
84
+ nec ullamcorper purus mollis sed. Suspendisse ut molestie lectus, faucibus aliquet libero. Aliquam
85
+ tristique, neque ut lobortis ultricies, tellus elit ultrices risus, sodales dapibus sem mauris et
86
+ magna. Sed et sem porttitor, fringilla mauris vestibulum, porttitor dui. Proin vitae viverra elit.
87
+ Integer nec adipiscing velit. Nunc quis urna tristique, ultrices orci eget, aliquet lorem. Curabitur
88
+ consequat adipiscing sodales. In elementum condimentum ante id placerat. Cras ac turpis tristique
89
+ lacus vulputate dictum vel nec libero. Curabitur fringilla interdum tempus. Integer placerat dolor
90
+ ut magna aliquet bibendum. Cras ac metus magna. Curabitur vehicula magna ut sapien viverra ornare.
91
+ Donec risus nisi, imperdiet eu laoreet in, tempor lobortis urna. Etiam malesuada et lacus ac
92
+ consectetur. Morbi facilisis sapien quis nisl laoreet semper. Suspendisse volutpat sapien vel quam
93
+ blandit faucibus. Nam sagittis velit eros, vitae suscipit tortor elementum ac. Pellentesque habitant
94
+ morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec nec nibh dictum,
95
+ pretium nulla eu, pharetra mauris. Vestibulum leo mi, convallis et euismod ac, molestie in ligula.
96
+ Vestibulum tempor tincidunt porttitor. Integer nisl orci, dignissim ac volutpat a, auctor eget
97
+ augue. Suspendisse eget euismod nunc, eu elementum ipsum. Cras libero tortor, gravida quis
98
+ vestibulum a, tincidunt aliquam mauris. Integer elementum pellentesque posuere. Donec accumsan
99
+ feugiat pulvinar. Aliquam eros justo, dictum non elementum nec, tristique vel massa. Nulla a velit
100
+ porttitor, aliquam turpis nec, ultricies ligula. Nam id dignissim dui. Ut placerat arcu nec accumsan
101
+ varius. Sed quis accumsan nunc, in dapibus lorem. Morbi egestas sagittis pulvinar. Morbi id mauris
102
+ ante. Sed magna nibh, venenatis quis lacinia in, congue quis metus. Nunc lacus lectus, adipiscing
103
+ sed consequat id, luctus vel dui. Mauris eu nisi erat. Proin eleifend lectus sit amet ligula
104
+ fringilla semper. Suspendisse tristique, quam ac pharetra dictum, libero risus rutrum ipsum, eget
105
+ tristique arcu neque vel nisi. Ut auctor nulla vitae porta faucibus. Suspendisse ut tellus enim.
106
+ Morbi commodo posuere quam. Proin consequat in quam pulvinar posuere. Nunc id ullamcorper est. Cras
107
+ ac molestie massa. Cras leo tellus, tempus id nibh quis, porttitor laoreet elit. Mauris in ornare
108
+ nisi. Duis vel velit felis. Suspendisse gravida felis nec nulla hendrerit pretium. Cras at orci
109
+ neque. Phasellus vehicula, ipsum at tempus sodales, mauris est condimentum metus, a vehicula ante
110
+ tellus sit amet diam. Suspendisse fermentum elit in volutpat viverra. Nullam gravida in augue sed
111
+ mollis. Curabitur aliquam diam non quam aliquam ultrices. Quisque pretium semper diam eget
112
+ malesuada. Suspendisse porttitor sagittis sem at malesuada. Donec euismod elementum nulla, sit amet
113
+ eleifend enim adipiscing nec. Nullam porta, enim ac tincidunt molestie, turpis mi porta justo,
114
+ ornare tristique sem orci quis turpis. Nullam leo dolor, pellentesque ac hendrerit et, tempus quis
115
+ nisi. Fusce pretium mattis tortor sagittis suscipit. Vestibulum vitae suscipit libero. Mauris
116
+ consequat sagittis mi, id tempus est condimentum et. In eget condimentum odio, a malesuada quam.
117
+ Vivamus id turpis non nulla eleifend cursus ut sit amet tellus. Proin ultrices luctus nibh, eget
118
+ condimentum ligula vestibulum in. Aliquam pharetra aliquet erat nec lacinia. Cras fringilla est
119
+ fringilla ante tristique, vitae bibendum dolor malesuada. Praesent ut dui pulvinar, suscipit velit
120
+ gravida, malesuada nunc. Cras tempus feugiat interdum. Vivamus lectus lorem, rutrum ut neque at,
121
+ sollicitudin euismod nulla. Vestibulum ac ligula suscipit, ultricies felis eget, adipiscing lectus.
122
+ Maecenas nec enim vel eros molestie lobortis faucibus sit amet urna. Sed ac consequat nulla. Nulla
123
+ et libero nisi. Pellentesque euismod nunc quis ipsum tristique, suscipit elementum magna aliquam.
124
+ Praesent sit amet tincidunt leo. Duis tempor arcu eget est posuere imperdiet. Quisque vel dui
125
+ adipiscing, auctor nibh vel, vulputate sapien. Curabitur eu sodales lacus. Aliquam felis eros,
126
+ mattis a diam eu, ullamcorper vestibulum turpis. Vivamus vitae vulputate lacus, sed convallis lorem.
127
+ Vestibulum mattis sollicitudin vulputate. Mauris cursus erat eget nisi accumsan, nec commodo tellus
128
+ blandit. Etiam gravida nulla et lorem molestie auctor. Mauris venenatis iaculis nulla vel mollis.
129
+ Morbi pretium sed eros at commodo. Aliquam eu justo turpis. Pellentesque lobortis, nisl eget
130
+ ultricies dictum, augue sem placerat elit, vitae pretium lectus massa eget tortor. Nulla accumsan,
131
+ massa eu rutrum pharetra, mi sapien aliquam massa, viverra facilisis metus nisi in dolor. Duis felis
132
+ velit, interdum a elit non, cursus pellentesque libero. Cum sociis natoque penatibus et magnis dis
133
+ parturient montes, nascetur ridiculus mus. Nunc vel nisi quis augue accumsan aliquam. Suspendisse
134
+ ante lectus, lobortis nec suscipit at, ullamcorper at diam. Aliquam hendrerit, eros ac egestas
135
+ condimentum, enim metus lobortis nibh, sit amet convallis augue nulla nec lorem. Lorem ipsum dolor
136
+ sit amet, consectetur adipiscing elit. Ut ac ligula eget est blandit scelerisque at vitae nunc. Sed
137
+ venenatis eros non quam auctor posuere. Curabitur convallis dapibus semper. Fusce et leo sed massa
138
+ posuere porta. Morbi convallis lobortis eros. Quisque ac nisl dictum, sagittis eros et, pellentesque
139
+ metus. Quisque mattis sodales lorem quis malesuada. Aenean neque sapien, rutrum vitae euismod quis,
140
+ euismod eu mi. Etiam ante tellus, auctor vitae pulvinar a, mattis nec tellus. Morbi libero lectus,
141
+ mattis sit amet convallis at, viverra et nisi. Proin a ante tristique, blandit urna at, lobortis
142
+ leo. Praesent nec odio sit amet ligula adipiscing pretium at rhoncus felis. Ut ut velit turpis. Sed
143
+ tempor lectus massa, vel gravida libero gravida a. Nunc mollis, lorem id dapibus hendrerit, mi orci
144
+ gravida orci, at vehicula neque nisl quis nibh. Mauris feugiat, ligula sit amet interdum laoreet,
145
+ lectus leo accumsan dolor, eu cursus tortor quam eget lectus. Sed commodo, est in bibendum
146
+ condimentum, magna neque dictum sapien, at lacinia sem ipsum ut eros. In eget erat eu nulla
147
+ hendrerit tincidunt id vulputate nibh. Nunc sed imperdiet urna, eu tempor orci. Phasellus
148
+ pellentesque sapien eu risus tincidunt, ut iaculis risus fermentum. Suspendisse condimentum erat
149
+ vitae porta malesuada. Ut a vulputate lorem. Nulla ullamcorper, neque in posuere vulputate, neque
150
+ magna tempor erat, sit amet luctus nisi nibh quis ligula. Duis porta urna et fermentum interdum. Sed
151
+ pellentesque odio euismod nisi auctor rutrum. Suspendisse mi nibh, dignissim eget porttitor quis,
152
+ commodo a massa. Nunc vel eleifend turpis. Sed iaculis, massa quis egestas pellentesque, nibh ante
153
+ feugiat ante, a euismod lacus nunc et felis. Nam in aliquet odio. Nulla eget enim aliquam, faucibus
154
+ est at, fringilla tellus. Duis molestie massa ornare, sodales leo eget, lobortis nibh. Nam bibendum
155
+ mi a facilisis mattis. Duis ultrices arcu tellus, vitae interdum tortor dictum et. Sed id luctus
156
+ lectus, eu tempus quam. Duis mi nisl, iaculis vel tortor sit amet, vulputate sodales risus. Cras
157
+ vitae lobortis nisi, eu adipiscing ante. Nam eget scelerisque libero. Nulla pulvinar, velit et
158
+ posuere sagittis, odio risus venenatis sapien, at tristique enim augue quis sem. Integer rutrum
159
+ blandit eros eu faucibus. Etiam eget iaculis felis, in fermentum ante. Nullam a placerat risus, id
160
+ accumsan quam. Donec est orci, elementum eu sapien non, ultricies ullamcorper leo. Praesent
161
+ tincidunt, mauris in viverra hendrerit, dolor nisi cursus orci, vel lacinia neque ante eu magna. Nam
162
+ facilisis massa at nisi accumsan, non condimentum turpis facilisis. Cras quis ipsum at orci ornare
163
+ venenatis vitae et ante. Morbi vitae luctus lacus. Nullam eu felis at mi hendrerit commodo a eu
164
+ diam. Maecenas ultricies, urna sit amet egestas tempor, dolor ligula dictum nibh, vehicula commodo
165
+ ipsum diam at nunc. Proin facilisis tincidunt elit, sed vulputate leo lobortis sed. In tincidunt
166
+ risus lorem, venenatis pellentesque tellus accumsan vitae. Integer ullamcorper mi ut risus
167
+ consectetur dictum in quis dui. Pellentesque sed diam sed purus egestas mollis id at sapien. Nunc
168
+ cursus mi nec accumsan porta. Nullam pulvinar pharetra felis. Etiam porta massa et diam scelerisque,
169
+ ut iaculis nisl luctus. Curabitur vel metus id lacus faucibus tempus. Nullam ornare neque orci, nec
170
+ scelerisque erat mattis nec. Phasellus ultrices ultrices nisi quis venenatis. Sed ultrices iaculis
171
+ diam a faucibus. Phasellus quis suscipit nulla. Nulla ultricies, turpis et dictum ullamcorper, urna
172
+ metus porta tellus, quis congue dolor libero quis sem. Nam tempus metus risus, sed rutrum nibh
173
+ cursus malesuada. Vivamus bibendum odio eget mi aliquet, sed tempor eros tincidunt. Suspendisse eu
174
+ ultricies ligula, non commodo sem. Ut aliquet elit sed leo laoreet aliquam. Vivamus feugiat a justo
175
+ non auctor. Sed rhoncus orci ut dictum dignissim. Duis eros libero, tempus non venenatis quis,
176
+ suscipit eget turpis. Aliquam sed ullamcorper velit, in tincidunt tellus. Ut dapibus erat vel nunc
177
+ feugiat elementum. Cras congue, erat sit amet lacinia venenatis, nisi magna rhoncus nulla, eu
178
+ blandit eros neque ac eros. Donec vulputate placerat dapibus. Integer dignissim odio eget iaculis
179
+ ultrices. Vestibulum ligula neque, tincidunt at pretium ac, tincidunt sit amet tellus. Sed fermentum
180
+ egestas tortor, non volutpat sapien. Aliquam erat volutpat. Duis semper placerat sapien at placerat.
181
+ Praesent facilisis pharetra dignissim. Morbi laoreet sed tortor eu rhoncus. Vivamus eleifend felis
182
+ eu dui ornare ornare sed at urna. Nulla nulla justo, hendrerit id enim vitae, blandit consequat
183
+ nibh. Aliquam mattis diam mattis fringilla tempor. Suspendisse suscipit est sed pulvinar commodo.
184
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. In in scelerisque enim. Phasellus ornare
185
+ nisl consequat volutpat bibendum. Vivamus et nunc viverra, ultrices lorem a, cursus purus. Curabitur
186
+ nibh libero, hendrerit lobortis malesuada sit amet, fringilla et augue. Vestibulum est lacus,
187
+ fringilla sit amet dictum pulvinar, lacinia at leo. Proin iaculis felis vitae metus viverra blandit.
188
+ Mauris accumsan sagittis semper. Quisque non diam a quam volutpat faucibus. Pellentesque eros orci,
189
+ commodo eget fringilla eu, euismod et turpis. Duis molestie et eros ac ullamcorper. Phasellus
190
+ consequat risus eget elementum semper. Donec at mi a justo laoreet condimentum porttitor in purus.
191
+ Nulla sit amet libero consectetur, iaculis neque nec, scelerisque turpis. Aliquam interdum nibh eget
192
+ accumsan dictum. Ut lobortis, mi non eleifend lobortis, lorem mauris pretium urna, at fermentum
193
+ tellus felis eu nunc. Aliquam in nibh tristique, tempus purus a, cursus massa. Suspendisse potenti.
194
+ Maecenas porttitor et erat in sollicitudin. Cum sociis natoque penatibus et magnis dis parturient
195
+ montes, nascetur ridiculus mus. Vestibulum commodo placerat velit, vel pellentesque neque sagittis
196
+ eget. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nullam eu massa placerat,
197
+ iaculis eros eget, viverra orci. Aliquam ac lacus porttitor, eleifend elit id, vehicula mauris. Sed
198
+ ac interdum libero. Sed laoreet suscipit mi, ac accumsan massa condimentum nec. Suspendisse sodales
199
+ libero sollicitudin, malesuada quam ac, viverra enim. Sed sapien libero, egestas sit amet orci non,
200
+ venenatis interdum augue. In hac habitasse platea dictumst. Fusce gravida orci at ligula fringilla
201
+ adipiscing. Nunc quis ipsum quis nibh egestas porta. Proin et faucibus elit. Etiam in neque at nunc
202
+ pharetra adipiscing nec vel magna. Donec at nunc scelerisque, tincidunt risus ut, bibendum nisi.
203
+ Donec pulvinar fermentum purus, ac adipiscing urna iaculis at. Nulla ut nunc vitae lorem dapibus
204
+ fringilla. Ut placerat dignissim nulla ornare mattis. Mauris rutrum tellus quis odio dictum, ac
205
+ tempor velit scelerisque. Quisque ligula elit, convallis nec volutpat vitae, pulvinar id mauris.
206
+ Vivamus vel accumsan tortor. Donec eu sollicitudin dolor. Pellentesque egestas congue tristique.
207
+ Phasellus ut sollicitudin nisl. Praesent diam neque, malesuada id tincidunt id, malesuada in eros.
208
+ Phasellus adipiscing ipsum vel justo molestie vulputate. Praesent ultricies dapibus lacus pulvinar
209
+ gravida. Donec consequat, orci et mattis ultrices, nibh enim sagittis metus, vitae eleifend enim
210
+ tellus vitae augue. Suspendisse placerat iaculis risus nec iaculis. Ut ullamcorper ultrices dui, sed
211
+ blandit mauris hendrerit vitae. Nulla ac dolor lectus. Etiam pellentesque neque at odio bibendum, at
212
+ venenatis tellus fermentum. Maecenas a condimentum metus. Phasellus semper scelerisque feugiat.
213
+ Fusce varius varius tincidunt. Ut vel auctor magna. Cras dui turpis, euismod in enim a, scelerisque
214
+ adipiscing lectus. Duis mollis pharetra risus, sed ultrices nulla blandit non. Integer ac pulvinar
215
+ magna. Aenean fermentum auctor magna. Ut in viverra sapien. Proin ac bibendum magna, cursus gravida
216
+ elit. Phasellus vehicula facilisis nibh, tempor sagittis mauris accumsan et. Vestibulum sed lacus
217
+ luctus diam ornare venenatis non vel felis. Morbi posuere sit amet nisl quis pulvinar. Suspendisse
218
+ blandit tempus risus quis pretium. Nullam gravida libero vel aliquam suscipit. Nunc vel nunc at leo
219
+ pharetra tempor et ut mi. Aliquam erat volutpat. Nulla placerat odio tellus. Nam adipiscing massa
220
+ nec varius posuere. Proin placerat tellus posuere lorem suscipit, sit amet sagittis sem condimentum.
221
+ Ut pharetra odio quis tellus mattis facilisis. Quisque eget interdum est. Quisque mattis, felis eu
222
+ semper feugiat, quam augue interdum mauris, eget sodales nisi neque quis erat. Curabitur semper, mi
223
+ posuere luctus molestie, neque ante sagittis nulla, sit amet vehicula eros eros in justo. Integer
224
+ aliquet vehicula arcu, quis iaculis justo. Sed tincidunt sem id est porta volutpat. Mauris varius
225
+ felis ut est venenatis, ornare porttitor arcu adipiscing. Sed luctus rutrum ante, consectetur
226
+ sollicitudin sapien accumsan vulputate. Vivamus id diam vehicula, fermentum nunc id, viverra justo.
227
+ Quisque porttitor, odio in molestie hendrerit, libero eros vehicula odio, id vestibulum sapien neque
228
+ quis nibh. Donec vel faucibus est. Ut nec sapien vitae nibh congue egestas vel euismod tellus. Lorem
229
+ ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum quis lacus lorem. Integer egestas
230
+ euismod ante, vitae condimentum neque eleifend non. Sed posuere bibendum ante, ut facilisis dui
231
+ condimentum at. In ut varius augue. Vivamus bibendum eu odio vel convallis. Vivamus cursus sodales
232
+ iaculis. Nullam convallis facilisis blandit. Phasellus iaculis porttitor elit, eget vestibulum ipsum
233
+ convallis eu. Quisque volutpat justo ipsum, eleifend cursus urna facilisis a. Sed at diam nec sem
234
+ semper scelerisque. Aliquam euismod erat quis nisi dictum, at sodales leo fermentum. Nam at nisl
235
+ metus. Proin luctus porttitor ante in tincidunt. Maecenas laoreet vitae enim eget elementum. Nulla
236
+ id sagittis enim, nec ultrices tortor. Nam rutrum ipsum sit amet erat auctor, eu venenatis libero
237
+ ultricies. Ut condimentum neque non diam ullamcorper, ultrices feugiat neque egestas. Pellentesque
238
+ at lobortis est, in blandit mi. Maecenas tincidunt eros id massa pulvinar, quis varius eros
239
+ lobortis. Curabitur vitae sodales orci. Suspendisse potenti. Pellentesque eu fringilla nibh. Etiam
240
+ sed pretium enim, lacinia consequat lectus. Quisque sed mi risus. Praesent posuere dolor sed mauris
241
+ dapibus, id tristique mi mattis. Quisque nec urna rutrum, consectetur mauris ut, egestas libero.
242
+ Fusce a justo orci. Etiam vitae aliquet ipsum. Curabitur consequat tempor eros, ut placerat lectus
243
+ tempus et. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis
244
+ egestas. Sed ligula mi, laoreet sit amet nunc id, ullamcorper fermentum magna. Maecenas enim dui,
245
+ viverra at nulla ut, lacinia pretium nunc. Donec at ultricies nulla, nec cursus odio. Donec
246
+ ullamcorper nec turpis imperdiet hendrerit. Sed euismod aliquam vehicula. Nunc sed enim eleifend
247
+ turpis venenatis sagittis. Sed laoreet velit erat. Proin nisl erat, vulputate et fermentum iaculis,
248
+ mollis suscipit magna. Sed porta, augue ut accumsan fermentum, arcu tortor rutrum tellus, sit amet
249
+ sollicitudin lectus turpis non felis. Vestibulum ante leo, interdum sed venenatis non, porttitor ut
250
+ nibh. Sed sit amet luctus erat. Duis id rhoncus justo, non rutrum lorem. Mauris ut laoreet elit.
251
+ Praesent sed diam porta, rhoncus massa a, tincidunt lorem. Mauris bibendum nunc nec est ullamcorper
252
+ bibendum. Nullam venenatis libero sed ligula scelerisque euismod quis at dui. Donec ac velit luctus,
253
+ molestie mi at, tempor leo. Pellentesque a ultricies risus. Maecenas malesuada faucibus nulla quis
254
+ consectetur. Phasellus pretium interdum risus sit amet aliquet. Nullam eleifend sem id magna
255
+ laoreet, ut lobortis mi tincidunt. Maecenas in justo tempor, viverra ipsum eu, tincidunt nulla. Sed
256
+ sed molestie turpis. Pellentesque imperdiet, eros non vulputate fringilla, turpis odio luctus
257
+ lectus, eu lacinia purus nisl vitae justo. Etiam non dapibus dolor. Fusce non urna scelerisque,
258
+ interdum massa vitae, venenatis metus. Vestibulum scelerisque dolor ac lectus sollicitudin, eget
259
+ fringilla sapien fringilla. Suspendisse non quam massa. Donec a sollicitudin eros, ut mollis turpis.
260
+ Nullam gravida congue semper. Phasellus vitae tellus vitae nulla cursus tempor et non elit.
261
+ Vestibulum pharetra in ligula a venenatis. Maecenas at erat sed nulla vulputate pulvinar et eu
262
+ libero. Donec pulvinar arcu nisi, sed posuere turpis cursus a. In nec turpis interdum, condimentum
263
+ velit in, consectetur lacus. Duis porta, felis a rhoncus ornare, ligula est elementum nunc, eu
264
+ adipiscing massa lorem in nibh. In consequat gravida eros. Phasellus condimentum malesuada sapien
265
+ ultrices tempor. Suspendisse sit amet diam in est pulvinar iaculis nec vitae nibh. Vivamus rhoncus
266
+ enim lorem, elementum posuere est pretium ut. Duis lectus lorem, ultricies ac dignissim in, egestas
267
+ et ipsum. Proin nec est ac dui sagittis dictum. Cras dictum augue ipsum, sit amet gravida ligula
268
+ scelerisque nec. Ut congue blandit porta. Nunc porta vitae risus at sagittis. Donec viverra, ante id
269
+ porta consectetur, felis turpis fringilla dui, ut vulputate nulla eros sit amet augue. Donec
270
+ aliquet, felis ut tempor pretium, enim leo suscipit risus, eget mollis justo ipsum ut augue. Nullam
271
+ at lacus eu orci dapibus laoreet nec convallis leo. Fusce rhoncus sed neque sit amet viverra. Donec
272
+ arcu nisl, hendrerit non pulvinar eu, blandit ac neque. Curabitur porta velit metus, non ullamcorper
273
+ nibh volutpat non. Proin tristique orci nec pretium lobortis. Curabitur quam neque, lacinia vitae
274
+ massa id, molestie pellentesque risus. Praesent vitae lectus bibendum, tincidunt augue vel, volutpat
275
+ magna. Curabitur quis feugiat magna. In libero risus, commodo eu mauris vitae, euismod ullamcorper
276
+ libero. Cras elementum rutrum lacus eu euismod. Morbi purus metus, rutrum nec varius sed, dignissim
277
+ eget nisi. Vivamus mauris nibh, hendrerit eu massa sed, ultrices suscipit est. Cras id odio dui.
278
+ Nulla condimentum luctus ipsum, eu molestie turpis commodo sed. Aliquam erat volutpat. Ut sodales
279
+ urna sit amet est dapibus pharetra. In nec vestibulum mi. Nullam mattis fringilla venenatis. Sed
280
+ risus sem, tempor vitae suscipit a, viverra in quam. In malesuada odio nec laoreet accumsan. Donec
281
+ justo diam, lacinia eu ante eget, pulvinar molestie mauris. Interdum et malesuada fames ac ante
282
+ ipsum primis in faucibus. Sed vulputate ornare dolor a tempor. Maecenas egestas, augue et semper
283
+ egestas, elit ipsum varius sem, a dapibus eros velit in sapien. Nulla sit amet eros ullamcorper,
284
+ hendrerit nunc eu, aliquet ipsum. Sed sit amet lacus enim. Curabitur faucibus rutrum dui, a tempor
285
+ velit vestibulum sed. Curabitur sed nunc id lorem semper malesuada. Maecenas semper eros eu
286
+ pellentesque vulputate. Nulla accumsan dolor placerat eros euismod facilisis. Nam vitae velit
287
+ tortor. Fusce tincidunt felis luctus, scelerisque dui in, rutrum nulla. Proin a pharetra tellus.
288
+ Aenean varius dolor nec risus eleifend fringilla. Proin at tellus ligula. Cras imperdiet mollis nisi
289
+ eget auctor. Etiam libero nunc, dictum at fermentum vitae, vehicula tincidunt justo. Proin tempor
290
+ risus elit, vestibulum auctor erat tristique vel. Etiam varius dui ante, a fringilla erat
291
+ ullamcorper vel. Quisque cursus quam imperdiet ornare dictum. Suspendisse turpis nunc, scelerisque a
292
+ congue eget, faucibus ut mauris. Suspendisse venenatis nisi nec dolor pharetra, id euismod sem
293
+ accumsan. Quisque et accumsan justo, elementum vulputate nulla. Etiam et sapien scelerisque,
294
+ malesuada lacus non, pretium enim. Curabitur ultrices, ipsum hendrerit pulvinar volutpat, dui tortor
295
+ mattis tortor, sed tincidunt magna lectus non eros. Ut hendrerit velit non metus pellentesque
296
+ mattis. Nullam velit nisi, ornare sit amet ipsum id, commodo tincidunt nisi. Aliquam egestas, ante
297
+ non placerat convallis, mi mauris posuere ligula, nec auctor lectus mi quis quam. In auctor
298
+ facilisis ante id elementum. Donec interdum ipsum vitae lorem sollicitudin rutrum. Etiam congue
299
+ pharetra lorem ac dictum. Donec feugiat interdum vulputate. Curabitur mollis suscipit nisi, vel
300
+ tincidunt risus fringilla at. Phasellus tincidunt, nulla a tincidunt tempor, libero turpis imperdiet
301
+ tortor, vel convallis orci neque vitae nisi. Nunc euismod massa quis mollis ultricies. Proin non
302
+ ante elit. Pellentesque et convallis massa. Curabitur blandit mattis metus, non aliquam erat iaculis
303
+ ut. Nam vestibulum ipsum vitae nulla varius, sit amet sodales ipsum congue. Nullam eget mauris ut
304
+ est blandit rhoncus sit amet ac arcu. Nulla at purus consequat, lobortis massa sit amet, posuere
305
+ ante. Nam bibendum laoreet tempus. Fusce ac nulla consequat, placerat sem vitae, condimentum enim.
306
+ Vestibulum sed tellus nec elit varius venenatis. Donec et dapibus dui. Nullam est metus, ultrices
307
+ nec lectus vel, fermentum elementum lacus. Curabitur imperdiet vestibulum enim. Aenean sollicitudin
308
+ at leo quis ullamcorper. Suspendisse in posuere risus. In quis mattis sem, eu facilisis arcu.
309
+ Vestibulum faucibus auctor accumsan. Morbi mattis sit amet augue ac sodales. Integer varius eget
310
+ orci iaculis aliquet. Suspendisse a auctor turpis. Fusce vestibulum vestibulum ante sed mattis.
311
+ Mauris ornare rhoncus enim ac egestas. Donec turpis eros, interdum non placerat nec, adipiscing eu
312
+ urna. Integer feugiat mi quis eros fringilla vehicula. Proin suscipit magna ultricies laoreet
313
+ dignissim. Donec vehicula ac lacus non vehicula. Sed euismod mattis facilisis. Etiam nec risus vitae
314
+ risus iaculis lobortis. Duis eu dui sit amet turpis tincidunt vulputate. Nunc tortor diam, egestas
315
+ in ante ac, scelerisque placerat ante. Nullam interdum ultricies nisl a vehicula. Integer id nunc
316
+ elit. Sed rutrum sit amet neque quis tristique.