ruby-spark 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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.