diff --git a/.gitignore b/.gitignore index 60c38ed8f5..1890e8bd0e 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,11 @@ spring-openid/src/main/resources/application.properties spring-security-openid/src/main/resources/application.properties spring-all/*.log + +*.jar + +SpringDataInjectionDemo/.mvn/wrapper/maven-wrapper.properties + +spring-call-getters-using-reflection/.mvn/wrapper/maven-wrapper.properties + +spring-check-if-a-property-is-null/.mvn/wrapper/maven-wrapper.properties diff --git a/akka-streams/README.md b/akka-streams/README.md new file mode 100644 index 0000000000..7f2751422b --- /dev/null +++ b/akka-streams/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Guide to Akka Streams](http://www.baeldung.com/akka-streams) diff --git a/akka-streams/pom.xml b/akka-streams/pom.xml new file mode 100644 index 0000000000..b1471641f7 --- /dev/null +++ b/akka-streams/pom.xml @@ -0,0 +1,30 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + akka-streams + akka-streams + + + + com.typesafe.akka + akka-stream_2.11 + ${akkastreams.version} + + + com.typesafe.akka + akka-stream-testkit_2.11 + ${akkastreams.version} + + + + 2.5.2 + + + \ No newline at end of file diff --git a/akka-streams/src/main/java/com/baeldung/akkastreams/AverageRepository.java b/akka-streams/src/main/java/com/baeldung/akkastreams/AverageRepository.java new file mode 100644 index 0000000000..8cfae6d52a --- /dev/null +++ b/akka-streams/src/main/java/com/baeldung/akkastreams/AverageRepository.java @@ -0,0 +1,14 @@ +package com.baeldung.akkastreams; + + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; + +public class AverageRepository { + CompletionStage save(Double average) { + return CompletableFuture.supplyAsync(() -> { + System.out.println("saving average: " + average); + return average; + }); + } +} diff --git a/akka-streams/src/main/java/com/baeldung/akkastreams/DataImporter.java b/akka-streams/src/main/java/com/baeldung/akkastreams/DataImporter.java new file mode 100644 index 0000000000..92701e4e37 --- /dev/null +++ b/akka-streams/src/main/java/com/baeldung/akkastreams/DataImporter.java @@ -0,0 +1,74 @@ +package com.baeldung.akkastreams; + + +import akka.Done; +import akka.NotUsed; +import akka.actor.ActorSystem; +import akka.stream.ActorMaterializer; +import akka.stream.javadsl.Flow; +import akka.stream.javadsl.Keep; +import akka.stream.javadsl.Sink; +import akka.stream.javadsl.Source; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import java.util.stream.Collectors; + +public class DataImporter { + private final ActorSystem actorSystem; + private final AverageRepository averageRepository = new AverageRepository(); + + public DataImporter(ActorSystem actorSystem) { + this.actorSystem = actorSystem; + + } + + private List parseLine(String line) { + String[] fields = line.split(";"); + return Arrays.stream(fields) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + private Flow parseContent() { + return Flow.of(String.class).mapConcat(this::parseLine); + } + + private Flow computeAverage() { + return Flow.of(Integer.class).grouped(2).mapAsyncUnordered(8, integers -> + CompletableFuture.supplyAsync(() -> integers + .stream() + .mapToDouble(v -> v) + .average() + .orElse(-1.0))); + } + + Flow calculateAverage() { + return Flow.of(String.class) + .via(parseContent()) + .via(computeAverage()); + } + + private Sink> storeAverages() { + return Flow.of(Double.class) + .mapAsyncUnordered(4, averageRepository::save) + .toMat(Sink.ignore(), Keep.right()); + } + + + CompletionStage calculateAverageForContent(String content) { + return Source.single(content) + .via(calculateAverage()) + .runWith(storeAverages(), ActorMaterializer.create(actorSystem)) + .whenComplete((d, e) -> { + if (d != null) { + System.out.println("Import finished "); + } else { + e.printStackTrace(); + } + }); + } + +} diff --git a/akka-streams/src/test/java/com/baeldung/akkastreams/DataImporterUnitTest.java b/akka-streams/src/test/java/com/baeldung/akkastreams/DataImporterUnitTest.java new file mode 100644 index 0000000000..c47d74eae5 --- /dev/null +++ b/akka-streams/src/test/java/com/baeldung/akkastreams/DataImporterUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.akkastreams; + +import akka.NotUsed; +import akka.actor.ActorSystem; +import akka.stream.ActorMaterializer; +import akka.stream.javadsl.Flow; +import akka.stream.javadsl.Source; +import akka.stream.testkit.javadsl.TestSink; +import org.junit.Test; + + +public class DataImporterUnitTest { + private final ActorSystem actorSystem = ActorSystem.create(); + + @Test + public void givenStreamOfIntegers_whenCalculateAverageOfPairs_thenShouldReturnProperResults() { + //given + Flow tested = new DataImporter(actorSystem).calculateAverage(); + String input = "1;9;11;0"; + + //when + Source flow = Source.single(input).via(tested); + + //then + flow + .runWith(TestSink.probe(actorSystem), ActorMaterializer.create(actorSystem)) + .request(4) + .expectNextUnordered(5d, 5.5); + } + + @Test + public void givenStreamOfIntegers_whenCalculateAverageAndSaveToSink_thenShouldFinishSuccessfully() { + //given + DataImporter dataImporter = new DataImporter(actorSystem); + String input = "10;90;110;10"; + + //when + dataImporter.calculateAverageForContent(input) + .thenAccept(d -> actorSystem.terminate()); + + } + +} \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java b/algorithms/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java similarity index 90% rename from algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java rename to algorithms/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java index 943b44fe05..0cb11f5138 100644 --- a/algorithms/src/main/java/com/baeldung/automata/FiniteStateMachine.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/automata/FiniteStateMachine.java @@ -1,4 +1,4 @@ -package com.baeldung.automata; +package com.baeldung.algorithms.automata; /** * Finite state machine. diff --git a/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java b/algorithms/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java similarity index 93% rename from algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java rename to algorithms/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java index 090e00c73c..1cf06c04b5 100644 --- a/algorithms/src/main/java/com/baeldung/automata/RtFiniteStateMachine.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/automata/RtFiniteStateMachine.java @@ -1,4 +1,4 @@ -package com.baeldung.automata; +package com.baeldung.algorithms.automata; /** * Default implementation of a finite state machine. diff --git a/algorithms/src/main/java/com/baeldung/automata/RtState.java b/algorithms/src/main/java/com/baeldung/algorithms/automata/RtState.java similarity index 95% rename from algorithms/src/main/java/com/baeldung/automata/RtState.java rename to algorithms/src/main/java/com/baeldung/algorithms/automata/RtState.java index b4a5df7961..31cb9b577e 100644 --- a/algorithms/src/main/java/com/baeldung/automata/RtState.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/automata/RtState.java @@ -1,4 +1,4 @@ -package com.baeldung.automata; +package com.baeldung.algorithms.automata; import java.util.ArrayList; import java.util.List; diff --git a/algorithms/src/main/java/com/baeldung/automata/RtTransition.java b/algorithms/src/main/java/com/baeldung/algorithms/automata/RtTransition.java similarity index 93% rename from algorithms/src/main/java/com/baeldung/automata/RtTransition.java rename to algorithms/src/main/java/com/baeldung/algorithms/automata/RtTransition.java index 560011e42a..cb205deacb 100644 --- a/algorithms/src/main/java/com/baeldung/automata/RtTransition.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/automata/RtTransition.java @@ -1,4 +1,4 @@ -package com.baeldung.automata; +package com.baeldung.algorithms.automata; /** diff --git a/algorithms/src/main/java/com/baeldung/automata/State.java b/algorithms/src/main/java/com/baeldung/algorithms/automata/State.java similarity index 93% rename from algorithms/src/main/java/com/baeldung/automata/State.java rename to algorithms/src/main/java/com/baeldung/algorithms/automata/State.java index a25af9d03a..1889c4c7f6 100644 --- a/algorithms/src/main/java/com/baeldung/automata/State.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/automata/State.java @@ -1,4 +1,4 @@ -package com.baeldung.automata; +package com.baeldung.algorithms.automata; /** * State. Part of a finite state machine. diff --git a/algorithms/src/main/java/com/baeldung/automata/Transition.java b/algorithms/src/main/java/com/baeldung/algorithms/automata/Transition.java similarity index 89% rename from algorithms/src/main/java/com/baeldung/automata/Transition.java rename to algorithms/src/main/java/com/baeldung/algorithms/automata/Transition.java index d57620f911..68177ba7dd 100644 --- a/algorithms/src/main/java/com/baeldung/automata/Transition.java +++ b/algorithms/src/main/java/com/baeldung/algorithms/automata/Transition.java @@ -1,4 +1,4 @@ -package com.baeldung.automata; +package com.baeldung.algorithms.automata; /** * Transition in a finite State machine. diff --git a/algorithms/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java b/algorithms/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java new file mode 100644 index 0000000000..77089636c8 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/hillclimbing/HillClimbing.java @@ -0,0 +1,189 @@ +package com.baeldung.algorithms.hillclimbing; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Stack; + +public class HillClimbing { + public static void main(String[] args) { + HillClimbing hillClimbing = new HillClimbing(); + String blockArr[] = { "B", "C", "D", "A" }; + Stack startState = hillClimbing.getStackWithValues(blockArr); + String goalBlockArr[] = { "A", "B", "C", "D" }; + Stack goalState = hillClimbing.getStackWithValues(goalBlockArr); + try { + List solutionSequence = hillClimbing.getRouteWithHillClimbing(startState, goalState); + solutionSequence.forEach(HillClimbing::printEachStep); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void printEachStep(State state) { + List> stackList = state.getState(); + System.out.println("----------------"); + stackList.forEach(stack -> { + while (!stack.isEmpty()) { + System.out.println(stack.pop()); + } + System.out.println(" "); + }); + } + + private Stack getStackWithValues(String[] blocks) { + Stack stack = new Stack<>(); + for (String block : blocks) + stack.push(block); + return stack; + } + + /** + * This method prepares path from init state to goal state + */ + public List getRouteWithHillClimbing(Stack initStateStack, Stack goalStateStack) throws Exception { + List> initStateStackList = new ArrayList<>(); + initStateStackList.add(initStateStack); + int initStateHeuristics = getHeuristicsValue(initStateStackList, goalStateStack); + State initState = new State(initStateStackList, initStateHeuristics); + + List resultPath = new ArrayList<>(); + resultPath.add(new State(initState)); + + State currentState = initState; + boolean noStateFound = false; + while (!currentState.getState() + .get(0) + .equals(goalStateStack) || noStateFound) { + noStateFound = true; + State nextState = findNextState(currentState, goalStateStack); + if (nextState != null) { + noStateFound = false; + currentState = nextState; + resultPath.add(new State(nextState)); + } + } + + return resultPath; + } + + /** + * This method finds new state from current state based on goal and + * heuristics + */ + public State findNextState(State currentState, Stack goalStateStack) { + List> listOfStacks = currentState.getState(); + int currentStateHeuristics = currentState.getHeuristics(); + + return listOfStacks.stream() + .map(stack -> { + return applyOperationsOnState(listOfStacks, stack, currentStateHeuristics, goalStateStack); + }) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + } + + /** + * This method applies operations on the current state to get a new state + */ + public State applyOperationsOnState(List> listOfStacks, Stack stack, int currentStateHeuristics, Stack goalStateStack) { + State tempState; + List> tempStackList = new ArrayList<>(listOfStacks); + String block = stack.pop(); + if (stack.size() == 0) + tempStackList.remove(stack); + tempState = pushElementToNewStack(tempStackList, block, currentStateHeuristics, goalStateStack); + if (tempState == null) { + tempState = pushElementToExistingStacks(stack, tempStackList, block, currentStateHeuristics, goalStateStack); + } + if (tempState == null) + stack.push(block); + return tempState; + } + + /** + * Operation to be applied on a state in order to find new states. This + * operation pushes an element into a new stack + */ + private State pushElementToNewStack(List> currentStackList, String block, int currentStateHeuristics, Stack goalStateStack) { + State newState = null; + Stack newStack = new Stack<>(); + newStack.push(block); + + currentStackList.add(newStack); + int newStateHeuristics = getHeuristicsValue(currentStackList, goalStateStack); + if (newStateHeuristics > currentStateHeuristics) { + newState = new State(currentStackList, newStateHeuristics); + } else { + currentStackList.remove(newStack); + } + return newState; + } + + /** + * Operation to be applied on a state in order to find new states. This + * operation pushes an element into one of the other stacks to explore new + * states + */ + private State pushElementToExistingStacks(Stack currentStack, List> currentStackList, String block, int currentStateHeuristics, Stack goalStateStack) { + + Optional newState = currentStackList.stream() + .filter(stack -> stack != currentStack) + .map(stack -> { + return pushElementToStack(stack, block, currentStackList, currentStateHeuristics, goalStateStack); + }) + .filter(Objects::nonNull) + .findFirst(); + + return newState.orElse(null); + } + + /** + * This method pushes a block to the stack and returns new state if its closer to goal + */ + private State pushElementToStack(Stack stack, String block, List> currentStackList, int currentStateHeuristics, Stack goalStateStack) { + stack.push(block); + int newStateHeuristics = getHeuristicsValue(currentStackList, goalStateStack); + if (newStateHeuristics > currentStateHeuristics) { + return new State(currentStackList, newStateHeuristics); + } + stack.pop(); + return null; + } + + /** + * This method returns heuristics value for given state with respect to goal + * state + */ + public int getHeuristicsValue(List> currentState, Stack goalStateStack) { + Integer heuristicValue; + heuristicValue = currentState.stream() + .mapToInt(stack -> { + return getHeuristicsValueForStack(stack, currentState, goalStateStack); + }) + .sum(); + return heuristicValue; + } + + /** + * This method returns heuristics value for a particular stack + */ + public int getHeuristicsValueForStack(Stack stack, List> currentState, Stack goalStateStack) { + int stackHeuristics = 0; + boolean isPositioneCorrect = true; + int goalStartIndex = 0; + for (String currentBlock : stack) { + if (isPositioneCorrect && currentBlock.equals(goalStateStack.get(goalStartIndex))) { + stackHeuristics += goalStartIndex; + } else { + stackHeuristics -= goalStartIndex; + isPositioneCorrect = false; + } + goalStartIndex++; + } + return stackHeuristics; + } + +} \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/hillclimbing/State.java b/algorithms/src/main/java/com/baeldung/algorithms/hillclimbing/State.java new file mode 100644 index 0000000000..9180b33b5b --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/hillclimbing/State.java @@ -0,0 +1,43 @@ +package com.baeldung.algorithms.hillclimbing; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class State { + private List> state; + private int heuristics; + + public State(List> state) { + this.state = state; + } + + State(List> state, int heuristics) { + this.state = state; + this.heuristics = heuristics; + } + + State(State state) { + if (state != null) { + this.state = new ArrayList<>(); + for (Stack s : state.getState()) { + Stack s1; + s1 = (Stack) s.clone(); + this.state.add(s1); + } + this.heuristics = state.getHeuristics(); + } + } + + public List> getState() { + return state; + } + + public int getHeuristics() { + return heuristics; + } + + public void setHeuristics(int heuristics) { + this.heuristics = heuristics; + } +} \ No newline at end of file diff --git a/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java b/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java new file mode 100644 index 0000000000..f428df45d3 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/MonteCarloTreeSearch.java @@ -0,0 +1,109 @@ +package com.baeldung.algorithms.mcts.montecarlo; + +import java.util.List; + +import com.baeldung.algorithms.mcts.tictactoe.Board; +import com.baeldung.algorithms.mcts.tree.Node; +import com.baeldung.algorithms.mcts.tree.Tree; + +public class MonteCarloTreeSearch { + + private static final int WIN_SCORE = 10; + private int level; + private int oponent; + + public MonteCarloTreeSearch() { + this.level = 3; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + private int getMillisForCurrentLevel() { + return 2 * (this.level - 1) + 1; + } + + public Board findNextMove(Board board, int playerNo) { + long start = System.currentTimeMillis(); + long end = start + 60 * getMillisForCurrentLevel(); + + oponent = 3 - playerNo; + Tree tree = new Tree(); + Node rootNode = tree.getRoot(); + rootNode.getState().setBoard(board); + rootNode.getState().setPlayerNo(oponent); + + while (System.currentTimeMillis() < end) { + // Phase 1 - Selection + Node promisingNode = selectPromisingNode(rootNode); + // Phase 2 - Expansion + if (promisingNode.getState().getBoard().checkStatus() == Board.IN_PROGRESS) + expandNode(promisingNode); + + // Phase 3 - Simulation + Node nodeToExplore = promisingNode; + if (promisingNode.getChildArray().size() > 0) { + nodeToExplore = promisingNode.getRandomChildNode(); + } + int playoutResult = simulateRandomPlayout(nodeToExplore); + // Phase 4 - Update + backPropogation(nodeToExplore, playoutResult); + } + + Node winnerNode = rootNode.getChildWithMaxScore(); + tree.setRoot(winnerNode); + return winnerNode.getState().getBoard(); + } + + private Node selectPromisingNode(Node rootNode) { + Node node = rootNode; + while (node.getChildArray().size() != 0) { + node = UCT.findBestNodeWithUCT(node); + } + return node; + } + + private void expandNode(Node node) { + List possibleStates = node.getState().getAllPossibleStates(); + possibleStates.forEach(state -> { + Node newNode = new Node(state); + newNode.setParent(node); + newNode.getState().setPlayerNo(node.getState().getOpponent()); + node.getChildArray().add(newNode); + }); + } + + private void backPropogation(Node nodeToExplore, int playerNo) { + Node tempNode = nodeToExplore; + while (tempNode != null) { + tempNode.getState().incrementVisit(); + if (tempNode.getState().getPlayerNo() == playerNo) + tempNode.getState().addScore(WIN_SCORE); + tempNode = tempNode.getParent(); + } + } + + private int simulateRandomPlayout(Node node) { + Node tempNode = new Node(node); + State tempState = tempNode.getState(); + int boardStatus = tempState.getBoard().checkStatus(); + + if (boardStatus == oponent) { + tempNode.getParent().getState().setWinScore(Integer.MIN_VALUE); + return boardStatus; + } + while (boardStatus == Board.IN_PROGRESS) { + tempState.togglePlayer(); + tempState.randomPlay(); + boardStatus = tempState.getBoard().checkStatus(); + } + + return boardStatus; + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java b/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java new file mode 100644 index 0000000000..d855f775a8 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/State.java @@ -0,0 +1,97 @@ +package com.baeldung.algorithms.mcts.montecarlo; + +import java.util.ArrayList; +import java.util.List; + +import com.baeldung.algorithms.mcts.tictactoe.Board; +import com.baeldung.algorithms.mcts.tictactoe.Position; + +public class State { + private Board board; + private int playerNo; + private int visitCount; + private double winScore; + + public State() { + board = new Board(); + } + + public State(State state) { + this.board = new Board(state.getBoard()); + this.playerNo = state.getPlayerNo(); + this.visitCount = state.getVisitCount(); + this.winScore = state.getWinScore(); + } + + public State(Board board) { + this.board = new Board(board); + } + + Board getBoard() { + return board; + } + + void setBoard(Board board) { + this.board = board; + } + + int getPlayerNo() { + return playerNo; + } + + void setPlayerNo(int playerNo) { + this.playerNo = playerNo; + } + + int getOpponent() { + return 3 - playerNo; + } + + public int getVisitCount() { + return visitCount; + } + + public void setVisitCount(int visitCount) { + this.visitCount = visitCount; + } + + double getWinScore() { + return winScore; + } + + void setWinScore(double winScore) { + this.winScore = winScore; + } + + public List getAllPossibleStates() { + List possibleStates = new ArrayList<>(); + List availablePositions = this.board.getEmptyPositions(); + availablePositions.forEach(p -> { + State newState = new State(this.board); + newState.setPlayerNo(3 - this.playerNo); + newState.getBoard().performMove(newState.getPlayerNo(), p); + possibleStates.add(newState); + }); + return possibleStates; + } + + void incrementVisit() { + this.visitCount++; + } + + void addScore(double score) { + if (this.winScore != Integer.MIN_VALUE) + this.winScore += score; + } + + void randomPlay() { + List availablePositions = this.board.getEmptyPositions(); + int totalPossibilities = availablePositions.size(); + int selectRandom = (int) (Math.random() * ((totalPossibilities - 1) + 1)); + this.board.performMove(this.playerNo, availablePositions.get(selectRandom)); + } + + void togglePlayer() { + this.playerNo = 3 - this.playerNo; + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java b/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java new file mode 100644 index 0000000000..52707aab55 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/mcts/montecarlo/UCT.java @@ -0,0 +1,24 @@ +package com.baeldung.algorithms.mcts.montecarlo; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import com.baeldung.algorithms.mcts.tree.Node; + +public class UCT { + + public static double uctValue(int totalVisit, double nodeWinScore, int nodeVisit) { + if (nodeVisit == 0) { + return Integer.MAX_VALUE; + } + return (nodeWinScore / (double) nodeVisit) + 1.41 * Math.sqrt(Math.log(totalVisit) / (double) nodeVisit); + } + + static Node findBestNodeWithUCT(Node node) { + int parentVisit = node.getState().getVisitCount(); + return Collections.max( + node.getChildArray(), + Comparator.comparing(c -> uctValue(parentVisit, c.getState().getWinScore(), c.getState().getVisitCount()))); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java b/algorithms/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java new file mode 100644 index 0000000000..8b47fa0fdf --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Board.java @@ -0,0 +1,155 @@ +package com.baeldung.algorithms.mcts.tictactoe; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Board { + int[][] boardValues; + int totalMoves; + + public static final int DEFAULT_BOARD_SIZE = 3; + + public static final int IN_PROGRESS = -1; + public static final int DRAW = 0; + public static final int P1 = 1; + public static final int P2 = 2; + + public Board() { + boardValues = new int[DEFAULT_BOARD_SIZE][DEFAULT_BOARD_SIZE]; + } + + public Board(int boardSize) { + boardValues = new int[boardSize][boardSize]; + } + + public Board(int[][] boardValues) { + this.boardValues = boardValues; + } + + public Board(int[][] boardValues, int totalMoves) { + this.boardValues = boardValues; + this.totalMoves = totalMoves; + } + + public Board(Board board) { + int boardLength = board.getBoardValues().length; + this.boardValues = new int[boardLength][boardLength]; + int[][] boardValues = board.getBoardValues(); + int n = boardValues.length; + for (int i = 0; i < n; i++) { + int m = boardValues[i].length; + for (int j = 0; j < m; j++) { + this.boardValues[i][j] = boardValues[i][j]; + } + } + } + + public void performMove(int player, Position p) { + this.totalMoves++; + boardValues[p.getX()][p.getY()] = player; + } + + public int[][] getBoardValues() { + return boardValues; + } + + public void setBoardValues(int[][] boardValues) { + this.boardValues = boardValues; + } + + public int checkStatus() { + int boardSize = boardValues.length; + int maxIndex = boardSize - 1; + int[] diag1 = new int[boardSize]; + int[] diag2 = new int[boardSize]; + + for (int i = 0; i < boardSize; i++) { + int[] row = boardValues[i]; + int[] col = new int[boardSize]; + for (int j = 0; j < boardSize; j++) { + col[j] = boardValues[j][i]; + } + + int checkRowForWin = checkForWin(row); + if(checkRowForWin!=0) + return checkRowForWin; + + int checkColForWin = checkForWin(col); + if(checkColForWin!=0) + return checkColForWin; + + diag1[i] = boardValues[i][i]; + diag2[i] = boardValues[maxIndex - i][i]; + } + + int checkDia1gForWin = checkForWin(diag1); + if(checkDia1gForWin!=0) + return checkDia1gForWin; + + int checkDiag2ForWin = checkForWin(diag2); + if(checkDiag2ForWin!=0) + return checkDiag2ForWin; + + if (getEmptyPositions().size() > 0) + return IN_PROGRESS; + else + return DRAW; + } + + private int checkForWin(int[] row) { + boolean isEqual = true; + int size = row.length; + int previous = row[0]; + for (int i = 0; i < size; i++) { + if (previous != row[i]) { + isEqual = false; + break; + } + previous = row[i]; + } + if(isEqual) + return previous; + else + return 0; + } + + public void printBoard() { + int size = this.boardValues.length; + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + System.out.print(boardValues[i][j] + " "); + } + System.out.println(); + } + } + + public List getEmptyPositions() { + int size = this.boardValues.length; + List emptyPositions = new ArrayList<>(); + for (int i = 0; i < size; i++) { + for (int j = 0; j < size; j++) { + if (boardValues[i][j] == 0) + emptyPositions.add(new Position(i, j)); + } + } + return emptyPositions; + } + + public void printStatus() { + switch (this.checkStatus()) { + case P1: + System.out.println("Player 1 wins"); + break; + case P2: + System.out.println("Player 2 wins"); + break; + case DRAW: + System.out.println("Game Draw"); + break; + case IN_PROGRESS: + System.out.println("Game In rogress"); + break; + } + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java b/algorithms/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java new file mode 100644 index 0000000000..94ead4288d --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/mcts/tictactoe/Position.java @@ -0,0 +1,31 @@ +package com.baeldung.algorithms.mcts.tictactoe; + +public class Position { + int x; + int y; + + public Position() { + } + + public Position(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java b/algorithms/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java new file mode 100644 index 0000000000..20f9e992b5 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/mcts/tree/Node.java @@ -0,0 +1,78 @@ +package com.baeldung.algorithms.mcts.tree; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import com.baeldung.algorithms.mcts.montecarlo.State; + +public class Node { + State state; + Node parent; + List childArray; + + public Node() { + this.state = new State(); + childArray = new ArrayList<>(); + } + + public Node(State state) { + this.state = state; + childArray = new ArrayList<>(); + } + + public Node(State state, Node parent, List childArray) { + this.state = state; + this.parent = parent; + this.childArray = childArray; + } + + public Node(Node node) { + this.childArray = new ArrayList<>(); + this.state = new State(node.getState()); + if (node.getParent() != null) + this.parent = node.getParent(); + List childArray = node.getChildArray(); + for (Node child : childArray) { + this.childArray.add(new Node(child)); + } + } + + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + } + + public Node getParent() { + return parent; + } + + public void setParent(Node parent) { + this.parent = parent; + } + + public List getChildArray() { + return childArray; + } + + public void setChildArray(List childArray) { + this.childArray = childArray; + } + + public Node getRandomChildNode() { + int noOfPossibleMoves = this.childArray.size(); + int selectRandom = (int) (Math.random() * ((noOfPossibleMoves - 1) + 1)); + return this.childArray.get(selectRandom); + } + + public Node getChildWithMaxScore() { + return Collections.max(this.childArray, Comparator.comparing(c -> { + return c.getState().getVisitCount(); + })); + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java b/algorithms/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java new file mode 100644 index 0000000000..c5543c0ed4 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/mcts/tree/Tree.java @@ -0,0 +1,26 @@ +package com.baeldung.algorithms.mcts.tree; + +public class Tree { + Node root; + + public Tree() { + root = new Node(); + } + + public Tree(Node root) { + this.root = root; + } + + public Node getRoot() { + return root; + } + + public void setRoot(Node root) { + this.root = root; + } + + public void addChild(Node parent, Node child) { + parent.getChildArray().add(child); + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java b/algorithms/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java new file mode 100644 index 0000000000..8e14afcf7a --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/minimax/GameOfBones.java @@ -0,0 +1,14 @@ +package com.baeldung.algorithms.minimax; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +class GameOfBones { + static List getPossibleStates(int noOfBonesInHeap) { + return IntStream.rangeClosed(1, 3).boxed() + .map(i -> noOfBonesInHeap - i) + .filter(newHeapCount -> newHeapCount >= 0) + .collect(Collectors.toList()); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java b/algorithms/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java new file mode 100644 index 0000000000..ce2ba03af5 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/minimax/MiniMax.java @@ -0,0 +1,60 @@ +package com.baeldung.algorithms.minimax; + +import java.util.Comparator; +import java.util.List; +import java.util.NoSuchElementException; + +public class MiniMax { + private Tree tree; + + public Tree getTree() { + return tree; + } + + public void constructTree(int noOfBones) { + tree = new Tree(); + Node root = new Node(noOfBones, true); + tree.setRoot(root); + constructTree(root); + } + + private void constructTree(Node node) { + List listofPossibleHeaps = GameOfBones.getPossibleStates(node.getNoOfBones()); + boolean isMaxPlayer = !node.isMaxPlayer(); + listofPossibleHeaps.forEach(n -> { + Node newNode = new Node(n, isMaxPlayer); + node.addChild(newNode); + if (newNode.getNoOfBones() > 0) { + constructTree(newNode); + } + }); + } + + public boolean checkWin() { + Node root = tree.getRoot(); + checkWin(root); + return root.getScore() == 1; + } + + private void checkWin(Node node) { + List children = node.getChildren(); + boolean isMaxPlayer = node.isMaxPlayer(); + children.forEach(child -> { + if (child.getNoOfBones() == 0) { + child.setScore(isMaxPlayer ? 1 : -1); + } else { + checkWin(child); + } + }); + Node bestChild = findBestChild(isMaxPlayer, children); + node.setScore(bestChild.getScore()); + } + + private Node findBestChild(boolean isMaxPlayer, List children) { + Comparator byScoreComparator = Comparator.comparing(Node::getScore); + + return children.stream() + .max(isMaxPlayer ? byScoreComparator : byScoreComparator.reversed()) + .orElseThrow(NoSuchElementException::new); + } +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/minimax/Node.java b/algorithms/src/main/java/com/baeldung/algorithms/minimax/Node.java new file mode 100644 index 0000000000..4ceef0073d --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/minimax/Node.java @@ -0,0 +1,42 @@ +package com.baeldung.algorithms.minimax; + +import java.util.ArrayList; +import java.util.List; + +public class Node { + private int noOfBones; + private boolean isMaxPlayer; + private int score; + private List children; + + public Node(int noOfBones, boolean isMaxPlayer) { + this.noOfBones = noOfBones; + this.isMaxPlayer = isMaxPlayer; + children = new ArrayList<>(); + } + + int getNoOfBones() { + return noOfBones; + } + + boolean isMaxPlayer() { + return isMaxPlayer; + } + + int getScore() { + return score; + } + + void setScore(int score) { + this.score = score; + } + + List getChildren() { + return children; + } + + void addChild(Node newNode) { + children.add(newNode); + } + +} diff --git a/algorithms/src/main/java/com/baeldung/algorithms/minimax/Tree.java b/algorithms/src/main/java/com/baeldung/algorithms/minimax/Tree.java new file mode 100644 index 0000000000..34c56cdd58 --- /dev/null +++ b/algorithms/src/main/java/com/baeldung/algorithms/minimax/Tree.java @@ -0,0 +1,16 @@ +package com.baeldung.algorithms.minimax; + +public class Tree { + private Node root; + + Tree() { + } + + Node getRoot() { + return root; + } + + void setRoot(Node root) { + this.root = root; + } +} diff --git a/algorithms/src/test/java/algorithms/HillClimbingAlgorithmTest.java b/algorithms/src/test/java/algorithms/HillClimbingAlgorithmTest.java new file mode 100644 index 0000000000..666adbb180 --- /dev/null +++ b/algorithms/src/test/java/algorithms/HillClimbingAlgorithmTest.java @@ -0,0 +1,58 @@ +package algorithms; + +import com.baeldung.algorithms.hillclimbing.HillClimbing; +import com.baeldung.algorithms.hillclimbing.State; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class HillClimbingAlgorithmTest { + private Stack initStack; + private Stack goalStack; + + @Before + public void initStacks() { + String blockArr[] = { "B", "C", "D", "A" }; + String goalBlockArr[] = { "A", "B", "C", "D" }; + initStack = new Stack<>(); + for (String block : blockArr) + initStack.push(block); + goalStack = new Stack<>(); + for (String block : goalBlockArr) + goalStack.push(block); + } + + @Test + public void givenInitAndGoalState_whenGetPathWithHillClimbing_thenPathFound() { + HillClimbing hillClimbing = new HillClimbing(); + + List path; + try { + path = hillClimbing.getRouteWithHillClimbing(initStack, goalStack); + assertNotNull(path); + assertEquals(path.get(path.size() - 1) + .getState() + .get(0), goalStack); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void givenCurrentState_whenFindNextState_thenBetterHeuristics() { + HillClimbing hillClimbing = new HillClimbing(); + List> initList = new ArrayList<>(); + initList.add(initStack); + State currentState = new State(initList); + currentState.setHeuristics(hillClimbing.getHeuristicsValue(initList, goalStack)); + State nextState = hillClimbing.findNextState(currentState, goalStack); + assertTrue(nextState.getHeuristics() > currentState.getHeuristics()); + } +} \ No newline at end of file diff --git a/algorithms/src/test/java/algorithms/MCTSTest.java b/algorithms/src/test/java/algorithms/MCTSTest.java new file mode 100644 index 0000000000..f969c26311 --- /dev/null +++ b/algorithms/src/test/java/algorithms/MCTSTest.java @@ -0,0 +1,92 @@ +package algorithms; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.algorithms.mcts.montecarlo.MonteCarloTreeSearch; +import com.baeldung.algorithms.mcts.montecarlo.State; +import com.baeldung.algorithms.mcts.montecarlo.UCT; +import com.baeldung.algorithms.mcts.tictactoe.Board; +import com.baeldung.algorithms.mcts.tictactoe.Position; +import com.baeldung.algorithms.mcts.tree.Tree; + +public class MCTSTest { + Tree gameTree; + MonteCarloTreeSearch mcts; + + @Before + public void initGameTree() { + gameTree = new Tree(); + mcts = new MonteCarloTreeSearch(); + } + + @Test + public void givenStats_whenGetUCTForNode_thenUCTMatchesWithManualData() { + double uctValue = 15.79; + assertEquals(UCT.uctValue(600, 300, 20), uctValue, 0.01); + } + + @Test + public void giveninitBoardState_whenGetAllPossibleStates_thenNonEmptyList() { + State initState = gameTree.getRoot().getState(); + List possibleStates = initState.getAllPossibleStates(); + assertTrue(possibleStates.size() > 0); + } + + @Test + public void givenEmptyBoard_whenPerformMove_thenLessAvailablePossitions() { + Board board = new Board(); + int initAvailablePositions = board.getEmptyPositions().size(); + board.performMove(Board.P1, new Position(1, 1)); + int availablePositions = board.getEmptyPositions().size(); + assertTrue(initAvailablePositions > availablePositions); + } + + @Test + public void givenEmptyBoard_whenSimulateInterAIPlay_thenGameDraw() { + Board board = new Board(); + + int player = Board.P1; + int totalMoves = Board.DEFAULT_BOARD_SIZE * Board.DEFAULT_BOARD_SIZE; + for (int i = 0; i < totalMoves; i++) { + board = mcts.findNextMove(board, player); + if (board.checkStatus() != -1) { + break; + } + player = 3 - player; + } + int winStatus = board.checkStatus(); + assertEquals(winStatus, Board.DRAW); + } + + @Test + public void givenEmptyBoard_whenLevel1VsLevel3_thenLevel3WinsOrDraw() { + Board board = new Board(); + MonteCarloTreeSearch mcts1 = new MonteCarloTreeSearch(); + mcts1.setLevel(1); + MonteCarloTreeSearch mcts3 = new MonteCarloTreeSearch(); + mcts3.setLevel(3); + + int player = Board.P1; + int totalMoves = Board.DEFAULT_BOARD_SIZE * Board.DEFAULT_BOARD_SIZE; + for (int i = 0; i < totalMoves; i++) { + if (player == Board.P1) + board = mcts3.findNextMove(board, player); + else + board = mcts1.findNextMove(board, player); + + if (board.checkStatus() != -1) { + break; + } + player = 3 - player; + } + int winStatus = board.checkStatus(); + assertTrue(winStatus == Board.DRAW || winStatus == Board.P1); + } + +} diff --git a/algorithms/src/test/java/algorithms/RtFiniteStateMachineLongRunningUnitTest.java b/algorithms/src/test/java/algorithms/RtFiniteStateMachineLongRunningUnitTest.java index c6800e9a64..99e962773f 100644 --- a/algorithms/src/test/java/algorithms/RtFiniteStateMachineLongRunningUnitTest.java +++ b/algorithms/src/test/java/algorithms/RtFiniteStateMachineLongRunningUnitTest.java @@ -1,6 +1,6 @@ package algorithms; -import com.baeldung.automata.*; +import com.baeldung.algorithms.automata.*; import org.junit.Test; import static org.junit.Assert.assertTrue; diff --git a/algorithms/src/test/java/algorithms/mcts/MCTSTest.java b/algorithms/src/test/java/algorithms/mcts/MCTSTest.java new file mode 100644 index 0000000000..375f66ab6f --- /dev/null +++ b/algorithms/src/test/java/algorithms/mcts/MCTSTest.java @@ -0,0 +1,92 @@ +package algorithms.mcts; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.algorithms.mcts.montecarlo.MonteCarloTreeSearch; +import com.baeldung.algorithms.mcts.montecarlo.State; +import com.baeldung.algorithms.mcts.montecarlo.UCT; +import com.baeldung.algorithms.mcts.tictactoe.Board; +import com.baeldung.algorithms.mcts.tictactoe.Position; +import com.baeldung.algorithms.mcts.tree.Tree; + +public class MCTSTest { + private Tree gameTree; + private MonteCarloTreeSearch mcts; + + @Before + public void initGameTree() { + gameTree = new Tree(); + mcts = new MonteCarloTreeSearch(); + } + + @Test + public void givenStats_whenGetUCTForNode_thenUCTMatchesWithManualData() { + double uctValue = 15.79; + assertEquals(UCT.uctValue(600, 300, 20), uctValue, 0.01); + } + + @Test + public void giveninitBoardState_whenGetAllPossibleStates_thenNonEmptyList() { + State initState = gameTree.getRoot().getState(); + List possibleStates = initState.getAllPossibleStates(); + assertTrue(possibleStates.size() > 0); + } + + @Test + public void givenEmptyBoard_whenPerformMove_thenLessAvailablePossitions() { + Board board = new Board(); + int initAvailablePositions = board.getEmptyPositions().size(); + board.performMove(Board.P1, new Position(1, 1)); + int availablePositions = board.getEmptyPositions().size(); + assertTrue(initAvailablePositions > availablePositions); + } + + @Test + public void givenEmptyBoard_whenSimulateInterAIPlay_thenGameDraw() { + Board board = new Board(); + + int player = Board.P1; + int totalMoves = Board.DEFAULT_BOARD_SIZE * Board.DEFAULT_BOARD_SIZE; + for (int i = 0; i < totalMoves; i++) { + board = mcts.findNextMove(board, player); + if (board.checkStatus() != -1) { + break; + } + player = 3 - player; + } + int winStatus = board.checkStatus(); + assertEquals(winStatus, Board.DRAW); + } + + @Test + public void givenEmptyBoard_whenLevel1VsLevel3_thenLevel3WinsOrDraw() { + Board board = new Board(); + MonteCarloTreeSearch mcts1 = new MonteCarloTreeSearch(); + mcts1.setLevel(1); + MonteCarloTreeSearch mcts3 = new MonteCarloTreeSearch(); + mcts3.setLevel(3); + + int player = Board.P1; + int totalMoves = Board.DEFAULT_BOARD_SIZE * Board.DEFAULT_BOARD_SIZE; + for (int i = 0; i < totalMoves; i++) { + if (player == Board.P1) + board = mcts3.findNextMove(board, player); + else + board = mcts1.findNextMove(board, player); + + if (board.checkStatus() != -1) { + break; + } + player = 3 - player; + } + int winStatus = board.checkStatus(); + assertTrue(winStatus == Board.DRAW || winStatus == Board.P1); + } + +} diff --git a/algorithms/src/test/java/algorithms/minimax/MinimaxTest.java b/algorithms/src/test/java/algorithms/minimax/MinimaxTest.java new file mode 100644 index 0000000000..b29c16386c --- /dev/null +++ b/algorithms/src/test/java/algorithms/minimax/MinimaxTest.java @@ -0,0 +1,36 @@ +package algorithms.minimax; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; +import com.baeldung.algorithms.minimax.MiniMax; +import com.baeldung.algorithms.minimax.Tree; + +public class MinimaxTest { + private Tree gameTree; + private MiniMax miniMax; + + @Before + public void initMiniMaxUtility() { + miniMax = new MiniMax(); + } + + @Test + public void givenMiniMax_whenConstructTree_thenNotNullTree() { + assertNull(gameTree); + miniMax.constructTree(6); + gameTree = miniMax.getTree(); + assertNotNull(gameTree); + } + + @Test + public void givenMiniMax_whenCheckWin_thenComputeOptimal() { + miniMax.constructTree(6); + boolean result = miniMax.checkWin(); + assertTrue(result); + miniMax.constructTree(8); + result = miniMax.checkWin(); + assertFalse(result); + } +} diff --git a/asciidoctor/README.md b/asciidoctor/README.md new file mode 100644 index 0000000000..164200d227 --- /dev/null +++ b/asciidoctor/README.md @@ -0,0 +1,3 @@ +### Relevant articles + +- [Introduction to Asciidoctor](http://www.baeldung.com/introduction-to-asciidoctor) \ No newline at end of file diff --git a/spring-boot-kotlin/src/main/resource/application.properties b/asciidoctor/log4j.properties similarity index 100% rename from spring-boot-kotlin/src/main/resource/application.properties rename to asciidoctor/log4j.properties diff --git a/asciidoctor/pom.xml b/asciidoctor/pom.xml new file mode 100644 index 0000000000..989f6e5354 --- /dev/null +++ b/asciidoctor/pom.xml @@ -0,0 +1,56 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + asciidoctor + asciidoctor + + + + org.asciidoctor + asciidoctor-maven-plugin + 1.5.5 + + + org.asciidoctor + asciidoctorj-pdf + 1.5.0-alpha.15 + + + + + output-pdf + generate-resources + + process-asciidoc + + + + + src/docs/asciidoc + target/docs/asciidoc + pdf + + + + + + + + org.asciidoctor + asciidoctorj + 1.5.4 + + + org.asciidoctor + asciidoctorj-pdf + 1.5.0-alpha.11 + + + diff --git a/asciidoctor/src/docs/asciidoc/test.adoc b/asciidoctor/src/docs/asciidoc/test.adoc new file mode 100644 index 0000000000..5a86a00440 --- /dev/null +++ b/asciidoctor/src/docs/asciidoc/test.adoc @@ -0,0 +1,3 @@ +== Introduction Section + +Hi. I'm a simple test to see if this Maven build is working. If you see me in a nice PDF, then it means everything is [red]#working#. \ No newline at end of file diff --git a/asciidoctor/src/main/java/com/baeldung/asciidoctor/AsciidoctorDemo.java b/asciidoctor/src/main/java/com/baeldung/asciidoctor/AsciidoctorDemo.java new file mode 100644 index 0000000000..6ecf4ff964 --- /dev/null +++ b/asciidoctor/src/main/java/com/baeldung/asciidoctor/AsciidoctorDemo.java @@ -0,0 +1,33 @@ +package com.baeldung.asciidoctor; + +import static org.asciidoctor.Asciidoctor.Factory.create; +import static org.asciidoctor.OptionsBuilder.options; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.asciidoctor.Asciidoctor; + +public class AsciidoctorDemo { + + private final Asciidoctor asciidoctor; + + AsciidoctorDemo() { + asciidoctor = create(); + } + + public void generatePDFFromString(final String input) { + + final Map options = options().inPlace(true) + .backend("pdf") + .asMap(); + + + final String outfile = asciidoctor.convertFile(new File("sample.adoc"), options); + } + + String generateHTMLFromString(final String input) { + return asciidoctor.convert("Hello _Baeldung_!", new HashMap()); + } +} diff --git a/asciidoctor/src/test/java/com/baeldung/asciidoctor/AsciidoctorDemoTest.java b/asciidoctor/src/test/java/com/baeldung/asciidoctor/AsciidoctorDemoTest.java new file mode 100644 index 0000000000..3e312eb059 --- /dev/null +++ b/asciidoctor/src/test/java/com/baeldung/asciidoctor/AsciidoctorDemoTest.java @@ -0,0 +1,13 @@ +package com.baeldung.asciidoctor; + +import org.junit.Assert; +import org.junit.Test; + +public class AsciidoctorDemoTest { + + @Test + public void givenString_whenConverting_thenResultingHTMLCode() { + final AsciidoctorDemo asciidoctorDemo = new AsciidoctorDemo(); + Assert.assertEquals(asciidoctorDemo.generateHTMLFromString("Hello _Baeldung_!"), "
\n

Hello Baeldung!

\n
"); + } +} diff --git a/camel-api/README.md b/camel-api/README.md new file mode 100644 index 0000000000..fe8dadcfe1 --- /dev/null +++ b/camel-api/README.md @@ -0,0 +1,15 @@ +Example for the Article on Camel API with SpringBoot + +to start up, run: + mvn spring-boot:run + +them, do a POST http request to: + http://localhost:8080/camel/api/bean + +with the HEADER: Content-Type: application/json, + +and a BODY Payload like {"id": 1,"name": "World"} + +and we will get a return code of 201 and the response: Hello, World - if the transform() method from Application class is uncommented and the process() method is commented + +or return code of 201 and the response: {"id": 10,"name": "Hello, World"} - if the transform() method from Application class is commented and the process() method is uncommented diff --git a/camel-api/pom.xml b/camel-api/pom.xml new file mode 100644 index 0000000000..6db9f9bfd1 --- /dev/null +++ b/camel-api/pom.xml @@ -0,0 +1,80 @@ + + + + 4.0.0 + + com.example + spring-boot-camel + 0.0.1-SNAPSHOT + + Spring-Boot - Camel API + + + UTF-8 + 3.6.0 + 2.19.1 + 2.19.1 + 1.5.4.RELEASE + + + + + org.apache.camel + camel-servlet-starter + ${camel.version} + + + org.apache.camel + camel-jackson-starter + ${camel.version} + + + org.apache.camel + camel-swagger-java-starter + ${camel.version} + + + org.apache.camel + camel-spring-boot-starter + ${camel.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-starter.version} + + + + + spring-boot:run + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot-starter.version} + + + + repackage + + + + + + + diff --git a/camel-api/src/main/java/com/baeldung/camel/Application.java b/camel-api/src/main/java/com/baeldung/camel/Application.java new file mode 100644 index 0000000000..f805385ff9 --- /dev/null +++ b/camel-api/src/main/java/com/baeldung/camel/Application.java @@ -0,0 +1,104 @@ +package com.baeldung.camel; + +import javax.ws.rs.core.MediaType; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.servlet.CamelHttpTransportServlet; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.model.rest.RestBindingMode; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.stereotype.Component; + +@SpringBootApplication +@ComponentScan(basePackages="com.baeldung.camel") +public class Application extends SpringBootServletInitializer { + + @Value("${server.port}") + String serverPort; + + @Value("${baeldung.api.path}") + String contextPath; + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Bean + ServletRegistrationBean servletRegistrationBean() { + ServletRegistrationBean servlet = new ServletRegistrationBean(new CamelHttpTransportServlet(), contextPath+"/*"); + servlet.setName("CamelServlet"); + return servlet; + } + + + @Component + class RestApi extends RouteBuilder { + + @Override + public void configure() { + + CamelContext context = new DefaultCamelContext(); + + + // http://localhost:8080/camel/api-doc + restConfiguration().contextPath(contextPath) // + .port(serverPort) + .enableCORS(true) + .apiContextPath("/api-doc") + .apiProperty("api.title", "Test REST API") + .apiProperty("api.version", "v1") + .apiProperty("cors", "true") // cross-site + .apiContextRouteId("doc-api") + .component("servlet") + .bindingMode(RestBindingMode.json) + .dataFormatProperty("prettyPrint", "true"); +/** +The Rest DSL supports automatic binding json/xml contents to/from POJOs using Camels Data Format. +By default the binding mode is off, meaning there is no automatic binding happening for incoming and outgoing messages. +You may want to use binding if you develop POJOs that maps to your REST services request and response types. +This allows you, as a developer, to work with the POJOs in Java code. +*/ + + rest("/api/").description("Teste REST Service") + .id("api-route") + .post("/bean") + .produces(MediaType.APPLICATION_JSON) + .consumes(MediaType.APPLICATION_JSON) +// .get("/hello/{place}") + .bindingMode(RestBindingMode.auto) + .type(MyBean.class) + .enableCORS(true) +// .outType(OutBean.class) + + .to("direct:remoteService"); + + + from("direct:remoteService") + .routeId("direct-route") + .tracing() + .log(">>> ${body.id}") + .log(">>> ${body.name}") +// .transform().simple("blue ${in.body.name}") + .process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + MyBean bodyIn = (MyBean) exchange.getIn().getBody(); + + ExampleServices.example(bodyIn); + + exchange.getIn().setBody(bodyIn); + } + }) + .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(201)); + } + } +} diff --git a/camel-api/src/main/java/com/baeldung/camel/ExampleServices.java b/camel-api/src/main/java/com/baeldung/camel/ExampleServices.java new file mode 100644 index 0000000000..ec8f368e68 --- /dev/null +++ b/camel-api/src/main/java/com/baeldung/camel/ExampleServices.java @@ -0,0 +1,15 @@ +package com.baeldung.camel; + +/** + * a Mock class to show how some other layer + * (a persistence layer, for instance) + * could be used insida a Camel + * + */ +public class ExampleServices { + + public static void example(MyBean bodyIn) { + bodyIn.setName( "Hello, " + bodyIn.getName() ); + bodyIn.setId(bodyIn.getId()*10); + } +} diff --git a/camel-api/src/main/java/com/baeldung/camel/MyBean.java b/camel-api/src/main/java/com/baeldung/camel/MyBean.java new file mode 100644 index 0000000000..5368e40c93 --- /dev/null +++ b/camel-api/src/main/java/com/baeldung/camel/MyBean.java @@ -0,0 +1,18 @@ +package com.baeldung.camel; + +public class MyBean { + private Integer id; + private String name; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} diff --git a/camel-api/src/main/resources/application.properties b/camel-api/src/main/resources/application.properties new file mode 100644 index 0000000000..bce95f8eaf --- /dev/null +++ b/camel-api/src/main/resources/application.properties @@ -0,0 +1,15 @@ +logging.config=classpath:logback.xml + +# the options from org.apache.camel.spring.boot.CamelConfigurationProperties can be configured here +camel.springboot.name=MyCamel + +# lets listen on all ports to ensure we can be invoked from the pod IP +server.address=0.0.0.0 +management.address=0.0.0.0 + +# lets use a different management port in case you need to listen to HTTP requests on 8080 +management.port=8081 + +# disable all management enpoints except health +endpoints.enabled = true +endpoints.health.enabled = true \ No newline at end of file diff --git a/camel-api/src/main/resources/application.yml b/camel-api/src/main/resources/application.yml new file mode 100644 index 0000000000..3a4b913db7 --- /dev/null +++ b/camel-api/src/main/resources/application.yml @@ -0,0 +1,27 @@ +server: + port: 8080 + +# for example purposes of Camel version 2.18 and below +baeldung: + api: + path: '/camel' + +camel: + springboot: + # The Camel context name + name: ServicesRest + +# Binding health checks to a different port +management: + port: 8081 + +# disable all management enpoints except health +endpoints: + enabled: false + health: + enabled: true + +# The application configuration properties +quickstart: + generateOrderPeriod: 10s + processOrderPeriod: 30s diff --git a/camel-api/src/main/resources/logback.xml b/camel-api/src/main/resources/logback.xml new file mode 100644 index 0000000000..d0b4334f5a --- /dev/null +++ b/camel-api/src/main/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml index 23473ff161..f6792fdbd9 100644 --- a/core-java-9/pom.xml +++ b/core-java-9/pom.xml @@ -47,6 +47,13 @@ ${mockito.version} test + + com.jayway.awaitility + awaitility + ${awaitility.version} + test + + @@ -90,6 +97,7 @@ 1.3 4.12 1.10.19 + 1.7.0 diff --git a/core-java-9/src/main/java/com/baeldung/java9/streams.reactive/EndSubscriber.java b/core-java-9/src/main/java/com/baeldung/java9/streams.reactive/EndSubscriber.java new file mode 100644 index 0000000000..bbbb4f3411 --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/streams.reactive/EndSubscriber.java @@ -0,0 +1,43 @@ +package com.baeldung.java9.streams.reactive; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.Flow.Subscriber; +import java.util.concurrent.Flow.Subscription; +import java.util.concurrent.atomic.AtomicInteger; + +public class EndSubscriber implements Subscriber { + private final AtomicInteger howMuchMessagesToConsume; + private Subscription subscription; + public List consumedElements = new LinkedList<>(); + + public EndSubscriber(Integer howMuchMessagesToConsume) { + this.howMuchMessagesToConsume = new AtomicInteger(howMuchMessagesToConsume); + } + + @Override + public void onSubscribe(Subscription subscription) { + this.subscription = subscription; + subscription.request(1); + } + + @Override + public void onNext(T item) { + howMuchMessagesToConsume.decrementAndGet(); + System.out.println("Got : " + item); + consumedElements.add(item); + if (howMuchMessagesToConsume.get() > 0) { + subscription.request(1); + } + } + + @Override + public void onError(Throwable t) { + t.printStackTrace(); + } + + @Override + public void onComplete() { + System.out.println("Done"); + } +} \ No newline at end of file diff --git a/core-java-9/src/main/java/com/baeldung/java9/streams.reactive/TransformProcessor.java b/core-java-9/src/main/java/com/baeldung/java9/streams.reactive/TransformProcessor.java new file mode 100644 index 0000000000..325979470f --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/streams.reactive/TransformProcessor.java @@ -0,0 +1,38 @@ +package com.baeldung.java9.streams.reactive; + +import java.util.concurrent.Flow; +import java.util.concurrent.SubmissionPublisher; +import java.util.function.Function; + +public class TransformProcessor extends SubmissionPublisher implements Flow.Processor { + + private Function function; + private Flow.Subscription subscription; + + public TransformProcessor(Function function) { + super(); + this.function = function; + } + + @Override + public void onSubscribe(Flow.Subscription subscription) { + this.subscription = subscription; + subscription.request(1); + } + + @Override + public void onNext(T item) { + submit(function.apply(item)); + subscription.request(1); + } + + @Override + public void onError(Throwable t) { + t.printStackTrace(); + } + + @Override + public void onComplete() { + close(); + } +} \ No newline at end of file diff --git a/core-java-9/src/main/java/com/baeldung/java9/time/TimeApi.java b/core-java-9/src/main/java/com/baeldung/java9/time/TimeApi.java new file mode 100644 index 0000000000..ee4e35a77b --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/time/TimeApi.java @@ -0,0 +1,43 @@ +package com.baeldung.java9.time; + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class TimeApi { + + public static List getDatesBetweenUsingJava7(Date startDate, Date endDate) { + List datesInRange = new ArrayList(); + Calendar calendar = new GregorianCalendar(); + calendar.setTime(startDate); + + Calendar endCalendar = new GregorianCalendar(); + endCalendar.setTime(endDate); + + while (calendar.before(endCalendar)) { + Date result = calendar.getTime(); + datesInRange.add(result); + calendar.add(Calendar.DATE, 1); + } + return datesInRange; + } + + public static List getDatesBetweenUsingJava8(LocalDate startDate, LocalDate endDate) { + long numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate); + return IntStream.iterate(0, i -> i + 1) + .limit(numOfDaysBetween) + .mapToObj(i -> startDate.plusDays(i)) + .collect(Collectors.toList()); + } + + public static List getDatesBetweenUsingJava9(LocalDate startDate, LocalDate endDate) { + return startDate.datesUntil(endDate).collect(Collectors.toList()); + } + +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/streams.reactive/ReactiveStreamsTest.java b/core-java-9/src/test/java/com/baeldung/java9/streams.reactive/ReactiveStreamsTest.java new file mode 100644 index 0000000000..647557532d --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/streams.reactive/ReactiveStreamsTest.java @@ -0,0 +1,73 @@ +package com.baeldung.java9.streams.reactive; + + +import org.junit.Test; + +import java.util.List; +import java.util.concurrent.SubmissionPublisher; + +import static org.assertj.core.api.Java6Assertions.assertThat; + +public class ReactiveStreamsTest { + + @Test + public void givenPublisher_whenSubscribeToIt_thenShouldConsumeAllElements() throws InterruptedException { + //given + SubmissionPublisher publisher = new SubmissionPublisher<>(); + EndSubscriber subscriber = new EndSubscriber<>(6); + publisher.subscribe(subscriber); + List items = List.of("1", "x", "2", "x", "3", "x"); + + //when + assertThat(publisher.getNumberOfSubscribers()).isEqualTo(1); + items.forEach(publisher::submit); + publisher.close(); + + //then + + await().atMost(1000, TimeUnit.MILLISECONDS).until( + () -> assertThat(subscriber.consumedElements).containsExactlyElementsOf(items) + ); + } + + @Test + public void givenPublisher_whenSubscribeAndTransformElements_thenShouldConsumeAllElements() throws InterruptedException { + //given + SubmissionPublisher publisher = new SubmissionPublisher<>(); + TransformProcessor transformProcessor = new TransformProcessor<>(Integer::parseInt); + EndSubscriber subscriber = new EndSubscriber<>(3); + List items = List.of("1", "2", "3"); + List expectedResult = List.of(1, 2, 3); + + //when + publisher.subscribe(transformProcessor); + transformProcessor.subscribe(subscriber); + items.forEach(publisher::submit); + publisher.close(); + + //then + await().atMost(1000, TimeUnit.MILLISECONDS).until( + () -> assertThat(subscriber.consumedElements).containsExactlyElementsOf(expectedResult) + ); + } + + @Test + public void givenPublisher_whenRequestForOnlyOneElement_thenShouldConsumeOnlyThatOne() throws InterruptedException { + //given + SubmissionPublisher publisher = new SubmissionPublisher<>(); + EndSubscriber subscriber = new EndSubscriber<>(1); + publisher.subscribe(subscriber); + List items = List.of("1", "x", "2", "x", "3", "x"); + List expected = List.of("1"); + + //when + assertThat(publisher.getNumberOfSubscribers()).isEqualTo(1); + items.forEach(publisher::submit); + publisher.close(); + + //then + await().atMost(1000, TimeUnit.MILLISECONDS).until( + () -> assertThat(subscriber.consumedElements).containsExactlyElementsOf(expected) + ); + } +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/time/TimeApiTest.java b/core-java-9/src/test/java/com/baeldung/java9/time/TimeApiTest.java new file mode 100644 index 0000000000..a024db19a8 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/time/TimeApiTest.java @@ -0,0 +1,58 @@ +package com.baeldung.java9.time; + +import java.time.LocalDate; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class TimeApiTest { + + @Test + public void givenGetDatesBetweenWithUsingJava7_WhenStartEndDate_thenDatesList() { + Date startDate = Calendar.getInstance().getTime(); + Calendar endCalendar = Calendar.getInstance(); + endCalendar.add(Calendar.DATE, 2); + Date endDate = endCalendar.getTime(); + + List dates = TimeApi.getDatesBetweenUsingJava7(startDate, endDate); + assertEquals(dates.size(), 2); + + Calendar calendar = Calendar.getInstance(); + Date date1 = calendar.getTime(); + assertEquals(dates.get(0).getDay(), date1.getDay()); + assertEquals(dates.get(0).getMonth(), date1.getMonth()); + assertEquals(dates.get(0).getYear(), date1.getYear()); + + calendar.add(Calendar.DATE, 1); + Date date2 = calendar.getTime(); + assertEquals(dates.get(1).getDay(), date2.getDay()); + assertEquals(dates.get(1).getMonth(), date2.getMonth()); + assertEquals(dates.get(1).getYear(), date2.getYear()); + } + + @Test + public void givenGetDatesBetweenWithUsingJava8_WhenStartEndDate_thenDatesList() { + LocalDate startDate = LocalDate.now(); + LocalDate endDate = LocalDate.now().plusDays(2); + + List dates = TimeApi.getDatesBetweenUsingJava8(startDate, endDate); + assertEquals(dates.size(), 2); + assertEquals(dates.get(0), LocalDate.now()); + assertEquals(dates.get(1), LocalDate.now().plusDays(1)); + } + + @Test + public void givenGetDatesBetweenWithUsingJava9_WhenStartEndDate_thenDatesList() { + LocalDate startDate = LocalDate.now(); + LocalDate endDate = LocalDate.now().plusDays(2); + + List dates = TimeApi.getDatesBetweenUsingJava9(startDate, endDate); + assertEquals(dates.size(), 2); + assertEquals(dates.get(0), LocalDate.now()); + assertEquals(dates.get(1), LocalDate.now().plusDays(1)); + } + +} diff --git a/core-java/.gitignore b/core-java/.gitignore index 2a03a0f72e..3de4cc647e 100644 --- a/core-java/.gitignore +++ b/core-java/.gitignore @@ -17,9 +17,10 @@ # Files generated by integration tests *.txt +backup-pom.xml /bin/ /temp #IntelliJ specific -.idea +.idea/ *.iml \ No newline at end of file diff --git a/core-java/README.md b/core-java/README.md index 6c671a632d..559507e472 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -102,7 +102,7 @@ - [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection) - [Guide to DelayQueue](http://www.baeldung.com/java-delay-queue) -- [Guide to UUID in JAVA] (http://www.baeldung.com/guide-to-uuid-in-java) +- [Guide to UUID in JAVA](http://www.baeldung.com/guide-to-uuid-in-java) - [Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java](http://www.baeldung.com/java-path) - [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend) - [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration) @@ -113,4 +113,21 @@ - [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep) - [LongAdder and LongAccumulator in Java](http://www.baeldung.com/java-longadder-and-longaccumulator) - [Using Java MappedByteBuffer](http://www.baeldung.com/java-mapped-byte-buffer) - +- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies) +- [How to Copy an Array in Java](http://www.baeldung.com/java-array-copy) +- [Introduction to JDBC](http://www.baeldung.com/java-jdbc) +- [Guide to CopyOnWriteArrayList](http://www.baeldung.com/java-copy-on-write-arraylist) +- [Period and Duration in Java](http://www.baeldung.com/java-period-duration) +- [Converting a Stack Trace to a String in Java](http://www.baeldung.com/java-stacktrace-to-string) +- [Guide to the Java Phaser](http://www.baeldung.com/java-phaser) +- [Count Occurrences of a Char in a String](http://www.baeldung.com/java-count-chars) +- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization) +- [The StackOverflowError in Java](http://www.baeldung.com/java-stack-overflow-error) +- [Split a String in Java](http://www.baeldung.com/java-split-string) +- [Introduction to Java Serialization](http://www.baeldung.com/java-serialization) +- [How to Remove the Last Character of a String?](http://www.baeldung.com/java-remove-last-character-of-string) +- [Guide to Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized) +- [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror) +- [Guide to UUID in Java](http://www.baeldung.com/java-uuid) +- [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element) +- [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char) diff --git a/core-java/pom.xml b/core-java/pom.xml index 5c9bf06a57..84a56c8bc7 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -1,399 +1,420 @@ - 4.0.0 - com.baeldung - core-java - 0.1.0-SNAPSHOT - jar + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung + core-java + 0.1.0-SNAPSHOT + jar - core-java + core-java - + - - - net.sourceforge.collections - collections-generic - ${collections-generic.version} - - - com.google.guava - guava - ${guava.version} - + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + com.google.guava + guava + ${guava.version} + - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + - - commons-io - commons-io - ${commons-io.version} - + + commons-io + commons-io + ${commons-io.version} + - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + - - org.apache.commons - commons-math3 - ${commons-math3.version} - - - - org.decimal4j - decimal4j - ${decimal4j.version} - + + org.apache.commons + commons-math3 + ${commons-math3.version} + - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - + + org.decimal4j + decimal4j + ${decimal4j.version} + - - org.unix4j - unix4j-command - ${unix4j.version} - + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + - - com.googlecode.grep4j - grep4j - ${grep4j.version} - - + + org.unix4j + unix4j-command + ${unix4j.version} + - + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - + - + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + - - org.slf4j - slf4j-api - ${org.slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - org.slf4j - jcl-over-slf4j - ${org.slf4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - + - + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + + org.slf4j + jcl-over-slf4j + ${org.slf4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + - - org.hamcrest - hamcrest-all - 1.3 - test - + - - junit - junit - ${junit.version} - test - + + org.hamcrest + hamcrest-all + 1.3 + test + - - org.hamcrest - hamcrest-core - ${org.hamcrest.version} - test - - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - + + junit + junit + ${junit.version} + test + - - org.assertj - assertj-core - ${assertj.version} - test - + + org.hamcrest + hamcrest-core + ${org.hamcrest.version} + test + + + org.hamcrest + hamcrest-library + ${org.hamcrest.version} + test + - - org.mockito - mockito-core - ${mockito.version} - test - - - com.jayway.awaitility - awaitility - ${avaitility.version} - test - + + org.assertj + assertj-core + ${assertj.version} + test + - - commons-codec - commons-codec - ${commons-codec.version} - + + org.mockito + mockito-core + ${mockito.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + - - org.javamoney - moneta - 1.1 - + + commons-codec + commons-codec + ${commons-codec.version} + - - org.owasp.esapi - esapi - 2.1.0.1 - + + org.javamoney + moneta + 1.1 + - + + org.owasp.esapi + esapi + 2.1.0.1 + - - core-java - - - src/main/resources - true - - + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + - + + core-java + + + src/main/resources + true + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - - + - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - - true - - + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + + true + + - - org.apache.maven.plugins - maven-jar-plugin - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - + + org.apache.maven.plugins + maven-dependency-plugin + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/libs + + + + - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - + + org.apache.maven.plugins + maven-jar-plugin + + + + true + libs/ + org.baeldung.executable.ExecutableMavenJar + + + + - - org.apache.maven.plugins - maven-shade-plugin - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + ${project.basedir} + + + org.baeldung.executable.ExecutableMavenJar + + + + jar-with-dependencies + + + + + - - com.jolira - onejar-maven-plugin - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - + + org.apache.maven.plugins + maven-shade-plugin + + + + shade + + + true + + + org.baeldung.executable.ExecutableMavenJar + + + + + + - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - + + com.jolira + onejar-maven-plugin + + + + org.baeldung.executable.ExecutableMavenJar + true + ${project.build.finalName}-onejar.${project.packaging} + + + one-jar + + + + - + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + spring-boot + org.baeldung.executable.ExecutableMavenJar + + + + - + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - + - - - 2.8.5 + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*ManualTest.java + + + **/*IntegrationTest.java + + + + + + + json + + + + + + + - - 1.7.21 - 1.1.7 + + + 2.8.5 - - 21.0 - 3.5 - 1.55 - 1.10 - 3.6.1 - 1.0.3 - 2.5 - 4.1 - 4.01 - 0.4 - 1.8.7 - 1.16.12 + + 1.7.21 + 1.1.7 - - 1.3 - 4.12 - 1.10.19 - 3.6.1 - 1.7.0 + + 21.0 + 3.5 + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 2.5 + 4.1 + 4.01 + 0.4 + 1.8.7 + 1.16.12 + 4.6-b01 - - 3.6.0 - 2.19.1 + + 1.3 + 4.12 + 1.10.19 + 3.6.1 + 1.7.0 - + + 3.6.0 + 2.19.1 + \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersConsumer.java b/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersConsumer.java index 13fe0c3126..7b261b2b8e 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersConsumer.java +++ b/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersConsumer.java @@ -6,7 +6,7 @@ public class NumbersConsumer implements Runnable { private final BlockingQueue queue; private final int poisonPill; - public NumbersConsumer(BlockingQueue queue, int poisonPill) { + NumbersConsumer(BlockingQueue queue, int poisonPill) { this.queue = queue; this.poisonPill = poisonPill; } diff --git a/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersProducer.java b/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersProducer.java index b262097c63..9dcd0a3e47 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersProducer.java +++ b/core-java/src/main/java/com/baeldung/concurrent/blockingqueue/NumbersProducer.java @@ -9,7 +9,7 @@ public class NumbersProducer implements Runnable { private final int poisonPill; private final int poisonPillPerProducer; - public NumbersProducer(BlockingQueue numbersQueue, int poisonPill, int poisonPillPerProducer) { + NumbersProducer(BlockingQueue numbersQueue, int poisonPill, int poisonPillPerProducer) { this.numbersQueue = numbersQueue; this.poisonPill = poisonPill; this.poisonPillPerProducer = poisonPillPerProducer; diff --git a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java b/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java index 90cd01b69f..d48f317fe7 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java +++ b/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java @@ -7,7 +7,7 @@ public class BrokenWorker implements Runnable { private final List outputScraper; private final CountDownLatch countDownLatch; - public BrokenWorker(final List outputScraper, final CountDownLatch countDownLatch) { + BrokenWorker(final List outputScraper, final CountDownLatch countDownLatch) { this.outputScraper = outputScraper; this.countDownLatch = countDownLatch; } diff --git a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java b/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java index 66be2030e2..4aee5cf89a 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java +++ b/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java @@ -10,7 +10,7 @@ public class WaitingWorker implements Runnable { private final CountDownLatch callingThreadBlocker; private final CountDownLatch completedThreadCounter; - public WaitingWorker(final List outputScraper, final CountDownLatch readyThreadCounter, final CountDownLatch callingThreadBlocker, CountDownLatch completedThreadCounter) { + WaitingWorker(final List outputScraper, final CountDownLatch readyThreadCounter, final CountDownLatch callingThreadBlocker, CountDownLatch completedThreadCounter) { this.outputScraper = outputScraper; this.readyThreadCounter = readyThreadCounter; diff --git a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java b/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java index e712fc18d6..389e25719b 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java +++ b/core-java/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java @@ -7,7 +7,7 @@ public class Worker implements Runnable { private final List outputScraper; private final CountDownLatch countDownLatch; - public Worker(final List outputScraper, final CountDownLatch countDownLatch) { + Worker(final List outputScraper, final CountDownLatch countDownLatch) { this.outputScraper = outputScraper; this.countDownLatch = countDownLatch; } diff --git a/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java b/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java new file mode 100644 index 0000000000..977dae4fdb --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java @@ -0,0 +1,81 @@ +package com.baeldung.concurrent.cyclicbarrier; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; + +public class CyclicBarrierDemo { + + private CyclicBarrier cyclicBarrier; + private List> partialResults = Collections.synchronizedList(new ArrayList<>()); + private Random random = new Random(); + private int NUM_PARTIAL_RESULTS; + private int NUM_WORKERS; + + + private void runSimulation(int numWorkers, int numberOfPartialResults) { + NUM_PARTIAL_RESULTS = numberOfPartialResults; + NUM_WORKERS = numWorkers; + + cyclicBarrier = new CyclicBarrier(NUM_WORKERS, new AggregatorThread()); + System.out.println("Spawning " + NUM_WORKERS + " worker threads to compute " + + NUM_PARTIAL_RESULTS + " partial results each"); + for (int i = 0; i < NUM_WORKERS; i++) { + Thread worker = new Thread(new NumberCruncherThread()); + worker.setName("Thread " + i); + worker.start(); + } + } + + class NumberCruncherThread implements Runnable { + + @Override + public void run() { + String thisThreadName = Thread.currentThread().getName(); + List partialResult = new ArrayList<>(); + for (int i = 0; i < NUM_PARTIAL_RESULTS; i++) { + Integer num = random.nextInt(10); + System.out.println(thisThreadName + + ": Crunching some numbers! Final result - " + num); + partialResult.add(num); + } + partialResults.add(partialResult); + try { + System.out.println(thisThreadName + " waiting for others to reach barrier."); + cyclicBarrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } + } + } + + class AggregatorThread implements Runnable { + + @Override + public void run() { + String thisThreadName = Thread.currentThread().getName(); + System.out.println(thisThreadName + ": Computing final sum of " + NUM_WORKERS + + " workers, having " + NUM_PARTIAL_RESULTS + " results each."); + int sum = 0; + for (List threadResult : partialResults) { + System.out.print("Adding "); + for (Integer partialResult : threadResult) { + System.out.print(partialResult+" "); + sum += partialResult; + } + System.out.println(); + } + System.out.println(Thread.currentThread().getName() + ": Final result = " + sum); + } + + } + + public static void main(String[] args) { + CyclicBarrierDemo play = new CyclicBarrierDemo(); + play.runSimulation(5, 3); + } + +} diff --git a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayObject.java b/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayObject.java index aa4ca58d6a..5f72758e71 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayObject.java +++ b/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayObject.java @@ -9,7 +9,7 @@ public class DelayObject implements Delayed { private String data; private long startTime; - public DelayObject(String data, long delayInMilliseconds) { + DelayObject(String data, long delayInMilliseconds) { this.data = data; this.startTime = System.currentTimeMillis() + delayInMilliseconds; } diff --git a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueConsumer.java b/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueConsumer.java index 8a969bf7aa..d1c1eae9f2 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueConsumer.java +++ b/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueConsumer.java @@ -7,9 +7,9 @@ import java.util.concurrent.atomic.AtomicInteger; public class DelayQueueConsumer implements Runnable { private BlockingQueue queue; private final Integer numberOfElementsToTake; - public final AtomicInteger numberOfConsumedElements = new AtomicInteger(); + final AtomicInteger numberOfConsumedElements = new AtomicInteger(); - public DelayQueueConsumer(BlockingQueue queue, Integer numberOfElementsToTake) { + DelayQueueConsumer(BlockingQueue queue, Integer numberOfElementsToTake) { this.queue = queue; this.numberOfElementsToTake = numberOfElementsToTake; } diff --git a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueProducer.java b/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueProducer.java index 617f19b9ac..f24f4bc385 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueProducer.java +++ b/core-java/src/main/java/com/baeldung/concurrent/delayqueue/DelayQueueProducer.java @@ -9,9 +9,9 @@ public class DelayQueueProducer implements Runnable { private final Integer numberOfElementsToProduce; private final Integer delayOfEachProducedMessageMilliseconds; - public DelayQueueProducer(BlockingQueue queue, - Integer numberOfElementsToProduce, - Integer delayOfEachProducedMessageMilliseconds) { + DelayQueueProducer(BlockingQueue queue, + Integer numberOfElementsToProduce, + Integer delayOfEachProducedMessageMilliseconds) { this.queue = queue; this.numberOfElementsToProduce = numberOfElementsToProduce; this.delayOfEachProducedMessageMilliseconds = delayOfEachProducedMessageMilliseconds; diff --git a/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java b/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java index 3f1eacd276..c5672706ad 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java +++ b/core-java/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java @@ -5,7 +5,7 @@ public class Philosopher implements Runnable { private final Object leftFork; private final Object rightFork; - public Philosopher(Object left, Object right) { + Philosopher(Object left, Object right) { this.leftFork = left; this.rightFork = right; } @@ -30,7 +30,6 @@ public class Philosopher implements Runnable { } } catch (InterruptedException e) { Thread.currentThread().interrupt(); - return; } } } \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java b/core-java/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java index 471072b333..35bb2aa497 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java +++ b/core-java/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java @@ -7,7 +7,7 @@ public class FactorialSquareCalculator extends RecursiveTask { final private Integer n; - public FactorialSquareCalculator(Integer n) { + FactorialSquareCalculator(Integer n) { this.n = n; } diff --git a/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java b/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java index bcd559dd3b..3329fa599b 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java +++ b/core-java/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java @@ -3,15 +3,15 @@ package com.baeldung.concurrent.future; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -public class SquareCalculator { +class SquareCalculator { private final ExecutorService executor; - public SquareCalculator(ExecutorService executor) { + SquareCalculator(ExecutorService executor) { this.executor = executor; } - public Future calculate(Integer input) { + Future calculate(Integer input) { return executor.submit(() -> { Thread.sleep(1000); return input * input; diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java b/core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java index 4f061d2efd..f01c675fd2 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java +++ b/core-java/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java @@ -13,71 +13,71 @@ import static java.lang.Thread.sleep; public class ReentrantLockWithCondition { - static Logger logger = LoggerFactory.getLogger(ReentrantLockWithCondition.class); + private static Logger LOG = LoggerFactory.getLogger(ReentrantLockWithCondition.class); - Stack stack = new Stack<>(); - int CAPACITY = 5; + private Stack stack = new Stack<>(); + private static final int CAPACITY = 5; - ReentrantLock lock = new ReentrantLock(); - Condition stackEmptyCondition = lock.newCondition(); - Condition stackFullCondition = lock.newCondition(); + private ReentrantLock lock = new ReentrantLock(); + private Condition stackEmptyCondition = lock.newCondition(); + private Condition stackFullCondition = lock.newCondition(); - public void pushToStack(String item) throws InterruptedException { - try { - lock.lock(); - if (stack.size() == CAPACITY) { - logger.info(Thread.currentThread().getName() + " wait on stack full"); - stackFullCondition.await(); - } - logger.info("Pushing the item " + item); - stack.push(item); - stackEmptyCondition.signalAll(); - } finally { - lock.unlock(); - } + private void pushToStack(String item) throws InterruptedException { + try { + lock.lock(); + if (stack.size() == CAPACITY) { + LOG.info(Thread.currentThread().getName() + " wait on stack full"); + stackFullCondition.await(); + } + LOG.info("Pushing the item " + item); + stack.push(item); + stackEmptyCondition.signalAll(); + } finally { + lock.unlock(); + } - } + } - public String popFromStack() throws InterruptedException { - try { - lock.lock(); - if (stack.size() == 0) { - logger.info(Thread.currentThread().getName() + " wait on stack empty"); - stackEmptyCondition.await(); - } - return stack.pop(); - } finally { - stackFullCondition.signalAll(); - lock.unlock(); - } - } + private String popFromStack() throws InterruptedException { + try { + lock.lock(); + if (stack.size() == 0) { + LOG.info(Thread.currentThread().getName() + " wait on stack empty"); + stackEmptyCondition.await(); + } + return stack.pop(); + } finally { + stackFullCondition.signalAll(); + lock.unlock(); + } + } - public static void main(String[] args) { - final int threadCount = 2; - ReentrantLockWithCondition object = new ReentrantLockWithCondition(); - final ExecutorService service = Executors.newFixedThreadPool(threadCount); - service.execute(() -> { - for (int i = 0; i < 10; i++) { - try { - object.pushToStack("Item " + i); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } + public static void main(String[] args) { + final int threadCount = 2; + ReentrantLockWithCondition object = new ReentrantLockWithCondition(); + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + service.execute(() -> { + for (int i = 0; i < 10; i++) { + try { + object.pushToStack("Item " + i); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } - }); + }); - service.execute(() -> { - for (int i = 0; i < 10; i++) { - try { - logger.info("Item popped " + object.popFromStack()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } + service.execute(() -> { + for (int i = 0; i < 10; i++) { + try { + LOG.info("Item popped " + object.popFromStack()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } - }); + }); - service.shutdown(); - } + service.shutdown(); + } } diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java b/core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java index b6a4615638..14ae47b2f3 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java +++ b/core-java/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java @@ -12,81 +12,77 @@ import static java.lang.Thread.sleep; public class SharedObjectWithLock { - Logger logger = LoggerFactory.getLogger(SharedObjectWithLock.class); + private static final Logger LOG = LoggerFactory.getLogger(SharedObjectWithLock.class); - ReentrantLock lock = new ReentrantLock(true); + private ReentrantLock lock = new ReentrantLock(true); - int counter = 0; + private int counter = 0; - public void perform() { + void perform() { - lock.lock(); - logger.info("Thread - " + Thread.currentThread().getName() + " acquired the lock"); - try { - logger.info("Thread - " + Thread.currentThread().getName() + " processing"); - counter++; - } catch (Exception exception) { - logger.error(" Interrupted Exception ", exception); - } finally { - lock.unlock(); - logger.info("Thread - " + Thread.currentThread().getName() + " released the lock"); - } - } + lock.lock(); + LOG.info("Thread - " + Thread.currentThread().getName() + " acquired the lock"); + try { + LOG.info("Thread - " + Thread.currentThread().getName() + " processing"); + counter++; + } catch (Exception exception) { + LOG.error(" Interrupted Exception ", exception); + } finally { + lock.unlock(); + LOG.info("Thread - " + Thread.currentThread().getName() + " released the lock"); + } + } - public void performTryLock() { + private void performTryLock() { - logger.info("Thread - " + Thread.currentThread().getName() + " attempting to acquire the lock"); - try { - boolean isLockAcquired = lock.tryLock(2, TimeUnit.SECONDS); - if (isLockAcquired) { - try { - logger.info("Thread - " + Thread.currentThread().getName() + " acquired the lock"); + LOG.info("Thread - " + Thread.currentThread().getName() + " attempting to acquire the lock"); + try { + boolean isLockAcquired = lock.tryLock(2, TimeUnit.SECONDS); + if (isLockAcquired) { + try { + LOG.info("Thread - " + Thread.currentThread().getName() + " acquired the lock"); - logger.info("Thread - " + Thread.currentThread().getName() + " processing"); - sleep(1000); - } finally { - lock.unlock(); - logger.info("Thread - " + Thread.currentThread().getName() + " released the lock"); + LOG.info("Thread - " + Thread.currentThread().getName() + " processing"); + sleep(1000); + } finally { + lock.unlock(); + LOG.info("Thread - " + Thread.currentThread().getName() + " released the lock"); - } - } - } catch (InterruptedException exception) { - logger.error(" Interrupted Exception ", exception); - } - logger.info("Thread - " + Thread.currentThread().getName() + " could not acquire the lock"); - } + } + } + } catch (InterruptedException exception) { + LOG.error(" Interrupted Exception ", exception); + } + LOG.info("Thread - " + Thread.currentThread().getName() + " could not acquire the lock"); + } - public ReentrantLock getLock() { - return lock; - } + public ReentrantLock getLock() { + return lock; + } - boolean isLocked() { - return lock.isLocked(); - } + boolean isLocked() { + return lock.isLocked(); + } - boolean hasQueuedThreads() { - return lock.hasQueuedThreads(); - } + boolean hasQueuedThreads() { + return lock.hasQueuedThreads(); + } - int getCounter() { - return counter; - } + int getCounter() { + return counter; + } - public static void main(String[] args) { + public static void main(String[] args) { - final int threadCount = 2; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); - final SharedObjectWithLock object = new SharedObjectWithLock(); + final int threadCount = 2; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + final SharedObjectWithLock object = new SharedObjectWithLock(); - service.execute(() -> { - object.perform(); - }); - service.execute(() -> { - object.performTryLock(); - }); + service.execute(object::perform); + service.execute(object::performTryLock); - service.shutdown(); + service.shutdown(); - } + } } diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java b/core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java index 0b0dbc72cb..638bb56b2f 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java +++ b/core-java/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java @@ -12,93 +12,93 @@ import java.util.concurrent.locks.StampedLock; import static java.lang.Thread.sleep; public class StampedLockDemo { - Map map = new HashMap<>(); - Logger logger = LoggerFactory.getLogger(StampedLockDemo.class); + private Map map = new HashMap<>(); + private Logger logger = LoggerFactory.getLogger(StampedLockDemo.class); - private final StampedLock lock = new StampedLock(); + private final StampedLock lock = new StampedLock(); - public void put(String key, String value) throws InterruptedException { - long stamp = lock.writeLock(); + public void put(String key, String value) throws InterruptedException { + long stamp = lock.writeLock(); - try { - logger.info(Thread.currentThread().getName() + " acquired the write lock with stamp " + stamp); - map.put(key, value); - } finally { - lock.unlockWrite(stamp); - logger.info(Thread.currentThread().getName() + " unlocked the write lock with stamp " + stamp); - } - } + try { + logger.info(Thread.currentThread().getName() + " acquired the write lock with stamp " + stamp); + map.put(key, value); + } finally { + lock.unlockWrite(stamp); + logger.info(Thread.currentThread().getName() + " unlocked the write lock with stamp " + stamp); + } + } - public String get(String key) throws InterruptedException { - long stamp = lock.readLock(); - logger.info(Thread.currentThread().getName() + " acquired the read lock with stamp " + stamp); - try { - sleep(5000); - return map.get(key); + public String get(String key) throws InterruptedException { + long stamp = lock.readLock(); + logger.info(Thread.currentThread().getName() + " acquired the read lock with stamp " + stamp); + try { + sleep(5000); + return map.get(key); - } finally { - lock.unlockRead(stamp); - logger.info(Thread.currentThread().getName() + " unlocked the read lock with stamp " + stamp); + } finally { + lock.unlockRead(stamp); + logger.info(Thread.currentThread().getName() + " unlocked the read lock with stamp " + stamp); - } + } - } + } - public String readWithOptimisticLock(String key) throws InterruptedException { - long stamp = lock.tryOptimisticRead(); - String value = map.get(key); + private String readWithOptimisticLock(String key) throws InterruptedException { + long stamp = lock.tryOptimisticRead(); + String value = map.get(key); - if (!lock.validate(stamp)) { - stamp = lock.readLock(); - try { - sleep(5000); - return map.get(key); + if (!lock.validate(stamp)) { + stamp = lock.readLock(); + try { + sleep(5000); + return map.get(key); - } finally { - lock.unlock(stamp); - logger.info(Thread.currentThread().getName() + " unlocked the read lock with stamp " + stamp); + } finally { + lock.unlock(stamp); + logger.info(Thread.currentThread().getName() + " unlocked the read lock with stamp " + stamp); - } - } - return value; - } + } + } + return value; + } - public static void main(String[] args) { - final int threadCount = 4; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); - StampedLockDemo object = new StampedLockDemo(); + public static void main(String[] args) { + final int threadCount = 4; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + StampedLockDemo object = new StampedLockDemo(); - Runnable writeTask = () -> { + Runnable writeTask = () -> { - try { - object.put("key1", "value1"); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }; - Runnable readTask = () -> { + try { + object.put("key1", "value1"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }; + Runnable readTask = () -> { - try { - object.get("key1"); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }; - Runnable readOptimisticTask = () -> { + try { + object.get("key1"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }; + Runnable readOptimisticTask = () -> { - try { - object.readWithOptimisticLock("key1"); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }; - service.submit(writeTask); - service.submit(writeTask); - service.submit(readTask); - service.submit(readOptimisticTask); + try { + object.readWithOptimisticLock("key1"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }; + service.submit(writeTask); + service.submit(writeTask); + service.submit(readTask); + service.submit(readOptimisticTask); - service.shutdown(); + service.shutdown(); - } + } } diff --git a/core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java b/core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java index 83b8b34fe9..eeb7aa4b13 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java +++ b/core-java/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java @@ -15,106 +15,106 @@ import static java.lang.Thread.sleep; public class SynchronizedHashMapWithRWLock { - static Map syncHashMap = new HashMap<>(); - Logger logger = LoggerFactory.getLogger(SynchronizedHashMapWithRWLock.class); + private static Map syncHashMap = new HashMap<>(); + private Logger logger = LoggerFactory.getLogger(SynchronizedHashMapWithRWLock.class); - private final ReadWriteLock lock = new ReentrantReadWriteLock(); - private final Lock readLock = lock.readLock(); - private final Lock writeLock = lock.writeLock(); + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private final Lock readLock = lock.readLock(); + private final Lock writeLock = lock.writeLock(); - public void put(String key, String value) throws InterruptedException { + public void put(String key, String value) throws InterruptedException { - try { - writeLock.lock(); - logger.info(Thread.currentThread().getName() + " writing"); - syncHashMap.put(key, value); - sleep(1000); - } finally { - writeLock.unlock(); - } + try { + writeLock.lock(); + logger.info(Thread.currentThread().getName() + " writing"); + syncHashMap.put(key, value); + sleep(1000); + } finally { + writeLock.unlock(); + } - } + } - public String get(String key) { - try { - readLock.lock(); - logger.info(Thread.currentThread().getName() + " reading"); - return syncHashMap.get(key); - } finally { - readLock.unlock(); - } - } + public String get(String key) { + try { + readLock.lock(); + logger.info(Thread.currentThread().getName() + " reading"); + return syncHashMap.get(key); + } finally { + readLock.unlock(); + } + } - public String remove(String key) { - try { - writeLock.lock(); - return syncHashMap.remove(key); - } finally { - writeLock.unlock(); - } - } + public String remove(String key) { + try { + writeLock.lock(); + return syncHashMap.remove(key); + } finally { + writeLock.unlock(); + } + } - public boolean containsKey(String key) { - try { - readLock.lock(); - return syncHashMap.containsKey(key); - } finally { - readLock.unlock(); - } - } + public boolean containsKey(String key) { + try { + readLock.lock(); + return syncHashMap.containsKey(key); + } finally { + readLock.unlock(); + } + } - boolean isReadLockAvailable() { - return readLock.tryLock(); - } + boolean isReadLockAvailable() { + return readLock.tryLock(); + } - public static void main(String[] args) throws InterruptedException { + public static void main(String[] args) throws InterruptedException { - final int threadCount = 3; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); - SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); + final int threadCount = 3; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); - service.execute(new Thread(new Writer(object), "Writer")); - service.execute(new Thread(new Reader(object), "Reader1")); - service.execute(new Thread(new Reader(object), "Reader2")); + service.execute(new Thread(new Writer(object), "Writer")); + service.execute(new Thread(new Reader(object), "Reader1")); + service.execute(new Thread(new Reader(object), "Reader2")); - service.shutdown(); - } + service.shutdown(); + } - private static class Reader implements Runnable { + private static class Reader implements Runnable { - SynchronizedHashMapWithRWLock object; + SynchronizedHashMapWithRWLock object; - public Reader(SynchronizedHashMapWithRWLock object) { - this.object = object; - } + Reader(SynchronizedHashMapWithRWLock object) { + this.object = object; + } - @Override - public void run() { - for (int i = 0; i < 10; i++) { - object.get("key" + i); - } - } - } + @Override + public void run() { + for (int i = 0; i < 10; i++) { + object.get("key" + i); + } + } + } - private static class Writer implements Runnable { + private static class Writer implements Runnable { - SynchronizedHashMapWithRWLock object; + SynchronizedHashMapWithRWLock object; - public Writer(SynchronizedHashMapWithRWLock object) { - this.object = object; - } + public Writer(SynchronizedHashMapWithRWLock object) { + this.object = object; + } - @Override - public void run() { - for (int i = 0; i < 10; i++) { - try { - object.put("key" + i, "value" + i); - sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - } + @Override + public void run() { + for (int i = 0; i < 10; i++) { + try { + object.put("key" + i, "value" + i); + sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } } diff --git a/core-java/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java b/core-java/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java new file mode 100644 index 0000000000..50cd2966ea --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java @@ -0,0 +1,31 @@ +package com.baeldung.concurrent.semaphores; + +import java.util.concurrent.Semaphore; + +class CounterUsingMutex { + + private final Semaphore mutex; + private int count; + + CounterUsingMutex() { + mutex = new Semaphore(1); + count = 0; + } + + void increase() throws InterruptedException { + mutex.acquire(); + this.count = this.count + 1; + Thread.sleep(1000); + mutex.release(); + + } + + int getCount() { + return this.count; + } + + boolean hasQueuedThreads() { + return mutex.hasQueuedThreads(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java b/core-java/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java new file mode 100644 index 0000000000..718574d3c8 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java @@ -0,0 +1,23 @@ +package com.baeldung.concurrent.semaphores; + +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang3.concurrent.TimedSemaphore; + +class DelayQueueUsingTimedSemaphore { + + private final TimedSemaphore semaphore; + + DelayQueueUsingTimedSemaphore(long period, int slotLimit) { + semaphore = new TimedSemaphore(period, TimeUnit.SECONDS, slotLimit); + } + + boolean tryAdd() { + return semaphore.tryAcquire(); + } + + int availableSlots() { + return semaphore.getAvailablePermits(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java b/core-java/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java new file mode 100644 index 0000000000..3cf7c45428 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java @@ -0,0 +1,25 @@ +package com.baeldung.concurrent.semaphores; + +import java.util.concurrent.Semaphore; + +class LoginQueueUsingSemaphore { + + private final Semaphore semaphore; + + LoginQueueUsingSemaphore(int slotLimit) { + semaphore = new Semaphore(slotLimit); + } + + boolean tryLogin() { + return semaphore.tryAcquire(); + } + + void logout() { + semaphore.release(); + } + + int availableSlots() { + return semaphore.availablePermits(); + } + +} diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java index ce1f57bb93..d5ff5f7842 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/Event.java @@ -2,20 +2,20 @@ package com.baeldung.concurrent.skiplist; import java.time.ZonedDateTime; -public class Event { +class Event { private final ZonedDateTime eventTime; private final String content; - public Event(ZonedDateTime eventTime, String content) { + Event(ZonedDateTime eventTime, String content) { this.eventTime = eventTime; this.content = content; } - public ZonedDateTime getEventTime() { + ZonedDateTime getEventTime() { return eventTime; } - public String getContent() { + String getContent() { return content; } } diff --git a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java index 3aca6b0147..2e501ed368 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java +++ b/core-java/src/main/java/com/baeldung/concurrent/skiplist/EventWindowSort.java @@ -5,24 +5,24 @@ import java.util.Comparator; import java.util.concurrent.ConcurrentNavigableMap; import java.util.concurrent.ConcurrentSkipListMap; -public class EventWindowSort { +class EventWindowSort { private final ConcurrentSkipListMap events - = new ConcurrentSkipListMap<>(Comparator.comparingLong(value -> value.toInstant().toEpochMilli())); + = new ConcurrentSkipListMap<>(Comparator.comparingLong(value -> value.toInstant().toEpochMilli())); - public void acceptEvent(Event event) { + void acceptEvent(Event event) { events.put(event.getEventTime(), event.getContent()); } - public ConcurrentNavigableMap getEventsFromLastMinute() { + ConcurrentNavigableMap getEventsFromLastMinute() { return events.tailMap(ZonedDateTime - .now() - .minusMinutes(1)); + .now() + .minusMinutes(1)); } - public ConcurrentNavigableMap getEventsOlderThatOneMinute() { + ConcurrentNavigableMap getEventsOlderThatOneMinute() { return events.headMap(ZonedDateTime - .now() - .minusMinutes(1)); + .now() + .minusMinutes(1)); } } diff --git a/core-java/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java b/core-java/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java index 0311d9b0b2..90bc4dceed 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java +++ b/core-java/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java @@ -13,10 +13,10 @@ public class WaitSleepExample { private static final Object LOCK = new Object(); public static void main(String... args) throws InterruptedException { - sleepWaitInSyncronizedBlocks(); + sleepWaitInSynchronizedBlocks(); } - private static void sleepWaitInSyncronizedBlocks() throws InterruptedException { + private static void sleepWaitInSynchronizedBlocks() throws InterruptedException { Thread.sleep(1000); // called on the thread LOG.debug("Thread '" + Thread.currentThread().getName() + "' is woken after sleeping for 1 second"); @@ -25,5 +25,5 @@ public class WaitSleepExample { LOG.debug("Object '" + LOCK + "' is woken after waiting for 1 second"); } } - + } diff --git a/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java b/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java index d66cd0d796..332a6d9263 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java +++ b/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java @@ -5,13 +5,13 @@ public class BaeldungSynchronizedBlocks { private int count = 0; private static int staticCount = 0; - public void performSynchronisedTask() { + void performSynchronisedTask() { synchronized (this) { setCount(getCount() + 1); } } - public static void performStaticSyncTask() { + static void performStaticSyncTask() { synchronized (BaeldungSynchronizedBlocks.class) { setStaticCount(getStaticCount() + 1); } @@ -25,11 +25,11 @@ public class BaeldungSynchronizedBlocks { this.count = count; } - public static int getStaticCount() { + static int getStaticCount() { return staticCount; } - public static void setStaticCount(int staticCount) { + private static void setStaticCount(int staticCount) { BaeldungSynchronizedBlocks.staticCount = staticCount; } } diff --git a/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java b/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java index 1295140b7c..179c6fb9ef 100644 --- a/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java +++ b/core-java/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java @@ -5,17 +5,17 @@ public class BaeldungSynchronizedMethods { private int sum = 0; private int syncSum = 0; - public static int staticSum = 0; + static int staticSum = 0; - public void calculate() { + void calculate() { setSum(getSum() + 1); } - public synchronized void synchronisedCalculate() { + synchronized void synchronisedCalculate() { setSyncSum(getSyncSum() + 1); } - public static synchronized void syncStaticCalculate() { + static synchronized void syncStaticCalculate() { staticSum = staticSum + 1; } @@ -27,11 +27,11 @@ public class BaeldungSynchronizedMethods { this.sum = sum; } - public int getSyncSum() { + int getSyncSum() { return syncSum; } - public void setSyncSum(int syncSum) { + private void setSyncSum(int syncSum) { this.syncSum = syncSum; } } diff --git a/core-java/src/main/java/com/baeldung/datetime/UseLocalDate.java b/core-java/src/main/java/com/baeldung/datetime/UseLocalDate.java index 82f5745b3c..0d727cf0b5 100644 --- a/core-java/src/main/java/com/baeldung/datetime/UseLocalDate.java +++ b/core-java/src/main/java/com/baeldung/datetime/UseLocalDate.java @@ -6,40 +6,40 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; -public class UseLocalDate { +class UseLocalDate { - public LocalDate getLocalDateUsingFactoryOfMethod(int year, int month, int dayOfMonth) { + LocalDate getLocalDateUsingFactoryOfMethod(int year, int month, int dayOfMonth) { return LocalDate.of(year, month, dayOfMonth); } - public LocalDate getLocalDateUsingParseMethod(String representation) { + LocalDate getLocalDateUsingParseMethod(String representation) { return LocalDate.parse(representation); } - public LocalDate getLocalDateFromClock() { + LocalDate getLocalDateFromClock() { LocalDate localDate = LocalDate.now(); return localDate; } - public LocalDate getNextDay(LocalDate localDate) { + LocalDate getNextDay(LocalDate localDate) { return localDate.plusDays(1); } - public LocalDate getPreviousDay(LocalDate localDate) { + LocalDate getPreviousDay(LocalDate localDate) { return localDate.minus(1, ChronoUnit.DAYS); } - public DayOfWeek getDayOfWeek(LocalDate localDate) { + DayOfWeek getDayOfWeek(LocalDate localDate) { DayOfWeek day = localDate.getDayOfWeek(); return day; } - public LocalDate getFirstDayOfMonth() { + LocalDate getFirstDayOfMonth() { LocalDate firstDayOfMonth = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); return firstDayOfMonth; } - public LocalDateTime getStartOfDay(LocalDate localDate) { + LocalDateTime getStartOfDay(LocalDate localDate) { LocalDateTime startofDay = localDate.atStartOfDay(); return startofDay; } diff --git a/core-java/src/main/java/com/baeldung/datetime/UseLocalTime.java b/core-java/src/main/java/com/baeldung/datetime/UseLocalTime.java index 9bd8f9706c..8d166c413f 100644 --- a/core-java/src/main/java/com/baeldung/datetime/UseLocalTime.java +++ b/core-java/src/main/java/com/baeldung/datetime/UseLocalTime.java @@ -5,31 +5,27 @@ import java.time.temporal.ChronoUnit; public class UseLocalTime { - public LocalTime getLocalTimeUsingFactoryOfMethod(int hour, int min, int seconds) { - LocalTime localTime = LocalTime.of(hour, min, seconds); - return localTime; + LocalTime getLocalTimeUsingFactoryOfMethod(int hour, int min, int seconds) { + return LocalTime.of(hour, min, seconds); } - public LocalTime getLocalTimeUsingParseMethod(String timeRepresentation) { - LocalTime localTime = LocalTime.parse(timeRepresentation); - return localTime; + LocalTime getLocalTimeUsingParseMethod(String timeRepresentation) { + return LocalTime.parse(timeRepresentation); } - public LocalTime getLocalTimeFromClock() { - LocalTime localTime = LocalTime.now(); - return localTime; + private LocalTime getLocalTimeFromClock() { + return LocalTime.now(); } - public LocalTime addAnHour(LocalTime localTime) { - LocalTime newTime = localTime.plus(1, ChronoUnit.HOURS); - return newTime; + LocalTime addAnHour(LocalTime localTime) { + return localTime.plus(1, ChronoUnit.HOURS); } - public int getHourFromLocalTime(LocalTime localTime) { + int getHourFromLocalTime(LocalTime localTime) { return localTime.getHour(); } - public LocalTime getLocalTimeWithMinuteSetToValue(LocalTime localTime, int minute) { + LocalTime getLocalTimeWithMinuteSetToValue(LocalTime localTime, int minute) { return localTime.withMinute(minute); } } diff --git a/core-java/src/main/java/com/baeldung/datetime/UsePeriod.java b/core-java/src/main/java/com/baeldung/datetime/UsePeriod.java index 5a42ef83b4..10bc6caec3 100644 --- a/core-java/src/main/java/com/baeldung/datetime/UsePeriod.java +++ b/core-java/src/main/java/com/baeldung/datetime/UsePeriod.java @@ -3,13 +3,13 @@ package com.baeldung.datetime; import java.time.LocalDate; import java.time.Period; -public class UsePeriod { +class UsePeriod { - public LocalDate modifyDates(LocalDate localDate, Period period) { + LocalDate modifyDates(LocalDate localDate, Period period) { return localDate.plus(period); } - public Period getDifferenceBetweenDates(LocalDate localDate1, LocalDate localDate2) { + Period getDifferenceBetweenDates(LocalDate localDate1, LocalDate localDate2) { return Period.between(localDate1, localDate2); } } diff --git a/core-java/src/main/java/com/baeldung/datetime/UseToInstant.java b/core-java/src/main/java/com/baeldung/datetime/UseToInstant.java index 94154ce5c0..1fa413bbf2 100644 --- a/core-java/src/main/java/com/baeldung/datetime/UseToInstant.java +++ b/core-java/src/main/java/com/baeldung/datetime/UseToInstant.java @@ -8,12 +8,10 @@ import java.util.Date; public class UseToInstant { public LocalDateTime convertDateToLocalDate(Date date) { - LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); - return localDateTime; + return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); } public LocalDateTime convertDateToLocalDate(Calendar calendar) { - LocalDateTime localDateTime = LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault()); - return localDateTime; + return LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault()); } } diff --git a/core-java/src/main/java/com/baeldung/datetime/UseZonedDateTime.java b/core-java/src/main/java/com/baeldung/datetime/UseZonedDateTime.java index 2d1b17484b..f5e1af0a06 100644 --- a/core-java/src/main/java/com/baeldung/datetime/UseZonedDateTime.java +++ b/core-java/src/main/java/com/baeldung/datetime/UseZonedDateTime.java @@ -4,10 +4,9 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; -public class UseZonedDateTime { +class UseZonedDateTime { - public ZonedDateTime getZonedDateTime(LocalDateTime localDateTime, ZoneId zoneId) { - ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId); - return zonedDateTime; + ZonedDateTime getZonedDateTime(LocalDateTime localDateTime, ZoneId zoneId) { + return ZonedDateTime.of(localDateTime, zoneId); } } diff --git a/core-java/src/main/java/com/baeldung/deserialization/AppleProduct.java b/core-java/src/main/java/com/baeldung/deserialization/AppleProduct.java new file mode 100644 index 0000000000..d672b9a4f5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/deserialization/AppleProduct.java @@ -0,0 +1,26 @@ +package com.baeldung.deserialization; + +import java.io.Serializable; + +public class AppleProduct implements Serializable { + + private static final long serialVersionUID = 1234567L; // user-defined (i.e. not default or generated) +// private static final long serialVersionUID = 7654321L; // user-defined (i.e. not default or generated) + + public String headphonePort; + public String thunderboltPort; + public String lighteningPort; + + public String getHeadphonePort() { + return headphonePort; + } + + public String getThunderboltPort() { + return thunderboltPort; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/deserialization/DeserializationUtility.java b/core-java/src/main/java/com/baeldung/deserialization/DeserializationUtility.java new file mode 100644 index 0000000000..3ed2b8be1d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/deserialization/DeserializationUtility.java @@ -0,0 +1,27 @@ +package com.baeldung.deserialization; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.util.Base64; + +public class DeserializationUtility { + + public static void main(String[] args) throws ClassNotFoundException, IOException { + + String serializedObj = "rO0ABXNyACljb20uYmFlbGR1bmcuZGVzZXJpYWxpemF0aW9uLkFwcGxlUHJvZHVjdAAAAAAAEtaHAgADTAANaGVhZHBob25lUG9ydHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wADmxpZ2h0ZW5pbmdQb3J0cQB+AAFMAA90aHVuZGVyYm9sdFBvcnRxAH4AAXhwdAARaGVhZHBob25lUG9ydDIwMjBwdAATdGh1bmRlcmJvbHRQb3J0MjAyMA=="; + System.out.println("Deserializing AppleProduct..."); + AppleProduct deserializedObj = (AppleProduct) deSerializeObjectFromString(serializedObj); + System.out.println("Headphone port of AppleProduct:" + deserializedObj.getHeadphonePort()); + System.out.println("Thunderbolt port of AppleProduct:" + deserializedObj.getThunderboltPort()); + } + + public static Object deSerializeObjectFromString(String s) throws IOException, ClassNotFoundException { + byte[] data = Base64.getDecoder().decode(s); + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data)); + Object o = ois.readObject(); + ois.close(); + return o; + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/deserialization/SerializationUtility.java b/core-java/src/main/java/com/baeldung/deserialization/SerializationUtility.java new file mode 100644 index 0000000000..1dbcc40e6b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/deserialization/SerializationUtility.java @@ -0,0 +1,30 @@ +package com.baeldung.deserialization; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.Base64; + +public class SerializationUtility { + + public static void main(String[] args) throws ClassNotFoundException, IOException { + + AppleProduct macBook = new AppleProduct(); + macBook.headphonePort = "headphonePort2020"; + macBook.thunderboltPort = "thunderboltPort2020"; + + String serializedObj = serializeObjectToString(macBook); + System.out.println("Serialized AppleProduct object to string:"); + System.out.println(serializedObj); + } + + public static String serializeObjectToString(Serializable o) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(o); + oos.close(); + return Base64.getEncoder().encodeToString(baos.toByteArray()); + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java b/core-java/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java index f9028bd159..bdc732947f 100644 --- a/core-java/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java +++ b/core-java/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java @@ -13,8 +13,7 @@ public class DirectoryMonitoringExample { private static final Logger LOG = LoggerFactory.getLogger(DirectoryMonitoringExample.class); - - public static final int POLL_INTERVAL = 500; + private static final int POLL_INTERVAL = 500; public static void main(String[] args) throws Exception { FileAlterationObserver observer = new FileAlterationObserver(System.getProperty("user.home")); diff --git a/core-java/src/main/java/com/baeldung/doublecolon/Computer.java b/core-java/src/main/java/com/baeldung/doublecolon/Computer.java index b5d2e70abd..dc0b064013 100644 --- a/core-java/src/main/java/com/baeldung/doublecolon/Computer.java +++ b/core-java/src/main/java/com/baeldung/doublecolon/Computer.java @@ -6,12 +6,12 @@ public class Computer { private String color; private Integer healty; - public Computer(final int age, final String color) { + Computer(final int age, final String color) { this.age = age; this.color = color; } - public Computer(final Integer age, final String color, final Integer healty) { + Computer(final Integer age, final String color, final Integer healty) { this.age = age; this.color = color; this.healty = healty; @@ -28,7 +28,7 @@ public class Computer { this.age = age; } - public String getColor() { + String getColor() { return color; } @@ -36,11 +36,11 @@ public class Computer { this.color = color; } - public Integer getHealty() { + Integer getHealty() { return healty; } - public void setHealty(final Integer healty) { + void setHealty(final Integer healty) { this.healty = healty; } @@ -72,10 +72,7 @@ public class Computer { final Computer computer = (Computer) o; - if (age != null ? !age.equals(computer.age) : computer.age != null) { - return false; - } - return color != null ? color.equals(computer.color) : computer.color == null; + return (age != null ? age.equals(computer.age) : computer.age == null) && (color != null ? color.equals(computer.color) : computer.color == null); } diff --git a/core-java/src/main/java/com/baeldung/doublecolon/ComputerUtils.java b/core-java/src/main/java/com/baeldung/doublecolon/ComputerUtils.java index d181dfcdf7..317808d893 100644 --- a/core-java/src/main/java/com/baeldung/doublecolon/ComputerUtils.java +++ b/core-java/src/main/java/com/baeldung/doublecolon/ComputerUtils.java @@ -7,8 +7,8 @@ import java.util.List; public class ComputerUtils { - public static final ComputerPredicate after2010Predicate = (c) -> (c.getAge() > 2010); - public static final ComputerPredicate blackPredicate = (c) -> "black".equals(c.getColor()); + static final ComputerPredicate after2010Predicate = (c) -> (c.getAge() > 2010); + static final ComputerPredicate blackPredicate = (c) -> "black".equals(c.getColor()); public static List filter(final List inventory, final ComputerPredicate p) { @@ -18,7 +18,7 @@ public class ComputerUtils { return result; } - public static void repair(final Computer computer) { + static void repair(final Computer computer) { if (computer.getHealty() < 50) { computer.setHealty(100); } diff --git a/core-java/src/main/java/com/baeldung/doublecolon/MacbookPro.java b/core-java/src/main/java/com/baeldung/doublecolon/MacbookPro.java index f5c31e9653..79c8d9e383 100644 --- a/core-java/src/main/java/com/baeldung/doublecolon/MacbookPro.java +++ b/core-java/src/main/java/com/baeldung/doublecolon/MacbookPro.java @@ -13,7 +13,7 @@ public class MacbookPro extends Computer { super(age, color); } - public MacbookPro(Integer age, String color, Integer healty) { + MacbookPro(Integer age, String color, Integer healty) { super(age, color, healty); } diff --git a/core-java/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java b/core-java/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java index 942efc50cc..c35b69d075 100644 --- a/core-java/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java +++ b/core-java/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java @@ -15,7 +15,7 @@ public class TimingDynamicInvocationHandler implements InvocationHandler { private Object target; - public TimingDynamicInvocationHandler(Object target) { + TimingDynamicInvocationHandler(Object target) { this.target = target; for(Method method: target.getClass().getDeclaredMethods()) { diff --git a/core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java index b9125c3e2f..66de220057 100644 --- a/core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java +++ b/core-java/src/main/java/com/baeldung/equalshashcode/entities/Square.java @@ -1,10 +1,10 @@ package com.baeldung.equalshashcode.entities; -import java.awt.Color; +import java.awt.*; public class Square extends Rectangle { - Color color; + private Color color; public Square(double width, Color color) { super(width, width); diff --git a/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java b/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java new file mode 100644 index 0000000000..4afce56e39 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/filesystem/jndi/LookupFSJNDI.java @@ -0,0 +1,43 @@ +package com.baeldung.filesystem.jndi; + +import java.io.File; +import java.util.Hashtable; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +public class LookupFSJNDI { + private InitialContext ctx = null; + + public LookupFSJNDI() throws NamingException { + super(); + init(); + } + + private void init() throws NamingException { + Hashtable env = new Hashtable(); + + env.put (Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.fscontext.RefFSContextFactory"); + // URI to namespace (actual directory) + env.put(Context.PROVIDER_URL, "file:./src/test/resources"); + + ctx = new InitialContext(env); + } + + public InitialContext getCtx() { + return ctx; + } + + public File getFile(String fileName) { + File file; + try { + file = (File)getCtx().lookup(fileName); + } catch (NamingException e) { + file = null; + } + return file; + } + +} diff --git a/core-java/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java b/core-java/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java new file mode 100644 index 0000000000..3776ef82e2 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java @@ -0,0 +1,23 @@ +package com.baeldung.java.reflection; + +import java.lang.annotation.Annotation; + +public class DynamicGreeter implements Greeter { + + private String greet; + + public DynamicGreeter(String greet) { + this.greet = greet; + } + + @Override + public Class annotationType() { + return DynamicGreeter.class; + } + + @Override + public String greet() { + return greet; + } + +} diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Greeter.java b/core-java/src/main/java/com/baeldung/java/reflection/Greeter.java new file mode 100644 index 0000000000..ede269528a --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java/reflection/Greeter.java @@ -0,0 +1,10 @@ +package com.baeldung.java.reflection; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Greeter { + + public String greet() default ""; +} diff --git a/core-java/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java b/core-java/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java new file mode 100644 index 0000000000..601306f5d2 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java @@ -0,0 +1,58 @@ +package com.baeldung.java.reflection; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Map; + +public class GreetingAnnotation { + + private static final String ANNOTATION_METHOD = "annotationData"; + private static final String ANNOTATION_FIELDS = "declaredAnnotations"; + private static final String ANNOTATIONS = "annotations"; + + public static void main(String ...args) { + Greeter greetings = Greetings.class.getAnnotation(Greeter.class); + System.err.println("Hello there, " + greetings.greet() + " !!"); + + Greeter targetValue = new DynamicGreeter("Good evening"); + //alterAnnotationValueJDK8(Greetings.class, Greeter.class, targetValue); + alterAnnotationValueJDK7(Greetings.class, Greeter.class, targetValue); + + greetings = Greetings.class.getAnnotation(Greeter.class); + System.err.println("Hello there, " + greetings.greet() + " !!"); + } + + @SuppressWarnings("unchecked") + public static void alterAnnotationValueJDK8(Class targetClass, Class targetAnnotation, Annotation targetValue) { + try { + Method method = Class.class.getDeclaredMethod(ANNOTATION_METHOD, null); + method.setAccessible(true); + + Object annotationData = method.invoke(targetClass); + + Field annotations = annotationData.getClass().getDeclaredField(ANNOTATIONS); + annotations.setAccessible(true); + + Map, Annotation> map = (Map, Annotation>) annotations.get(annotationData); + map.put(targetAnnotation, targetValue); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("unchecked") + public static void alterAnnotationValueJDK7(Class targetClass, Class targetAnnotation, Annotation targetValue) { + try { + Field annotations = Class.class.getDeclaredField(ANNOTATIONS); + annotations.setAccessible(true); + + Map, Annotation> map = (Map, Annotation>) annotations.get(targetClass); + System.out.println(map); + map.put(targetAnnotation, targetValue); + System.out.println(map); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/java/reflection/Greetings.java b/core-java/src/main/java/com/baeldung/java/reflection/Greetings.java new file mode 100644 index 0000000000..4f3a20c3b9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/java/reflection/Greetings.java @@ -0,0 +1,6 @@ +package com.baeldung.java.reflection; + +@Greeter(greet="Good morning") +public class Greetings { + +} diff --git a/core-java/src/main/java/com/baeldung/javanetworking/url/URLDemo.java b/core-java/src/main/java/com/baeldung/javanetworking/url/URLDemo.java new file mode 100644 index 0000000000..f8038a7e86 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/javanetworking/url/URLDemo.java @@ -0,0 +1,69 @@ +package com.baeldung.javanetworking.url; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class URLDemo { + private final Logger log = LoggerFactory.getLogger(URLDemo.class); + + String URLSTRING = "https://wordpress.org:443/support/topic/page-jumps-within-wordpress/?replies=3#post-2278484"; + // parsed locator + String URLPROTOCOL = "https"; + // final static String URLAUTHORITY = "wordpress.org:443"; + String URLHOST = "wordpress.org"; + String URLPATH = "/support/topic/page-jumps-within-wordpress/"; + // final static String URLFILENAME = "/support/topic/page-jumps-within-wordpress/?replies=3"; + // final static int URLPORT = 443; + int URLDEFAULTPORT = 443; + String URLQUERY = "replies=3"; + String URLREFERENCE = "post-2278484"; + String URLCOMPOUND = URLPROTOCOL + "://" + URLHOST + ":" + URLDEFAULTPORT + URLPATH + "?" + URLQUERY + "#" + URLREFERENCE; + + URL url; + URLConnection urlConnection = null; + HttpURLConnection connection = null; + BufferedReader in = null; + String urlContent = ""; + + public String testURL(String urlString) throws IOException, IllegalArgumentException { + String urlStringCont = ""; + // comment the if clause if experiment with URL + /*if (!URLSTRING.equals(urlString)) { + throw new IllegalArgumentException("URL String argument is not proper: " + urlString); + }*/ + // creating URL object + url = new URL(urlString); + // get URL connection + urlConnection = url.openConnection(); + connection = null; + // we can check, if connection is proper type + if (urlConnection instanceof HttpURLConnection) { + connection = (HttpURLConnection) urlConnection; + } else { + log.info("Please enter an HTTP URL"); + throw new IOException("HTTP URL is not correct"); + } + // we can check response code (200 OK is expected) + log.info(connection.getResponseCode() + " " + connection.getResponseMessage()); + in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String current; + + while ((current = in.readLine()) != null) { + urlStringCont += current; + } + return urlStringCont; + } + + public static void main(String[] args) throws Exception { + URLDemo demo = new URLDemo(); + String content = demo.testURL(demo.URLCOMPOUND); + demo.log.info(content); + } +} diff --git a/core-java/src/main/java/com/baeldung/map/iteration/MapIteration.java b/core-java/src/main/java/com/baeldung/map/iteration/MapIteration.java new file mode 100644 index 0000000000..2bc078cdb0 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/map/iteration/MapIteration.java @@ -0,0 +1,71 @@ +package com.baeldung.map.iteration; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class MapIteration { + + public static void main(String[] args) { + MapIteration mapIteration = new MapIteration(); + Map map = new HashMap<>(); + + map.put("One", 1); + map.put("Three", 3); + map.put("Two", 2); + + System.out.println("Iterating Keys of Map Using KeySet"); + mapIteration.iterateKeys(map); + + System.out.println("Iterating Map Using Entry Set"); + mapIteration.iterateUsingEntrySet(map); + + System.out.println("Iterating Using Iterator and Map Entry"); + mapIteration.iterateUsingIteratorAndEntry(map); + + System.out.println("Iterating Using KeySet and For Each"); + mapIteration.iterateUsingKeySetAndForeach(map); + + System.out.println("Iterating Map Using Lambda Expression"); + mapIteration.iterateUsingLambda(map); + + System.out.println("Iterating Using Stream API"); + mapIteration.iterateUsingStreamAPI(map); + } + + public void iterateUsingEntrySet(Map map) { + for (Map.Entry entry : map.entrySet()) { + System.out.println(entry.getKey() + ":" + entry.getValue()); + } + } + + public void iterateUsingLambda(Map map) { + map.forEach((k, v) -> System.out.println((k + ":" + v))); + } + + public void iterateUsingIteratorAndEntry(Map map) { + Iterator> iterator = map.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry pair = iterator.next(); + System.out.println(pair.getKey() + ":" + pair.getValue()); + } + } + + public void iterateUsingKeySetAndForeach(Map map) { + for (String key : map.keySet()) { + System.out.println(key + ":" + map.get(key)); + } + } + + public void iterateUsingStreamAPI(Map map) { + map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":" + e.getValue())); + } + + public void iterateKeys(Map map) { + for (String key : map.keySet()) { + System.out.println(key); + } + + } + +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/maths/BigDecimalImpl.java b/core-java/src/main/java/com/baeldung/maths/BigDecimalImpl.java new file mode 100644 index 0000000000..1472dd7d6d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/maths/BigDecimalImpl.java @@ -0,0 +1,18 @@ +package com.baeldung.maths; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class BigDecimalImpl { + + public static void main(String[] args) { + + BigDecimal serviceTax = new BigDecimal("56.0084578639"); + serviceTax = serviceTax.setScale(2, RoundingMode.CEILING); + + BigDecimal entertainmentTax = new BigDecimal("23.00689"); + entertainmentTax = entertainmentTax.setScale(2, RoundingMode.FLOOR); + + BigDecimal totalTax = serviceTax.add(entertainmentTax); + } +} diff --git a/core-java/src/main/java/com/baeldung/maths/BigIntegerImpl.java b/core-java/src/main/java/com/baeldung/maths/BigIntegerImpl.java new file mode 100644 index 0000000000..dc509429f9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/maths/BigIntegerImpl.java @@ -0,0 +1,16 @@ +package com.baeldung.maths; + +import java.math.BigInteger; + +public class BigIntegerImpl { + + public static void main(String[] args) { + + BigInteger numStarsMilkyWay = new BigInteger("8731409320171337804361260816606476"); + BigInteger numStarsAndromeda = new BigInteger("5379309320171337804361260816606476"); + + BigInteger totalStars = numStarsMilkyWay.add(numStarsAndromeda); + + } + +} diff --git a/core-java/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java b/core-java/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java index 2c852b5e82..0d02391a73 100644 --- a/core-java/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java +++ b/core-java/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java @@ -11,4 +11,4 @@ public class NoClassDefFoundErrorExample { test = new ClassWithInitErrors(); return test; } -} +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java b/core-java/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java new file mode 100644 index 0000000000..a1b4140281 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java @@ -0,0 +1,19 @@ +package com.baeldung.outofmemoryerror; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +public class OutOfMemoryGCLimitExceed { + public static void addRandomDataToMap() { + Map dataMap = new HashMap<>(); + Random r = new Random(); + while (true) { + dataMap.put(r.nextInt(), String.valueOf(r.nextInt())); + } + } + + public static void main(String[] args) { + OutOfMemoryGCLimitExceed.addRandomDataToMap(); + } +} diff --git a/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java b/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java new file mode 100644 index 0000000000..45c13f735d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java @@ -0,0 +1,39 @@ +package com.baeldung.reflection; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +class BaeldungReflectionUtils { + + private static final Logger LOG = LoggerFactory.getLogger(BaeldungReflectionUtils.class); + + static List getNullPropertiesList(Customer customer) throws Exception { + PropertyDescriptor[] propDescArr = Introspector.getBeanInfo(Customer.class, Object.class).getPropertyDescriptors(); + + return Arrays.stream(propDescArr) + .filter(nulls(customer)) + .map(PropertyDescriptor::getName) + .collect(Collectors.toList()); + } + + private static Predicate nulls(Customer customer) { + return pd -> { + boolean result = false; + try { + Method getterMethod = pd.getReadMethod(); + result = (getterMethod != null && getterMethod.invoke(customer) == null); + } catch (Exception e) { + LOG.error("error invoking getter method"); + } + return result; + }; + } +} diff --git a/core-java/src/main/java/com/baeldung/reflection/Customer.java b/core-java/src/main/java/com/baeldung/reflection/Customer.java new file mode 100644 index 0000000000..a0239f7239 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/reflection/Customer.java @@ -0,0 +1,56 @@ +package com.baeldung.reflection; + +public class Customer { + + private Integer id; + private String name; + private String emailId; + private Long phoneNumber; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmailId() { + return emailId; + } + + public void setEmailId(String emailId) { + this.emailId = emailId; + } + + @Override + public String toString() { + return "Customer [id=" + id + ", name=" + name + ", emailId=" + emailId + ", phoneNumber=" + + phoneNumber + "]"; + } + + Customer(Integer id, String name, String emailId, Long phoneNumber) { + super(); + this.id = id; + this.name = name; + this.emailId = emailId; + this.phoneNumber = phoneNumber; + } + + public Long getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(Long phoneNumber) { + this.phoneNumber = phoneNumber; + } + +} diff --git a/core-java/src/main/java/com/baeldung/serialization/Address.java b/core-java/src/main/java/com/baeldung/serialization/Address.java index 524ecb1ffc..055b53e70e 100644 --- a/core-java/src/main/java/com/baeldung/serialization/Address.java +++ b/core-java/src/main/java/com/baeldung/serialization/Address.java @@ -1,4 +1,4 @@ -package com.baeuldung.serialization; +package com.baeldung.serialization; public class Address { diff --git a/core-java/src/main/java/com/baeldung/serialization/Employee.java b/core-java/src/main/java/com/baeldung/serialization/Employee.java index 69beeb0b49..0fa3ad2fc8 100644 --- a/core-java/src/main/java/com/baeldung/serialization/Employee.java +++ b/core-java/src/main/java/com/baeldung/serialization/Employee.java @@ -1,4 +1,4 @@ -package com.baeuldung.serialization; +package com.baeldung.serialization; import java.io.IOException; import java.io.ObjectInputStream; diff --git a/core-java/src/main/java/com/baeldung/serialization/Person.java b/core-java/src/main/java/com/baeldung/serialization/Person.java index 23d0601e03..4fd1a943c1 100644 --- a/core-java/src/main/java/com/baeldung/serialization/Person.java +++ b/core-java/src/main/java/com/baeldung/serialization/Person.java @@ -1,4 +1,4 @@ -package com.baeuldung.serialization; +package com.baeldung.serialization; import java.io.Serializable; public class Person implements Serializable { diff --git a/core-java/src/main/java/com/baeldung/stream/StreamApi.java b/core-java/src/main/java/com/baeldung/stream/StreamApi.java index ec792314d2..364fdeffbb 100644 --- a/core-java/src/main/java/com/baeldung/stream/StreamApi.java +++ b/core-java/src/main/java/com/baeldung/stream/StreamApi.java @@ -5,17 +5,17 @@ import java.util.stream.Stream; public class StreamApi { - public String getLastElementUsingReduce(List valueList) { + public static String getLastElementUsingReduce(List valueList) { Stream stream = valueList.stream(); return stream.reduce((first, second) -> second).orElse(null); } - public Integer getInfiniteStreamLastElementUsingReduce() { + public static Integer getInfiniteStreamLastElementUsingReduce() { Stream stream = Stream.iterate(0, i -> i + 1); return stream.limit(20).reduce((first, second) -> second).orElse(null); } - public String getLastElementUsingSkip(List valueList) { + public static String getLastElementUsingSkip(List valueList) { long count = valueList.stream().count(); Stream stream = valueList.stream(); return stream.skip(count - 1).findFirst().orElse(null); diff --git a/core-java/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java b/core-java/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java new file mode 100644 index 0000000000..79c18916c2 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java @@ -0,0 +1,16 @@ +package com.baeldung.typeerasure; + +public class ArrayContentPrintUtil { + + public static void printArray(E[] array) { + for (E element : array) { + System.out.printf("%s ", element); + } + } + + public static > void printArray(E[] array) { + for (E element : array) { + System.out.printf("%s ", element); + } + } +} diff --git a/core-java/src/main/java/com/baeldung/typeerasure/BoundStack.java b/core-java/src/main/java/com/baeldung/typeerasure/BoundStack.java new file mode 100644 index 0000000000..6d158fda77 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/typeerasure/BoundStack.java @@ -0,0 +1,37 @@ +package com.baeldung.typeerasure; + +import java.util.Arrays; + +public class BoundStack> { + + private E[] stackContent; + private int total; + + public BoundStack(int capacity) { + this.stackContent = (E[]) new Object[capacity]; + } + + public void push(E data) { + if (total == stackContent.length) { + resize(2 * stackContent.length); + } + stackContent[total++] = data; + } + + public E pop() { + if (!isEmpty()) { + E datum = stackContent[total]; + stackContent[total--] = null; + return datum; + } + return null; + } + + private void resize(int capacity) { + Arrays.copyOf(stackContent, capacity); + } + + public boolean isEmpty() { + return total == 0; + } +} diff --git a/core-java/src/main/java/com/baeldung/typeerasure/IntegerStack.java b/core-java/src/main/java/com/baeldung/typeerasure/IntegerStack.java new file mode 100644 index 0000000000..ad1da1239d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/typeerasure/IntegerStack.java @@ -0,0 +1,13 @@ +package com.baeldung.typeerasure; + +public class IntegerStack extends Stack { + + public IntegerStack(int capacity) { + super(capacity); + } + + public void push(Integer value) { + System.out.println("Pushing into my integerStack"); + super.push(value); + } +} diff --git a/core-java/src/main/java/com/baeldung/typeerasure/Stack.java b/core-java/src/main/java/com/baeldung/typeerasure/Stack.java new file mode 100644 index 0000000000..b88ef6ad8b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/typeerasure/Stack.java @@ -0,0 +1,39 @@ +package com.baeldung.typeerasure; + +import java.util.Arrays; + +public class Stack { + + private E[] stackContent; + private int total; + + public Stack(int capacity) { + this.stackContent = (E[]) new Object[capacity]; + } + + public void push(E data) { + System.out.println("In base stack push#"); + if (total == stackContent.length) { + resize(2 * stackContent.length); + } + stackContent[total++] = data; + } + + public E pop() { + if (!isEmpty()) { + E datum = stackContent[total]; + stackContent[total--] = null; + return datum; + } + return null; + } + + private void resize(int capacity) { + Arrays.copyOf(stackContent, capacity); + } + + public boolean isEmpty() { + return total == 0; + } + +} diff --git a/core-java/src/main/java/log4j.properties b/core-java/src/main/java/log4j.properties new file mode 100644 index 0000000000..5fe42d854c --- /dev/null +++ b/core-java/src/main/java/log4j.properties @@ -0,0 +1,9 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=DEBUG, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n diff --git a/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java b/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java index 6b6f5dbe2a..d9e580acbb 100644 --- a/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java +++ b/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilUnitTest.java @@ -9,6 +9,8 @@ import org.junit.Test; import java.util.Arrays; +import static org.junit.Assert.assertTrue; + public class ArrayCopyUtilUnitTest { private static Employee[] employees; private static final int MAX = 2; @@ -46,10 +48,10 @@ public class ArrayCopyUtilUnitTest { System.arraycopy(array, 2, copiedArray, 0, 3); - Assert.assertTrue(3 == copiedArray.length); - Assert.assertTrue(copiedArray[0] == array[2]); - Assert.assertTrue(copiedArray[1] == array[3]); - Assert.assertTrue(copiedArray[2] == array[4]); + assertTrue(3 == copiedArray.length); + assertTrue(copiedArray[0] == array[2]); + assertTrue(copiedArray[1] == array[3]); + assertTrue(copiedArray[2] == array[4]); } @Test @@ -58,10 +60,10 @@ public class ArrayCopyUtilUnitTest { int[] copiedArray = Arrays.copyOfRange(array, 1, 4); - Assert.assertTrue(3 == copiedArray.length); - Assert.assertTrue(copiedArray[0] == array[1]); - Assert.assertTrue(copiedArray[1] == array[2]); - Assert.assertTrue(copiedArray[2] == array[3]); + assertTrue(3 == copiedArray.length); + assertTrue(copiedArray[0] == array[1]); + assertTrue(copiedArray[1] == array[2]); + assertTrue(copiedArray[2] == array[3]); } @Test @@ -73,9 +75,9 @@ public class ArrayCopyUtilUnitTest { Assert.assertArrayEquals(copiedArray, array); array[0] = 9; - Assert.assertTrue(copiedArray[0] != array[0]); + assertTrue(copiedArray[0] != array[0]); copiedArray[1] = 12; - Assert.assertTrue(copiedArray[1] != array[1]); + assertTrue(copiedArray[1] != array[1]); } @Test @@ -85,7 +87,7 @@ public class ArrayCopyUtilUnitTest { Assert.assertArrayEquals(copiedArray, employees); employees[0].setName(employees[0].getName()+"_Changed"); //change in employees' element caused change in the copied array - Assert.assertTrue(copiedArray[0].getName().equals(employees[0].getName())); + assertTrue(copiedArray[0].getName().equals(employees[0].getName())); } @Test @@ -96,9 +98,9 @@ public class ArrayCopyUtilUnitTest { Assert.assertArrayEquals(copiedArray, array); array[0] = 9; - Assert.assertTrue(copiedArray[0] != array[0]); + assertTrue(copiedArray[0] != array[0]); copiedArray[1] = 12; - Assert.assertTrue(copiedArray[1] != array[1]); + assertTrue(copiedArray[1] != array[1]); } @Test @@ -108,7 +110,7 @@ public class ArrayCopyUtilUnitTest { Assert.assertArrayEquals(copiedArray, employees);; employees[0].setName(employees[0].getName()+"_Changed"); //change in employees' element changed the copied array - Assert.assertTrue(copiedArray[0].getName().equals(employees[0].getName())); + assertTrue(copiedArray[0].getName().equals(employees[0].getName())); } @Test @@ -138,7 +140,7 @@ public class ArrayCopyUtilUnitTest { Assert.assertArrayEquals(copiedArray, employees); employees[0].setName(employees[0].getName()+"_Changed"); //change in employees' element didn't change in the copied array - Assert.assertTrue(copiedArray[0].getName().equals(employees[0].getName())); + assertTrue(copiedArray[0].getName().equals(employees[0].getName())); } @Test diff --git a/core-java/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionTest.java b/core-java/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionTest.java index a6104e635b..8714d084ab 100644 --- a/core-java/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionTest.java +++ b/core-java/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionTest.java @@ -8,4 +8,4 @@ public class ClassNotFoundExceptionTest { public void givenNoDriversInClassPath_whenLoadDrivers_thenClassNotFoundException() throws ClassNotFoundException { Class.forName("oracle.jdbc.driver.OracleDriver"); } -} +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureUnitTest.java b/core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java similarity index 96% rename from core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureUnitTest.java rename to core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java index 501cb1afa0..0c3a13d176 100644 --- a/core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureUnitTest.java +++ b/core-java/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java @@ -11,9 +11,9 @@ import java.util.stream.Stream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class CompletableFutureUnitTest { +public class CompletableFutureLongRunningUnitTest { - private static final Logger LOG = LoggerFactory.getLogger(CompletableFutureUnitTest.class); + private static final Logger LOG = LoggerFactory.getLogger(CompletableFutureLongRunningUnitTest.class); @Test @@ -24,7 +24,7 @@ public class CompletableFutureUnitTest { assertEquals("Hello", result); } - public Future calculateAsync() throws InterruptedException { + private Future calculateAsync() throws InterruptedException { CompletableFuture completableFuture = new CompletableFuture<>(); Executors.newCachedThreadPool().submit(() -> { @@ -44,7 +44,7 @@ public class CompletableFutureUnitTest { assertEquals("Hello", result); } - public Future calculateAsyncWithCancellation() throws InterruptedException { + private Future calculateAsyncWithCancellation() throws InterruptedException { CompletableFuture completableFuture = new CompletableFuture<>(); Executors.newCachedThreadPool().submit(() -> { diff --git a/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java b/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java index 11c27ff980..2f1abef64e 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java @@ -24,8 +24,8 @@ public class LongAccumulatorUnitTest { //when Runnable accumulateAction = () -> IntStream - .rangeClosed(0, numberOfIncrements) - .forEach(accumulator::accumulate); + .rangeClosed(0, numberOfIncrements) + .forEach(accumulator::accumulate); for (int i = 0; i < numberOfThreads; i++) { executorService.execute(accumulateAction); diff --git a/core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListUnitTest.java b/core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListUnitTest.java index 9111403155..3eb1d21872 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListUnitTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListUnitTest.java @@ -17,7 +17,7 @@ public class CopyOnWriteArrayListUnitTest { public void givenCopyOnWriteList_whenIterateAndAddElementToUnderneathList_thenShouldNotChangeIterator() { //given final CopyOnWriteArrayList numbers = - new CopyOnWriteArrayList<>(new Integer[]{1, 3, 5, 8}); + new CopyOnWriteArrayList<>(new Integer[]{1, 3, 5, 8}); //when Iterator iterator = numbers.iterator(); @@ -42,7 +42,7 @@ public class CopyOnWriteArrayListUnitTest { public void givenCopyOnWriteList_whenIterateOverItAndTryToRemoveElement_thenShouldThrowException() { //given final CopyOnWriteArrayList numbers = - new CopyOnWriteArrayList<>(new Integer[]{1, 3, 5, 8}); + new CopyOnWriteArrayList<>(new Integer[]{1, 3, 5, 8}); //when Iterator iterator = numbers.iterator(); diff --git a/core-java/src/test/java/com/baeldung/concurrent/delayqueue/DelayQueueIntegrationTest.java b/core-java/src/test/java/com/baeldung/concurrent/delayqueue/DelayQueueIntegrationTest.java index 6490c6c094..180f3033ab 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/delayqueue/DelayQueueIntegrationTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/delayqueue/DelayQueueIntegrationTest.java @@ -4,7 +4,11 @@ import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; -import java.util.concurrent.*; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.DelayQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import static junit.framework.TestCase.assertEquals; @@ -19,7 +23,7 @@ public class DelayQueueIntegrationTest { int delayOfEachProducedMessageMilliseconds = 500; DelayQueueConsumer consumer = new DelayQueueConsumer(queue, numberOfElementsToProduce); DelayQueueProducer producer - = new DelayQueueProducer(queue, numberOfElementsToProduce, delayOfEachProducedMessageMilliseconds); + = new DelayQueueProducer(queue, numberOfElementsToProduce, delayOfEachProducedMessageMilliseconds); //when executor.submit(producer); @@ -41,7 +45,7 @@ public class DelayQueueIntegrationTest { int delayOfEachProducedMessageMilliseconds = 10_000; DelayQueueConsumer consumer = new DelayQueueConsumer(queue, numberOfElementsToProduce); DelayQueueProducer producer - = new DelayQueueProducer(queue, numberOfElementsToProduce, delayOfEachProducedMessageMilliseconds); + = new DelayQueueProducer(queue, numberOfElementsToProduce, delayOfEachProducedMessageMilliseconds); //when executor.submit(producer); @@ -63,7 +67,7 @@ public class DelayQueueIntegrationTest { int delayOfEachProducedMessageMilliseconds = -10_000; DelayQueueConsumer consumer = new DelayQueueConsumer(queue, numberOfElementsToProduce); DelayQueueProducer producer - = new DelayQueueProducer(queue, numberOfElementsToProduce, delayOfEachProducedMessageMilliseconds); + = new DelayQueueProducer(queue, numberOfElementsToProduce, delayOfEachProducedMessageMilliseconds); //when executor.submit(producer); diff --git a/core-java/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java b/core-java/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java index a47c44506d..1dff70ffb8 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java @@ -1,10 +1,10 @@ package com.baeldung.concurrent.future; -import static org.junit.Assert.assertEquals; +import org.junit.Test; import java.util.concurrent.ForkJoinPool; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class FactorialSquareCalculatorUnitTest { diff --git a/core-java/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java b/core-java/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java index 84d7a55504..5f8b05a974 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java @@ -8,7 +8,12 @@ import org.junit.rules.TestName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.concurrent.*; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; diff --git a/core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java b/core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java index 4dccbc3e26..0d4591e624 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java @@ -9,65 +9,65 @@ import static junit.framework.TestCase.assertEquals; public class SharedObjectWithLockManualTest { - @Test - public void whenLockAcquired_ThenLockedIsTrue() { - final SharedObjectWithLock object = new SharedObjectWithLock(); + @Test + public void whenLockAcquired_ThenLockedIsTrue() { + final SharedObjectWithLock object = new SharedObjectWithLock(); - final int threadCount = 2; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); + final int threadCount = 2; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); - executeThreads(object, threadCount, service); + executeThreads(object, threadCount, service); - assertEquals(true, object.isLocked()); + assertEquals(true, object.isLocked()); - service.shutdown(); - } + service.shutdown(); + } - @Test - public void whenLocked_ThenQueuedThread() { - final int threadCount = 4; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); - final SharedObjectWithLock object = new SharedObjectWithLock(); + @Test + public void whenLocked_ThenQueuedThread() { + final int threadCount = 4; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + final SharedObjectWithLock object = new SharedObjectWithLock(); - executeThreads(object, threadCount, service); + executeThreads(object, threadCount, service); - assertEquals(object.hasQueuedThreads(), true); + assertEquals(object.hasQueuedThreads(), true); - service.shutdown(); + service.shutdown(); - } + } - public void whenTryLock_ThenQueuedThread() { - final SharedObjectWithLock object = new SharedObjectWithLock(); + public void whenTryLock_ThenQueuedThread() { + final SharedObjectWithLock object = new SharedObjectWithLock(); - final int threadCount = 2; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); + final int threadCount = 2; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); - executeThreads(object, threadCount, service); + executeThreads(object, threadCount, service); - assertEquals(true, object.isLocked()); + assertEquals(true, object.isLocked()); - service.shutdown(); - } + service.shutdown(); + } - @Test - public void whenGetCount_ThenCorrectCount() throws InterruptedException { - final int threadCount = 4; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); - final SharedObjectWithLock object = new SharedObjectWithLock(); + @Test + public void whenGetCount_ThenCorrectCount() throws InterruptedException { + final int threadCount = 4; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); + final SharedObjectWithLock object = new SharedObjectWithLock(); - executeThreads(object, threadCount, service); - Thread.sleep(1000); - assertEquals(object.getCounter(), 4); + executeThreads(object, threadCount, service); + Thread.sleep(1000); + assertEquals(object.getCounter(), 4); - service.shutdown(); + service.shutdown(); - } + } - private void executeThreads(SharedObjectWithLock object, int threadCount, ExecutorService service) { - for (int i = 0; i < threadCount; i++) { - service.execute(object::perform); - } - } + private void executeThreads(SharedObjectWithLock object, int threadCount, ExecutorService service) { + for (int i = 0; i < threadCount; i++) { + service.execute(object::perform); + } + } } diff --git a/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java b/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java index fd6cf08442..3014ae38b2 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java @@ -1,6 +1,5 @@ package com.baeldung.concurrent.locks; -import jdk.nashorn.internal.ir.annotations.Ignore; import org.junit.Test; import java.util.concurrent.ExecutorService; @@ -10,49 +9,49 @@ import static junit.framework.TestCase.assertEquals; public class SynchronizedHashMapWithRWLockManualTest { - @Test - public void whenWriting_ThenNoReading() { - SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); - final int threadCount = 3; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); + @Test + public void whenWriting_ThenNoReading() { + SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); + final int threadCount = 3; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); - executeWriterThreads(object, threadCount, service); + executeWriterThreads(object, threadCount, service); - assertEquals(object.isReadLockAvailable(), false); + assertEquals(object.isReadLockAvailable(), false); - service.shutdown(); - } + service.shutdown(); + } - @Test - public void whenReading_ThenMultipleReadingAllowed() { - SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); - final int threadCount = 5; - final ExecutorService service = Executors.newFixedThreadPool(threadCount); + @Test + public void whenReading_ThenMultipleReadingAllowed() { + SynchronizedHashMapWithRWLock object = new SynchronizedHashMapWithRWLock(); + final int threadCount = 5; + final ExecutorService service = Executors.newFixedThreadPool(threadCount); - executeReaderThreads(object, threadCount, service); + executeReaderThreads(object, threadCount, service); - assertEquals(object.isReadLockAvailable(), true); + assertEquals(object.isReadLockAvailable(), true); - service.shutdown(); - } + service.shutdown(); + } - private void executeWriterThreads(SynchronizedHashMapWithRWLock object, int threadCount, ExecutorService service) { - for (int i = 0; i < threadCount; i++) { - service.execute(() -> { - try { - object.put("key" + threadCount, "value" + threadCount); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }); - } - } + private void executeWriterThreads(SynchronizedHashMapWithRWLock object, int threadCount, ExecutorService service) { + for (int i = 0; i < threadCount; i++) { + service.execute(() -> { + try { + object.put("key" + threadCount, "value" + threadCount); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + } + } - private void executeReaderThreads(SynchronizedHashMapWithRWLock object, int threadCount, ExecutorService service) { - for (int i = 0; i < threadCount; i++) - service.execute(() -> { - object.get("key" + threadCount); - }); - } + private void executeReaderThreads(SynchronizedHashMapWithRWLock object, int threadCount, ExecutorService service) { + for (int i = 0; i < threadCount; i++) + service.execute(() -> { + object.get("key" + threadCount); + }); + } } diff --git a/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueIntegrationTest.java b/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueIntegrationTest.java index 9f7b828a9c..d1814c8fc9 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueIntegrationTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/priorityblockingqueue/PriorityBlockingQueueIntegrationTest.java @@ -42,7 +42,7 @@ public class PriorityBlockingQueueIntegrationTest { try { Integer poll = queue.take(); LOG.debug("Polled: " + poll); - } catch (InterruptedException e) { + } catch (InterruptedException ignored) { } } }); diff --git a/core-java/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java b/core-java/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java new file mode 100644 index 0000000000..8d64bb6809 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java @@ -0,0 +1,114 @@ +package com.baeldung.concurrent.semaphores; + +import org.junit.Test; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class SemaphoresManualTest { + + // ========= login queue ====== + + @Test + public void givenLoginQueue_whenReachLimit_thenBlocked() { + final int slots = 10; + final ExecutorService executorService = Executors.newFixedThreadPool(slots); + final LoginQueueUsingSemaphore loginQueue = new LoginQueueUsingSemaphore(slots); + IntStream.range(0, slots) + .forEach(user -> executorService.execute(loginQueue::tryLogin)); + executorService.shutdown(); + + assertEquals(0, loginQueue.availableSlots()); + assertFalse(loginQueue.tryLogin()); + } + + @Test + public void givenLoginQueue_whenLogout_thenSlotsAvailable() { + final int slots = 10; + final ExecutorService executorService = Executors.newFixedThreadPool(slots); + final LoginQueueUsingSemaphore loginQueue = new LoginQueueUsingSemaphore(slots); + IntStream.range(0, slots) + .forEach(user -> executorService.execute(loginQueue::tryLogin)); + executorService.shutdown(); + + assertEquals(0, loginQueue.availableSlots()); + loginQueue.logout(); + assertTrue(loginQueue.availableSlots() > 0); + assertTrue(loginQueue.tryLogin()); + } + + // ========= delay queue ======= + + @Test + public void givenDelayQueue_whenReachLimit_thenBlocked() { + final int slots = 50; + final ExecutorService executorService = Executors.newFixedThreadPool(slots); + final DelayQueueUsingTimedSemaphore delayQueue = new DelayQueueUsingTimedSemaphore(1, slots); + IntStream.range(0, slots) + .forEach(user -> executorService.execute(delayQueue::tryAdd)); + executorService.shutdown(); + + assertEquals(0, delayQueue.availableSlots()); + assertFalse(delayQueue.tryAdd()); + } + + @Test + public void givenDelayQueue_whenTimePass_thenSlotsAvailable() throws InterruptedException { + final int slots = 50; + final ExecutorService executorService = Executors.newFixedThreadPool(slots); + final DelayQueueUsingTimedSemaphore delayQueue = new DelayQueueUsingTimedSemaphore(1, slots); + IntStream.range(0, slots) + .forEach(user -> executorService.execute(delayQueue::tryAdd)); + executorService.shutdown(); + + assertEquals(0, delayQueue.availableSlots()); + Thread.sleep(1000); + assertTrue(delayQueue.availableSlots() > 0); + assertTrue(delayQueue.tryAdd()); + } + + // ========== mutex ======== + + @Test + public void whenMutexAndMultipleThreads_thenBlocked() throws InterruptedException { + final int count = 5; + final ExecutorService executorService = Executors.newFixedThreadPool(count); + final CounterUsingMutex counter = new CounterUsingMutex(); + IntStream.range(0, count) + .forEach(user -> executorService.execute(() -> { + try { + counter.increase(); + } catch (final InterruptedException e) { + e.printStackTrace(); + } + })); + executorService.shutdown(); + + assertTrue(counter.hasQueuedThreads()); + } + + @Test + public void givenMutexAndMultipleThreads_ThenDelay_thenCorrectCount() throws InterruptedException { + final int count = 5; + final ExecutorService executorService = Executors.newFixedThreadPool(count); + final CounterUsingMutex counter = new CounterUsingMutex(); + IntStream.range(0, count) + .forEach(user -> executorService.execute(() -> { + try { + counter.increase(); + } catch (final InterruptedException e) { + e.printStackTrace(); + } + })); + executorService.shutdown(); + assertTrue(counter.hasQueuedThreads()); + Thread.sleep(5000); + assertFalse(counter.hasQueuedThreads()); + assertEquals(count, counter.getCount()); + } +} diff --git a/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockTest.java b/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockTest.java index 303daa8d26..1f8e8d681a 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockTest.java @@ -1,13 +1,13 @@ package com.baeldung.concurrent.synchronize; -import static org.junit.Assert.assertEquals; +import org.junit.Test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class BaeldungSychronizedBlockTest { @@ -17,7 +17,7 @@ public class BaeldungSychronizedBlockTest { BaeldungSynchronizedBlocks synchronizedBlocks = new BaeldungSynchronizedBlocks(); IntStream.range(0, 1000) - .forEach(count -> service.submit(synchronizedBlocks::performSynchronisedTask)); + .forEach(count -> service.submit(synchronizedBlocks::performSynchronisedTask)); service.awaitTermination(100, TimeUnit.MILLISECONDS); assertEquals(1000, synchronizedBlocks.getCount()); @@ -28,7 +28,7 @@ public class BaeldungSychronizedBlockTest { ExecutorService service = Executors.newCachedThreadPool(); IntStream.range(0, 1000) - .forEach(count -> service.submit(BaeldungSynchronizedBlocks::performStaticSyncTask)); + .forEach(count -> service.submit(BaeldungSynchronizedBlocks::performStaticSyncTask)); service.awaitTermination(100, TimeUnit.MILLISECONDS); assertEquals(1000, BaeldungSynchronizedBlocks.getStaticCount()); diff --git a/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsTest.java b/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsTest.java index e829423362..ba7c1f0a7b 100644 --- a/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsTest.java +++ b/core-java/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsTest.java @@ -1,14 +1,14 @@ package com.baeldung.concurrent.synchronize; -import static org.junit.Assert.assertEquals; +import org.junit.Ignore; +import org.junit.Test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; -import org.junit.Ignore; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class BaeldungSynchronizeMethodsTest { @@ -19,7 +19,7 @@ public class BaeldungSynchronizeMethodsTest { BaeldungSynchronizedMethods method = new BaeldungSynchronizedMethods(); IntStream.range(0, 1000) - .forEach(count -> service.submit(method::calculate)); + .forEach(count -> service.submit(method::calculate)); service.awaitTermination(100, TimeUnit.MILLISECONDS); assertEquals(1000, method.getSum()); @@ -31,7 +31,7 @@ public class BaeldungSynchronizeMethodsTest { BaeldungSynchronizedMethods method = new BaeldungSynchronizedMethods(); IntStream.range(0, 1000) - .forEach(count -> service.submit(method::synchronisedCalculate)); + .forEach(count -> service.submit(method::synchronisedCalculate)); service.awaitTermination(100, TimeUnit.MILLISECONDS); assertEquals(1000, method.getSyncSum()); @@ -42,7 +42,7 @@ public class BaeldungSynchronizeMethodsTest { ExecutorService service = Executors.newCachedThreadPool(); IntStream.range(0, 1000) - .forEach(count -> service.submit(BaeldungSynchronizedMethods::syncStaticCalculate)); + .forEach(count -> service.submit(BaeldungSynchronizedMethods::syncStaticCalculate)); service.awaitTermination(100, TimeUnit.MILLISECONDS); assertEquals(1000, BaeldungSynchronizedMethods.staticSum); diff --git a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java b/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java index 57e1f33280..a10ec66f20 100644 --- a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java +++ b/core-java/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java @@ -7,13 +7,15 @@ import java.time.Month; import org.junit.Assert; import org.junit.Test; +import static org.junit.Assert.assertEquals; + public class UseLocalDateTimeUnitTest { UseLocalDateTime useLocalDateTime = new UseLocalDateTime(); @Test public void givenString_whenUsingParse_thenLocalDateTime() { - Assert.assertEquals(LocalDate.of(2016, Month.MAY, 10), useLocalDateTime.getLocalDateTimeUsingParseMethod("2016-05-10T06:30").toLocalDate()); - Assert.assertEquals(LocalTime.of(6, 30), useLocalDateTime.getLocalDateTimeUsingParseMethod("2016-05-10T06:30").toLocalTime()); + assertEquals(LocalDate.of(2016, Month.MAY, 10), useLocalDateTime.getLocalDateTimeUsingParseMethod("2016-05-10T06:30").toLocalDate()); + assertEquals(LocalTime.of(6, 30), useLocalDateTime.getLocalDateTimeUsingParseMethod("2016-05-10T06:30").toLocalTime()); } } diff --git a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java b/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java index 8f1997e9e8..e158c0fd67 100644 --- a/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java +++ b/core-java/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java @@ -7,48 +7,50 @@ import java.time.LocalDateTime; import org.junit.Assert; import org.junit.Test; +import static org.junit.Assert.assertEquals; + public class UseLocalDateUnitTest { UseLocalDate useLocalDate = new UseLocalDate(); @Test public void givenValues_whenUsingFactoryOf_thenLocalDate() { - Assert.assertEquals("2016-05-10", useLocalDate.getLocalDateUsingFactoryOfMethod(2016, 5, 10).toString()); + assertEquals("2016-05-10", useLocalDate.getLocalDateUsingFactoryOfMethod(2016, 5, 10).toString()); } @Test public void givenString_whenUsingParse_thenLocalDate() { - Assert.assertEquals("2016-05-10", useLocalDate.getLocalDateUsingParseMethod("2016-05-10").toString()); + assertEquals("2016-05-10", useLocalDate.getLocalDateUsingParseMethod("2016-05-10").toString()); } @Test public void whenUsingClock_thenLocalDate() { - Assert.assertEquals(LocalDate.now(), useLocalDate.getLocalDateFromClock()); + assertEquals(LocalDate.now(), useLocalDate.getLocalDateFromClock()); } @Test public void givenDate_whenUsingPlus_thenNextDay() { - Assert.assertEquals(LocalDate.now().plusDays(1), useLocalDate.getNextDay(LocalDate.now())); + assertEquals(LocalDate.now().plusDays(1), useLocalDate.getNextDay(LocalDate.now())); } @Test public void givenDate_whenUsingMinus_thenPreviousDay() { - Assert.assertEquals(LocalDate.now().minusDays(1), useLocalDate.getPreviousDay(LocalDate.now())); + assertEquals(LocalDate.now().minusDays(1), useLocalDate.getPreviousDay(LocalDate.now())); } @Test public void givenToday_whenUsingGetDayOfWeek_thenDayOfWeek() { - Assert.assertEquals(DayOfWeek.SUNDAY, useLocalDate.getDayOfWeek(LocalDate.parse("2016-05-22"))); + assertEquals(DayOfWeek.SUNDAY, useLocalDate.getDayOfWeek(LocalDate.parse("2016-05-22"))); } @Test public void givenToday_whenUsingWithTemporalAdjuster_thenFirstDayOfMonth() { - Assert.assertEquals(1, useLocalDate.getFirstDayOfMonth().getDayOfMonth()); + assertEquals(1, useLocalDate.getFirstDayOfMonth().getDayOfMonth()); } @Test public void givenLocalDate_whenUsingAtStartOfDay_thenReturnMidnight() { - Assert.assertEquals(LocalDateTime.parse("2016-05-22T00:00:00"), useLocalDate.getStartOfDay(LocalDate.parse("2016-05-22"))); + assertEquals(LocalDateTime.parse("2016-05-22T00:00:00"), useLocalDate.getStartOfDay(LocalDate.parse("2016-05-22"))); } } diff --git a/core-java/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java b/core-java/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java new file mode 100644 index 0000000000..887e7e41da --- /dev/null +++ b/core-java/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java @@ -0,0 +1,67 @@ +package com.baeldung.deserialization; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.io.InvalidClassException; + +import org.junit.Ignore; +import org.junit.Test; + +public class DeserializationUnitTest { + + private static final String serializedObj = "rO0ABXNyACljb20uYmFlbGR1bmcuZGVzZXJpYWxpemF0aW9uLkFwcGxlUHJvZHVjdAAAAAAAEtaHAgADTAANaGVhZHBob25lUG9ydHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wADmxpZ2h0ZW5pbmdQb3J0cQB+AAFMAA90aHVuZGVyYm9sdFBvcnRxAH4AAXhwdAARaGVhZHBob25lUG9ydDIwMjBwdAATdGh1bmRlcmJvbHRQb3J0MjAyMA=="; + + private static long userDefinedSerialVersionUID = 1234567L; + + /** + * Tests the deserialization of the original "AppleProduct" (no exceptions are thrown) + * @throws ClassNotFoundException + * @throws IOException + */ + @Test + public void testDeserializeObj_compatible() throws IOException, ClassNotFoundException { + + assertEquals(userDefinedSerialVersionUID, AppleProduct.getSerialVersionUID()); + + AppleProduct macBook = new AppleProduct(); + macBook.headphonePort = "headphonePort2020"; + macBook.thunderboltPort = "thunderboltPort2020"; + + // serializes the "AppleProduct" object + String serializedProduct = SerializationUtility.serializeObjectToString(macBook); + + // deserializes the "AppleProduct" object + AppleProduct deserializedProduct = (AppleProduct) DeserializationUtility.deSerializeObjectFromString(serializedProduct); + + assertTrue(deserializedProduct.headphonePort.equalsIgnoreCase(macBook.headphonePort)); + assertTrue(deserializedProduct.thunderboltPort.equalsIgnoreCase(macBook.thunderboltPort)); + + } + + /** + * Tests the deserialization of the modified (non-compatible) "AppleProduct". + * The test should result in an InvalidClassException being thrown. + * + * Note: to run this test: + * 1. Modify the value of the serialVersionUID identifier in AppleProduct.java + * 2. Remove the @Ignore annotation + * 3. Run the test individually (do not run the entire set of tests) + * 4. Revert the changes made in 1 & 2 (so that you're able to re-run the tests successfully) + * + * @throws ClassNotFoundException + * @throws IOException + */ + @Ignore + @Test(expected = InvalidClassException.class) + public void testDeserializeObj_incompatible() throws ClassNotFoundException, IOException { + + assertNotEquals(userDefinedSerialVersionUID, AppleProduct.getSerialVersionUID()); + + // attempts to deserialize the "AppleProduct" object + DeserializationUtility.deSerializeObjectFromString(serializedObj); + } + +} diff --git a/core-java/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java b/core-java/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java index f69e4b03ee..7157dead6e 100644 --- a/core-java/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java +++ b/core-java/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java @@ -83,7 +83,7 @@ public class ComputerUtilsUnitTest { final TriFunction integerStringIntegerObjectTriFunction = MacbookPro::new; final MacbookPro macbookPro = integerStringIntegerObjectTriFunction.apply(2010, "black", 100); - Double initialValue = new Double(999.99); + Double initialValue = 999.99; final Double actualValue = macbookPro.calculateValue(initialValue); Assert.assertEquals(766.659, actualValue, 0.0); } diff --git a/core-java/src/test/java/com/baeldung/file/FileOperationsManualTest.java b/core-java/src/test/java/com/baeldung/file/FileOperationsManualTest.java index 74886bdb53..ea71d1b5c1 100644 --- a/core-java/src/test/java/com/baeldung/file/FileOperationsManualTest.java +++ b/core-java/src/test/java/com/baeldung/file/FileOperationsManualTest.java @@ -6,7 +6,12 @@ import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; @@ -14,6 +19,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + public class FileOperationsManualTest { @Test @@ -25,7 +34,7 @@ public class FileOperationsManualTest { InputStream inputStream = new FileInputStream(file); String data = readFromInputStream(inputStream); - Assert.assertEquals(expectedData, data.trim()); + assertEquals(expectedData, data.trim()); } @Test @@ -36,7 +45,7 @@ public class FileOperationsManualTest { InputStream inputStream = clazz.getResourceAsStream("/fileTest.txt"); String data = readFromInputStream(inputStream); - Assert.assertEquals(expectedData, data.trim()); + assertEquals(expectedData, data.trim()); } @Test @@ -47,7 +56,7 @@ public class FileOperationsManualTest { InputStream inputStream = clazz.getResourceAsStream("/LICENSE.txt"); String data = readFromInputStream(inputStream); - Assert.assertThat(data.trim(), CoreMatchers.containsString(expectedData)); + assertThat(data.trim(), CoreMatchers.containsString(expectedData)); } @Test @@ -61,7 +70,7 @@ public class FileOperationsManualTest { InputStream inputStream = urlConnection.getInputStream(); String data = readFromInputStream(inputStream); - Assert.assertThat(data.trim(), CoreMatchers.containsString(expectedData)); + assertThat(data.trim(), CoreMatchers.containsString(expectedData)); } @Test @@ -72,7 +81,7 @@ public class FileOperationsManualTest { File file = new File(classLoader.getResource("fileTest.txt").getFile()); String data = FileUtils.readFileToString(file); - Assert.assertEquals(expectedData, data.trim()); + assertEquals(expectedData, data.trim()); } @Test @@ -84,7 +93,7 @@ public class FileOperationsManualTest { byte[] fileBytes = Files.readAllBytes(path); String data = new String(fileBytes); - Assert.assertEquals(expectedData, data.trim()); + assertEquals(expectedData, data.trim()); } @Test @@ -98,7 +107,7 @@ public class FileOperationsManualTest { lines.forEach(line -> data.append(line).append("\n")); lines.close(); - Assert.assertEquals(expectedData, data.toString().trim()); + assertEquals(expectedData, data.toString().trim()); } private String readFromInputStream(InputStream inputStream) throws IOException { diff --git a/core-java/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java b/core-java/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java new file mode 100644 index 0000000000..330ec3aee3 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java @@ -0,0 +1,41 @@ +package com.baeldung.filesystem.jndi.test; + +import com.baeldung.filesystem.jndi.LookupFSJNDI; +import org.junit.Test; + +import javax.naming.InitialContext; +import javax.naming.NamingException; +import java.io.File; + +import static org.junit.Assert.assertNotNull; + +public class LookupFSJNDIIntegrationTest { + LookupFSJNDI fsjndi; + InitialContext ctx = null; + final String FILENAME = "test.find"; + + public LookupFSJNDIIntegrationTest() { + try { + fsjndi = new LookupFSJNDI(); + } catch (NamingException e) { + fsjndi = null; + } + } + + @Test + public void whenInitializationLookupFSJNDIIsNotNull_thenSuccess() { + assertNotNull("Class LookupFSJNDI has instance", fsjndi); + } + + @Test + public void givenLookupFSJNDI_whengetInitialContextIsNotNull_thenSuccess() { + ctx = fsjndi.getCtx(); + assertNotNull("Context exists", ctx); + } + + @Test + public void givenInitialContext_whenLokupFileExists_thenSuccess() { + File file = fsjndi.getFile(FILENAME); + assertNotNull("File exists", file); + } +} diff --git a/core-java/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java b/core-java/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java index 1036df0bb8..811088cc0c 100644 --- a/core-java/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java +++ b/core-java/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java @@ -25,7 +25,7 @@ public class FunctionalInterfaceUnitTest { @Test public void whenPassingLambdaToComputeIfAbsent_thenTheValueGetsComputedAndPutIntoMap() { Map nameMap = new HashMap<>(); - Integer value = nameMap.computeIfAbsent("John", s -> s.length()); + Integer value = nameMap.computeIfAbsent("John", String::length); assertEquals(new Integer(4), nameMap.get("John")); assertEquals(new Integer(4), value); diff --git a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java b/core-java/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java index 270cc8be9a..3c34bf2c6e 100644 --- a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java +++ b/core-java/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java @@ -2,7 +2,7 @@ package com.baeldung.hashing; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; public class SHA256HashingUnitTest { diff --git a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java index 691615a1b4..acd6536ac4 100644 --- a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java +++ b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java @@ -2,7 +2,6 @@ package com.baeldung.http; import org.apache.commons.lang.StringUtils; import org.junit.Test; -import static org.junit.Assert.*; import java.io.BufferedReader; import java.io.DataOutputStream; @@ -17,6 +16,9 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + public class HttpRequestLiveTest { @Test @@ -39,7 +41,7 @@ public class HttpRequestLiveTest { int status = con.getResponseCode(); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; - StringBuffer content = new StringBuffer(); + StringBuilder content = new StringBuilder(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } @@ -67,7 +69,7 @@ public class HttpRequestLiveTest { int status = con.getResponseCode(); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; - StringBuffer content = new StringBuffer(); + StringBuilder content = new StringBuilder(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } diff --git a/core-java/src/test/java/com/baeldung/java/currentmethod/CurrentlyExecutedMethodFinderTest.java b/core-java/src/test/java/com/baeldung/java/currentmethod/CurrentlyExecutedMethodFinderTest.java new file mode 100644 index 0000000000..9a231a9a3d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/currentmethod/CurrentlyExecutedMethodFinderTest.java @@ -0,0 +1,43 @@ +package com.baeldung.java.currentmethod; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * The class presents various ways of finding the name of currently executed method. + */ +public class CurrentlyExecutedMethodFinderTest { + + @Test + public void givenCurrentThread_whenGetStackTrace_thenFindMethod() { + final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + assertEquals("givenCurrentThread_whenGetStackTrace_thenFindMethod", stackTrace[1].getMethodName()); + } + + @Test + public void givenException_whenGetStackTrace_thenFindMethod() { + String methodName = new Exception().getStackTrace()[0].getMethodName(); + assertEquals("givenException_whenGetStackTrace_thenFindMethod", methodName); + } + + @Test + public void givenThrowable_whenGetStacktrace_thenFindMethod() { + StackTraceElement[] stackTrace = new Throwable().getStackTrace(); + assertEquals("givenThrowable_whenGetStacktrace_thenFindMethod", stackTrace[0].getMethodName()); + } + + @Test + public void givenObject_whenGetEnclosingMethod_thenFindMethod() { + String methodName = new Object() {}.getClass().getEnclosingMethod().getName(); + assertEquals("givenObject_whenGetEnclosingMethod_thenFindMethod", methodName); + } + + @Test + public void givenLocal_whenGetEnclosingMethod_thenFindMethod() { + class Local {}; + String methodName = Local.class.getEnclosingMethod().getName(); + assertEquals("givenLocal_whenGetEnclosingMethod_thenFindMethod", methodName); + } + +} diff --git a/core-java/src/test/java/com/baeldung/java8/Java8MapAndFlatMap.java b/core-java/src/test/java/com/baeldung/java8/Java8MapAndFlatMap.java new file mode 100644 index 0000000000..7098f88f30 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java8/Java8MapAndFlatMap.java @@ -0,0 +1,52 @@ +package com.baeldung.java8; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; + +public class Java8MapAndFlatMap { + + @Test + public void givenStream_whenCalledMap_thenProduceList() { + List myList = Stream.of("a", "b") + .map(String::toUpperCase) + .collect(Collectors.toList()); + assertEquals(asList("A", "B"), myList); + } + + @Test + public void givenStream_whenCalledFlatMap_thenProduceFlattenedList() throws Exception { + List> list = Arrays.asList(Arrays.asList("a"), Arrays.asList("b")); + System.out.println(list); + + System.out.println(list + .stream().flatMap(Collection::stream) + .collect(Collectors.toList())); + } + + @Test + public void givenOptional_whenCalledMap_thenProduceOptional() { + Optional s = Optional.of("test"); + assertEquals(Optional.of("TEST"), s.map(String::toUpperCase)); + } + + @Test + public void givenOptional_whenCalledFlatMap_thenProduceFlattenedOptional() { + assertEquals(Optional.of(Optional.of("STRING")), Optional + .of("string") + .map(s -> Optional.of("STRING"))); + + assertEquals(Optional.of("STRING"), Optional + .of("string") + .flatMap(s -> Optional.of("STRING"))); + } + +} diff --git a/core-java/src/test/java/com/baeldung/javanetworking/url/test/URLDemoTest.java b/core-java/src/test/java/com/baeldung/javanetworking/url/test/URLDemoTest.java new file mode 100644 index 0000000000..293052e842 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/javanetworking/url/test/URLDemoTest.java @@ -0,0 +1,106 @@ +package com.baeldung.javanetworking.url.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +import org.junit.BeforeClass; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.javanetworking.url.URLDemo; + +@FixMethodOrder +public class URLDemoTest { + private final Logger log = LoggerFactory.getLogger(URLDemo.class); + static String URLSTRING = "https://wordpress.org:443/support/topic/page-jumps-within-wordpress/?replies=3#post-2278484"; + // parsed locator + static String URLPROTOCOL = "https"; + String URLAUTHORITY = "wordpress.org:443"; + static String URLHOST = "wordpress.org"; + static String URLPATH = "/support/topic/page-jumps-within-wordpress/"; + String URLFILENAME = "/support/topic/page-jumps-within-wordpress/?replies=3"; + int URLPORT = 443; + static int URLDEFAULTPORT = 443; + static String URLQUERY = "replies=3"; + static String URLREFERENCE = "post-2278484"; + static String URLCOMPOUND = URLPROTOCOL + "://" + URLHOST + ":" + URLDEFAULTPORT + URLPATH + "?" + URLQUERY + "#" + URLREFERENCE; + + static URL url; + URLConnection urlConnection = null; + HttpURLConnection connection = null; + BufferedReader in = null; + String urlContent = ""; + + @BeforeClass + public static void givenEmplyURL_whenInitializeURL_thenSuccess() throws MalformedURLException { + url = new URL(URLCOMPOUND); + } + + // check parsed URL + @Test + public void givenURL_whenURLIsParsed_thenSuccess() { + assertNotNull("URL is null", url); + assertEquals("URL string is not equal", url.toString(), URLSTRING); + assertEquals("Protocol is not equal", url.getProtocol(), URLPROTOCOL); + assertEquals("Authority is not equal", url.getAuthority(), URLAUTHORITY); + assertEquals("Host string is not equal", url.getHost(), URLHOST); + assertEquals("Path string is not equal", url.getPath(), URLPATH); + assertEquals("File string is not equal", url.getFile(), URLFILENAME); + assertEquals("Port number is not equal", url.getPort(), URLPORT); + assertEquals("Default port number is not equal", url.getDefaultPort(), URLDEFAULTPORT); + assertEquals("Query string is not equal", url.getQuery(), URLQUERY); + assertEquals("Reference string is not equal", url.getRef(), URLREFERENCE); + } + + // Obtain the content from location + @Test + public void givenURL_whenOpenConnectionAndContentIsNotEmpty_thenSuccess() throws IOException { + try { + urlConnection = url.openConnection(); + } catch (IOException ex) { + urlConnection = null; + ex.printStackTrace(); + } + assertNotNull("URL Connection is null", urlConnection); + + connection = null; + assertTrue("URLConnection is not HttpURLConnection", urlConnection instanceof HttpURLConnection); + if (urlConnection instanceof HttpURLConnection) { + connection = (HttpURLConnection) urlConnection; + } + assertNotNull("Connection is null", connection); + + log.info(connection.getResponseCode() + " " + connection.getResponseMessage()); + + try { + in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + } catch (IOException ex) { + in = null; + ex.printStackTrace(); + } + assertNotNull("Input stream failed", in); + + String current; + try { + while ((current = in.readLine()) != null) { + urlContent += current; + } + } catch (IOException ex) { + urlContent = null; + ex.printStackTrace(); + } + assertNotNull("Content is null", urlContent); + assertTrue("Content is empty", urlContent.length() > 0); + } +} diff --git a/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java b/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java index 50abb4bc92..3c8f519082 100644 --- a/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java +++ b/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java @@ -14,7 +14,7 @@ import org.hamcrest.collection.IsIterableContainingInOrder; import org.junit.Test; public class FlattenNestedListUnitTest { - List> lol = asList(asList("one:one"), asList("two:one", "two:two", "two:three"), asList("three:one", "three:two", "three:three", "three:four")); + private List> lol = asList(asList("one:one"), asList("two:one", "two:two", "two:three"), asList("three:one", "three:two", "three:three", "three:four")); @Test public void givenNestedList_thenFlattenImperatively() { @@ -36,13 +36,13 @@ public class FlattenNestedListUnitTest { assertThat(ls, IsIterableContainingInOrder.contains("one:one", "two:one", "two:two", "two:three", "three:one", "three:two", "three:three", "three:four")); } - public List flattenListOfListsImperatively(List> list) { + private List flattenListOfListsImperatively(List> list) { List ls = new ArrayList<>(); list.forEach(ls::addAll); return ls; } - public List flattenListOfListsStream(List> list) { + private List flattenListOfListsStream(List> list) { return list.stream().flatMap(Collection::stream).collect(Collectors.toList()); } } diff --git a/core-java/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java b/core-java/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java index 75f8b8359f..7a23afa12f 100644 --- a/core-java/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java +++ b/core-java/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java @@ -1,18 +1,19 @@ package com.baeldung.list.listoflist; +import org.junit.Before; +import org.junit.Test; + import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; -import org.junit.Before; -import org.junit.Test; public class ListOfListsUnitTest { - private List> listOfLists = new ArrayList>(); - private ArrayList penList = new ArrayList<>(); - private ArrayList pencilList = new ArrayList<>(); - private ArrayList rubberList = new ArrayList<>(); + private List> listOfLists = new ArrayList<>(); + private List penList = new ArrayList<>(); + private List pencilList = new ArrayList<>(); + private List rubberList = new ArrayList<>(); @SuppressWarnings("unchecked") @Before @@ -29,11 +30,11 @@ public class ListOfListsUnitTest { @Test public void givenListOfLists_thenCheckNames() { assertEquals("Pen 1", ((Pen) listOfLists.get(0) - .get(0)).getName()); + .get(0)).getName()); assertEquals("Pencil 1", ((Pencil) listOfLists.get(1) - .get(0)).getName()); + .get(0)).getName()); assertEquals("Rubber 1", ((Rubber) listOfLists.get(2) - .get(0)).getName()); + .get(0)).getName()); } @SuppressWarnings("unchecked") @@ -43,10 +44,10 @@ public class ListOfListsUnitTest { ((ArrayList) listOfLists.get(1)).remove(0); listOfLists.remove(1); assertEquals("Rubber 1", ((Rubber) listOfLists.get(1) - .get(0)).getName()); + .get(0)).getName()); listOfLists.remove(0); assertEquals("Rubber 1", ((Rubber) listOfLists.get(0) - .get(0)).getName()); + .get(0)).getName()); } @Test @@ -60,17 +61,17 @@ public class ListOfListsUnitTest { ArrayList rubbers = new ArrayList<>(); rubbers.add(new Rubber("Rubber 1")); rubbers.add(new Rubber("Rubber 2")); - + List> list = new ArrayList>(); list.add(pens); list.add(pencils); list.add(rubbers); - + assertEquals("Pen 1", ((Pen) list.get(0) - .get(0)).getName()); + .get(0)).getName()); assertEquals("Pencil 1", ((Pencil) list.get(1) - .get(0)).getName()); + .get(0)).getName()); assertEquals("Rubber 1", ((Rubber) list.get(2) - .get(0)).getName()); + .get(0)).getName()); } } diff --git a/core-java/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java b/core-java/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java index 22457d196e..3c2d9904d4 100644 --- a/core-java/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java +++ b/core-java/src/test/java/com/baeldung/mappedbytebuffer/MappedByteBufferUnitTest.java @@ -47,7 +47,7 @@ public class MappedByteBufferUnitTest { //when try (FileChannel fileChannel = (FileChannel) Files.newByteChannel(pathToWrite, - EnumSet.of(StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING))) { + EnumSet.of(StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING))) { MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, charBuffer.length()); if (mappedByteBuffer != null) { @@ -61,7 +61,7 @@ public class MappedByteBufferUnitTest { } - public Path getFileURIFromResources(String fileName) throws Exception { + private Path getFileURIFromResources(String fileName) throws Exception { ClassLoader classLoader = getClass().getClassLoader(); return Paths.get(classLoader.getResource(fileName).getPath()); } diff --git a/core-java/src/test/java/com/baeldung/maths/BigDecimalImplTest.java b/core-java/src/test/java/com/baeldung/maths/BigDecimalImplTest.java new file mode 100644 index 0000000000..788fbd7047 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/maths/BigDecimalImplTest.java @@ -0,0 +1,25 @@ +package com.baeldung.maths; + +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class BigDecimalImplTest { + + @Test + public void givenBigDecimalNumbers_whenAddedTogether_thenGetExpectedResult() { + BigDecimal serviceTax = new BigDecimal("56.0084578639"); + serviceTax = serviceTax.setScale(2, RoundingMode.CEILING); + + BigDecimal entertainmentTax = new BigDecimal("23.00689"); + entertainmentTax = entertainmentTax.setScale(2, RoundingMode.FLOOR); + + BigDecimal totalTax = serviceTax.add(entertainmentTax); + BigDecimal result = BigDecimal.valueOf(79.01); + + Assert.assertEquals(result, totalTax); + + } +} diff --git a/core-java/src/test/java/com/baeldung/maths/BigIntegerImplTest.java b/core-java/src/test/java/com/baeldung/maths/BigIntegerImplTest.java new file mode 100644 index 0000000000..aa8eaa9909 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/maths/BigIntegerImplTest.java @@ -0,0 +1,21 @@ +package com.baeldung.maths; + +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigInteger; + +public class BigIntegerImplTest { + + @Test + public void givenBigIntegerNumbers_whenAddedTogether_thenGetExpectedResult() { + BigInteger numStarsMilkyWay = new BigInteger("8731409320171337804361260816606476"); + BigInteger numStarsAndromeda = new BigInteger("5379309320171337804361260816606476"); + + BigInteger totalStars = numStarsMilkyWay.add(numStarsAndromeda); + BigInteger result = new BigInteger("14110718640342675608722521633212952"); + + Assert.assertEquals(result, totalStars); + } + +} diff --git a/core-java/src/test/java/com/baeldung/maths/RoundTest.java b/core-java/src/test/java/com/baeldung/maths/RoundTest.java index 95db146414..5ce9523e21 100644 --- a/core-java/src/test/java/com/baeldung/maths/RoundTest.java +++ b/core-java/src/test/java/com/baeldung/maths/RoundTest.java @@ -5,6 +5,9 @@ import org.decimal4j.util.DoubleRounder; import org.junit.Assert; import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + public class RoundTest { private double value = 2.03456d; private int places = 2; diff --git a/core-java/src/test/java/com/baeldung/money/JavaMoneyUnitTest.java b/core-java/src/test/java/com/baeldung/money/JavaMoneyUnitTest.java index 69906543a9..8948d1ebf7 100644 --- a/core-java/src/test/java/com/baeldung/money/JavaMoneyUnitTest.java +++ b/core-java/src/test/java/com/baeldung/money/JavaMoneyUnitTest.java @@ -3,13 +3,13 @@ package com.baeldung.money; import org.javamoney.moneta.FastMoney; import org.javamoney.moneta.Money; import org.javamoney.moneta.format.CurrencyStyle; +import org.junit.Ignore; import org.junit.Test; import javax.money.CurrencyUnit; import javax.money.Monetary; import javax.money.MonetaryAmount; import javax.money.UnknownCurrencyException; -import javax.money.convert.ConversionQueryBuilder; import javax.money.convert.CurrencyConversion; import javax.money.convert.MonetaryConversions; import javax.money.format.AmountFormatQueryBuilder; @@ -19,7 +19,11 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; public class JavaMoneyUnitTest { @@ -36,17 +40,16 @@ public class JavaMoneyUnitTest { @Test(expected = UnknownCurrencyException.class) public void givenCurrencyCode_whenNoExist_thanThrowsError() { Monetary.getCurrency("AAA"); - fail(); // if no exception } @Test public void givenAmounts_whenStringified_thanEquals() { CurrencyUnit usd = Monetary.getCurrency("USD"); MonetaryAmount fstAmtUSD = Monetary - .getDefaultAmountFactory() - .setCurrency(usd) - .setNumber(200) - .create(); + .getDefaultAmountFactory() + .setCurrency(usd) + .setNumber(200) + .create(); Money moneyof = Money.of(12, usd); FastMoney fastmoneyof = FastMoney.of(2, usd); @@ -59,10 +62,10 @@ public class JavaMoneyUnitTest { @Test public void givenCurrencies_whenCompared_thanNotequal() { MonetaryAmount oneDolar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); Money oneEuro = Money.of(1, "EUR"); assertFalse(oneEuro.equals(FastMoney.of(1, "EUR"))); @@ -72,10 +75,10 @@ public class JavaMoneyUnitTest { @Test(expected = ArithmeticException.class) public void givenAmount_whenDivided_thanThrowsException() { MonetaryAmount oneDolar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); oneDolar.divide(3); fail(); // if no exception } @@ -85,8 +88,8 @@ public class JavaMoneyUnitTest { List monetaryAmounts = Arrays.asList(Money.of(100, "CHF"), Money.of(10.20, "CHF"), Money.of(1.15, "CHF")); Money sumAmtCHF = (Money) monetaryAmounts - .stream() - .reduce(Money.of(0, "CHF"), MonetaryAmount::add); + .stream() + .reduce(Money.of(0, "CHF"), MonetaryAmount::add); assertEquals("CHF 111.35", sumAmtCHF.toString()); } @@ -97,18 +100,18 @@ public class JavaMoneyUnitTest { Money moneyof = Money.of(12, usd); MonetaryAmount fstAmtUSD = Monetary - .getDefaultAmountFactory() - .setCurrency(usd) - .setNumber(200.50) - .create(); + .getDefaultAmountFactory() + .setCurrency(usd) + .setNumber(200.50) + .create(); MonetaryAmount oneDolar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); Money subtractedAmount = Money - .of(1, "USD") - .subtract(fstAmtUSD); + .of(1, "USD") + .subtract(fstAmtUSD); MonetaryAmount multiplyAmount = oneDolar.multiply(0.25); MonetaryAmount divideAmount = oneDolar.divide(0.25); @@ -124,22 +127,23 @@ public class JavaMoneyUnitTest { @Test public void givenAmount_whenRounded_thanEquals() { MonetaryAmount fstAmtEUR = Monetary - .getDefaultAmountFactory() - .setCurrency("EUR") - .setNumber(1.30473908) - .create(); + .getDefaultAmountFactory() + .setCurrency("EUR") + .setNumber(1.30473908) + .create(); MonetaryAmount roundEUR = fstAmtEUR.with(Monetary.getDefaultRounding()); assertEquals("EUR 1.30473908", fstAmtEUR.toString()); assertEquals("EUR 1.3", roundEUR.toString()); } @Test + @Ignore("Currency providers are not always available") public void givenAmount_whenConversion_thenNotNull() { MonetaryAmount oneDollar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); CurrencyConversion conversionEUR = MonetaryConversions.getConversion("EUR"); @@ -152,10 +156,10 @@ public class JavaMoneyUnitTest { @Test public void givenLocale_whenFormatted_thanEquals() { MonetaryAmount oneDollar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); MonetaryAmountFormat formatUSD = MonetaryFormats.getAmountFormat(Locale.US); String usFormatted = formatUSD.format(oneDollar); @@ -167,16 +171,16 @@ public class JavaMoneyUnitTest { @Test public void givenAmount_whenCustomFormat_thanEquals() { MonetaryAmount oneDollar = Monetary - .getDefaultAmountFactory() - .setCurrency("USD") - .setNumber(1) - .create(); + .getDefaultAmountFactory() + .setCurrency("USD") + .setNumber(1) + .create(); MonetaryAmountFormat customFormat = MonetaryFormats.getAmountFormat(AmountFormatQueryBuilder - .of(Locale.US) - .set(CurrencyStyle.NAME) - .set("pattern", "00000.00 ¤") - .build()); + .of(Locale.US) + .set(CurrencyStyle.NAME) + .set("pattern", "00000.00 ¤") + .build()); String customFormatted = customFormat.format(oneDollar); assertNotNull(customFormat); diff --git a/core-java/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorTest.java b/core-java/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorTest.java index bb446dc385..aa11aaa788 100644 --- a/core-java/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorTest.java +++ b/core-java/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorTest.java @@ -9,4 +9,4 @@ public class NoClassDefFoundErrorTest { NoClassDefFoundErrorExample sample = new NoClassDefFoundErrorExample(); sample.getClassWithInitErrors(); } -} +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsTest.java b/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsTest.java new file mode 100644 index 0000000000..bba867f50f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsTest.java @@ -0,0 +1,24 @@ +package com.baeldung.reflection; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertTrue; + +public class BaeldungReflectionUtilsTest { + + @Test + public void givenCustomer_whenAFieldIsNull_thenFieldNameInResult() throws Exception { + Customer customer = new Customer(1, "Himanshu", null, null); + + List result = BaeldungReflectionUtils.getNullPropertiesList(customer); + List expectedFieldNames = Arrays.asList("emailId", "phoneNumber"); + + assertTrue(result.size() == expectedFieldNames.size()); + assertTrue(result.containsAll(expectedFieldNames)); + + } + +} diff --git a/core-java/src/test/java/com/baeldung/regexp/EscapingCharsTest.java b/core-java/src/test/java/com/baeldung/regexp/EscapingCharsTest.java index f8dbde4c4f..47c9cfc621 100644 --- a/core-java/src/test/java/com/baeldung/regexp/EscapingCharsTest.java +++ b/core-java/src/test/java/com/baeldung/regexp/EscapingCharsTest.java @@ -1,71 +1,73 @@ package com.baeldung.regexp; -import static junit.framework.TestCase.assertEquals; -import static org.junit.Assert.assertThat; -import static org.hamcrest.CoreMatchers.*; +import org.junit.Test; + import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.junit.Test; +import static junit.framework.TestCase.assertEquals; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; public class EscapingCharsTest { @Test public void givenRegexWithDot_whenMatchingStr_thenMatches() { String strInput = "foof"; String strRegex = "foo."; - + assertEquals(true, strInput.matches(strRegex)); } - + @Test public void givenRegexWithDotEsc_whenMatchingStr_thenNotMatching() { String strInput = "foof"; String strRegex = "foo\\."; - + assertEquals(false, strInput.matches(strRegex)); } - + @Test public void givenRegexWithPipeEscaped_whenSplitStr_thenSplits() { String strInput = "foo|bar|hello|world"; String strRegex = "\\Q|\\E"; - + assertEquals(4, strInput.split(strRegex).length); } - + @Test public void givenRegexWithPipeEscQuoteMeth_whenSplitStr_thenSplits() { String strInput = "foo|bar|hello|world"; String strRegex = "|"; - - assertEquals(4,strInput.split(Pattern.quote(strRegex)).length); + + assertEquals(4, strInput.split(Pattern.quote(strRegex)).length); } - + @Test public void givenRegexWithDollar_whenReplacing_thenNotReplace() { String strInput = "I gave $50 to my brother." - + "He bought candy for $35. Now he has $15 left."; + + "He bought candy for $35. Now he has $15 left."; String strRegex = "$"; String strReplacement = "£"; String output = "I gave £50 to my brother." - + "He bought candy for £35. Now he has £15 left."; + + "He bought candy for £35. Now he has £15 left."; Pattern p = Pattern.compile(strRegex); Matcher m = p.matcher(strInput); - + assertThat(output, not(equalTo(m.replaceAll(strReplacement)))); } - + @Test public void givenRegexWithDollarEsc_whenReplacing_thenReplace() { String strInput = "I gave $50 to my brother." - + "He bought candy for $35. Now he has $15 left."; + + "He bought candy for $35. Now he has $15 left."; String strRegex = "\\$"; String strReplacement = "£"; String output = "I gave £50 to my brother." - + "He bought candy for £35. Now he has £15 left."; + + "He bought candy for £35. Now he has £15 left."; Pattern p = Pattern.compile(strRegex); Matcher m = p.matcher(strInput); - - assertEquals(output,m.replaceAll(strReplacement)); + + assertEquals(output, m.replaceAll(strReplacement)); } } diff --git a/core-java/src/test/java/com/baeldung/scripting/NashornUnitTest.java b/core-java/src/test/java/com/baeldung/scripting/NashornUnitTest.java index fe1a7d4bd4..7f165cec86 100644 --- a/core-java/src/test/java/com/baeldung/scripting/NashornUnitTest.java +++ b/core-java/src/test/java/com/baeldung/scripting/NashornUnitTest.java @@ -4,7 +4,11 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import javax.script.*; +import javax.script.Bindings; +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; import java.io.InputStreamReader; import java.util.List; import java.util.Map; diff --git a/core-java/src/test/java/com/baeldung/serialization/PersonUnitTest.java b/core-java/src/test/java/com/baeldung/serialization/PersonUnitTest.java index 86bd3f9c8d..dbcdf0ec9d 100644 --- a/core-java/src/test/java/com/baeldung/serialization/PersonUnitTest.java +++ b/core-java/src/test/java/com/baeldung/serialization/PersonUnitTest.java @@ -1,6 +1,6 @@ -package com.baeuldung.serialization; +package com.baeldung.serialization; -import static org.junit.Assert.assertTrue; +import org.junit.Test; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -8,57 +8,57 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import org.junit.Test; +import static org.junit.Assert.assertTrue; public class PersonUnitTest { - @Test - public void whenSerializingAndDeserializing_ThenObjectIsTheSame() throws IOException, ClassNotFoundException { - Person p = new Person(); - p.setAge(20); - p.setName("Joe"); + @Test + public void whenSerializingAndDeserializing_ThenObjectIsTheSame() throws IOException, ClassNotFoundException { + Person p = new Person(); + p.setAge(20); + p.setName("Joe"); - FileOutputStream fileOutputStream = new FileOutputStream("yofile.txt"); - ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); - objectOutputStream.writeObject(p); - objectOutputStream.flush(); - objectOutputStream.close(); + FileOutputStream fileOutputStream = new FileOutputStream("yofile.txt"); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); + objectOutputStream.writeObject(p); + objectOutputStream.flush(); + objectOutputStream.close(); - FileInputStream fileInputStream = new FileInputStream("yofile.txt"); - ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); - Person p2 = (Person) objectInputStream.readObject(); - objectInputStream.close(); + FileInputStream fileInputStream = new FileInputStream("yofile.txt"); + ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); + Person p2 = (Person) objectInputStream.readObject(); + objectInputStream.close(); - assertTrue(p2.getAge() == p.getAge()); - assertTrue(p2.getName().equals(p.getName())); - } + assertTrue(p2.getAge() == p.getAge()); + assertTrue(p2.getName().equals(p.getName())); + } - @Test - public void whenCustomSerializingAndDeserializing_ThenObjectIsTheSame() throws IOException, ClassNotFoundException { - Person p = new Person(); - p.setAge(20); - p.setName("Joe"); + @Test + public void whenCustomSerializingAndDeserializing_ThenObjectIsTheSame() throws IOException, ClassNotFoundException { + Person p = new Person(); + p.setAge(20); + p.setName("Joe"); - Address a = new Address(); - a.setHouseNumber(1); + Address a = new Address(); + a.setHouseNumber(1); - Employee e = new Employee(); - e.setPerson(p); - e.setAddress(a); + Employee e = new Employee(); + e.setPerson(p); + e.setAddress(a); - FileOutputStream fileOutputStream = new FileOutputStream("yofile2.txt"); - ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); - objectOutputStream.writeObject(e); - objectOutputStream.flush(); - objectOutputStream.close(); + FileOutputStream fileOutputStream = new FileOutputStream("yofile2.txt"); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); + objectOutputStream.writeObject(e); + objectOutputStream.flush(); + objectOutputStream.close(); - FileInputStream fileInputStream = new FileInputStream("yofile2.txt"); - ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); - Employee e2 = (Employee) objectInputStream.readObject(); - objectInputStream.close(); + FileInputStream fileInputStream = new FileInputStream("yofile2.txt"); + ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); + Employee e2 = (Employee) objectInputStream.readObject(); + objectInputStream.close(); - assertTrue(e2.getPerson().getAge() == e.getPerson().getAge()); - assertTrue(e2.getAddress().getHouseNumber() == (e.getAddress().getHouseNumber())); - } + assertTrue(e2.getPerson().getAge() == e.getPerson().getAge()); + assertTrue(e2.getAddress().getHouseNumber() == (e.getAddress().getHouseNumber())); + } } diff --git a/core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java b/core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java index 7ac8e0a97a..2bf6d142bb 100644 --- a/core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java +++ b/core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java @@ -1,14 +1,14 @@ package com.baeldung.socket; -import static org.junit.Assert.assertEquals; - -import java.util.concurrent.Executors; - import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import java.util.concurrent.Executors; + +import static org.junit.Assert.assertEquals; + public class EchoIntegrationTest { private static final Integer PORT = 4444; diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java b/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java index 9b86770453..1f1de9149a 100644 --- a/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java +++ b/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java @@ -1,11 +1,10 @@ package com.baeldung.stackoverflowerror; -import static org.junit.Assert.fail; import org.junit.Test; public class CyclicDependancyManualTest { @Test(expected = StackOverflowError.class) public void whenInstanciatingClassOne_thenThrowsException() { - ClassOne obj = new ClassOne(); + ClassOne obj = new ClassOne(); } } diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java b/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java index 996d0e9017..3530fa1c3e 100644 --- a/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java +++ b/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java @@ -1,9 +1,9 @@ package com.baeldung.stackoverflowerror; -import static junit.framework.TestCase.assertEquals; -import static org.junit.Assert.fail; import org.junit.Test; +import static junit.framework.TestCase.assertEquals; + public class InfiniteRecursionWithTerminationConditionManualTest { @Test public void givenPositiveIntNoOne_whenCalcFact_thenCorrectlyCalc() { @@ -23,9 +23,9 @@ public class InfiniteRecursionWithTerminationConditionManualTest { @Test(expected = StackOverflowError.class) public void givenNegativeInt_whenCalcFact_thenThrowsException() { - int numToCalcFactorial = -1; - InfiniteRecursionWithTerminationCondition irtc = new InfiniteRecursionWithTerminationCondition(); + int numToCalcFactorial = -1; + InfiniteRecursionWithTerminationCondition irtc = new InfiniteRecursionWithTerminationCondition(); - irtc.calculateFactorial(numToCalcFactorial); + irtc.calculateFactorial(numToCalcFactorial); } } diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java b/core-java/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java index a4269aef56..858cec2ffa 100644 --- a/core-java/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java +++ b/core-java/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java @@ -1,9 +1,9 @@ package com.baeldung.stackoverflowerror; -import static junit.framework.TestCase.assertEquals; - import org.junit.Test; +import static junit.framework.TestCase.assertEquals; + public class RecursionWithCorrectTerminationConditionManualTest { @Test public void givenNegativeInt_whenCalcFact_thenCorrectlyCalc() { diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java b/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java index 65126efff2..1e1c245d4d 100644 --- a/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java +++ b/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java @@ -6,25 +6,25 @@ import org.junit.Test; public class UnintendedInfiniteRecursionManualTest { @Test(expected = StackOverflowError.class) public void givenPositiveIntNoOne_whenCalFact_thenThrowsException() { - int numToCalcFactorial= 1; + int numToCalcFactorial = 1; UnintendedInfiniteRecursion uir = new UnintendedInfiniteRecursion(); - + uir.calculateFactorial(numToCalcFactorial); } - + @Test(expected = StackOverflowError.class) public void givenPositiveIntGtOne_whenCalcFact_thenThrowsException() { - int numToCalcFactorial= 2; + int numToCalcFactorial = 2; UnintendedInfiniteRecursion uir = new UnintendedInfiniteRecursion(); - + uir.calculateFactorial(numToCalcFactorial); } - + @Test(expected = StackOverflowError.class) public void givenNegativeInt_whenCalcFact_thenThrowsException() { - int numToCalcFactorial= -1; + int numToCalcFactorial = -1; UnintendedInfiniteRecursion uir = new UnintendedInfiniteRecursion(); - + uir.calculateFactorial(numToCalcFactorial); } } diff --git a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java index 7ca1d000be..2238012e20 100644 --- a/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java +++ b/core-java/src/test/java/com/baeldung/strategy/StrategyDesignPatternUnitTest.java @@ -7,7 +7,9 @@ import java.util.Arrays; import java.util.List; import java.util.function.Function; -import static com.baeldung.strategy.Discounter.*; +import static com.baeldung.strategy.Discounter.christmas; +import static com.baeldung.strategy.Discounter.easter; +import static com.baeldung.strategy.Discounter.newYear; import static org.assertj.core.api.Assertions.assertThat; public class StrategyDesignPatternUnitTest { @@ -26,7 +28,7 @@ public class StrategyDesignPatternUnitTest { public void shouldDivideByTwo_WhenApplyingStaffDiscounterWithAnonyousTypes() { Discounter staffDiscounter = new Discounter() { @Override - public BigDecimal apply( BigDecimal amount) { + public BigDecimal apply(BigDecimal amount) { return amount.multiply(BigDecimal.valueOf(0.5)); } }; diff --git a/core-java/src/test/java/com/baeldung/stream/InfiniteStreamUnitTest.java b/core-java/src/test/java/com/baeldung/stream/InfiniteStreamUnitTest.java index fa482b8dfe..84c8992557 100644 --- a/core-java/src/test/java/com/baeldung/stream/InfiniteStreamUnitTest.java +++ b/core-java/src/test/java/com/baeldung/stream/InfiniteStreamUnitTest.java @@ -5,7 +5,6 @@ import org.junit.Test; import java.util.Arrays; import java.util.List; -import java.util.Random; import java.util.UUID; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -22,8 +21,8 @@ public class InfiniteStreamUnitTest { //when List collect = infiniteStream - .limit(10) - .collect(Collectors.toList()); + .limit(10) + .collect(Collectors.toList()); //then assertEquals(collect, Arrays.asList(0, 2, 4, 6, 8, 10, 12, 14, 16, 18)); @@ -37,9 +36,9 @@ public class InfiniteStreamUnitTest { //when List randomInts = infiniteStreamOfRandomUUID - .skip(10) - .limit(10) - .collect(Collectors.toList()); + .skip(10) + .limit(10) + .collect(Collectors.toList()); //then assertEquals(randomInts.size(), 10); diff --git a/core-java/src/test/java/com/baeldung/stream/StreamAddUnitTest.java b/core-java/src/test/java/com/baeldung/stream/StreamAddUnitTest.java index 8176d6a60c..d0745b8bc9 100644 --- a/core-java/src/test/java/com/baeldung/stream/StreamAddUnitTest.java +++ b/core-java/src/test/java/com/baeldung/stream/StreamAddUnitTest.java @@ -1,10 +1,12 @@ package com.baeldung.stream; +import org.junit.Test; + import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; + import static org.junit.Assert.assertEquals; -import org.junit.Test; public class StreamAddUnitTest { @@ -25,7 +27,7 @@ public class StreamAddUnitTest { Stream newStream = Stream.concat(Stream.of(99), anStream); assertEquals(newStream.findFirst() - .get(), (Integer) 99); + .get(), (Integer) 99); } @Test @@ -38,7 +40,7 @@ public class StreamAddUnitTest { assertEquals(resultList.get(3), (Double) 9.9); } - public Stream insertInStream(Stream stream, T elem, int index) { + private Stream insertInStream(Stream stream, T elem, int index) { List result = stream.collect(Collectors.toList()); result.add(index, elem); return result.stream(); diff --git a/core-java/src/test/java/com/baeldung/stream/StreamApiTest.java b/core-java/src/test/java/com/baeldung/stream/StreamApiTest.java index af52b3ee69..f4d0ac6b08 100644 --- a/core-java/src/test/java/com/baeldung/stream/StreamApiTest.java +++ b/core-java/src/test/java/com/baeldung/stream/StreamApiTest.java @@ -1,41 +1,40 @@ package com.baeldung.stream; -import static org.junit.Assert.assertEquals; +import org.junit.Test; import java.util.ArrayList; import java.util.List; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class StreamApiTest { - private StreamApi streamApi = new StreamApi(); @Test public void givenList_whenGetLastElementUsingReduce_thenReturnLastElement() { - List valueList = new ArrayList(); + List valueList = new ArrayList<>(); valueList.add("Joe"); valueList.add("John"); valueList.add("Sean"); - String last = streamApi.getLastElementUsingReduce(valueList); + String last = StreamApi.getLastElementUsingReduce(valueList); assertEquals("Sean", last); } - + @Test public void givenInfiniteStream_whenGetInfiniteStreamLastElementUsingReduce_thenReturnLastElement() { - Integer last = streamApi.getInfiniteStreamLastElementUsingReduce(); - assertEquals(new Integer(19), last); + int last = StreamApi.getInfiniteStreamLastElementUsingReduce(); + assertEquals(19, last); } - + @Test public void givenListAndCount_whenGetLastElementUsingSkip_thenReturnLastElement() { - List valueList = new ArrayList(); + List valueList = new ArrayList<>(); valueList.add("Joe"); valueList.add("John"); valueList.add("Sean"); - String last = streamApi.getLastElementUsingSkip(valueList); + String last = StreamApi.getLastElementUsingSkip(valueList); assertEquals("Sean", last); } diff --git a/core-java/src/test/java/com/baeldung/string/JoinerSplitterUnitTest.java b/core-java/src/test/java/com/baeldung/string/JoinerSplitterUnitTest.java index d58c1026d0..8901bcf9db 100644 --- a/core-java/src/test/java/com/baeldung/string/JoinerSplitterUnitTest.java +++ b/core-java/src/test/java/com/baeldung/string/JoinerSplitterUnitTest.java @@ -1,68 +1,66 @@ package com.baeldung.string; -import static org.junit.Assert.*; +import org.junit.Test; import java.util.ArrayList; import java.util.List; -import org.junit.Test; - -import com.baeldung.string.JoinerSplitter; +import static org.junit.Assert.assertEquals; public class JoinerSplitterUnitTest { - @Test - public void provided_array_convert_to_stream_and_convert_to_string() { + @Test + public void provided_array_convert_to_stream_and_convert_to_string() { - String[] programming_languages = {"java", "python", "nodejs", "ruby"}; + String[] programming_languages = {"java", "python", "nodejs", "ruby"}; - String expectation = "java,python,nodejs,ruby"; - - String result = JoinerSplitter.join(programming_languages); - assertEquals(result, expectation); - } - - @Test - public void givenArray_transformedToStream_convertToPrefixPostfixString() { + String expectation = "java,python,nodejs,ruby"; - String[] programming_languages = {"java", "python", - "nodejs", "ruby"}; - String expectation = "[java,python,nodejs,ruby]"; - - String result = JoinerSplitter.joinWithPrefixPostFix(programming_languages); - assertEquals(result, expectation); - } - - @Test - public void givenString_transformedToStream_convertToList() { + String result = JoinerSplitter.join(programming_languages); + assertEquals(result, expectation); + } - String programming_languages = "java,python,nodejs,ruby"; - - List expectation = new ArrayList(); - expectation.add("java"); - expectation.add("python"); - expectation.add("nodejs"); - expectation.add("ruby"); - - List result = JoinerSplitter.split(programming_languages); - - assertEquals(result, expectation); - } - - @Test - public void givenString_transformedToStream_convertToListOfChar() { + @Test + public void givenArray_transformedToStream_convertToPrefixPostfixString() { + + String[] programming_languages = {"java", "python", + "nodejs", "ruby"}; + String expectation = "[java,python,nodejs,ruby]"; + + String result = JoinerSplitter.joinWithPrefixPostFix(programming_languages); + assertEquals(result, expectation); + } + + @Test + public void givenString_transformedToStream_convertToList() { + + String programming_languages = "java,python,nodejs,ruby"; + + List expectation = new ArrayList(); + expectation.add("java"); + expectation.add("python"); + expectation.add("nodejs"); + expectation.add("ruby"); + + List result = JoinerSplitter.split(programming_languages); + + assertEquals(result, expectation); + } + + @Test + public void givenString_transformedToStream_convertToListOfChar() { + + String programming_languages = "java,python,nodejs,ruby"; + + List expectation = new ArrayList(); + char[] charArray = programming_languages.toCharArray(); + for (char c : charArray) { + expectation.add(c); + } + + List result = JoinerSplitter.splitToListOfChar(programming_languages); + assertEquals(result, expectation); + + } - String programming_languages = "java,python,nodejs,ruby"; - - List expectation = new ArrayList(); - char[] charArray = programming_languages.toCharArray(); - for (char c : charArray) { - expectation.add(c); - } - - List result = JoinerSplitter.splitToListOfChar(programming_languages); - assertEquals(result, expectation); - - } - } diff --git a/core-java/src/test/java/com/baeldung/string/SplitUnitTest.java b/core-java/src/test/java/com/baeldung/string/SplitUnitTest.java index 5d8703db1a..83fd253b97 100644 --- a/core-java/src/test/java/com/baeldung/string/SplitUnitTest.java +++ b/core-java/src/test/java/com/baeldung/string/SplitUnitTest.java @@ -2,7 +2,6 @@ package com.baeldung.string; import com.google.common.base.Splitter; import org.apache.commons.lang.StringUtils; -import org.assertj.core.util.Lists; import org.junit.Test; import java.util.List; diff --git a/core-java/src/test/java/com/baeldung/string/StringHelperUnitTest.java b/core-java/src/test/java/com/baeldung/string/StringHelperUnitTest.java index 427f02ba16..917ed1c937 100644 --- a/core-java/src/test/java/com/baeldung/string/StringHelperUnitTest.java +++ b/core-java/src/test/java/com/baeldung/string/StringHelperUnitTest.java @@ -1,9 +1,10 @@ package com.baeldung.string; +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -import org.apache.commons.lang3.StringUtils; -import org.junit.Test; public class StringHelperUnitTest { @@ -67,7 +68,7 @@ public class StringHelperUnitTest { assertEquals("abc", StringHelper.removeLastCharOptional(WHITE_SPACE_AT_THE_END_STRING)); assertEquals("abc", StringHelper.removeLastCharRegexOptional(WHITE_SPACE_AT_THE_END_STRING)); } - + @Test public void givenStringWithNewLineAtTheEnd_whenSubstring_thenGetStringWithoutNewLine() { assertEquals("abc", StringHelper.removeLastChar(NEW_LINE_AT_THE_END_STRING)); @@ -78,7 +79,7 @@ public class StringHelperUnitTest { assertEquals("abc", StringHelper.removeLastCharOptional(NEW_LINE_AT_THE_END_STRING)); assertNotEquals("abc", StringHelper.removeLastCharRegexOptional(NEW_LINE_AT_THE_END_STRING)); } - + @Test public void givenMultiLineString_whenSubstring_thenGetStringWithoutNewLine() { assertEquals("abc\nde", StringHelper.removeLastChar(MULTIPLE_LINES_STRING)); diff --git a/core-java/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java b/core-java/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java new file mode 100644 index 0000000000..1b02e5d291 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java @@ -0,0 +1,59 @@ +package com.baeldung.string; + +import org.junit.Test; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +public class StringToCharStreamUnitTest { + + private String testString = "Tests"; + + @Test + public void givenTestString_whenChars_thenReturnIntStream() { + assertThat(testString.chars(), instanceOf(IntStream.class)); + } + + @Test + public void givenTestString_whenCodePoints_thenReturnIntStream() { + assertThat(testString.codePoints(), instanceOf(IntStream.class)); + } + + @Test + public void givenTestString_whenCodePoints_thenShowOccurences() throws Exception { + Map map = testString.codePoints() + .mapToObj(c -> (char) c) + .filter(Character::isLetter) + .collect(Collectors.toMap(c -> c, c -> 1, Integer::sum)); + + System.out.println(map); + } + + @Test + public void givenIntStream_whenMapToObj_thenReturnCharacterStream() { + Stream characterStream = testString.chars() + .mapToObj(c -> (char) c); + Stream characterStream1 = testString.codePoints() + .mapToObj(c -> (char) c); + assertNotNull("IntStream returned by chars() did not map to Stream", characterStream); + assertNotNull("IntStream returned by codePoints() did not map to Stream", characterStream1); + } + + @Test + public void givenIntStream_whenMapToObj_thenReturnStringStream() { + List strings = testString.codePoints() + .mapToObj(c -> String.valueOf((char) c)) + .collect(Collectors.toList()); + + assertEquals(strings.size(), 5); + } + +} diff --git a/core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueUnitTest.java b/core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueIntegrationTest.java similarity index 97% rename from core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueUnitTest.java rename to core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueIntegrationTest.java index 79339d1680..76df3c6450 100644 --- a/core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueUnitTest.java +++ b/core-java/src/test/java/com/baeldung/synchronousqueue/SynchronousQueueIntegrationTest.java @@ -12,9 +12,9 @@ import java.util.concurrent.atomic.AtomicInteger; import static junit.framework.TestCase.assertEquals; @FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class SynchronousQueueUnitTest { +public class SynchronousQueueIntegrationTest { - private static final Logger LOG = LoggerFactory.getLogger(SynchronousQueueUnitTest.class); + private static final Logger LOG = LoggerFactory.getLogger(SynchronousQueueIntegrationTest.class); @Test diff --git a/core-java/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java b/core-java/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java new file mode 100644 index 0000000000..060f177265 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.typeerasure; + +import org.junit.Test; + +public class TypeErasureUnitTest { + + @Test(expected = ClassCastException.class) + public void givenIntegerStack_whenStringPushedAndAssignPoppedValueToInteger_shouldFail() { + IntegerStack integerStack = new IntegerStack(5); + Stack stack = integerStack; + stack.push("Hello"); + Integer data = integerStack.pop(); + } + + @Test + public void givenAnyArray_whenInvokedPrintArray_shouldSucceed() { + Integer[] scores = new Integer[] { 100, 200, 10, 99, 20 }; + ArrayContentPrintUtil.printArray(scores); + } + +} diff --git a/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java b/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java index f5cab88f3d..2f18c38bc7 100644 --- a/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java +++ b/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java @@ -15,7 +15,7 @@ class OffHeapArray { return (Unsafe) f.get(null); } - public OffHeapArray(long size) throws NoSuchFieldException, IllegalAccessException { + OffHeapArray(long size) throws NoSuchFieldException, IllegalAccessException { this.size = size; address = getUnsafe().allocateMemory(size * BYTE); } @@ -32,7 +32,7 @@ class OffHeapArray { return size; } - public void freeMemory() throws NoSuchFieldException, IllegalAccessException { + void freeMemory() throws NoSuchFieldException, IllegalAccessException { getUnsafe().freeMemory(address); } diff --git a/core-java/src/test/resources/test.find b/core-java/src/test/resources/test.find new file mode 100644 index 0000000000..0cb7d51df1 --- /dev/null +++ b/core-java/src/test/resources/test.find @@ -0,0 +1 @@ +Test of JNDI on file. \ No newline at end of file diff --git a/drools/README.MD b/drools/README.MD new file mode 100644 index 0000000000..4ece7608fc --- /dev/null +++ b/drools/README.MD @@ -0,0 +1,3 @@ +### Relevant Articles: +[Introduction to Drools](http://www.baeldung.com/drools) +[Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel) diff --git a/drools/pom.xml b/drools/pom.xml index b352044fb8..29231f150c 100644 --- a/drools/pom.xml +++ b/drools/pom.xml @@ -16,7 +16,7 @@ 4.4.6 - 7.0.0.CR1 + 7.1.0.Beta2 3.13 diff --git a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java index 5f0d619813..e8841b05e2 100644 --- a/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java +++ b/drools/src/main/java/com/baeldung/drools/config/DroolsBeanFactory.java @@ -1,10 +1,15 @@ package com.baeldung.drools.config; +import org.drools.decisiontable.DecisionTableProviderImpl; import org.kie.api.KieServices; import org.kie.api.builder.*; import org.kie.api.io.KieResources; +import org.kie.api.io.Resource; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; +import org.kie.internal.builder.DecisionTableConfiguration; +import org.kie.internal.builder.DecisionTableInputType; +import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.io.ResourceFactory; import java.io.IOException; import java.util.Arrays; @@ -64,4 +69,39 @@ public class DroolsBeanFactory { } -} \ No newline at end of file + public KieSession getKieSession(Resource dt) { + KieFileSystem kieFileSystem = kieServices.newKieFileSystem() + .write(dt); + + KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem) + .buildAll(); + + KieRepository kieRepository = kieServices.getRepository(); + + ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId(); + + KieContainer kieContainer = kieServices.newKieContainer(krDefaultReleaseId); + + KieSession ksession = kieContainer.newKieSession(); + + return ksession; + } + + /* + * Can be used for debugging + * Input excelFile example: com/baeldung/drools/rules/Discount.xls + */ + public String getDrlFromExcel(String excelFile) { + DecisionTableConfiguration configuration = KnowledgeBuilderFactory.newDecisionTableConfiguration(); + configuration.setInputType(DecisionTableInputType.XLS); + + Resource dt = ResourceFactory.newClassPathResource(excelFile, getClass()); + + DecisionTableProviderImpl decisionTableProvider = new DecisionTableProviderImpl(); + + String drl = decisionTableProvider.loadFromResource(dt, null); + + return drl; + } + +} diff --git a/drools/src/main/java/com/baeldung/drools/model/Customer.java b/drools/src/main/java/com/baeldung/drools/model/Customer.java new file mode 100644 index 0000000000..e900612b55 --- /dev/null +++ b/drools/src/main/java/com/baeldung/drools/model/Customer.java @@ -0,0 +1,44 @@ +package com.baeldung.drools.model; + +public class Customer { + + private CustomerType type; + + private int years; + + private int discount; + + public Customer(CustomerType type, int numOfYears) { + super(); + this.type = type; + this.years = numOfYears; + } + + public CustomerType getType() { + return type; + } + + public void setType(CustomerType type) { + this.type = type; + } + + public int getYears() { + return years; + } + + public void setYears(int years) { + this.years = years; + } + + public int getDiscount() { + return discount; + } + + public void setDiscount(int discount) { + this.discount = discount; + } + + public enum CustomerType { + INDIVIDUAL, BUSINESS; + } +} diff --git a/drools/src/main/resources/com/baeldung/drools/rules/Discount.xls b/drools/src/main/resources/com/baeldung/drools/rules/Discount.xls new file mode 100644 index 0000000000..198cc8dcda Binary files /dev/null and b/drools/src/main/resources/com/baeldung/drools/rules/Discount.xls differ diff --git a/drools/src/test/java/com/baeldung/drools/service/ApplicantServiceIntegrationTest.java b/drools/src/test/java/com/baeldung/drools/service/ApplicantServiceIntegrationTest.java index 71f33f2db4..f5d74c0a58 100644 --- a/drools/src/test/java/com/baeldung/drools/service/ApplicantServiceIntegrationTest.java +++ b/drools/src/test/java/com/baeldung/drools/service/ApplicantServiceIntegrationTest.java @@ -17,37 +17,39 @@ public class ApplicantServiceIntegrationTest { private ApplicantService applicantService; @Before - public void setup(){ + public void setup() { applicantService = new ApplicantService(); } @Test public void whenCriteriaMatching_ThenSuggestManagerRole() throws IOException { - Applicant applicant=new Applicant("Davis",37,1600000.0,11); - SuggestedRole suggestedRole=new SuggestedRole(); - applicantService.suggestARoleForApplicant(applicant,suggestedRole); - assertEquals("Manager",suggestedRole.getRole()); + Applicant applicant = new Applicant("Davis", 37, 1600000.0, 11); + SuggestedRole suggestedRole = new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant, suggestedRole); + assertEquals("Manager", suggestedRole.getRole()); } @Test public void whenCriteriaMatching_ThenSuggestSeniorDeveloperRole() throws IOException { - Applicant applicant=new Applicant("John",37,1200000.0,8); - SuggestedRole suggestedRole=new SuggestedRole(); - applicantService.suggestARoleForApplicant(applicant,suggestedRole); - assertEquals("Senior developer",suggestedRole.getRole()); + Applicant applicant = new Applicant("John", 37, 1200000.0, 8); + SuggestedRole suggestedRole = new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant, suggestedRole); + assertEquals("Senior developer", suggestedRole.getRole()); } + @Test public void whenCriteriaMatching_ThenSuggestDeveloperRole() throws IOException { - Applicant applicant=new Applicant("Davis",37,800000.0,3); - SuggestedRole suggestedRole=new SuggestedRole(); - applicantService.suggestARoleForApplicant(applicant,suggestedRole); - assertEquals("Developer",suggestedRole.getRole()); + Applicant applicant = new Applicant("Davis", 37, 800000.0, 3); + SuggestedRole suggestedRole = new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant, suggestedRole); + assertEquals("Developer", suggestedRole.getRole()); } + @Test public void whenCriteriaNotMatching_ThenNoRole() throws IOException { - Applicant applicant=new Applicant("John",37,1200000.0,5); - SuggestedRole suggestedRole=new SuggestedRole(); - applicantService.suggestARoleForApplicant(applicant,suggestedRole); + Applicant applicant = new Applicant("John", 37, 1200000.0, 5); + SuggestedRole suggestedRole = new SuggestedRole(); + applicantService.suggestARoleForApplicant(applicant, suggestedRole); assertNull(suggestedRole.getRole()); } } diff --git a/drools/src/test/java/com/baeldung/drools/service/DiscountExcelIntegrationTest.java b/drools/src/test/java/com/baeldung/drools/service/DiscountExcelIntegrationTest.java new file mode 100644 index 0000000000..c3c4ebd4f8 --- /dev/null +++ b/drools/src/test/java/com/baeldung/drools/service/DiscountExcelIntegrationTest.java @@ -0,0 +1,56 @@ +package com.baeldung.drools.service; + +import static org.junit.Assert.assertEquals; + +import org.junit.Before; +import org.junit.Test; +import org.kie.api.io.Resource; +import org.kie.api.runtime.KieSession; +import org.kie.internal.io.ResourceFactory; + +import com.baeldung.drools.config.DroolsBeanFactory; +import com.baeldung.drools.model.Customer; +import com.baeldung.drools.model.Customer.CustomerType; + +public class DiscountExcelIntegrationTest { + + private KieSession kSession; + + @Before + public void setup() { + Resource resource = ResourceFactory.newClassPathResource("com/baeldung/drools/rules/Discount.xls", getClass()); + kSession = new DroolsBeanFactory().getKieSession(resource); + } + + @Test + public void giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount() throws Exception { + Customer customer = new Customer(CustomerType.INDIVIDUAL, 5); + kSession.insert(customer); + + kSession.fireAllRules(); + + assertEquals(customer.getDiscount(), 15); + } + + @Test + public void giveIndvidualRecent_whenFireRule_thenCorrectDiscount() throws Exception { + + Customer customer = new Customer(CustomerType.INDIVIDUAL, 1); + kSession.insert(customer); + + kSession.fireAllRules(); + + assertEquals(customer.getDiscount(), 5); + } + + @Test + public void giveBusinessAny_whenFireRule_thenCorrectDiscount() throws Exception { + Customer customer = new Customer(CustomerType.BUSINESS, 0); + kSession.insert(customer); + + kSession.fireAllRules(); + + assertEquals(customer.getDiscount(), 20); + } + +} diff --git a/drools/src/test/java/com/baeldung/drools/service/ProductServiceIntegrationTest.java b/drools/src/test/java/com/baeldung/drools/service/ProductServiceIntegrationTest.java index 08c3fceb7d..73624c2c99 100644 --- a/drools/src/test/java/com/baeldung/drools/service/ProductServiceIntegrationTest.java +++ b/drools/src/test/java/com/baeldung/drools/service/ProductServiceIntegrationTest.java @@ -3,6 +3,7 @@ package com.baeldung.drools.service; import com.baeldung.drools.model.Product; import org.junit.Before; import org.junit.Test; + import static junit.framework.TestCase.assertEquals; @@ -11,22 +12,22 @@ public class ProductServiceIntegrationTest { private ProductService productService; @Before - public void setup(){ - productService=new ProductService(); + public void setup() { + productService = new ProductService(); } @Test - public void whenProductTypeElectronic_ThenLabelBarcode(){ - Product product=new Product("Microwave","Electronic"); - product=productService.applyLabelToProduct(product); - assertEquals("BarCode",product.getLabel()); + public void whenProductTypeElectronic_ThenLabelBarcode() { + Product product = new Product("Microwave", "Electronic"); + product = productService.applyLabelToProduct(product); + assertEquals("BarCode", product.getLabel()); } @Test - public void whenProductTypeBook_ThenLabelIsbn(){ - Product product=new Product("AutoBiography","Book"); - product=productService.applyLabelToProduct(product); - assertEquals("ISBN",product.getLabel()); + public void whenProductTypeBook_ThenLabelIsbn() { + Product product = new Product("AutoBiography", "Book"); + product = productService.applyLabelToProduct(product); + assertEquals("ISBN", product.getLabel()); } } diff --git a/guava/README.md b/guava/README.md index f46c4dd3de..56d282560b 100644 --- a/guava/README.md +++ b/guava/README.md @@ -25,3 +25,6 @@ - [Guide to Guava RangeMap](http://www.baeldung.com/guava-rangemap) - [Guide to Guava Table](http://www.baeldung.com/guava-table) - [Guide to Guava’s Reflection Utilities](http://www.baeldung.com/guava-reflection) +- [Guide to Guava ClassToInstanceMap](http://www.baeldung.com/guava-class-to-instance-map) +- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](http://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue) +- [Guide to Mathematical Utilities in Guava](http://www.baeldung.com/guava-math) diff --git a/guest/junit5-example/.gitignore b/guest/junit5-example/.gitignore new file mode 100644 index 0000000000..60be5b80aa --- /dev/null +++ b/guest/junit5-example/.gitignore @@ -0,0 +1,4 @@ +/target/ +.settings/ +.classpath +.project diff --git a/guest/junit5-example/pom.xml b/guest/junit5-example/pom.xml new file mode 100644 index 0000000000..aec7f9228a --- /dev/null +++ b/guest/junit5-example/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + junit5-example + junit5-example + 0.0.1-SNAPSHOT + + + + org.junit.jupiter + junit-jupiter-engine + 5.0.0-M4 + + + org.junit.jupiter + junit-jupiter-params + 5.0.0-M4 + + + + org.junit.vintage + junit-vintage-engine + 4.12.0-M4 + + + + com.h2database + h2 + 1.4.195 + + + + org.apache.logging.log4j + log4j-core + 2.8.2 + + + + + + + + maven-compiler-plugin + 3.5 + + 1.8 + 1.8 + + + + maven-surefire-plugin + 2.19.1 + + + org.junit.platform + junit-platform-surefire-provider + 1.0.0-M4 + + + + + math + + + + + + \ No newline at end of file diff --git a/guest/junit5-example/src/main/java/com/stackify/daos/UserDAO.java b/guest/junit5-example/src/main/java/com/stackify/daos/UserDAO.java new file mode 100644 index 0000000000..091d077ef6 --- /dev/null +++ b/guest/junit5-example/src/main/java/com/stackify/daos/UserDAO.java @@ -0,0 +1,141 @@ +package com.stackify.daos; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.stackify.models.User; +import com.stackify.utils.ConnectionUtil; + +public class UserDAO { + + private Logger logger = LogManager.getLogger(UserDAO.class); + + public void createTable() { + try (Connection con = ConnectionUtil.getConnection()) { + String createQuery = "CREATE TABLE users(email varchar(50) primary key, name varchar(50))"; + PreparedStatement pstmt = con.prepareStatement(createQuery); + + pstmt.execute(); + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + + } + + public void add(User user) { + try (Connection con = ConnectionUtil.getConnection()) { + + String insertQuery = "INSERT INTO users(email,name) VALUES(?,?)"; + PreparedStatement pstmt = con.prepareStatement(insertQuery); + pstmt.setString(1, user.getEmail()); + pstmt.setString(2, user.getName()); + + pstmt.executeUpdate(); + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + } + + public void update(User user) { + try (Connection con = ConnectionUtil.getConnection()) { + + String updateQuery = "UPDATE users SET name=? WHERE email=?"; + PreparedStatement pstmt = con.prepareStatement(updateQuery); + pstmt.setString(1, user.getName()); + pstmt.setString(2, user.getEmail()); + + pstmt.executeUpdate(); + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + } + + public void delete(User user) { + try (Connection con = ConnectionUtil.getConnection()) { + + String deleteQuery = "DELETE FROM users WHERE email=?"; + PreparedStatement pstmt = con.prepareStatement(deleteQuery); + pstmt.setString(1, user.getEmail()); + + pstmt.executeUpdate(); + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + } + + public void delete(String email) { + try (Connection con = ConnectionUtil.getConnection()) { + + String deleteQuery = "DELETE FROM users WHERE email=?"; + PreparedStatement pstmt = con.prepareStatement(deleteQuery); + pstmt.setString(1, email); + + pstmt.executeUpdate(); + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + } + + public User findOne(String email) { + User user = null; + + try (Connection con = ConnectionUtil.getConnection()) { + String query = "SELECT * FROM users WHERE email=?"; + PreparedStatement pstmt = con.prepareStatement(query); + pstmt.setString(1, email); + + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + user = new User(); + user.setEmail(rs.getString("email")); + user.setName(rs.getString("name")); + } + + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + + return user; + } + + public List findAll() { + List users = new ArrayList<>(); + + try (Connection con = ConnectionUtil.getConnection()) { + String query = "SELECT * FROM users"; + PreparedStatement pstmt = con.prepareStatement(query); + + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + User user = new User(); + user.setEmail(rs.getString("email")); + user.setName(rs.getString("name")); + users.add(user); + } + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + + return users; + } + + public void deleteAll() { + try (Connection con = ConnectionUtil.getConnection()) { + + String deleteQuery = "DELETE FROM users"; + PreparedStatement pstmt = con.prepareStatement(deleteQuery); + + pstmt.executeUpdate(); + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + } + +} diff --git a/guest/junit5-example/src/main/java/com/stackify/models/User.java b/guest/junit5-example/src/main/java/com/stackify/models/User.java new file mode 100644 index 0000000000..d6951102a7 --- /dev/null +++ b/guest/junit5-example/src/main/java/com/stackify/models/User.java @@ -0,0 +1,63 @@ +package com.stackify.models; + +public class User { + private String email; + private String name; + + public User() { + } + + public User(String email, String name) { + super(); + this.email = email; + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((email == null) ? 0 : email.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + User other = (User) obj; + if (email == null) { + if (other.email != null) + return false; + } else if (!email.equals(other.email)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + +} diff --git a/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironment.java b/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironment.java new file mode 100644 index 0000000000..2c1fa80f2e --- /dev/null +++ b/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironment.java @@ -0,0 +1,15 @@ +package com.stackify.test.conditions; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +@Target({ ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@ExtendWith(DisabledOnEnvironmentCondition.class) +public @interface DisabledOnEnvironment { + String[] value(); +} \ No newline at end of file diff --git a/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironmentCondition.java b/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironmentCondition.java new file mode 100644 index 0000000000..adb9d9c09e --- /dev/null +++ b/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironmentCondition.java @@ -0,0 +1,38 @@ +package com.stackify.test.conditions; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Optional; +import java.util.Properties; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.TestExecutionCondition; +import org.junit.jupiter.api.extension.TestExtensionContext; +import org.junit.platform.commons.support.AnnotationSupport; + +import com.stackify.utils.ConnectionUtil; + +public class DisabledOnEnvironmentCondition implements TestExecutionCondition { + + @Override + public ConditionEvaluationResult evaluate(TestExtensionContext context) { + Properties props = new Properties(); + String env = ""; + try { + props.load(ConnectionUtil.class.getResourceAsStream("/application.properties")); + env = props.getProperty("env"); + } catch (IOException e) { + e.printStackTrace(); + } + Optional disabled = AnnotationSupport.findAnnotation(context.getElement().get(), DisabledOnEnvironment.class); + if (disabled.isPresent()) { + String[] envs = disabled.get().value(); + if (Arrays.asList(envs).contains(env)) { + return ConditionEvaluationResult.disabled("Disabled on environment " + env); + } + } + + return ConditionEvaluationResult.enabled("Enabled on environment "+env); + } + +} diff --git a/guest/junit5-example/src/main/java/com/stackify/utils/ConnectionUtil.java b/guest/junit5-example/src/main/java/com/stackify/utils/ConnectionUtil.java new file mode 100644 index 0000000000..bcfe5058a7 --- /dev/null +++ b/guest/junit5-example/src/main/java/com/stackify/utils/ConnectionUtil.java @@ -0,0 +1,38 @@ +package com.stackify.utils; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class ConnectionUtil { + + private static Logger logger = LogManager.getLogger(ConnectionUtil.class); + + public static Connection getConnection() { + try { + Properties props = new Properties(); + props.load(ConnectionUtil.class.getResourceAsStream("jdbc.properties")); + Class.forName(props.getProperty("jdbc.driver")); + Connection con = DriverManager.getConnection(props.getProperty("jdbc.url"), props.getProperty("jdbc.user"), props.getProperty("jdbc.password")); + return con; + } + + catch (FileNotFoundException exc) { + logger.error(exc.getMessage()); + } catch (IOException exc) { + logger.error(exc.getMessage()); + } catch (ClassNotFoundException exc) { + logger.error(exc.getMessage()); + } catch (SQLException exc) { + logger.error(exc.getMessage()); + } + return null; + } + +} diff --git a/guest/junit5-example/src/main/resources/application.properties b/guest/junit5-example/src/main/resources/application.properties new file mode 100644 index 0000000000..601f964ff3 --- /dev/null +++ b/guest/junit5-example/src/main/resources/application.properties @@ -0,0 +1 @@ +env=dev \ No newline at end of file diff --git a/guest/junit5-example/src/main/resources/com/stackify/utils/jdbc.properties b/guest/junit5-example/src/main/resources/com/stackify/utils/jdbc.properties new file mode 100644 index 0000000000..2d9a39b157 --- /dev/null +++ b/guest/junit5-example/src/main/resources/com/stackify/utils/jdbc.properties @@ -0,0 +1,4 @@ +jdbc.driver=org.h2.Driver +jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1 +jdbc.user= +jdbc.password= \ No newline at end of file diff --git a/guest/junit5-example/src/main/resources/log4j2.xml b/guest/junit5-example/src/main/resources/log4j2.xml new file mode 100644 index 0000000000..602b5ab490 --- /dev/null +++ b/guest/junit5-example/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/guest/junit5-example/src/test/java/com/stackify/test/DatabaseConnectionTest.java b/guest/junit5-example/src/test/java/com/stackify/test/DatabaseConnectionTest.java new file mode 100644 index 0000000000..d8f13b5715 --- /dev/null +++ b/guest/junit5-example/src/test/java/com/stackify/test/DatabaseConnectionTest.java @@ -0,0 +1,19 @@ +package com.stackify.test; + +import java.sql.Connection; + +import org.junit.jupiter.api.Test; + +import com.stackify.utils.ConnectionUtil; + +import static org.junit.jupiter.api.Assertions.*; + +public interface DatabaseConnectionTest { + + @Test + default void testDatabaseConnection() { + Connection con = ConnectionUtil.getConnection(); + assertNotNull(con); + } + +} diff --git a/guest/junit5-example/src/test/java/com/stackify/test/DynamicTests.java b/guest/junit5-example/src/test/java/com/stackify/test/DynamicTests.java new file mode 100644 index 0000000000..39b3b5aac5 --- /dev/null +++ b/guest/junit5-example/src/test/java/com/stackify/test/DynamicTests.java @@ -0,0 +1,38 @@ +package com.stackify.test; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import org.junit.jupiter.api.function.ThrowingConsumer; + +import com.stackify.daos.UserDAO; +import com.stackify.models.User; + +public class DynamicTests { + + @TestFactory + public Collection dynamicTestCollection() { + return Arrays.asList(DynamicTest.dynamicTest("Dynamic Test", () -> assertTrue(1 == 1))); + } + + @TestFactory + public Stream dynamicUserTestCollection() { + List inputList = Arrays.asList(new User("john@yahoo.com", "John"), new User("ana@yahoo.com", "Ana")); + + Function displayNameGenerator = (input) -> "Saving user: " + input; + + UserDAO userDAO = new UserDAO(); + ThrowingConsumer testExecutor = (input) -> { + userDAO.add(input); + assertNotNull(userDAO.findOne(input.getEmail())); + }; + + return DynamicTest.stream(inputList.iterator(), displayNameGenerator, testExecutor); + } +} diff --git a/guest/junit5-example/src/test/java/com/stackify/test/IncrementTest.java b/guest/junit5-example/src/test/java/com/stackify/test/IncrementTest.java new file mode 100644 index 0000000000..a23a5bf20b --- /dev/null +++ b/guest/junit5-example/src/test/java/com/stackify/test/IncrementTest.java @@ -0,0 +1,25 @@ +package com.stackify.test; + +import static org.junit.jupiter.api.Assertions.*; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.RepeatedTest; +import org.junit.jupiter.api.RepetitionInfo; + +public class IncrementTest { + + private static Logger logger = LogManager.getLogger(IncrementTest.class); + + @BeforeEach + public void increment() { + logger.info("Before Each Test"); + } + + @RepeatedTest(value = 3, name = RepeatedTest.SHORT_DISPLAY_NAME) + public void test(RepetitionInfo info) { + assertTrue(1 == 1); + logger.info("Repetition #" + info.getCurrentRepetition()); + } +} diff --git a/guest/junit5-example/src/test/java/com/stackify/test/TaggedTest.java b/guest/junit5-example/src/test/java/com/stackify/test/TaggedTest.java new file mode 100644 index 0000000000..db3c38ceac --- /dev/null +++ b/guest/junit5-example/src/test/java/com/stackify/test/TaggedTest.java @@ -0,0 +1,16 @@ +package com.stackify.test; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +@Tag("math") +public class TaggedTest { + + @Test + @Tag("arithmetic") + public void testEquals() { + assertTrue(1 == 1); + } + +} diff --git a/guest/junit5-example/src/test/java/com/stackify/test/UsersTest.java b/guest/junit5-example/src/test/java/com/stackify/test/UsersTest.java new file mode 100644 index 0000000000..88958a8232 --- /dev/null +++ b/guest/junit5-example/src/test/java/com/stackify/test/UsersTest.java @@ -0,0 +1,155 @@ +package com.stackify.test; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assumptions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.stackify.daos.UserDAO; +import com.stackify.models.User; + +import com.stackify.test.conditions.DisabledOnEnvironment; + +public class UsersTest implements DatabaseConnectionTest { + + private static UserDAO userDAO; + + private static Logger logger = LogManager.getLogger(UsersTest.class); + + @BeforeAll + public static void addData() { + userDAO = new UserDAO(); + userDAO.createTable(); + + User user1 = new User("john@gmail.com", "John"); + User user2 = new User("ana@gmail.com", "Ana"); + userDAO.add(user1); + userDAO.add(user2); + } + + @Test + @DisplayName("Test Get Users") + public void testGetUsersNumber() { + assertEquals(2, userDAO.findAll().size()); + + } + + @Test + @DisplayName("Test Get Users") + public void testGetUsersNumberWithInfo(TestInfo testInfo) { + assertEquals(2, userDAO.findAll().size()); + assertEquals("Test Get Users", testInfo.getDisplayName()); + assertEquals(UsersTest.class, testInfo.getTestClass().get()); + logger.info("Running test method:" + testInfo.getTestMethod().get().getName()); + } + + @Test + public void testGetUser() { + User user = userDAO.findOne("john@gmail.com"); + assertEquals("John", user.getName(), "User name:" + user.getName() + " incorrect"); + } + + @Test + public void testClassicAssertions() { + User user1 = userDAO.findOne("john@gmail.com"); + User user2 = userDAO.findOne("john@yahoo.com"); + + assertNotNull(user1); + assertNull(user2); + + user2 = new User("john@yahoo.com", "John"); + assertEquals(user1.getName(), user2.getName(), "Names are not equal"); + assertFalse(user1.getEmail().equals(user2.getEmail()), "Emails are equal"); + assertNotSame(user1, user2); + } + + @Test + @Disabled + public void testGroupedAssertions() { + User user = userDAO.findOne("john@gmail.com"); + assertAll("user", () -> assertEquals("Johnson", user.getName()), () -> assertEquals("johnson@gmail.com", user.getEmail())); + } + + @Test + public void testIterableEquals() { + User user1 = new User("john@gmail.com", "John"); + User user2 = new User("ana@gmail.com", "Ana"); + + List users = new ArrayList<>(); + users.add(user1); + users.add(user2); + + assertIterableEquals(users, userDAO.findAll()); + } + + @Test + public void testLinesMatch() { + List expectedLines = Collections.singletonList("(.*)@(.*)"); + List emails = Arrays.asList("john@gmail.com"); + assertLinesMatch(expectedLines, emails); + } + + @Test + void testThrows() { + User user = null; + Exception exception = assertThrows(NullPointerException.class, () -> user.getName()); + logger.info(exception.getMessage()); + } + + @Test + @DisabledOnEnvironment({ "dev", "prod") + void testFail() { + fail("this test fails"); + } + + @Test + void testAssumptions() { + List users = userDAO.findAll(); + assumeFalse(users == null); + assumeTrue(users.size() > 0); + + User user1 = new User("john@gmail.com", "John"); + + assumingThat(users.contains(user1), () -> assertTrue(users.size() > 1)); + } + + @ParameterizedTest + @ValueSource(strings = { "john@gmail.com", "ana@gmail.com" }) + public void testParameterized(String email) { + assertNotNull(userDAO.findOne(email)); + } + + @AfterAll + public static void removeData() { + userDAO.deleteAll(); + } + + @Nested + class DeleteUsersTest { + @Test + public void addUser() { + User user = new User("bob@gmail.com", "Bob"); + userDAO.add(user); + assertNotNull(userDAO.findOne("bob@gmail.com")); + + userDAO.delete("bob@gmail.com"); + assertNull(userDAO.findOne("bob@gmail.com")); + } + } + +} diff --git a/guest/memory-leaks/pom.xml b/guest/memory-leaks/pom.xml new file mode 100644 index 0000000000..eada59c5a1 --- /dev/null +++ b/guest/memory-leaks/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + com.baeldung + memory-leaks + 0.0.1-SNAPSHOT + + + + junit + junit + 4.12 + + + + + + + src/main/resources/ + + **/*.java + + + + src/test/resources/ + + + + + maven-compiler-plugin + 3.5 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/guest/memory-leaks/src/test/java/com/baeldung/Key.java b/guest/memory-leaks/src/test/java/com/baeldung/Key.java new file mode 100644 index 0000000000..6ae2fe7fcf --- /dev/null +++ b/guest/memory-leaks/src/test/java/com/baeldung/Key.java @@ -0,0 +1,11 @@ +package com.baeldung; + +public class Key { + + public static String key; + + public Key(String key) { + Key.key = key; + } + +} diff --git a/guest/memory-leaks/src/test/java/com/baeldung/MemoryLeaksTest.java b/guest/memory-leaks/src/test/java/com/baeldung/MemoryLeaksTest.java new file mode 100644 index 0000000000..a8a094b4db --- /dev/null +++ b/guest/memory-leaks/src/test/java/com/baeldung/MemoryLeaksTest.java @@ -0,0 +1,98 @@ +//package com.baeldung; +// +//import java.io.BufferedReader; +//import java.io.File; +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.InputStreamReader; +//import java.net.URISyntaxException; +//import java.net.URL; +//import java.net.URLConnection; +//import java.nio.charset.StandardCharsets; +//import java.nio.file.Files; +//import java.nio.file.Paths; +//import java.nio.file.StandardOpenOption; +//import java.util.ArrayList; +//import java.util.Map; +//import java.util.Random; +//import java.util.Scanner; +// +//import org.junit.FixMethodOrder; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.junit.runners.JUnit4; +//import org.junit.runners.MethodSorters; +// +//@FixMethodOrder(MethodSorters.NAME_ASCENDING) +//@RunWith(JUnit4.class) +//public class MemoryLeaksTest { +// private Random random = new Random(); +// public static final ArrayList list = new ArrayList(1000000); +// +// @Test +// public void givenStaticField_whenLotsOfOperations_thenMemoryLeak() throws InterruptedException { +// for (int i = 0; i < 1000000; i++) { +// list.add(random.nextDouble()); +// } +// System.gc(); +// Thread.sleep(10000); //to allow GC do its job +// } +// +// +// @Test +// public void givenNormalField_whenLotsOfOperations_thenGCWorksFine() throws InterruptedException { +// addElementsToTheList(); +// System.gc(); +// Thread.sleep(10000); //to allow GC do its job +// } +// +// private void addElementsToTheList(){ +// ArrayList list = new ArrayList(1000000); +// for (int i = 0; i < 1000000; i++) { +// list.add(random.nextDouble()); +// } +// } +// +// @SuppressWarnings({ "resource" }) +// @Test(expected = OutOfMemoryError.class) +// public void givenLengthString_whenIntern_thenOutOfMemory() throws IOException, InterruptedException { +// Thread.sleep(15000); +// String str = new Scanner(new File("src/test/resources/large.txt"), "UTF-8").useDelimiter("\\A") +// .next(); +// System.gc(); +// str.intern(); +// Thread.sleep(10000); +// } +// +// @Test(expected = OutOfMemoryError.class) +// public void givenURL_whenUnclosedStream_thenOutOfMemory() throws IOException, URISyntaxException { +// String str = ""; +// URLConnection conn = new URL("http:norvig.com/big.txt").openConnection(); +// BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); +// while (br.readLine() != null) { +// str += br.readLine(); +// } +// Files.write(Paths.get("src/main/resources/"), str.getBytes(), StandardOpenOption.CREATE); +// } +// +// @SuppressWarnings("unused") +// @Test(expected = OutOfMemoryError.class) +// public void givenConnection_whenUnclosed_thenOutOfMemory() throws IOException, URISyntaxException { +// URL url = new URL("ftp:speedtest.tele2.net"); +// URLConnection urlc = url.openConnection(); +// InputStream is = urlc.getInputStream(); +// String str = ""; +// while (true) { +// str += is.toString() +// .intern(); +// } +// } +// +// @Test(expected = OutOfMemoryError.class) +// public void givenMap_whenNoEqualsNoHashCodeMethods_thenOutOfMemory() throws IOException, URISyntaxException { +// Map map = System.getProperties(); +// while (true) { +// map.put(new Key("key"), "value"); +// } +// } +//} diff --git a/guest/memory-leaks/src/test/resources/large.txt b/guest/memory-leaks/src/test/resources/large.txt new file mode 100644 index 0000000000..8807f07143 --- /dev/null +++ b/guest/memory-leaks/src/test/resources/large.txt @@ -0,0 +1,5391 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ut nisi neque. Proin faucibus scelerisque odio vel vulputate. Maecenas vel urna pharetra velit faucibus vehicula. Nullam lobortis orci orci, non tempus justo faucibus lacinia. Aenean sodales nulla in lorem fringilla, eu vulputate tortor sodales. Vestibulum ut libero vitae leo imperdiet posuere. Integer nec nisl diam. Vivamus non massa scelerisque, congue tortor ut, aliquet nibh. Nulla pretium ex mi, vel elementum arcu vulputate eget. Suspendisse non bibendum lectus. Quisque et sapien sit amet sem dignissim efficitur vel at magna. Maecenas imperdiet, nunc a congue maximus, felis tellus finibus augue, vel porttitor velit velit in lectus. Duis euismod malesuada volutpat. + +Nunc a vulputate eros, non volutpat mauris. Nam lobortis, magna ac posuere venenatis, dui neque vulputate purus, ac semper nisi justo lobortis ipsum. Donec fringilla dignissim magna, quis rutrum velit pellentesque non. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris vel felis imperdiet, convallis odio a, commodo leo. Nulla facilisi. In hendrerit ligula lectus, quis molestie leo congue et. Duis elementum suscipit est quis consequat. Pellentesque magna urna, accumsan eget porta sed, elementum nec enim. Nulla et risus accumsan sapien ultrices ultricies. Aliquam facilisis vitae erat sit amet molestie. Vivamus sit amet metus malesuada ex laoreet tempor. Suspendisse quis varius lacus, ut lobortis urna. + +Duis et massa sapien. Duis quis purus vel nisi commodo ultricies quis id ipsum. Quisque vel nisi nec nunc egestas cursus non quis lacus. Nam dapibus convallis lacus eget lobortis. Pellentesque quis tellus tincidunt, gravida eros consectetur, accumsan ipsum. Pellentesque ipsum mi, posuere vitae urna vitae, accumsan eleifend dolor. Mauris tempus enim vel pretium pulvinar. Praesent eu diam tellus. Vestibulum cursus diam lorem, et consequat dolor aliquet ut. Sed ullamcorper nibh augue, a congue leo vehicula quis. Cras porttitor, magna eget aliquet vehicula, velit est convallis odio, quis varius sem risus eget est. Morbi molestie malesuada egestas. + +Pellentesque hendrerit lectus ligula, sed facilisis ipsum venenatis vitae. Praesent placerat et magna eu accumsan. Curabitur libero sem, egestas quis dui vel, vestibulum luctus arcu. Integer et efficitur eros. Sed venenatis suscipit ultricies. Integer at massa eu metus pretium pretium ac quis nunc. Praesent eget faucibus leo. Sed convallis mattis dictum. Suspendisse vel molestie dui. Integer blandit, risus eu interdum laoreet, ligula quam aliquam metus, at imperdiet nisl lacus id massa. Nunc sapien diam, mattis id justo sit amet, gravida tempor lorem. Quisque metus ex, varius ut elit vel, rutrum consequat magna. Donec efficitur nisl nec augue auctor, vel cursus quam dignissim. Vestibulum sit amet libero velit. + +Fusce vel fringilla orci. Duis ut hendrerit ligula. Mauris tristique libero non posuere tempor. Suspendisse commodo sodales felis, sit amet tempor nunc semper laoreet. Maecenas commodo diam vel bibendum gravida. In scelerisque sapien ut arcu placerat, et posuere nibh congue. Ut ullamcorper malesuada turpis in cursus. Donec auctor at massa non volutpat. Ut consectetur egestas purus, nec sodales eros euismod at. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In mattis leo tincidunt, volutpat ex maximus, placerat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas non maximus tortor. + +Morbi ullamcorper purus semper nisl vulputate, non fermentum augue posuere. Aenean ut ultrices sem. Aliquam erat volutpat. Pellentesque id odio lorem. Phasellus eget leo ante. Vivamus ac lacinia velit, quis eleifend nulla. Nulla magna turpis, scelerisque non sapien at, bibendum dictum diam. Pellentesque hendrerit nulla dictum velit pulvinar, eu volutpat leo venenatis. Duis egestas ut eros convallis ultrices. Mauris id nisi et leo maximus scelerisque ut sit amet dolor. Ut consectetur volutpat nibh ut luctus. Curabitur congue mauris et magna tempus, sit amet eleifend felis cursus. Pellentesque non augue vitae velit elementum imperdiet ut nec lacus. + +Nulla posuere enim vel velit vehicula, ut viverra quam luctus. Integer dapibus tincidunt nisl ut fringilla. Nullam sodales mattis tincidunt. Mauris non metus sed risus condimentum tristique quis ut mi. Vivamus vitae nisl lorem. Morbi vehicula malesuada ipsum, eu feugiat sapien vulputate vitae. Sed ut magna augue. Pellentesque pharetra urna mauris, eget tincidunt turpis finibus non. Sed ullamcorper purus a nunc convallis tristique. Phasellus nec tristique metus. Mauris tristique neque dolor, id feugiat arcu pulvinar ut. Aenean justo nunc, euismod nec quam quis, porttitor lacinia neque. Nam diam tellus, hendrerit a neque vel, efficitur dictum ante. Integer ut leo leo. Curabitur viverra quis sem vel tempor. Maecenas in elementum elit. + +Nullam ut nulla non lectus aliquet aliquet vel ut leo. Morbi at dui mauris. Mauris in posuere turpis. Donec lectus justo, porta egestas rhoncus at, tristique vitae sapien. Curabitur hendrerit convallis mattis. Ut at nunc ac mi sodales lacinia ut sit amet nisi. Sed ac felis nec est ornare aliquam. In congue quam leo. Sed aliquam sit amet felis a tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur vitae augue vitae leo aliquet elementum. Suspendisse facilisis nisi id enim placerat cursus. + +Maecenas nec tincidunt elit. Curabitur faucibus elit a ex pretium, at pretium leo tincidunt. Duis rutrum, nunc nec iaculis malesuada, ligula purus scelerisque est, id rutrum justo tellus a eros. Nulla quis nulla dictum, blandit sapien eu, tincidunt sem. Curabitur vestibulum, mi in ultricies auctor, purus tortor semper lacus, at suscipit sem ex at nisl. Integer hendrerit lacinia nibh, tristique blandit lacus pellentesque eget. In tempor ut nunc ut pharetra. Sed pellentesque semper euismod. Suspendisse sit amet mauris vitae tortor dapibus mattis. Phasellus at rhoncus ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque pretium malesuada tellus, tincidunt iaculis ligula tincidunt quis. Sed eu nisi non massa vulputate semper id id lorem. Praesent ut leo lacus. + +Sed sed facilisis erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet dui hendrerit, efficitur justo nec, faucibus orci. Vestibulum tempor nec diam in vestibulum. Nullam eu lorem ut diam sagittis consequat malesuada nec massa. Mauris mollis ante at lacinia fringilla. Praesent cursus diam vel congue hendrerit. Fusce in suscipit tortor. + +Aenean laoreet, nisi a efficitur placerat, tellus felis rhoncus dui, id lobortis felis libero eget mauris. Praesent a mi erat. Phasellus auctor tristique viverra. Phasellus sem felis, sodales ac sem vitae, pharetra varius urna. In ultrices scelerisque magna eget varius. Etiam volutpat ornare rutrum. Maecenas vel porttitor elit. In at iaculis ipsum, vel euismod justo. Etiam molestie lectus elit, hendrerit aliquam quam dictum sit amet. Sed eu nibh mauris. + +Sed congue mauris nulla. Duis lacus quam, facilisis in fermentum eget, elementum nec sapien. Fusce diam augue, ornare rutrum tincidunt sed, lacinia id tortor. Nam in nunc enim. Praesent cursus, lorem dignissim dictum malesuada, odio quam auctor libero, nec dapibus lectus nibh non tortor. Integer sed semper sapien. Mauris velit ex, aliquet sit amet vehicula vel, euismod ut tortor. Curabitur eget iaculis sapien, in mattis enim. Phasellus elit turpis, facilisis vel erat et, viverra laoreet lorem. Morbi a egestas est. Integer mi magna, condimentum sit amet commodo quis, placerat sed nisi. Maecenas tempus, odio ac ultrices faucibus, purus diam auctor neque, eget malesuada nibh nisi at mauris. Etiam luctus, sem non viverra pretium, leo augue viverra orci, et finibus enim erat vitae lorem. Proin iaculis nulla suscipit lobortis vulputate. + +Morbi mauris urna, posuere at finibus vitae, lacinia in nibh. Duis vel lectus eu metus placerat vehicula vel ac est. Quisque dapibus consectetur vulputate. In hac habitasse platea dictumst. Integer vel sagittis turpis, eget egestas ex. Quisque maximus lacinia orci, id viverra nisl auctor quis. Maecenas semper vestibulum ornare. Ut id neque tincidunt, efficitur turpis fermentum, commodo tortor. Cras luctus sed arcu et porta. Nunc at enim fringilla, pulvinar nibh et, venenatis magna. Sed at porta tellus, cursus fringilla sapien. Mauris feugiat ipsum ex, non fermentum magna pulvinar eu. Fusce a condimentum justo. Nam sit amet mi vitae purus consectetur rhoncus. Suspendisse molestie ipsum id tellus malesuada mollis. + +Vivamus sed eros eget turpis tincidunt iaculis. Nam at quam a odio tincidunt pharetra a sit amet sem. Mauris scelerisque tempus maximus. Ut iaculis mi eget mi ultricies, eu vulputate eros rhoncus. Nulla consectetur faucibus dolor, ac euismod enim semper rhoncus. Proin aliquet scelerisque dolor, ac auctor urna posuere ut. Fusce non mi vehicula, aliquam nulla nec, luctus felis. Cras vitae sapien quis metus auctor aliquet et molestie turpis. Aliquam enim mauris, feugiat feugiat pellentesque non, aliquam vel nulla. Curabitur luctus sem vel molestie feugiat. Fusce sed felis tincidunt diam pulvinar faucibus. Nulla rutrum, justo eleifend convallis laoreet, dolor nisi placerat leo, at cursus nisl metus sed magna. Fusce eu metus velit. Cras accumsan leo quis arcu sollicitudin luctus. Nulla facilisi. + +In hac habitasse platea dictumst. Nulla facilisi. Integer gravida orci porttitor, sollicitudin nisi nec, commodo nisi. Donec finibus convallis augue, eu ultricies lorem consequat non. Nunc fermentum odio ut tellus sollicitudin, eget rhoncus enim lobortis. Aliquam a blandit arcu, eget maximus nulla. Nullam non sem nibh. Aenean cursus fermentum lectus sed commodo. Aenean sodales vestibulum sem. Nullam sodales a nibh vitae ullamcorper. Phasellus placerat ac mi ac blandit. Ut vehicula sodales orci, vel vestibulum dolor aliquam quis. + +Etiam ultrices purus eget semper tincidunt. Nunc quis nisl id nibh pellentesque congue. Morbi ultricies fermentum mauris sit amet sodales. Quisque porttitor, quam ac ultricies tempor, turpis felis tempor felis, rhoncus vehicula arcu justo sagittis est. Vivamus semper nulla mauris, et condimentum nisl pharetra ut. Nam sed euismod nunc. Etiam tortor tortor, aliquam vel nibh et, hendrerit volutpat tellus. Morbi purus massa, maximus sit amet scelerisque ac, lacinia vitae erat. Cras interdum consequat turpis nec rutrum. Donec molestie odio fringilla viverra interdum. Mauris id orci gravida lacus finibus commodo. Nullam risus arcu, dignissim eu aliquet eu, faucibus at diam. Suspendisse at ligula a ipsum aliquam iaculis ac vitae tellus. Curabitur et tempor quam. + +Maecenas quis risus aliquet, pretium sem ac, condimentum ex. Praesent eleifend, ex at pretium pharetra, elit arcu rhoncus urna, eget hendrerit nunc elit vel mauris. Praesent suscipit augue vel urna sagittis, et tempus tortor tempus. In ultricies sagittis sapien nec commodo. Cras nec venenatis eros. Nunc iaculis urna at urna mollis sagittis. Cras sed turpis sit amet orci semper dignissim id id enim. Morbi sed ornare felis, quis egestas tellus. Cras eget diam quis dolor molestie pulvinar. Fusce ut dui at tortor condimentum porttitor. Nulla nisi diam, malesuada vitae vestibulum a, fringilla ut felis. + +Fusce efficitur porta enim, nec semper justo ornare et. Pellentesque ultricies tellus ac turpis interdum commodo. Aliquam erat volutpat. Vivamus rhoncus turpis et nulla tempor gravida. Donec varius eros ac dolor blandit, ut iaculis ipsum ultrices. Suspendisse at maximus massa, ut elementum est. Suspendisse interdum est at tristique volutpat. Etiam varius dui vitae enim elementum ullamcorper a vel arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam metus sem, iaculis quis lectus sit amet, semper aliquet ligula. Ut bibendum nisi nec turpis ornare facilisis. Morbi pharetra eros tincidunt orci feugiat, ac tempus ligula elementum. Nulla facilisi. Nam dignissim tellus id dolor vestibulum convallis. Donec vitae sapien vitae lacus tempus accumsan ac et diam. Phasellus sit amet euismod magna. + +Maecenas tortor turpis, egestas sit amet pharetra in, dignissim vel sapien. Fusce finibus vel nisi sed lacinia. Integer maximus est vel lectus aliquet consequat. Maecenas dictum neque non enim dictum suscipit. Vestibulum lacinia, urna sit amet consequat mattis, nisi enim interdum leo, eget convallis odio mauris vel risus. Suspendisse vel tempor est. Nullam a scelerisque mauris. Maecenas id sagittis urna. Donec non turpis sed mauris feugiat rhoncus eu id leo. Duis porttitor sodales eros, ac sollicitudin eros luctus ac. Proin et libero malesuada, facilisis ligula non, gravida lorem. Maecenas a euismod arcu. + +Etiam fringilla eros ante, vitae imperdiet erat eleifend ut. Phasellus eget lectus augue. Ut magna elit, laoreet non cursus ut, rutrum vitae est. Morbi eu libero sit amet lorem euismod pretium. Quisque finibus iaculis tincidunt. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut luctus, elit id pulvinar bibendum, erat lectus lacinia lacus, eget condimentum diam diam a ligula. Morbi sit amet nunc nisi. Praesent rhoncus congue enim vel eleifend. Aenean vel mattis nisi. + +Aliquam dictum euismod suscipit. Etiam eu tellus et metus laoreet fringilla. Suspendisse potenti. Praesent feugiat, lacus sit amet dictum dignissim, nibh neque volutpat ex, eu malesuada arcu neque in mauris. Mauris tincidunt velit eu sapien convallis, nec facilisis ligula volutpat. Morbi interdum imperdiet gravida. Praesent sapien diam, vulputate et tempor sit amet, interdum ut erat. Vestibulum vel lacus consequat, vestibulum velit quis, vulputate dolor. Proin pellentesque gravida fermentum. Fusce risus felis, ullamcorper quis nibh ac, elementum placerat est. + +Quisque risus mi, ultricies non eleifend ut, mattis eu justo. Praesent eu sapien turpis. Integer imperdiet non nisi ac fermentum. Maecenas ornare erat nec vulputate dapibus. Mauris sollicitudin velit id tortor commodo, eu feugiat metus sodales. Fusce aliquet felis non dolor ullamcorper, id auctor purus pharetra. Phasellus at vehicula ipsum, in faucibus elit. In vitae turpis mauris. + +Vestibulum maximus risus ac vestibulum ultricies. Maecenas mattis ipsum vel eros malesuada sodales. Proin aliquam odio in turpis luctus scelerisque. Cras pretium sodales justo sed dignissim. Quisque eu pretium lorem, vel dignissim ex. Duis placerat mattis turpis et elementum. Suspendisse ac tincidunt odio. Vivamus non nulla vitae purus egestas porttitor. Ut at erat vitae est mollis bibendum. Praesent porttitor iaculis velit non mollis. Vestibulum sed varius mauris, ac pulvinar erat. Aliquam porttitor ac elit vehicula congue. Vestibulum nec quam at massa auctor eleifend quis ac nulla. Quisque aliquam, risus sed pulvinar viverra, orci ligula eleifend augue, at eleifend urna neque eu mi. Donec efficitur eu metus ac convallis. + +Sed vestibulum rutrum mattis. Vivamus a semper orci. Donec ut nulla id ante venenatis accumsan eget a augue. Suspendisse sollicitudin nulla sed nibh faucibus, tempor efficitur arcu bibendum. Maecenas nec mollis felis, vestibulum consequat leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque vel risus sapien. Etiam ligula libero, dignissim in sapien sit amet, malesuada volutpat dolor. Nam tincidunt eget lectus eget rutrum. Donec laoreet a velit nec vestibulum. Vestibulum scelerisque euismod imperdiet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ultricies laoreet lectus vel porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut egestas elit id urna feugiat ultricies eget at ex. + +Duis feugiat, ante in pulvinar commodo, nibh diam tincidunt lectus, sed ultrices purus neque fermentum neque. Curabitur lobortis, lorem mattis tempus eleifend, nibh urna facilisis sem, ut aliquam dui urna vel turpis. Quisque hendrerit lorem non commodo blandit. Vestibulum placerat nisl non dui congue, at porta nibh sollicitudin. Quisque ut nulla laoreet, tincidunt dolor quis, condimentum turpis. Integer gravida, mauris vel volutpat ornare, lacus neque egestas ante, a consequat dui felis et risus. Nulla ut fermentum lacus. + +Sed vitae enim sit amet ex pharetra aliquam. Nulla enim odio, ultrices sed sem gravida, faucibus commodo metus. Cras iaculis elit at lectus euismod, quis pretium ipsum sagittis. Cras tellus enim, ultrices a luctus et, tempor consectetur lorem. Vivamus in ullamcorper tortor, non tincidunt elit. Suspendisse magna quam, condimentum quis congue at, dignissim a libero. Donec dui libero, placerat ut neque in, suscipit rutrum urna. Praesent eu iaculis nulla, et dapibus ligula. Phasellus at metus dictum, sagittis erat in, tincidunt elit. Nulla facilisis quam lorem, eget finibus nibh condimentum sed. Quisque sit amet ipsum elit. Integer sed arcu sed dui faucibus hendrerit. + +Phasellus dapibus sem vitae malesuada tristique. Sed consectetur dui eu condimentum posuere. Aliquam quis pulvinar tellus. Mauris vel orci a quam ornare gravida vel et purus. Ut eleifend libero sem, ut commodo lectus suscipit eu. Nam tempor est eros, ut rutrum magna eleifend at. Mauris congue, nisi in convallis laoreet, diam odio iaculis augue, eu lacinia velit magna tempor nunc. + +Ut eu magna eu ligula porttitor aliquam et id felis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut sollicitudin, mauris vel maximus posuere, justo metus molestie nisi, et molestie erat magna ornare dui. Morbi tellus mauris, maximus quis tempor nec, convallis a enim. Nullam sit amet magna metus. Fusce a metus gravida, ullamcorper dolor id, vulputate nibh. Nulla tempus libero nec felis lobortis, in molestie nisi vulputate. Pellentesque blandit hendrerit ligula, vitae mollis diam dignissim sed. Suspendisse dignissim, lectus euismod egestas facilisis, nibh elit suscipit risus, quis sodales ipsum lorem non metus. Praesent ut aliquet ex. Nam odio risus, facilisis ac ligula ac, tempus suscipit ex. + +Sed mattis lobortis risus. Nullam convallis odio turpis, finibus pulvinar ex condimentum et. Maecenas metus nisi, ultrices ut bibendum eget, cursus sed metus. Sed venenatis dapibus commodo. Aenean vitae suscipit nisl. Sed lacinia vel est vestibulum faucibus. Pellentesque eu gravida ipsum. Donec lacinia, dolor eu egestas sodales, ligula arcu imperdiet erat, quis luctus justo dolor sed enim. Donec ornare ornare ullamcorper. Etiam convallis augue imperdiet elementum eleifend. Cras hendrerit diam magna, non blandit ligula hendrerit nec. Aliquam erat volutpat. In in arcu tincidunt, consequat purus nec, luctus odio. Ut dapibus efficitur ipsum id ornare. Morbi mattis est id libero interdum, et vestibulum enim gravida. + +Sed porta nunc nulla, sit amet pulvinar arcu cursus in. Morbi at augue lacus. Sed molestie mi nec imperdiet mollis. Fusce nibh massa, finibus id augue in, consequat cursus libero. In pharetra, urna eu aliquam auctor, lorem risus sollicitudin justo, nec tincidunt erat metus id metus. Fusce finibus libero justo, eu tincidunt lacus eleifend nec. In accumsan ex eros, eu blandit dui bibendum vitae. In ut est at tellus mattis feugiat at vitae nibh. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget odio nec justo cursus tristique quis ut mauris. Cras sit amet lectus diam. Praesent vitae dolor sem. Phasellus non justo nunc. Mauris accumsan lorem bibendum elit fermentum dapibus. Vivamus sagittis nisl quis pharetra dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse molestie molestie malesuada. In lacus elit, accumsan et mauris facilisis, consectetur dapibus metus. Curabitur tincidunt metus eros, at fringilla leo accumsan sed. Nulla ipsum enim, pellentesque vitae nunc vel, rutrum dapibus mauris. Sed vehicula scelerisque lacus in volutpat. Etiam ac ante vitae velit pretium varius eget vitae enim. Aenean at orci sed quam semper sodales sed ut lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; + +Aliquam elit nulla, tincidunt a ullamcorper quis, gravida ac nunc. Sed vitae suscipit ex. Pellentesque fermentum, nisl id dapibus pellentesque, nisl sem consectetur magna, at fringilla leo arcu ac odio. Maecenas ultrices ante felis, et iaculis urna condimentum id. Praesent sagittis ullamcorper lacus, id hendrerit nisi congue id. Fusce elit sem, porttitor nec ligula id, accumsan tempus nisi. Nam non semper arcu, facilisis egestas mauris. Ut pharetra ligula convallis orci hendrerit, id commodo quam pulvinar. In hac habitasse platea dictumst. Nulla tempor, orci in aliquet cursus, nunc urna imperdiet mi, eget condimentum purus nibh a augue. Vestibulum vehicula arcu sit amet rutrum elementum. Nam et lacus efficitur nisi auctor semper. Phasellus eget libero at nibh scelerisque ultricies vel quis justo. Cras eu risus nunc. + +Donec sit amet augue nec lectus molestie lacinia ut posuere ligula. Nunc mattis erat non nunc lobortis, ut sagittis purus convallis. Duis vel luctus risus, quis vestibulum sem. Suspendisse sit amet cursus dolor. Nulla dignissim mi ac ex feugiat, non pretium erat mattis. Ut ac vestibulum arcu. Curabitur rutrum facilisis dapibus. Praesent et porta dolor, vitae sagittis mi. Praesent ac metus vel lectus fringilla laoreet. Phasellus a ex ac dui pretium blandit. Cras sem quam, luctus non bibendum id, blandit eu ligula. Phasellus volutpat pharetra nisi ac mollis. + +Duis ultrices varius arcu non dictum. Nullam tortor libero, fermentum ac vehicula eu, tristique a lacus. Proin ut vestibulum purus. Ut sed ante congue leo blandit ultricies. Phasellus euismod vulputate felis, quis sodales mauris lobortis in. Donec eget elementum ante, quis porttitor ipsum. Praesent tristique lorem sit amet felis ornare accumsan. Donec vel sodales lorem. + +Phasellus mattis magna sapien, sed dignissim arcu faucibus vel. Nulla sollicitudin, ipsum non iaculis dignissim, est nulla ultrices magna, posuere tristique risus velit a erat. In convallis nisi vitae nunc rhoncus dictum. Sed vitae egestas ex. Nunc faucibus ullamcorper blandit. Nullam cursus, orci id rhoncus luctus, arcu nibh blandit quam, a lobortis ipsum erat sed justo. Phasellus porta sapien felis, sit amet scelerisque dolor pharetra eu. Aenean ullamcorper nibh a ipsum luctus iaculis. Mauris mollis magna ex, venenatis vulputate nisi vehicula at. Nullam fringilla nulla nec orci convallis, at hendrerit dolor vulputate. Vivamus porta quam ac justo sodales tempor. Donec rhoncus arcu eget lorem sagittis, eu tempus mauris luctus. + +Aenean hendrerit iaculis dui. Ut congue urna diam, a mattis neque euismod ut. Vestibulum ut scelerisque tortor. Donec semper tempor leo sed blandit. Fusce consectetur enim eu nisl cursus commodo. Morbi vehicula ex ac augue fermentum venenatis. Nam bibendum sem varius neque faucibus, at pellentesque est eleifend. Proin aliquet nibh mollis sapien aliquam, et lacinia nisi facilisis. Phasellus eget rhoncus arcu. Donec pharetra urna a scelerisque pretium. + +Cras commodo eu sapien eu commodo. Pellentesque ac ultrices orci. Aenean cursus velit ut orci dictum lacinia. Praesent commodo, mauris a fermentum ultrices, odio purus sollicitudin ex, et feugiat nunc libero eget erat. Donec quis libero odio. Nam fermentum mi enim, sed sollicitudin justo accumsan sit amet. Nulla sit amet eleifend nisi. Sed pretium eu eros ut tristique. Nam lobortis tellus et pellentesque aliquet. + +Nulla leo risus, auctor eget ultrices id, fringilla ut risus. Sed mauris lorem, blandit non pulvinar id, varius eget dui. Aliquam erat volutpat. Curabitur sit amet hendrerit purus, id vehicula ante. Proin nulla ipsum, pharetra sit amet rutrum id, dapibus sed enim. Integer ut neque id nulla mollis vehicula. Aenean bibendum finibus augue at ornare. Quisque sit amet interdum odio. In eu lorem enim. Pellentesque elementum elementum erat a dictum. Nam purus mauris, dictum fringilla lobortis non, suscipit in neque. Maecenas ullamcorper fringilla tellus, sit amet facilisis massa scelerisque tempus. In in aliquam urna. + +In efficitur iaculis eros, et finibus enim rutrum ac. Suspendisse porta cursus ex a accumsan. Mauris finibus, magna sed faucibus ultricies, dolor ante viverra velit, venenatis efficitur erat nisl eu tortor. Maecenas quis magna leo. Proin imperdiet massa ac justo luctus sodales. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc blandit varius porttitor. Ut luctus enim id massa blandit semper. + +Mauris pretium, erat vitae feugiat maximus, risus purus scelerisque ligula, at elementum massa tortor vel lacus. Donec aliquam justo sit amet libero blandit, eu condimentum dolor condimentum. Fusce semper elit at lorem mattis fermentum. Nunc dapibus nulla eu semper tristique. Cras et maximus urna. Sed porttitor et quam a pretium. Vivamus condimentum dolor sit amet placerat porta. Pellentesque in velit porttitor, laoreet sem sed, pellentesque enim. Ut nec elit metus. In hac habitasse platea dictumst. Phasellus ex ipsum, faucibus quis vulputate eget, dapibus vel mi. Nullam eros erat, facilisis nec lacus nec, rutrum porttitor lacus. + +Pellentesque rutrum nisi sed augue ornare aliquam. Vestibulum convallis, magna nec aliquam facilisis, leo elit auctor lorem, placerat tincidunt turpis elit et orci. Curabitur eget consequat nisi, quis imperdiet metus. Quisque dapibus metus sed luctus accumsan. Donec at rhoncus neque. Cras mollis sagittis iaculis. Donec efficitur lorem et ante cursus, quis consectetur risus commodo. Nunc euismod turpis non gravida lacinia. Nullam tincidunt magna eget pretium laoreet. Aliquam in odio in massa interdum dapibus. Nullam eu auctor nibh. Suspendisse eget porttitor ante. Sed fermentum commodo pulvinar. Fusce dictum, mi eget venenatis tempor, est erat scelerisque lacus, in semper eros mauris dignissim diam. In porta, arcu laoreet dictum finibus, ligula leo cursus ante, a euismod enim sem quis augue. + +Nullam vitae ex risus. Ut pretium tempus ligula. Nullam eu orci turpis. Aenean commodo urna at lacus tristique lobortis. Nulla dolor felis, interdum id magna non, lacinia posuere mauris. Cras et est sed arcu pharetra dictum. Mauris leo lacus, malesuada sollicitudin vestibulum at, placerat non ante. Fusce suscipit, lacus vel lobortis posuere, nisi elit porta massa, et egestas ligula turpis ullamcorper justo. Morbi sit amet lectus porttitor, aliquam eros at, interdum neque. Aliquam finibus diam pulvinar consectetur eleifend. Etiam libero ante, varius in mi sed, condimentum bibendum leo. Donec elementum congue malesuada. Etiam et diam vel eros semper egestas. + +In hac habitasse platea dictumst. Donec fermentum risus in augue accumsan, pretium commodo dolor consectetur. Proin ac metus vitae lacus dignissim viverra. Donec sodales tempor lorem, ac pharetra augue rhoncus sit amet. Aenean sed eleifend massa. Nam volutpat quis sem et lobortis. Curabitur eleifend fermentum erat, et dignissim massa tempus placerat. + +Integer bibendum mi in arcu sodales, non porttitor ante cursus. Donec sollicitudin facilisis tincidunt. Mauris blandit maximus dignissim. Aliquam quis nulla pellentesque, pretium arcu in, tempus magna. Nunc sed urna mi. Nulla facilisi. Curabitur ut nibh facilisis, dapibus nunc ac, mollis neque. Sed at dolor ac lacus eleifend rhoncus. Etiam eget blandit dui, sed molestie quam. Donec sit amet massa eget odio tincidunt elementum vel eget odio. Vivamus vel odio a tellus vehicula pulvinar vel et nisi. Fusce ut neque vitae mauris dictum molestie eget sit amet turpis. Morbi neque purus, porttitor sed lorem et, mollis dapibus felis. Phasellus iaculis mi nec lectus posuere, ultricies luctus libero consequat. Quisque sed fringilla velit. Fusce quis turpis mollis, sagittis tortor ut, malesuada eros. + +Nunc mollis leo dui, vitae eleifend nisi euismod id. Duis egestas porttitor laoreet. Integer tristique aliquet dolor nec imperdiet. Maecenas suscipit quis ligula vitae lacinia. Vivamus ac mi purus. Integer tincidunt semper eleifend. Morbi ut molestie enim. Fusce convallis purus sem. + +Praesent ac sem quam. Curabitur in dui libero. Donec ac lacus diam. Nam quis risus pharetra, efficitur nibh a, porta turpis. Aenean convallis tortor non sapien ullamcorper sollicitudin. Donec tellus arcu, posuere at lorem vel, consequat blandit massa. Nulla finibus quam justo, id consequat ex ultrices eu. Cras et elit ullamcorper, pellentesque urna sed, dapibus libero. Etiam molestie convallis lorem, et euismod nisl convallis nec. In ornare odio lectus, sit amet eleifend ex rutrum id. Aliquam quis leo lacinia, ultricies elit vitae, venenatis ex. Duis sit amet lorem dignissim, viverra tortor vel, aliquam neque. Fusce facilisis ipsum at velit accumsan, et ultricies turpis laoreet. + +Curabitur mollis, metus ac dignissim euismod, nisi sapien rhoncus mauris, vel porta risus mi vitae risus. Phasellus metus arcu, tristique ut sapien eu, tincidunt varius quam. Praesent mauris eros, consequat a dapibus ac, viverra eget dui. Donec euismod convallis nisl eget blandit. Sed scelerisque ligula et neque venenatis venenatis. Fusce maximus scelerisque pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras et maximus massa, vel blandit est. Phasellus et interdum ex. + +Pellentesque egestas tempus felis et luctus. Ut aliquet sed ipsum at ultrices. Suspendisse et justo at risus euismod vulputate. Vivamus quis hendrerit quam. Mauris eget commodo sapien. Ut nec erat ut ex tristique pulvinar. Duis vestibulum iaculis lorem. Nulla ornare purus a massa cursus, a egestas purus accumsan. Etiam eu mollis ipsum, id blandit eros. Nunc nec dolor in mauris congue vehicula. Cras hendrerit sapien orci. + +Pellentesque non purus sed urna pharetra ultricies vitae ut sapien. Ut purus ligula, tempor vitae erat eu, finibus fringilla sem. Phasellus laoreet est tortor, eget pharetra eros tincidunt at. Nullam dapibus eros a nisl accumsan sollicitudin. Nunc vestibulum enim sed justo molestie, sit amet ultricies mi rutrum. Aenean in libero non ligula faucibus facilisis sit amet eu turpis. Nam vel porttitor dui. Phasellus venenatis urna massa, et venenatis ligula dictum quis. Curabitur tincidunt nec lectus vel finibus. In hac habitasse platea dictumst. Aliquam erat volutpat. Mauris vel quam egestas, interdum libero ut, hendrerit diam. Maecenas dui orci, accumsan non tortor eu, faucibus aliquam diam. Maecenas ullamcorper metus sit amet porta consectetur. Vestibulum pretium vehicula lorem at placerat. Nunc et blandit nisl. + +Nulla ultrices ultricies est eu viverra. Aenean ut pulvinar metus. Etiam vulputate neque mauris, ut ultrices purus aliquam a. Aliquam luctus quam vel tincidunt semper. Vivamus aliquam dapibus nisl, vitae cursus dolor. Proin aliquet ante ante. Ut sapien ipsum, cursus id placerat vitae, feugiat faucibus massa. \ No newline at end of file diff --git a/guest/webservices/rest-client/WebContent/META-INF/MANIFEST.MF b/guest/webservices/rest-client/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..254272e1c0 --- /dev/null +++ b/guest/webservices/rest-client/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/guest/webservices/rest-client/pom.xml b/guest/webservices/rest-client/pom.xml new file mode 100644 index 0000000000..af03ac1948 --- /dev/null +++ b/guest/webservices/rest-client/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + com.stackify + rest-client + 0.0.1-SNAPSHOT + war + + + + maven-compiler-plugin + 3.5 + + 1.8 + 1.8 + + + + maven-war-plugin + 2.6 + + WebContent + false + + + + + \ No newline at end of file diff --git a/guest/webservices/rest-client/rest-client/.angular-cli.json b/guest/webservices/rest-client/rest-client/.angular-cli.json new file mode 100644 index 0000000000..5d1839d374 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/.angular-cli.json @@ -0,0 +1,57 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "rest-client" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets", + "favicon.ico" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "styles.css" + ], + "scripts": [], + "environmentSource": "environments/environment.ts", + "environments": { + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json" + }, + { + "project": "src/tsconfig.spec.json" + }, + { + "project": "e2e/tsconfig.e2e.json" + } + ], + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "css", + "component": {} + } +} diff --git a/guest/webservices/rest-client/rest-client/.editorconfig b/guest/webservices/rest-client/rest-client/.editorconfig new file mode 100644 index 0000000000..6e87a003da --- /dev/null +++ b/guest/webservices/rest-client/rest-client/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/guest/webservices/rest-client/rest-client/.gitignore b/guest/webservices/rest-client/rest-client/.gitignore new file mode 100644 index 0000000000..54bfd2001e --- /dev/null +++ b/guest/webservices/rest-client/rest-client/.gitignore @@ -0,0 +1,42 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db diff --git a/guest/webservices/rest-client/rest-client/README.md b/guest/webservices/rest-client/rest-client/README.md new file mode 100644 index 0000000000..b33d171f3c --- /dev/null +++ b/guest/webservices/rest-client/rest-client/README.md @@ -0,0 +1,28 @@ +# RestClient + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.1.3. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). +Before running the tests make sure you are serving the app via `ng serve`. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/guest/webservices/rest-client/rest-client/e2e/app.e2e-spec.ts b/guest/webservices/rest-client/rest-client/e2e/app.e2e-spec.ts new file mode 100644 index 0000000000..2eb6dade08 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/e2e/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { RestClientPage } from './app.po'; + +describe('rest-client App', () => { + let page: RestClientPage; + + beforeEach(() => { + page = new RestClientPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('Welcome to app!!'); + }); +}); diff --git a/guest/webservices/rest-client/rest-client/e2e/app.po.ts b/guest/webservices/rest-client/rest-client/e2e/app.po.ts new file mode 100644 index 0000000000..1e111a7ff6 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/e2e/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class RestClientPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/guest/webservices/rest-client/rest-client/e2e/tsconfig.e2e.json b/guest/webservices/rest-client/rest-client/e2e/tsconfig.e2e.json new file mode 100644 index 0000000000..e2a9a2fc77 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/e2e/tsconfig.e2e.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "node" + ] + } +} diff --git a/guest/webservices/rest-client/rest-client/karma.conf.js b/guest/webservices/rest-client/rest-client/karma.conf.js new file mode 100644 index 0000000000..4d9ab9d948 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/karma.conf.js @@ -0,0 +1,33 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/0.13/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular/cli'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular/cli/plugins/karma') + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/guest/webservices/rest-client/rest-client/package.json b/guest/webservices/rest-client/rest-client/package.json new file mode 100644 index 0000000000..b10090830c --- /dev/null +++ b/guest/webservices/rest-client/rest-client/package.json @@ -0,0 +1,48 @@ +{ + "name": "rest-client", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "^4.0.0", + "@angular/common": "^4.0.0", + "@angular/compiler": "^4.0.0", + "@angular/core": "^4.0.0", + "@angular/forms": "^4.0.0", + "@angular/http": "^4.0.0", + "@angular/platform-browser": "^4.0.0", + "@angular/platform-browser-dynamic": "^4.0.0", + "@angular/router": "^4.0.0", + "core-js": "^2.4.1", + "rxjs": "^5.1.0", + "zone.js": "^0.8.4" + }, + "devDependencies": { + "@angular/cli": "1.1.3", + "@angular/compiler-cli": "^4.0.0", + "@angular/language-service": "^4.0.0", + "@types/jasmine": "2.5.45", + "@types/node": "~6.0.60", + "codelyzer": "~3.0.1", + "jasmine-core": "~2.6.2", + "jasmine-spec-reporter": "~4.1.0", + "karma": "~1.7.0", + "karma-chrome-launcher": "~2.1.1", + "karma-cli": "~1.0.1", + "karma-coverage-istanbul-reporter": "^1.2.1", + "karma-jasmine": "~1.1.0", + "karma-jasmine-html-reporter": "^0.2.2", + "protractor": "~5.1.2", + "ts-node": "~3.0.4", + "tslint": "~5.3.2", + "typescript": "~2.3.3" + } +} diff --git a/guest/webservices/rest-client/rest-client/protractor.conf.js b/guest/webservices/rest-client/rest-client/protractor.conf.js new file mode 100644 index 0000000000..7ee3b5ee86 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/guest/webservices/rest-client/rest-client/src/app/app.component.css b/guest/webservices/rest-client/rest-client/src/app/app.component.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guest/webservices/rest-client/rest-client/src/app/app.component.html b/guest/webservices/rest-client/rest-client/src/app/app.component.html new file mode 100644 index 0000000000..94dc25088b --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/app/app.component.html @@ -0,0 +1,13 @@ + + + + Angular QuickStart + + + + + + + loading users component + + \ No newline at end of file diff --git a/guest/webservices/rest-client/rest-client/src/app/app.component.spec.ts b/guest/webservices/rest-client/rest-client/src/app/app.component.spec.ts new file mode 100644 index 0000000000..7d2799ceb6 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/app/app.component.spec.ts @@ -0,0 +1,32 @@ +import { TestBed, async } from '@angular/core/testing'; + +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + + it('should create the app', async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + + it(`should have as title 'app'`, async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('app'); + })); + + it('should render title in a h1 tag', async(() => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!!'); + })); +}); diff --git a/guest/webservices/rest-client/rest-client/src/app/app.component.ts b/guest/webservices/rest-client/rest-client/src/app/app.component.ts new file mode 100644 index 0000000000..7b0f672831 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { + title = 'app'; +} diff --git a/guest/webservices/rest-client/rest-client/src/app/app.module.ts b/guest/webservices/rest-client/rest-client/src/app/app.module.ts new file mode 100644 index 0000000000..fe90536b1e --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/app/app.module.ts @@ -0,0 +1,25 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { HttpModule } from '@angular/http'; +import { FormsModule } from '@angular/forms'; + +import { AppComponent } from './app.component'; +import { UsersComponent } from './users.component'; +import { RouterModule } from '@angular/router'; + +@NgModule({ + declarations: [ + AppComponent, + UsersComponent + ], + imports: [ + BrowserModule, + HttpModule, + FormsModule, + RouterModule.forRoot([ + { path: '', component: AppComponent }, + { path: 'users', component: UsersComponent }])], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/guest/webservices/rest-client/rest-client/src/app/app.service.ts b/guest/webservices/rest-client/rest-client/src/app/app.service.ts new file mode 100644 index 0000000000..cf57aecbc9 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/app/app.service.ts @@ -0,0 +1,36 @@ +import {Injectable} from '@angular/core'; +import { Http, Response, Headers, RequestOptions } from '@angular/http'; +import 'rxjs/add/operator/map'; + +export class User { + constructor( + public email: string, + public name: string) { } +} + +@Injectable() +export class UserService { + constructor( + private _http: Http){} + + url = 'http://localhost:8080/rest-server/users'; + + addUser(user){ + let headers = new Headers({'Content-Type': 'application/json'}); + let options = new RequestOptions({ headers: headers}); + + return this._http.post(this.url, JSON.stringify(user), options) + .map( + (_response: Response) => { + return _response; + }, + err => alert('Error adding user')); + } + + getUsers() { + return this._http.get(this.url) + .map((_response: Response) => { + return _response.json(); + }); + } +} \ No newline at end of file diff --git a/guest/webservices/rest-client/rest-client/src/app/users.component.html b/guest/webservices/rest-client/rest-client/src/app/users.component.html new file mode 100644 index 0000000000..bbf9289080 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/app/users.component.html @@ -0,0 +1,15 @@ +
+Email:
+Name:
+ +
+ +
+ + + + + +
{{user.email}} +{{user.name}}
+ diff --git a/guest/webservices/rest-client/rest-client/src/app/users.component.ts b/guest/webservices/rest-client/rest-client/src/app/users.component.ts new file mode 100644 index 0000000000..6c5a383848 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/app/users.component.ts @@ -0,0 +1,39 @@ +import { Component } from '@angular/core'; +import {UserService, User} from './app.service'; + +@Component({ + selector: 'users-page', + providers: [UserService], + templateUrl: './users.component.html', + styleUrls: ['./app.component.css'] +}) +export class UsersComponent { + title = 'Users'; + + constructor( + private _service:UserService){} + + public user = {email: "", name: ""}; + public res=[]; + + addUser() { + this._service.addUser(this.user) + .subscribe( () => this.getUsers()); + } + + getUsers() { + this._service.getUsers() + .subscribe( + users => { + this.res=[]; + users.forEach(usr => { + this.res.push( + new User( + usr.email, + usr.name + ) + ) + }); + }); + } +} diff --git a/guest/webservices/rest-client/rest-client/src/assets/.gitkeep b/guest/webservices/rest-client/rest-client/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guest/webservices/rest-client/rest-client/src/environments/environment.prod.ts b/guest/webservices/rest-client/rest-client/src/environments/environment.prod.ts new file mode 100644 index 0000000000..3612073bc3 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/guest/webservices/rest-client/rest-client/src/environments/environment.ts b/guest/webservices/rest-client/rest-client/src/environments/environment.ts new file mode 100644 index 0000000000..b7f639aeca --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/environments/environment.ts @@ -0,0 +1,8 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: false +}; diff --git a/guest/webservices/rest-client/rest-client/src/favicon.ico b/guest/webservices/rest-client/rest-client/src/favicon.ico new file mode 100644 index 0000000000..8081c7ceaf Binary files /dev/null and b/guest/webservices/rest-client/rest-client/src/favicon.ico differ diff --git a/guest/webservices/rest-client/rest-client/src/index.html b/guest/webservices/rest-client/rest-client/src/index.html new file mode 100644 index 0000000000..5714e185ca --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/index.html @@ -0,0 +1,14 @@ + + + + + RestClient + + + + + + + + + diff --git a/guest/webservices/rest-client/rest-client/src/main.ts b/guest/webservices/rest-client/rest-client/src/main.ts new file mode 100644 index 0000000000..a9ca1caf8c --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/main.ts @@ -0,0 +1,11 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/guest/webservices/rest-client/rest-client/src/polyfills.ts b/guest/webservices/rest-client/rest-client/src/polyfills.ts new file mode 100644 index 0000000000..fd01cc9f1d --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/polyfills.ts @@ -0,0 +1,73 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following to support `@angular/animation`. */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + +/** Evergreen browsers require these. **/ +import 'core-js/es6/reflect'; +import 'core-js/es7/reflect'; + + +/** ALL Firefox browsers require the following to support `@angular/animation`. **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + + +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; diff --git a/guest/webservices/rest-client/rest-client/src/styles.css b/guest/webservices/rest-client/rest-client/src/styles.css new file mode 100644 index 0000000000..90d4ee0072 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/guest/webservices/rest-client/rest-client/src/test.ts b/guest/webservices/rest-client/rest-client/src/test.ts new file mode 100644 index 0000000000..cd612eeb0e --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/test.ts @@ -0,0 +1,32 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare const __karma__: any; +declare const require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function () {}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/guest/webservices/rest-client/rest-client/src/tsconfig.app.json b/guest/webservices/rest-client/rest-client/src/tsconfig.app.json new file mode 100644 index 0000000000..5e2507db58 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "es2015", + "baseUrl": "", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/guest/webservices/rest-client/rest-client/src/tsconfig.spec.json b/guest/webservices/rest-client/rest-client/src/tsconfig.spec.json new file mode 100644 index 0000000000..510e3f1fda --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "module": "commonjs", + "target": "es5", + "baseUrl": "", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/guest/webservices/rest-client/rest-client/src/typings.d.ts b/guest/webservices/rest-client/rest-client/src/typings.d.ts new file mode 100644 index 0000000000..ef5c7bd620 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/src/typings.d.ts @@ -0,0 +1,5 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} diff --git a/guest/webservices/rest-client/rest-client/tsconfig.json b/guest/webservices/rest-client/rest-client/tsconfig.json new file mode 100644 index 0000000000..a35a8ee3a4 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "baseUrl": "src", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2016", + "dom" + ] + } +} diff --git a/guest/webservices/rest-client/rest-client/tslint.json b/guest/webservices/rest-client/rest-client/tslint.json new file mode 100644 index 0000000000..dd117b3871 --- /dev/null +++ b/guest/webservices/rest-client/rest-client/tslint.json @@ -0,0 +1,135 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + "static-before-instance", + "variables-before-functions" + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "typeof-compare": true, + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "no-access-missing-member": true, + "templates-use-public": true, + "invoke-injectable": true + } +} diff --git a/guest/webservices/rest-server/WebContent/META-INF/MANIFEST.MF b/guest/webservices/rest-server/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..254272e1c0 --- /dev/null +++ b/guest/webservices/rest-server/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/guest/webservices/rest-server/WebContent/WEB-INF/web.xml b/guest/webservices/rest-server/WebContent/WEB-INF/web.xml new file mode 100644 index 0000000000..46b173c59a --- /dev/null +++ b/guest/webservices/rest-server/WebContent/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + rest-server + + rest-server + org.glassfish.jersey.servlet.ServletContainer + + javax.ws.rs.Application + com.stackify.ApplicationInitializer + + 1 + + + rest-server + /* + + \ No newline at end of file diff --git a/guest/webservices/rest-server/pom.xml b/guest/webservices/rest-server/pom.xml new file mode 100644 index 0000000000..350e7eb9c9 --- /dev/null +++ b/guest/webservices/rest-server/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + com.stackify + rest-server + 0.0.1-SNAPSHOT + war + + + + org.glassfish.jersey.containers + jersey-container-servlet + 2.25.1 + + + org.glassfish.jersey.media + jersey-media-moxy + 2.25.1 + + + io.rest-assured + rest-assured + 3.0.3 + + + junit + junit + 4.12 + + + + + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + maven-war-plugin + 3.0.0 + + WebContent + + + + + \ No newline at end of file diff --git a/guest/webservices/rest-server/src/main/java/com/stackify/ApplicationInitializer.java b/guest/webservices/rest-server/src/main/java/com/stackify/ApplicationInitializer.java new file mode 100644 index 0000000000..6d864e859e --- /dev/null +++ b/guest/webservices/rest-server/src/main/java/com/stackify/ApplicationInitializer.java @@ -0,0 +1,9 @@ +package com.stackify; + +import org.glassfish.jersey.server.ResourceConfig; + +public class ApplicationInitializer extends ResourceConfig { + public ApplicationInitializer() { + packages("com.stackify.services"); + } +} diff --git a/guest/webservices/rest-server/src/main/java/com/stackify/models/User.java b/guest/webservices/rest-server/src/main/java/com/stackify/models/User.java new file mode 100644 index 0000000000..8c8073357d --- /dev/null +++ b/guest/webservices/rest-server/src/main/java/com/stackify/models/User.java @@ -0,0 +1,43 @@ +package com.stackify.models; + +import javax.ws.rs.core.Link; + +public class User { + private String email; + private String name; + private Link link; + + public User() { + } + + public User(String email, String name) { + super(); + this.email = email; + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Link getLink() { + return link; + } + + public void setLink(Link link) { + this.link = link; + } + +} diff --git a/guest/webservices/rest-server/src/main/java/com/stackify/services/CorsFilter.java b/guest/webservices/rest-server/src/main/java/com/stackify/services/CorsFilter.java new file mode 100644 index 0000000000..267aa6fd61 --- /dev/null +++ b/guest/webservices/rest-server/src/main/java/com/stackify/services/CorsFilter.java @@ -0,0 +1,19 @@ +package com.stackify.services; + +import java.io.IOException; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.ext.Provider; + +@Provider +public class CorsFilter implements ContainerResponseFilter { + + @Override + public void filter(final ContainerRequestContext requestContext, + final ContainerResponseContext response) throws IOException { + response.getHeaders().add("Access-Control-Allow-Origin", "*"); + response.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept"); + } +} diff --git a/guest/webservices/rest-server/src/main/java/com/stackify/services/UserService.java b/guest/webservices/rest-server/src/main/java/com/stackify/services/UserService.java new file mode 100644 index 0000000000..e78ed4627a --- /dev/null +++ b/guest/webservices/rest-server/src/main/java/com/stackify/services/UserService.java @@ -0,0 +1,33 @@ +package com.stackify.services; + +import java.util.ArrayList; +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import com.stackify.models.User; + +@Path("/users") +public class UserService { + private static List users = new ArrayList<>(); + + @POST + @Consumes(MediaType.APPLICATION_JSON) + public Response addUser(User user) { + users.add(user); + return Response.ok() + .build(); + } + + @GET + @Produces(MediaType.APPLICATION_JSON) + public List getUsers() { + return users; + } +} diff --git a/guest/webservices/rest-server/src/test/java/com/stackify/services/UserServiceTest.java b/guest/webservices/rest-server/src/test/java/com/stackify/services/UserServiceTest.java new file mode 100644 index 0000000000..064951fbbe --- /dev/null +++ b/guest/webservices/rest-server/src/test/java/com/stackify/services/UserServiceTest.java @@ -0,0 +1,34 @@ +package com.stackify.services; + +import org.junit.Test; + +import io.restassured.RestAssured; +import static io.restassured.RestAssured.*; +import static org.hamcrest.CoreMatchers.*; + +public class UserServiceTest { + @Test + public void whenAddUser_thenGetUserOk() { + RestAssured.baseURI = "http://localhost:8080/rest-server"; + + //@formatter:off + + String json = "{\"email\":\"john@gmail.com\",\"name\":\"John\"}"; + given() + .contentType("application/json") + .body(json) + .when() + .post("/users") + .then() + .statusCode(200); + + when() + .get("/users") + .then() + .contentType("application/json") + .body("name", hasItem("John")) + .body("email", hasItem("john@gmail.com")); + + //@formatter:on + } +} diff --git a/guest/webservices/soap_client/src/main/java/com/stackify/JAXWSClient.java b/guest/webservices/soap_client/src/main/java/com/stackify/JAXWSClient.java new file mode 100644 index 0000000000..5542fbde20 --- /dev/null +++ b/guest/webservices/soap_client/src/main/java/com/stackify/JAXWSClient.java @@ -0,0 +1,19 @@ +package com.stackify; + +import com.stackify.services.DefaultUserImplService; +import com.stackify.services.User; +import com.stackify.services.UserService; +import com.stackify.services.Users; + +public class JAXWSClient { + public static void main(String[] args) { + DefaultUserImplService service = new DefaultUserImplService(); + User user = new User(); + user.setEmail("john@gmail.com"); + user.setName("John"); + UserService port = service.getDefaultUserImplPort(); + port.addUser(user); + Users users = port.getUsers(); + System.out.println(users.getUsers().iterator().next().getName()); + } +} diff --git a/guest/webservices/soap_client/src/main/java/com/stackify/services/DefaultUserImplService.java b/guest/webservices/soap_client/src/main/java/com/stackify/services/DefaultUserImplService.java new file mode 100644 index 0000000000..821b969166 --- /dev/null +++ b/guest/webservices/soap_client/src/main/java/com/stackify/services/DefaultUserImplService.java @@ -0,0 +1,94 @@ + +package com.stackify.services; + +import java.net.MalformedURLException; +import java.net.URL; +import javax.xml.namespace.QName; +import javax.xml.ws.Service; +import javax.xml.ws.WebEndpoint; +import javax.xml.ws.WebServiceClient; +import javax.xml.ws.WebServiceException; +import javax.xml.ws.WebServiceFeature; + + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.2.9-b130926.1035 + * Generated source version: 2.2 + * + */ +@WebServiceClient(name = "DefaultUserImplService", targetNamespace = "http://services.stackify.com/", wsdlLocation = "http://localhost:8080/users?wsdl") +public class DefaultUserImplService + extends Service +{ + + private final static URL DEFAULTUSERIMPLSERVICE_WSDL_LOCATION; + private final static WebServiceException DEFAULTUSERIMPLSERVICE_EXCEPTION; + private final static QName DEFAULTUSERIMPLSERVICE_QNAME = new QName("http://services.stackify.com/", "DefaultUserImplService"); + + static { + URL url = null; + WebServiceException e = null; + try { + url = new URL("http://localhost:8080/users?wsdl"); + } catch (MalformedURLException ex) { + e = new WebServiceException(ex); + } + DEFAULTUSERIMPLSERVICE_WSDL_LOCATION = url; + DEFAULTUSERIMPLSERVICE_EXCEPTION = e; + } + + public DefaultUserImplService() { + super(__getWsdlLocation(), DEFAULTUSERIMPLSERVICE_QNAME); + } + + public DefaultUserImplService(WebServiceFeature... features) { + super(__getWsdlLocation(), DEFAULTUSERIMPLSERVICE_QNAME, features); + } + + public DefaultUserImplService(URL wsdlLocation) { + super(wsdlLocation, DEFAULTUSERIMPLSERVICE_QNAME); + } + + public DefaultUserImplService(URL wsdlLocation, WebServiceFeature... features) { + super(wsdlLocation, DEFAULTUSERIMPLSERVICE_QNAME, features); + } + + public DefaultUserImplService(URL wsdlLocation, QName serviceName) { + super(wsdlLocation, serviceName); + } + + public DefaultUserImplService(URL wsdlLocation, QName serviceName, WebServiceFeature... features) { + super(wsdlLocation, serviceName, features); + } + + /** + * + * @return + * returns UserService + */ + @WebEndpoint(name = "DefaultUserImplPort") + public UserService getDefaultUserImplPort() { + return super.getPort(new QName("http://services.stackify.com/", "DefaultUserImplPort"), UserService.class); + } + + /** + * + * @param features + * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the features parameter will have their default values. + * @return + * returns UserService + */ + @WebEndpoint(name = "DefaultUserImplPort") + public UserService getDefaultUserImplPort(WebServiceFeature... features) { + return super.getPort(new QName("http://services.stackify.com/", "DefaultUserImplPort"), UserService.class, features); + } + + private static URL __getWsdlLocation() { + if (DEFAULTUSERIMPLSERVICE_EXCEPTION!= null) { + throw DEFAULTUSERIMPLSERVICE_EXCEPTION; + } + return DEFAULTUSERIMPLSERVICE_WSDL_LOCATION; + } + +} diff --git a/guest/webservices/soap_client/src/main/java/com/stackify/services/ObjectFactory.java b/guest/webservices/soap_client/src/main/java/com/stackify/services/ObjectFactory.java new file mode 100644 index 0000000000..d992521d9f --- /dev/null +++ b/guest/webservices/soap_client/src/main/java/com/stackify/services/ObjectFactory.java @@ -0,0 +1,48 @@ + +package com.stackify.services; + +import javax.xml.bind.annotation.XmlRegistry; + + +/** + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the com.stackify.services package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are + * provided in this class. + * + */ +@XmlRegistry +public class ObjectFactory { + + + /** + * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.stackify.services + * + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link User } + * + */ + public User createUser() { + return new User(); + } + + /** + * Create an instance of {@link Users } + * + */ + public Users createUsers() { + return new Users(); + } + +} diff --git a/guest/webservices/soap_client/src/main/java/com/stackify/services/User.java b/guest/webservices/soap_client/src/main/java/com/stackify/services/User.java new file mode 100644 index 0000000000..d9d517f83d --- /dev/null +++ b/guest/webservices/soap_client/src/main/java/com/stackify/services/User.java @@ -0,0 +1,87 @@ + +package com.stackify.services; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for user complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="user">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "user", propOrder = { + "email", + "name" +}) +public class User { + + protected String email; + protected String name; + + /** + * Gets the value of the email property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getEmail() { + return email; + } + + /** + * Sets the value of the email property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setEmail(String value) { + this.email = value; + } + + /** + * Gets the value of the name property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setName(String value) { + this.name = value; + } + +} diff --git a/guest/webservices/soap_client/src/main/java/com/stackify/services/UserService.java b/guest/webservices/soap_client/src/main/java/com/stackify/services/UserService.java new file mode 100644 index 0000000000..87ab1f2f75 --- /dev/null +++ b/guest/webservices/soap_client/src/main/java/com/stackify/services/UserService.java @@ -0,0 +1,47 @@ + +package com.stackify.services; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebResult; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.ws.Action; + + +/** + * This class was generated by the JAX-WS RI. + * JAX-WS RI 2.2.9-b130926.1035 + * Generated source version: 2.2 + * + */ +@WebService(name = "UserService", targetNamespace = "http://services.stackify.com/") +@SOAPBinding(style = SOAPBinding.Style.RPC) +@XmlSeeAlso({ + ObjectFactory.class +}) +public interface UserService { + + + /** + * + * @param arg0 + */ + @WebMethod + @Action(input = "http://services.stackify.com/UserService/addUserRequest", output = "http://services.stackify.com/UserService/addUserResponse") + public void addUser( + @WebParam(name = "arg0", partName = "arg0") + User arg0); + + /** + * + * @return + * returns com.stackify.services.Users + */ + @WebMethod + @WebResult(partName = "return") + @Action(input = "http://services.stackify.com/UserService/getUsersRequest", output = "http://services.stackify.com/UserService/getUsersResponse") + public Users getUsers(); + +} diff --git a/guest/webservices/soap_client/src/main/java/com/stackify/services/Users.java b/guest/webservices/soap_client/src/main/java/com/stackify/services/Users.java new file mode 100644 index 0000000000..bde0e47b11 --- /dev/null +++ b/guest/webservices/soap_client/src/main/java/com/stackify/services/Users.java @@ -0,0 +1,69 @@ + +package com.stackify.services; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for users complex type. + * + *

The following schema fragment specifies the expected content contained within this class. + * + *

+ * <complexType name="users">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="users" type="{http://services.stackify.com/}user" maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "users", propOrder = { + "users" +}) +public class Users { + + @XmlElement(nillable = true) + protected List users; + + /** + * Gets the value of the users property. + * + *

+ * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a set method for the users property. + * + *

+ * For example, to add a new item, do as follows: + *

+     *    getUsers().add(newItem);
+     * 
+ * + * + *

+ * Objects of the following type(s) are allowed in the list + * {@link User } + * + * + */ + public List getUsers() { + if (users == null) { + users = new ArrayList(); + } + return this.users; + } + +} diff --git a/guest/webservices/soap_client/src/main/java/com/stackify/services/package-info.java b/guest/webservices/soap_client/src/main/java/com/stackify/services/package-info.java new file mode 100644 index 0000000000..af6d2bc25e --- /dev/null +++ b/guest/webservices/soap_client/src/main/java/com/stackify/services/package-info.java @@ -0,0 +1,2 @@ +@javax.xml.bind.annotation.XmlSchema(namespace = "http://services.stackify.com/") +package com.stackify.services; diff --git a/guest/webservices/soap_example/src/main/java/com/stackify/ServicePublisher.java b/guest/webservices/soap_example/src/main/java/com/stackify/ServicePublisher.java new file mode 100644 index 0000000000..3a10b6e285 --- /dev/null +++ b/guest/webservices/soap_example/src/main/java/com/stackify/ServicePublisher.java @@ -0,0 +1,11 @@ +package com.stackify; + +import javax.xml.ws.Endpoint; + +import com.stackify.services.DefaultUserImpl; + +public class ServicePublisher { + public static void main(String[] args) { + Endpoint.publish("http://localhost:8080/users", new DefaultUserImpl()); + } +} diff --git a/guest/webservices/soap_example/src/main/java/com/stackify/models/User.java b/guest/webservices/soap_example/src/main/java/com/stackify/models/User.java new file mode 100644 index 0000000000..1a9741154d --- /dev/null +++ b/guest/webservices/soap_example/src/main/java/com/stackify/models/User.java @@ -0,0 +1,32 @@ +package com.stackify.models; + +public class User { + private String email; + private String name; + + public User() { + } + + public User(String email, String name) { + super(); + this.email = email; + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/guest/webservices/soap_example/src/main/java/com/stackify/models/Users.java b/guest/webservices/soap_example/src/main/java/com/stackify/models/Users.java new file mode 100644 index 0000000000..2323a74614 --- /dev/null +++ b/guest/webservices/soap_example/src/main/java/com/stackify/models/Users.java @@ -0,0 +1,16 @@ +package com.stackify.models; + +import java.util.List; + +public class Users { + List users; + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + +} diff --git a/guest/webservices/soap_example/src/main/java/com/stackify/services/DefaultUserImpl.java b/guest/webservices/soap_example/src/main/java/com/stackify/services/DefaultUserImpl.java new file mode 100644 index 0000000000..87d7d646c1 --- /dev/null +++ b/guest/webservices/soap_example/src/main/java/com/stackify/services/DefaultUserImpl.java @@ -0,0 +1,27 @@ +package com.stackify.services; + +import java.util.ArrayList; + +import javax.jws.WebService; + +import com.stackify.models.User; +import com.stackify.models.Users; + +@WebService(endpointInterface = "com.stackify.services.UserService") +public class DefaultUserImpl implements UserService { + + ArrayList usersList = new ArrayList<>(); + + @Override + public void addUser(User user) { + usersList.add(user); + } + + @Override + public Users getUsers() { + Users users = new Users(); + users.setUsers(usersList); + return users; + } + +} diff --git a/guest/webservices/soap_example/src/main/java/com/stackify/services/UserService.java b/guest/webservices/soap_example/src/main/java/com/stackify/services/UserService.java new file mode 100644 index 0000000000..8c57fbd061 --- /dev/null +++ b/guest/webservices/soap_example/src/main/java/com/stackify/services/UserService.java @@ -0,0 +1,19 @@ +package com.stackify.services; + +import javax.jws.WebMethod; +import javax.jws.WebService; +import javax.jws.soap.SOAPBinding; + +import com.stackify.models.User; +import com.stackify.models.Users; + +@WebService +@SOAPBinding(style = SOAPBinding.Style.RPC) +public interface UserService { + + @WebMethod + public void addUser(User user); + + @WebMethod + public Users getUsers(); +} diff --git a/guest/webservices/spring-rest-service/WebContent/META-INF/MANIFEST.MF b/guest/webservices/spring-rest-service/WebContent/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..254272e1c0 --- /dev/null +++ b/guest/webservices/spring-rest-service/WebContent/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/guest/webservices/spring-rest-service/pom.xml b/guest/webservices/spring-rest-service/pom.xml new file mode 100644 index 0000000000..11082cf17b --- /dev/null +++ b/guest/webservices/spring-rest-service/pom.xml @@ -0,0 +1,48 @@ + + 4.0.0 + com.stackify + spring-rest-service + 0.0.1-SNAPSHOT + war + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-hateoas + + + io.springfox + springfox-swagger2 + 2.7.0 + + + io.springfox + springfox-swagger-ui + 2.7.0 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/guest/webservices/spring-rest-service/src/main/java/com/stackify/Application.java b/guest/webservices/spring-rest-service/src/main/java/com/stackify/Application.java new file mode 100644 index 0000000000..b45ed8094f --- /dev/null +++ b/guest/webservices/spring-rest-service/src/main/java/com/stackify/Application.java @@ -0,0 +1,12 @@ +package com.stackify; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/guest/webservices/spring-rest-service/src/main/java/com/stackify/config/SwaggerConfig.java b/guest/webservices/spring-rest-service/src/main/java/com/stackify/config/SwaggerConfig.java new file mode 100644 index 0000000000..0e9567b452 --- /dev/null +++ b/guest/webservices/spring-rest-service/src/main/java/com/stackify/config/SwaggerConfig.java @@ -0,0 +1,22 @@ +package com.stackify.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2).select() + .apis(RequestHandlerSelectors.basePackage("com.stackify.controllers")) + .paths(PathSelectors.any()) + .build(); + } +} diff --git a/guest/webservices/spring-rest-service/src/main/java/com/stackify/controllers/UserController.java b/guest/webservices/spring-rest-service/src/main/java/com/stackify/controllers/UserController.java new file mode 100644 index 0000000000..361dbde38d --- /dev/null +++ b/guest/webservices/spring-rest-service/src/main/java/com/stackify/controllers/UserController.java @@ -0,0 +1,52 @@ +package com.stackify.controllers; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.hateoas.Link; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import com.stackify.models.User; +import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; +import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; + +@RestController +public class UserController { + + private static List users = new ArrayList<>(); + + @PostMapping(value = "/users", consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.CREATED) + public void addUser(@RequestBody User user) { + users.add(user); + } + + @GetMapping("/users") + public List getUsers() { + users.forEach(user -> { + Link selfLink = linkTo(methodOn(UserController.class).getUsers()).slash(user.getEmail()) + .withSelfRel(); + user.getLinks().clear(); + user.add(selfLink); + }); + return users; + } + + @GetMapping("/users/{email}") + public User getUser(@PathVariable String email) { + User us = users.stream() + .filter(user -> !user.getEmail() + .equals(email)) + .findAny() + .orElse(null); + return us; + } + +} diff --git a/guest/webservices/spring-rest-service/src/main/java/com/stackify/models/User.java b/guest/webservices/spring-rest-service/src/main/java/com/stackify/models/User.java new file mode 100644 index 0000000000..b52e7f0f87 --- /dev/null +++ b/guest/webservices/spring-rest-service/src/main/java/com/stackify/models/User.java @@ -0,0 +1,34 @@ +package com.stackify.models; + +import org.springframework.hateoas.ResourceSupport; + +public class User extends ResourceSupport { + private String email; + private String name; + + public User() { + } + + public User(String email, String name) { + super(); + this.email = email; + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java b/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java new file mode 100644 index 0000000000..85c96d8b10 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java @@ -0,0 +1,12 @@ +package com.baeldung.hibernate.dao; + +import java.util.List; + +public interface GenericDao { + + void save (T entity); + void delete (T Entity); + T findByName(String name); + List findAll(); + void populate(); +} diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java b/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java new file mode 100644 index 0000000000..c0397ee5bb --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java @@ -0,0 +1,80 @@ +package com.baeldung.hibernate.dao; + +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.criterion.Expression; + +import com.baeldung.hibernate.pojo.Supplier; + +public class SupplierDao implements GenericDao{ + private SessionFactory sessionFactory; + private String tenant; + + public SupplierDao(SessionFactory sessionFactory, String tenant) { + this.sessionFactory = sessionFactory; + this.tenant = tenant; + populate(); + } + + @Override + public void save(Supplier entity) { + Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); + session.save(entity); + } + + @Override + public void delete(Supplier supplier) { + Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); + session.delete(supplier); + } + + @Override + public Supplier findByName(String name) { + Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); + List fetchedSuppliers = session.createCriteria(Supplier.class).add(Expression.eq("name", name)).list(); + if (fetchedSuppliers.size()>0) { + return fetchedSuppliers.get(0); + }else { + return null; + } + } + + @Override + public List findAll() { + Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); + return session.createCriteria(Supplier.class).list(); + } + + @Override + public void populate() { + System.out.println("Init DB1"); + Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession(); + Transaction transaction = session.getTransaction(); + + transaction.begin(); + session.createSQLQuery("DROP ALL OBJECTS").executeUpdate(); + session + .createSQLQuery( + "create table Supplier (id integer generated by default as identity, country varchar(255), name varchar(255), primary key (id))") + .executeUpdate(); + Supplier genertedSupplier = generateEntityForTenant(tenant); + System.out.println("Inserting Supplier"+genertedSupplier); + save (genertedSupplier); + + } + + private Supplier generateEntityForTenant(String forTenant) { + if (forTenant.equals("mydb1")) { + return new Supplier ("John","USA"); + } + return new Supplier ("Miller","UK"); + } + + + +} diff --git a/hibernate5/src/main/resources/hibernate.properties b/hibernate5/src/main/resources/hibernate.properties deleted file mode 100644 index a8f927a280..0000000000 --- a/hibernate5/src/main/resources/hibernate.properties +++ /dev/null @@ -1,8 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 -hibernate.connection.username=sa -jdbc.password= - -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true -hibernate.multiTenancy=DATABASE diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java new file mode 100644 index 0000000000..82567690ac --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.hibernate; + +import java.io.IOException; + +import org.hibernate.SessionFactory; +import org.junit.Test; + +import com.baeldung.hibernate.dao.SupplierDao; +import com.baeldung.hibernate.pojo.Supplier; + +import static org.junit.Assert.assertNull;; + +public class MultiTenantDaoHibernateIntegrationTest { + @Test + public void givenDBMode_whenFetchingSuppliersByName_thenChecking() throws UnsupportedTenancyException, IOException { + SessionFactory sessionFactory = HibernateMultiTenantUtil.getSessionFactory(); + + SupplierDao myDb1Dao = new SupplierDao(sessionFactory, "mydb1"); + Supplier db1SupplierName = myDb1Dao.findByName("John"); + + // finding the same supplier name in another tenant + // and we should not be able to find in there and both dbs are different. + SupplierDao myDb2Dao = new SupplierDao(sessionFactory, "mydb2"); + Supplier db2SupplierName = myDb2Dao.findByName(db1SupplierName.getName()); + + assertNull(db2SupplierName); + + } + +} diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantHibernateIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantHibernateIntegrationTest.java deleted file mode 100644 index 610617cb8d..0000000000 --- a/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantHibernateIntegrationTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.baeldung.hibernate; - -import static org.junit.Assert.assertNotEquals; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; -import org.junit.Before; -import org.junit.Test; - -import com.baeldung.hibernate.pojo.Supplier; - -public class MultiTenantHibernateIntegrationTest { - @Test - public void givenDBMode_whenFetchingSuppliers_thenComparingFromDbs() throws UnsupportedTenancyException, IOException { - SessionFactory sessionFactory = HibernateMultiTenantUtil.getSessionFactory(); - - Session db1Session = sessionFactory.withOptions().tenantIdentifier("mydb1").openSession(); - - initDb1(db1Session); - - Transaction transaction = db1Session.getTransaction(); - transaction.begin(); - Supplier supplierFromDB1 = (Supplier) db1Session.createCriteria(Supplier.class).list().get(0); - transaction.commit(); - - Session db2Session = sessionFactory.withOptions().tenantIdentifier("mydb2").openSession(); - - initDb2(db2Session); - db2Session.getTransaction().begin(); - Supplier supplierFromDB2 = (Supplier) db2Session.createCriteria(Supplier.class).list().get(0); - db2Session.getTransaction().commit(); - - System.out.println(supplierFromDB1); - System.out.println(supplierFromDB2); - - assertNotEquals(supplierFromDB1, supplierFromDB2); - - } - - private void initDb1(Session db1Session) { - System.out.println("Init DB1"); - Transaction transaction = db1Session.getTransaction(); - transaction.begin(); - db1Session.createSQLQuery("DROP ALL OBJECTS").executeUpdate(); - db1Session - .createSQLQuery( - "create table Supplier (id integer generated by default as identity, country varchar(255), name varchar(255), primary key (id))") - .executeUpdate(); - db1Session.createSQLQuery("insert into Supplier (id, country, name) values (null, 'John', 'USA')").executeUpdate(); - transaction.commit(); - } - - private void initDb2(Session db2Session) { - System.out.println("Init DB2"); - Transaction transaction = db2Session.getTransaction(); - transaction.begin(); - db2Session.createSQLQuery("DROP ALL OBJECTS").executeUpdate(); - db2Session - .createSQLQuery( - "create table Supplier (id integer generated by default as identity, country varchar(255), name varchar(255), primary key (id))") - .executeUpdate(); - db2Session.createSQLQuery("insert into Supplier (id, country, name) values (null, 'Miller', 'UK')").executeUpdate(); - transaction.commit(); - } -} diff --git a/hibernate5/src/test/java/hibernate.properties b/hibernate5/src/test/resources/hibernate.properties similarity index 87% rename from hibernate5/src/test/java/hibernate.properties rename to hibernate5/src/test/resources/hibernate.properties index a8f927a280..298ecd05d3 100644 --- a/hibernate5/src/test/java/hibernate.properties +++ b/hibernate5/src/test/resources/hibernate.properties @@ -1,6 +1,7 @@ hibernate.connection.driver_class=org.h2.Driver hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 hibernate.connection.username=sa +hibernate.connection.autocommit=true jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect diff --git a/jee7/README.md b/jee7/README.md index 71163d6640..a2493e561b 100644 --- a/jee7/README.md +++ b/jee7/README.md @@ -4,3 +4,4 @@ - [Converters, Listeners and Validators in Java EE 7](http://www.baeldung.com/java-ee7-converter-listener-validator) - [Introduction to JAX-WS](http://www.baeldung.com/jax-ws) - [A Guide to Java EE Web-Related Annotations](http://www.baeldung.com/javaee-web-annotations) +- [Introduction to Testing with Arquillian](http://www.baeldung.com/arquillian) diff --git a/jee7/pom.xml b/jee7/pom.xml index e633d2df3d..b5e0d80b6c 100644 --- a/jee7/pom.xml +++ b/jee7/pom.xml @@ -31,6 +31,7 @@ 1.0.0.Final 2.6 + 4.2.3.RELEASE @@ -136,6 +137,34 @@ standard 1.1.2 + + + javax.mvc + javax.mvc-api + 20160715 + + + org.glassfish.ozark + ozark + 20160715 + + + + org.springframework.security + spring-security-web + ${org.springframework.security.version} + + + + org.springframework.security + spring-security-config + ${org.springframework.security.version} + + + org.springframework.security + spring-security-taglibs + ${org.springframework.security.version} + @@ -378,4 +407,18 @@ + + + + bintray-mvc-spec-maven + bintray + http://dl.bintray.com/mvc-spec/maven + + true + + + false + + + diff --git a/jee7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java b/jee7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java new file mode 100755 index 0000000000..f8e7982253 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/springSecurity/ApplicationConfig.java @@ -0,0 +1,13 @@ +package com.baeldung.springSecurity; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +/** + * Application class required by JAX-RS. If you don't want to have any + * prefix in the URL, you can set the application path to "/". + */ +@ApplicationPath("/") +public class ApplicationConfig extends Application { + +} diff --git a/jee7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java b/jee7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java new file mode 100644 index 0000000000..e6a05f7b71 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/springSecurity/SecurityWebApplicationInitializer.java @@ -0,0 +1,10 @@ +package com.baeldung.springSecurity; + +import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; + +public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { + + public SecurityWebApplicationInitializer() { + super(SpringSecurityConfig.class); + } +} diff --git a/jee7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java b/jee7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java new file mode 100644 index 0000000000..bda8930f36 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/springSecurity/SpringSecurityConfig.java @@ -0,0 +1,46 @@ +package com.baeldung.springSecurity; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth + .inMemoryAuthentication() + .withUser("user1") + .password("user1Pass") + .roles("USER") + .and() + .withUser("admin") + .password("adminPass") + .roles("ADMIN"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .csrf() + .disable() + .authorizeRequests() + .antMatchers("/auth/login*") + .anonymous() + .antMatchers("/home/admin*") + .hasRole("ADMIN") + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage("/auth/login") + .defaultSuccessUrl("/home", true) + .failureUrl("/auth/login?error=true") + .and() + .logout() + .logoutSuccessUrl("/auth/login"); + } +} \ No newline at end of file diff --git a/jee7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java b/jee7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java new file mode 100644 index 0000000000..53fd9f4b81 --- /dev/null +++ b/jee7/src/main/java/com/baeldung/springSecurity/controller/HomeController.java @@ -0,0 +1,28 @@ +package com.baeldung.springSecurity.controller; + +import javax.mvc.annotation.Controller; +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("/home") +@Controller +public class HomeController { + + @GET + public String home() { + return "home.jsp"; + } + + @GET + @Path("/user") + public String admin() { + return "user.jsp"; + } + + @GET + @Path("/admin") + public String user() { + return "admin.jsp"; + } + +} diff --git a/jee7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java b/jee7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java new file mode 100644 index 0000000000..a7e7bb471d --- /dev/null +++ b/jee7/src/main/java/com/baeldung/springSecurity/controller/LoginController.java @@ -0,0 +1,15 @@ +package com.baeldung.springSecurity.controller; + +import javax.mvc.annotation.Controller; +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("/auth/login") +@Controller +public class LoginController { + + @GET + public String login() { + return "login.jsp"; + } +} diff --git a/jee7/src/main/webapp/WEB-INF/views/admin.jsp b/jee7/src/main/webapp/WEB-INF/views/admin.jsp new file mode 100644 index 0000000000..b83ea09f5b --- /dev/null +++ b/jee7/src/main/webapp/WEB-INF/views/admin.jsp @@ -0,0 +1,12 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> + + + + +

Welcome to the ADMIN page

+ + ">Logout + + + \ No newline at end of file diff --git a/jee7/src/main/webapp/WEB-INF/views/home.jsp b/jee7/src/main/webapp/WEB-INF/views/home.jsp new file mode 100644 index 0000000000..c6e129c9ce --- /dev/null +++ b/jee7/src/main/webapp/WEB-INF/views/home.jsp @@ -0,0 +1,26 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> + + + + +

This is the body of the sample view

+ + + This text is only visible to a user +

+ ">Restricted Admin Page +

+
+ + + This text is only visible to an admin +
+ ">Admin Page +
+
+ + ">Logout + + + \ No newline at end of file diff --git a/jee7/src/main/webapp/WEB-INF/views/login.jsp b/jee7/src/main/webapp/WEB-INF/views/login.jsp new file mode 100644 index 0000000000..d6f2e56f3a --- /dev/null +++ b/jee7/src/main/webapp/WEB-INF/views/login.jsp @@ -0,0 +1,26 @@ + + + + +

Login

+ +
+ + + + + + + + + + + + + +
User:
Password:
+ +
+ + + \ No newline at end of file diff --git a/jee7/src/main/webapp/WEB-INF/views/user.jsp b/jee7/src/main/webapp/WEB-INF/views/user.jsp new file mode 100644 index 0000000000..11b8155da7 --- /dev/null +++ b/jee7/src/main/webapp/WEB-INF/views/user.jsp @@ -0,0 +1,12 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> + + + + +

Welcome to the Restricted Admin page

+ + ">Logout + + + \ No newline at end of file diff --git a/jmh/pom.xml b/jmh/pom.xml new file mode 100644 index 0000000000..8ecfaa9651 --- /dev/null +++ b/jmh/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + com.baeldung + jmh + jar + 1.0-SNAPSHOT + jmh + http://maven.apache.org + + + UTF-8 + UTF-8 + 1.8 + + + + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + junit + junit + 3.8.1 + test + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + com.baeldung.Application + + + + + + + + \ No newline at end of file diff --git a/jmh/src/main/java/com/baeldung/Application.java b/jmh/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..28e70740e0 --- /dev/null +++ b/jmh/src/main/java/com/baeldung/Application.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import java.io.IOException; + +import org.openjdk.jmh.Main; +import org.openjdk.jmh.runner.RunnerException; + +public class Application { + + public static void main(String[] args) throws RunnerException, IOException { + Main.main(args); + } + +} diff --git a/jmh/src/main/java/com/baeldung/BenchMark.java b/jmh/src/main/java/com/baeldung/BenchMark.java new file mode 100644 index 0000000000..f2b984d211 --- /dev/null +++ b/jmh/src/main/java/com/baeldung/BenchMark.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.openjdk.jmh.annotations.Benchmark; + +public class BenchMark { + + @Benchmark + public void init() { + + } + +} diff --git a/jmh/src/main/resources/META-INF/BenchmarkList b/jmh/src/main/resources/META-INF/BenchmarkList new file mode 100644 index 0000000000..e69de29bb2 diff --git a/jmh/src/test/java/com/baeldung/AppTest.java b/jmh/src/test/java/com/baeldung/AppTest.java new file mode 100644 index 0000000000..c9f61455bd --- /dev/null +++ b/jmh/src/test/java/com/baeldung/AppTest.java @@ -0,0 +1,38 @@ +package com.baeldung; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/junit5/README.md b/junit5/README.md index 2ca5b08766..c1ff0eab63 100644 --- a/junit5/README.md +++ b/junit5/README.md @@ -1,3 +1,6 @@ ### Relevant Articles: - [The Basics of JUnit 5 – A Preview](http://www.baeldung.com/junit-5-preview) - [A Guide to JUnit 5](http://www.baeldung.com/junit-5) +- [Guide to Dynamic Tests in Junit 5](http://www.baeldung.com/junit5-dynamic-tests) +- [A Guide to @RepeatedTest in Junit 5](http://www.baeldung.com/junit-5-repeated-test) +- [Guide to Dynamic Tests in Junit 5](http://www.baeldung.com/junit5-dynamic-tests) diff --git a/junit5/pom.xml b/junit5/pom.xml index 9f06ebe6a5..6cc1405de8 100644 --- a/junit5/pom.xml +++ b/junit5/pom.xml @@ -21,6 +21,8 @@ 1.8 5.0.0-M4 1.0.0-M4 + 4.12.0-M4 + 4.12 3.6.0 2.19.1 @@ -51,11 +53,40 @@ + + + junit + junit + ${junit4.version} + test + + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + + org.junit.jupiter junit-jupiter-engine ${junit.jupiter.version} test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + \ No newline at end of file diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleTest.java b/junit5/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleTest.java new file mode 100644 index 0000000000..fd7fd93d66 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleTest.java @@ -0,0 +1,23 @@ +package com.baeldung.migration.junit4; + +import org.junit.Ignore; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import com.baeldung.migration.junit4.categories.Annotations; +import com.baeldung.migration.junit4.categories.JUnit4Tests; + +@Category(value = { Annotations.class, JUnit4Tests.class }) +public class AnnotationTestExampleTest { + @Test(expected = Exception.class) + public void shouldRaiseAnException() throws Exception { + throw new Exception("This is my expected exception"); + } + + @Test(timeout = 1) + @Ignore + public void shouldFailBecauseTimeout() throws InterruptedException { + Thread.sleep(10); + } + +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/AssertionsExampleTest.java b/junit5/src/test/java/com/baeldung/migration/junit4/AssertionsExampleTest.java new file mode 100644 index 0000000000..ff2a05a8c4 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit4/AssertionsExampleTest.java @@ -0,0 +1,28 @@ +package com.baeldung.migration.junit4; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Ignore; +import org.junit.Test; + +public class AssertionsExampleTest { + @Test + @Ignore + public void shouldFailBecauseTheNumbersAreNotEqualld() { + assertEquals("Numbers are not equal!", 2, 3); + } + + @Test + public void shouldAssertAllTheGroup() { + List list = Arrays.asList(1, 2, 3); + assertEquals("List is not incremental", list.get(0) + .intValue(), 1); + assertEquals("List is not incremental", list.get(1) + .intValue(), 2); + assertEquals("List is not incremental", list.get(2) + .intValue(), 3); + } +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/RuleExampleTest.java b/junit5/src/test/java/com/baeldung/migration/junit4/RuleExampleTest.java new file mode 100644 index 0000000000..10af6a9254 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit4/RuleExampleTest.java @@ -0,0 +1,18 @@ +package com.baeldung.migration.junit4; + +import org.junit.Rule; +import org.junit.Test; + +import com.baeldung.migration.junit4.rules.TraceUnitTestRule; + +public class RuleExampleTest { + + @Rule + public final TraceUnitTestRule traceRuleTests = new TraceUnitTestRule(); + + @Test + public void whenTracingTests() { + System.out.println("This is my test"); + /*...*/ + } +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java b/junit5/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java new file mode 100644 index 0000000000..a2b1b6bdd3 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java @@ -0,0 +1,5 @@ +package com.baeldung.migration.junit4.categories; + +public interface Annotations { + +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/categories/JUnit4Tests.java b/junit5/src/test/java/com/baeldung/migration/junit4/categories/JUnit4Tests.java new file mode 100644 index 0000000000..6af63d58ab --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit4/categories/JUnit4Tests.java @@ -0,0 +1,5 @@ +package com.baeldung.migration.junit4.categories; + +public interface JUnit4Tests { + +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java b/junit5/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java new file mode 100644 index 0000000000..5c993f17fd --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java @@ -0,0 +1,35 @@ +package com.baeldung.migration.junit4.rules; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.MultipleFailureException; +import org.junit.runners.model.Statement; + +public class TraceUnitTestRule implements TestRule { + + @Override + public Statement apply(Statement base, Description description) { + + return new Statement() { + @Override + public void evaluate() throws Throwable { + List errors = new ArrayList(); + + System.out.println("Starting test ... " + description.getMethodName()); + try { + base.evaluate(); + } catch (Throwable e) { + errors.add(e); + } finally { + System.out.println("... test finished. " + description.getMethodName()); + } + + MultipleFailureException.assertEmpty(errors); + } + }; + } + +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleTest.java b/junit5/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleTest.java new file mode 100644 index 0000000000..07d8ae64e4 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleTest.java @@ -0,0 +1,28 @@ +package com.baeldung.migration.junit5; + +import java.time.Duration; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; + +@Tag("annotations") +@Tag("junit5") +@RunWith(JUnitPlatform.class) +public class AnnotationTestExampleTest { + @Test + public void shouldRaiseAnException() throws Exception { + Assertions.assertThrows(Exception.class, () -> { + throw new Exception("This is my expected exception"); + }); + } + + @Test + @Disabled + public void shouldFailBecauseTimeout() throws InterruptedException { + Assertions.assertTimeout(Duration.ofMillis(1), () -> Thread.sleep(10)); + } +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit5/AssertionsExampleTest.java b/junit5/src/test/java/com/baeldung/migration/junit5/AssertionsExampleTest.java new file mode 100644 index 0000000000..642b7371de --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit5/AssertionsExampleTest.java @@ -0,0 +1,39 @@ +package com.baeldung.migration.junit5; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; + +@RunWith(JUnitPlatform.class) +public class AssertionsExampleTest { + @Test + @Disabled + public void shouldFailBecauseTheNumbersAreNotEqual() { + Assertions.assertEquals(2, 3, "Numbers are not equal!"); + } + + @Test + @Disabled + public void shouldFailBecauseItsNotTrue_overloading() { + Assertions.assertTrue(() -> { + return false; + }, () -> "It's not true!"); + } + + @Test + public void shouldAssertAllTheGroup() { + List list = Arrays.asList(1, 2, 3); + + Assertions.assertAll("List is not incremental", () -> Assertions.assertEquals(list.get(0) + .intValue(), 1), + () -> Assertions.assertEquals(list.get(1) + .intValue(), 2), + () -> Assertions.assertEquals(list.get(2) + .intValue(), 3)); + } +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit5/RuleExampleTest.java b/junit5/src/test/java/com/baeldung/migration/junit5/RuleExampleTest.java new file mode 100644 index 0000000000..a05360250b --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit5/RuleExampleTest.java @@ -0,0 +1,19 @@ +package com.baeldung.migration.junit5; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; + +import com.baeldung.migration.junit5.extensions.TraceUnitExtension; + +@RunWith(JUnitPlatform.class) +@ExtendWith(TraceUnitExtension.class) +public class RuleExampleTest { + + @Test + public void whenTracingTests() { + System.out.println("This is my test"); + /*...*/ + } +} diff --git a/junit5/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java b/junit5/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java new file mode 100644 index 0000000000..104d311bc0 --- /dev/null +++ b/junit5/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java @@ -0,0 +1,19 @@ +package com.baeldung.migration.junit5.extensions; + +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.TestExtensionContext; + +public class TraceUnitExtension implements AfterEachCallback, BeforeEachCallback { + + @Override + public void beforeEach(TestExtensionContext context) throws Exception { + System.out.println("Starting test ... " + context.getDisplayName()); + } + + @Override + public void afterEach(TestExtensionContext context) throws Exception { + System.out.println("... test finished. " + context.getDisplayName()); + } + +} diff --git a/kotlin/README.md b/kotlin/README.md index 57d16e0415..1408bc1ebd 100644 --- a/kotlin/README.md +++ b/kotlin/README.md @@ -4,5 +4,5 @@ - [A guide to the “when{}” block in Kotlin](http://www.baeldung.com/kotlin-when) - [Comprehensive Guide to Null Safety in Kotlin](http://www.baeldung.com/kotlin-null-safety) - [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability) -- [Difference Between “==” and “===” in Kotlin]() +- [Difference Between “==” and “===” in Kotlin](http://www.baeldung.com/kotlin-equality-operators) - [Generics in Kotlin](http://www.baeldung.com/kotlin-generics) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 7b45e9809b..e88013ab69 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -1,9 +1,8 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung kotlin 1.0-SNAPSHOT @@ -13,6 +12,13 @@ 1.0.0-SNAPSHOT + + + central + http://jcenter.bintray.com + + + org.jetbrains.kotlin @@ -31,9 +37,19 @@ ${kotlin-reflect.version} test + + org.jetbrains.kotlinx + kotlinx-coroutines-core + ${kotlinx.version} + + + com.nhaarman + mockito-kotlin + ${mockito-kotlin.version} + test + - @@ -104,10 +120,12 @@ - 1.1.1 - 1.1.1 - 1.1.1 - 1.1.1 + 1.1.2 + 1.1.2 + 1.1.2 + 1.1.2 + 0.15 + 1.5.0 \ No newline at end of file diff --git a/kotlin/src/main/java/com/baeldung/dataclass/Movie.java b/kotlin/src/main/java/com/baeldung/dataclass/Movie.java new file mode 100644 index 0000000000..7eac98fe2a --- /dev/null +++ b/kotlin/src/main/java/com/baeldung/dataclass/Movie.java @@ -0,0 +1,88 @@ +package com.baeldung.dataclass; + +public class Movie { + + private String name; + private String studio; + private float rating; + + public Movie(String name, String studio, float rating) { + this.name = name; + this.studio = studio; + this.rating = rating; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getStudio() { + return studio; + } + + public void setStudio(String studio) { + this.studio = studio; + } + + public float getRating() { + return rating; + } + + public void setRating(float rating) { + this.rating = rating; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + Float.floatToIntBits(rating); + result = prime * result + ((studio == null) ? 0 : studio.hashCode()); + + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + + if (obj == null) + return false; + + if (getClass() != obj.getClass()) + return false; + + Movie other = (Movie) obj; + + if (name == null) { + if (other.name != null) + return false; + + } else if (!name.equals(other.name)) + return false; + + if (Float.floatToIntBits(rating) != Float.floatToIntBits(other.rating)) + return false; + + if (studio == null) { + if (other.studio != null) + return false; + + } else if (!studio.equals(other.studio)) + return false; + + return true; + } + + @Override + public String toString() { + return "Movie [name=" + name + ", studio=" + studio + ", rating=" + rating + "]"; + } +} \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/dataclass/Movie.kt b/kotlin/src/main/kotlin/com/baeldung/dataclass/Movie.kt new file mode 100644 index 0000000000..c0c15b2516 --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/dataclass/Movie.kt @@ -0,0 +1,3 @@ +package com.baeldung.dataclass + +data class Movie(val name: String, val studio: String, var rating: Float) \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/dataclass/Sandbox.kt b/kotlin/src/main/kotlin/com/baeldung/dataclass/Sandbox.kt new file mode 100644 index 0000000000..d47909bf29 --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/dataclass/Sandbox.kt @@ -0,0 +1,26 @@ +package com.baeldung.dataclass + +fun main(args: Array) { + + val movie = Movie("Whiplash", "Sony Pictures", 8.5F) + + println(movie.name) //Whiplash + println(movie.studio) //Sony Pictures + println(movie.rating) //8.5 + + movie.rating = 9F + + println(movie.toString()) //Movie(name=Whiplash, studio=Sony Pictures, rating=9.0) + + val betterRating = movie.copy(rating = 9.5F) + println(betterRating.toString()) //Movie(name=Whiplash, studio=Sony Pictures, rating=9.5) + + movie.component1() //name + movie.component2() //studio + movie.component3() //rating + + val(name, studio, rating) = movie + + fun getMovieInfo() = movie + val(namef, studiof, ratingf) = getMovieInfo() +} \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/BookService.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/BookService.kt new file mode 100644 index 0000000000..993ee555af --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/BookService.kt @@ -0,0 +1,6 @@ +package com.baeldung.kotlin + +interface BookService { + fun inStock(bookId: Int): Boolean + fun lend(bookId: Int, memberId: Int) +} \ No newline at end of file diff --git a/kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/LendBookManager.kt b/kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/LendBookManager.kt new file mode 100644 index 0000000000..5a4718162a --- /dev/null +++ b/kotlin/src/main/kotlin/com/baeldung/kotlin/mockito/LendBookManager.kt @@ -0,0 +1,11 @@ +package com.baeldung.kotlin + +class LendBookManager(val bookService:BookService) { + fun checkout(bookId: Int, memberId: Int) { + if(bookService.inStock(bookId)) { + bookService.lend(bookId, memberId) + } else { + throw IllegalStateException("Book is not available") + } + } +} diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/CoroutinesTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/CoroutinesTest.kt new file mode 100644 index 0000000000..54fafdb3e1 --- /dev/null +++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/CoroutinesTest.kt @@ -0,0 +1,179 @@ +package com.baeldung.kotlin + +import kotlinx.coroutines.experimental.* +import org.junit.Test +import java.util.concurrent.atomic.AtomicInteger +import kotlin.coroutines.experimental.buildSequence +import kotlin.system.measureTimeMillis +import kotlin.test.assertEquals +import kotlin.test.assertTrue + + +class CoroutinesTest { + + @Test + fun givenBuildSequence_whenTakeNElements_thenShouldReturnItInALazyWay() { + //given + val fibonacciSeq = buildSequence { + var a = 0 + var b = 1 + + yield(1) + + while (true) { + yield(a + b) + + val tmp = a + b + a = b + b = tmp + } + } + + //when + val res = fibonacciSeq.take(5).toList() + + //then + assertEquals(res, listOf(1, 1, 2, 3, 5)) + } + + @Test + fun givenLazySeq_whenTakeNElements_thenShouldReturnAllElements() { + //given + val lazySeq = buildSequence { + print("START ") + for (i in 1..5) { + yield(i) + print("STEP ") + } + print("END") + } + //when + val res = lazySeq.take(10).toList() + + //then + assertEquals(res, listOf(1, 2, 3, 4, 5)) + } + + @Test + fun givenAsyncCoroutine_whenStartIt_thenShouldExecuteItInTheAsyncWay() { + //given + val res = mutableListOf() + + //when + runBlocking { + val promise = launch(CommonPool) { expensiveComputation(res) } + res.add("Hello,") + promise.join() + } + + //then + assertEquals(res, listOf("Hello,", "word!")) + } + + + suspend fun expensiveComputation(res: MutableList) { + delay(1000L) + res.add("word!") + } + + @Test + fun givenHugeAmountOfCoroutines_whenStartIt_thenShouldExecuteItWithoutOutOfMemory() { + runBlocking { + //given + val counter = AtomicInteger(0) + val numberOfCoroutines = 100_000 + + //when + val jobs = List(numberOfCoroutines) { + launch(CommonPool) { + delay(1L) + counter.incrementAndGet() + } + } + jobs.forEach { it.join() } + + //then + assertEquals(counter.get(), numberOfCoroutines) + } + } + + @Test + fun givenCancellableJob_whenRequestForCancel_thenShouldQuit() { + runBlocking { + //given + val job = launch(CommonPool) { + while (isActive) { + println("is working") + } + } + + delay(1300L) + + //when + job.cancel() + + //then cancel successfully + + } + } + + @Test(expected = CancellationException::class) + fun givenAsyncAction_whenDeclareTimeout_thenShouldFinishWhenTimedOut() { + runBlocking { + withTimeout(1300L) { + repeat(1000) { i -> + println("Some expensive computation $i ...") + delay(500L) + } + } + } + } + + @Test + fun givenHaveTwoExpensiveAction_whenExecuteThemAsync_thenTheyShouldRunConcurrently() { + runBlocking { + val delay = 1000L + val time = measureTimeMillis { + //given + val one = async(CommonPool) { someExpensiveComputation(delay) } + val two = async(CommonPool) { someExpensiveComputation(delay) } + + //when + runBlocking { + one.await() + two.await() + } + } + + //then + assertTrue(time < delay * 2) + } + } + + @Test + fun givenTwoExpensiveAction_whenExecuteThemLazy_thenTheyShouldNotConcurrently() { + runBlocking { + val delay = 1000L + val time = measureTimeMillis { + //given + val one = async(CommonPool, CoroutineStart.LAZY) { someExpensiveComputation(delay) } + val two = async(CommonPool, CoroutineStart.LAZY) { someExpensiveComputation(delay) } + + //when + runBlocking { + one.await() + two.await() + } + } + + //then + assertTrue(time > delay * 2) + } + } + + suspend fun someExpensiveComputation(delayInMilliseconds: Long) { + delay(delayInMilliseconds) + } + + +} diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/ListToMapTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/ListToMapTest.kt new file mode 100644 index 0000000000..e3477931bb --- /dev/null +++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/ListToMapTest.kt @@ -0,0 +1,74 @@ +package com.baeldung.kotlin + +import org.junit.Test +import kotlin.test.assertTrue + +class ListToMapTest { + + val user1 = User("John", 18, listOf("Hiking, Swimming")) + val user2 = User("Sara", 25, listOf("Chess, Board Games")) + val user3 = User("Dave", 34, listOf("Games, Racing sports")) + val user4 = User("John", 30, listOf("Reading, Poker")) + + @Test + fun givenList_whenConvertToMap_thenResult() { + val myList = listOf(user1, user2, user3) + val myMap = myList.map { it.name to it.age }.toMap() + + assertTrue(myMap.get("John") == 18) + } + + @Test + fun givenList_whenAssociatedBy_thenResult() { + val myList = listOf(user1, user2, user3) + val myMap = myList.associateBy({ it.name }, { it.hobbies }) + + assertTrue(myMap.get("John")!!.contains("Hiking, Swimming")) + } + + @Test + fun givenStringList_whenConvertToMap_thenResult() { + val myList = listOf("a", "b", "c") + val myMap = myList.map { it to it }.toMap() + + assertTrue(myMap.get("a") == "a") + } + + @Test + fun givenStringList_whenAssociate_thenResult() { + val myList = listOf("a", "b", "c", "c", "b") + val myMap = myList.associate{ it to it } + + assertTrue(myMap.get("a") == "a") + } + + @Test + fun givenStringList_whenAssociateTo_thenResult() { + val myList = listOf("a", "b", "c", "c", "b") + val myMap = mutableMapOf() + + myList.associateTo(myMap) {it to it} + + assertTrue(myMap.get("a") == "a") + } + + @Test + fun givenStringList_whenAssociateByTo_thenResult() { + val myList = listOf(user1, user2, user3, user4) + val myMap = mutableMapOf() + + myList.associateByTo(myMap, {it.name}, {it.age}) + + assertTrue(myMap.get("Dave") == 34) + } + + @Test + fun givenStringList_whenAssociateByToUser_thenResult() { + val myList = listOf(user1, user2, user3, user4) + val myMap = mutableMapOf() + + myList.associateByTo(myMap) {it.name} + + assertTrue(myMap.get("Dave")!!.age == 34) + } +} \ No newline at end of file diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTest.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTest.kt new file mode 100644 index 0000000000..ab08273686 --- /dev/null +++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTest.kt @@ -0,0 +1,30 @@ +package com.baeldung.kotlin; + +import org.junit.Test +import org.mockito.Mockito + +class LibraryManagementTest { + @Test(expected = IllegalStateException::class) + fun whenBookIsNotAvailable_thenAnExceptionIsThrown() { + val mockBookService = Mockito.mock(BookService::class.java) + + Mockito.`when`(mockBookService.inStock(100)).thenReturn(false) + + val manager = LendBookManager(mockBookService) + + manager.checkout(100, 1) + } + + @Test + fun whenBookIsAvailable_thenLendMethodIsCalled() { + val mockBookService = Mockito.mock(BookService::class.java) + + Mockito.`when`(mockBookService.inStock(100)).thenReturn(true) + + val manager = LendBookManager(mockBookService) + + manager.checkout(100, 1) + + Mockito.verify(mockBookService).lend(100, 1) + } +} \ No newline at end of file diff --git a/kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTestMockitoKotlin.kt b/kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTestMockitoKotlin.kt new file mode 100644 index 0000000000..1ff4e20c61 --- /dev/null +++ b/kotlin/src/test/kotlin/com/baeldung/kotlin/mockito/LendBookManagerTestMockitoKotlin.kt @@ -0,0 +1,32 @@ +package com.baeldung.kotlin; + +import com.nhaarman.mockito_kotlin.mock +import com.nhaarman.mockito_kotlin.verify +import com.nhaarman.mockito_kotlin.whenever +import org.junit.Test + +class LibraryManagementTestMockitoKotlin { + @Test(expected = IllegalStateException::class) + fun whenBookIsNotAvailable_thenAnExceptionIsThrown() { + val mockBookService = mock() + + whenever(mockBookService.inStock(100)).thenReturn(false) + + val manager = LendBookManager(mockBookService) + + manager.checkout(100, 1) + } + + @Test + fun whenBookIsAvailable_thenLendMethodIsCalled() { + val mockBookService : BookService = mock() + + whenever(mockBookService.inStock(100)).thenReturn(true) + + val manager = LendBookManager(mockBookService) + + manager.checkout(100, 1) + + verify(mockBookService).lend(100, 1) + } +} \ No newline at end of file diff --git a/libraries/OpenNLP/PartOfSpeechTag.txt b/libraries/OpenNLP/PartOfSpeechTag.txt new file mode 100644 index 0000000000..fdd8238ec4 --- /dev/null +++ b/libraries/OpenNLP/PartOfSpeechTag.txt @@ -0,0 +1 @@ +Out of the night that covers me \ No newline at end of file diff --git a/libraries/OpenNLP/doc-cat.train b/libraries/OpenNLP/doc-cat.train new file mode 100644 index 0000000000..c457221ec6 --- /dev/null +++ b/libraries/OpenNLP/doc-cat.train @@ -0,0 +1,10 @@ +GOOD good morning / +GOOD good evening / +GOOD have a good day / +GOOD nice party! / +GOOD fine pants / +BAD nightmare volcano in the sea / +BAD darkest sky / +BAD greed and waste / +BAD army attacks / +BAD bomb explodes / \ No newline at end of file diff --git a/libraries/OpenNLP/en-chunker.bin b/libraries/OpenNLP/en-chunker.bin new file mode 100644 index 0000000000..65d9356888 Binary files /dev/null and b/libraries/OpenNLP/en-chunker.bin differ diff --git a/libraries/OpenNLP/en-ner-location.bin b/libraries/OpenNLP/en-ner-location.bin new file mode 100644 index 0000000000..f3788bc1f6 Binary files /dev/null and b/libraries/OpenNLP/en-ner-location.bin differ diff --git a/libraries/OpenNLP/en-ner-person.bin b/libraries/OpenNLP/en-ner-person.bin new file mode 100644 index 0000000000..2f68318203 Binary files /dev/null and b/libraries/OpenNLP/en-ner-person.bin differ diff --git a/libraries/OpenNLP/en-pos-maxent.bin b/libraries/OpenNLP/en-pos-maxent.bin new file mode 100644 index 0000000000..c8cae23c5f Binary files /dev/null and b/libraries/OpenNLP/en-pos-maxent.bin differ diff --git a/libraries/OpenNLP/en-sent.bin b/libraries/OpenNLP/en-sent.bin new file mode 100644 index 0000000000..e89076be5a Binary files /dev/null and b/libraries/OpenNLP/en-sent.bin differ diff --git a/libraries/OpenNLP/en-token.bin b/libraries/OpenNLP/en-token.bin new file mode 100644 index 0000000000..c417277ca7 Binary files /dev/null and b/libraries/OpenNLP/en-token.bin differ diff --git a/libraries/README.md b/libraries/README.md index c405cc90d8..293e11cf0c 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -11,6 +11,14 @@ - [Intro to JaVer](http://www.baeldung.com/javers) - [Introduction to Apache Commons Math](http://www.baeldung.com/apache-commons-math) - [Intro to JaVer](http://www.baeldung.com/serenity-bdd) +- [Introduction to Netty](http://www.baeldung.com/netty) +- [Guide to Java Data Objects](http://www.baeldung.com/jdo) +- [Software Transactional Memory in Java Using Multiverse](http://www.baeldung.com/java-multiverse-stm) +- [Introduction to HikariCP](http://www.baeldung.com/hikaricp) +- [Serenity BDD with Spring and JBehave](http://www.baeldung.com/serenity-spring-jbehave) +- [Locality-Sensitive Hashing in Java Using Java-LSH](http://www.baeldung.com/locality-sensitive-hashing) +- [Apache Commons Collections OrderedMap](http://www.baeldung.com/apache-commons-ordered-map) + The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. diff --git a/libraries/chromedriver b/libraries/chromedriver new file mode 100755 index 0000000000..9ccb03049b Binary files /dev/null and b/libraries/chromedriver differ diff --git a/libraries/pom.xml b/libraries/pom.xml index ff1997e969..ff9c72399d 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> parent-modules com.baeldung @@ -26,6 +26,15 @@ true + + maven-failsafe-plugin + 2.20 + + + chromedriver + + + net.serenity-bdd.maven.plugins serenity-maven-plugin @@ -50,6 +59,7 @@ ${basedir}/datanucleus.properties ${basedir}/log4j.properties true + false @@ -70,11 +80,26 @@ cglib ${cglib.version} + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + org.apache.commons commons-lang3 ${commons-lang.version} + + org.apache.commons + commons-text + ${commons-text.version} + + + org.apache.commons + commons-collections4 + ${commons.collections.version} + org.jasypt jasypt @@ -225,7 +250,7 @@ org.datanucleus datanucleus-maven-plugin 5.0.2 - + org.datanucleus datanucleus-xml @@ -242,6 +267,18 @@ ${serenity.version} test + + net.serenity-bdd + serenity-screenplay + ${serenity.version} + test + + + net.serenity-bdd + serenity-screenplay-webdriver + ${serenity.version} + test + io.rest-assured spring-mock-mvc @@ -265,11 +302,11 @@ 1.4.195 - pl.pragmatists - JUnitParams - ${jUnitParams.version} - test - + pl.pragmatists + JUnitParams + ${jUnitParams.version} + test + org.quartz-scheduler quartz @@ -286,11 +323,68 @@ jool 0.9.12 + + org.openjdk.jmh + jmh-core + 1.19 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + + + io.netty + netty-all + ${netty.version} + + + + org.apache.opennlp + opennlp-tools + 1.8.0 + + + junit + junit + ${junit.version} + test + + + info.debatty + java-lsh + ${java-lsh.version} + + + au.com.dius + pact-jvm-consumer-junit_2.11 + ${pact.version} + test + + + org.codehaus.groovy + groovy-all + 2.4.10 + + + org.awaitility + awaitility + ${awaitility.version} + test + + + org.awaitility + awaitility-proxy + ${awaitility.version} + test + 0.7.0 3.2.4 3.5 + 1.1 + 1.9.3 1.9.2 1.2 3.21.0-GA @@ -310,6 +404,12 @@ 1.1.3-rc.5 1.4.0 1.1.0 + 4.1.10.Final + 4.1 + 4.12 + 0.10 + 3.5.0 + 3.0.0 diff --git a/libraries/src/main/java/com/baeldung/awaitility/AsyncService.java b/libraries/src/main/java/com/baeldung/awaitility/AsyncService.java new file mode 100644 index 0000000000..3bc82afaac --- /dev/null +++ b/libraries/src/main/java/com/baeldung/awaitility/AsyncService.java @@ -0,0 +1,50 @@ +package com.baeldung.awaitility; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicLong; + +public class AsyncService { + private final int DELAY = 1000; + private final int INIT_DELAY = 2000; + + private AtomicLong value = new AtomicLong(0); + private Executor executor = Executors.newFixedThreadPool(4); + private volatile boolean initialized = false; + + public void initialize() { + executor.execute(() -> { + sleep(INIT_DELAY); + initialized = true; + }); + } + + public boolean isInitialized() { + return initialized; + } + + public void addValue(long val) { + if (!isInitialized()) { + throw new IllegalStateException("Service is not initialized"); + } + executor.execute(() -> { + sleep(DELAY); + value.addAndGet(val); + }); + } + + public long getValue() { + if (!isInitialized()) { + throw new IllegalStateException("Service is not initialized"); + } + return value.longValue(); + } + + private void sleep(int delay) { + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/Course.java b/libraries/src/main/java/com/baeldung/commons/beanutils/Course.java new file mode 100644 index 0000000000..03251586fd --- /dev/null +++ b/libraries/src/main/java/com/baeldung/commons/beanutils/Course.java @@ -0,0 +1,35 @@ +package com.baeldung.commons.beanutils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Course { + private String name; + private List codes; + private Map enrolledStudent = new HashMap(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getCodes() { + return codes; + } + + public void setCodes(List codes) { + this.codes = codes; + } + + public void setEnrolledStudent(String enrolledId, Student student) { + enrolledStudent.put(enrolledId, student); + } + + public Student getEnrolledStudent(String enrolledId) { + return enrolledStudent.get(enrolledId); + } +} diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java b/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java new file mode 100644 index 0000000000..4a0b59404d --- /dev/null +++ b/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java @@ -0,0 +1,35 @@ +package com.baeldung.commons.beanutils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CourseEntity { + private String name; + private List codes; + private Map students = new HashMap(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getCodes() { + return codes; + } + + public void setCodes(List codes) { + this.codes = codes; + } + + public void setStudent(String id, Student student) { + students.put(id, student); + } + + public Student getStudent(String enrolledId) { + return students.get(enrolledId); + } +} diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java b/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java new file mode 100644 index 0000000000..1f566a782a --- /dev/null +++ b/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java @@ -0,0 +1,40 @@ +package com.baeldung.commons.beanutils; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; + +public class CourseService { + + public static void setValues(Course course, String name, List codes) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + // Setting the simple properties + PropertyUtils.setSimpleProperty(course, "name", name); + PropertyUtils.setSimpleProperty(course, "codes", codes); + } + + public static void setIndexedValue(Course course, int codeIndex, String code) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + // Setting the indexed properties + PropertyUtils.setIndexedProperty(course, "codes[" + codeIndex + "]", code); + } + + public static void setMappedValue(Course course, String enrollId, Student student) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + // Setting the mapped properties + PropertyUtils.setMappedProperty(course, "enrolledStudent(" + enrollId + ")", student); + } + + public static String getNestedValue(Course course, String enrollId, String nestedPropertyName) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + return (String) PropertyUtils.getNestedProperty( + course, "enrolledStudent(" + enrollId + ")." + nestedPropertyName); + } + + public static void copyProperties(Course course, CourseEntity courseEntity) + throws IllegalAccessException, InvocationTargetException { + BeanUtils.copyProperties(course, courseEntity); + } +} diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/Student.java b/libraries/src/main/java/com/baeldung/commons/beanutils/Student.java new file mode 100644 index 0000000000..3790bf6f9e --- /dev/null +++ b/libraries/src/main/java/com/baeldung/commons/beanutils/Student.java @@ -0,0 +1,13 @@ +package com.baeldung.commons.beanutils; + +public class Student { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/libraries/src/main/java/com/baeldung/commons/collectionutil/Address.java b/libraries/src/main/java/com/baeldung/commons/collectionutil/Address.java new file mode 100644 index 0000000000..a1e231ec85 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/commons/collectionutil/Address.java @@ -0,0 +1,47 @@ +package com.baeldung.commons.collectionutil; + +public class Address { + + private String locality; + private String city; + private String zip; + + public String getLocality() { + return locality; + } + + public void setLocality(String locality) { + this.locality = locality; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Address [locality=").append(locality).append(", city=").append(city).append(", zip=").append(zip).append("]"); + return builder.toString(); + } + + public Address(String locality, String city, String zip) { + super(); + this.locality = locality; + this.city = city; + this.zip = zip; + } + +} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java b/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java new file mode 100644 index 0000000000..e22f13861e --- /dev/null +++ b/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java @@ -0,0 +1,118 @@ +package com.baeldung.commons.collectionutil; + +public class Customer implements Comparable { + + private Integer id; + private String name; + private Long phone; + private String locality; + private String city; + private String zip; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getPhone() { + return phone; + } + + public void setPhone(Long phone) { + this.phone = phone; + } + + public String getLocality() { + return locality; + } + + public void setLocality(String locality) { + this.locality = locality; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + public Customer(Integer id, String name, Long phone, String locality, String city, String zip) { + super(); + this.id = id; + this.name = name; + this.phone = phone; + this.locality = locality; + this.city = city; + this.zip = zip; + } + + public Customer(Integer id, String name, Long phone) { + super(); + this.id = id; + this.name = name; + this.phone = phone; + } + + public Customer(String name) { + super(); + this.name = name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Customer other = (Customer) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + public int compareTo(Customer o) { + return this.name.compareTo(o.getName()); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Customer [id=").append(id).append(", name=").append(name).append(", phone=").append(phone).append("]"); + return builder.toString(); + } + +} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/jmh/BenchMark.java b/libraries/src/main/java/com/baeldung/jmh/BenchMark.java new file mode 100644 index 0000000000..bc0c348556 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmh/BenchMark.java @@ -0,0 +1,12 @@ +package com.baeldung.jmh; + +import org.openjdk.jmh.annotations.Benchmark; + +public class BenchMark { + + @Benchmark + public void init() { + + } + +} diff --git a/libraries/src/main/java/com/baeldung/jmh/JmhDemo.java b/libraries/src/main/java/com/baeldung/jmh/JmhDemo.java new file mode 100644 index 0000000000..6f1e8bc8cf --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmh/JmhDemo.java @@ -0,0 +1,12 @@ +package com.baeldung.jmh; + +import java.io.IOException; + +import org.openjdk.jmh.Main; +import org.openjdk.jmh.runner.RunnerException; + +public class JmhDemo { + public static void main(String[] args) throws RunnerException, IOException { + Main.main(args); + } +} diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/MainApplication.java b/libraries/src/main/java/com/baeldung/jmh/warmup/MainApplication.java new file mode 100644 index 0000000000..994a22c210 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmh/warmup/MainApplication.java @@ -0,0 +1,19 @@ +package com.baeldung.jmh.warmup; + +public class MainApplication { + + static { + long start = System.nanoTime(); + ManualClassLoader.load(); + long end = System.nanoTime(); + System.out.println("Warm Up time : " + (end - start)); + } + + public static void main(String[] args) { + long start = System.nanoTime(); + ManualClassLoader.load(); + long end = System.nanoTime(); + System.out.println("Total time taken : " + (end - start)); + } + +} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java b/libraries/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java new file mode 100644 index 0000000000..07cf7f6bcb --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmh/warmup/ManualClassLoader.java @@ -0,0 +1,17 @@ +package com.baeldung.jmh.warmup; + +import com.baeldung.jmh.warmup.dummy.Dummy; + +public class ManualClassLoader { + + public static void load() { + + for (int i = 0; i < 100000; i++) { + // load all(or most) important classes + Dummy dummy = new Dummy(); + dummy.m(); + } + + } + +} diff --git a/libraries/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java b/libraries/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java new file mode 100644 index 0000000000..d88215548c --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmh/warmup/dummy/Dummy.java @@ -0,0 +1,9 @@ +package com.baeldung.jmh.warmup.dummy; + +public class Dummy { + + public void m() { + + } + +} diff --git a/libraries/src/main/java/com/baeldung/netty/ClientHandler.java b/libraries/src/main/java/com/baeldung/netty/ClientHandler.java new file mode 100644 index 0000000000..5981affd22 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/ClientHandler.java @@ -0,0 +1,20 @@ +package com.baeldung.netty; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +public class ClientHandler extends ChannelInboundHandlerAdapter { + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + RequestData msg = new RequestData(); + msg.setIntValue(123); + msg.setStringValue("all work and no play makes jack a dull boy"); + ctx.writeAndFlush(msg); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println(msg); + ctx.close(); + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/NettyClient.java b/libraries/src/main/java/com/baeldung/netty/NettyClient.java new file mode 100644 index 0000000000..97dfc70b9f --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/NettyClient.java @@ -0,0 +1,37 @@ +package com.baeldung.netty; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +public class NettyClient { + public static void main(String[] args) throws Exception { + String host = "localhost"; + int port = 8080; + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + Bootstrap b = new Bootstrap(); + b.group(workerGroup); + b.channel(NioSocketChannel.class); + b.option(ChannelOption.SO_KEEPALIVE, true); + b.handler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(new RequestDataEncoder(), new ResponseDataDecoder(), new ClientHandler()); + } + }); + + ChannelFuture f = b.connect(host, port).sync(); + + f.channel().closeFuture().sync(); + } finally { + workerGroup.shutdownGracefully(); + } + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/NettyServer.java b/libraries/src/main/java/com/baeldung/netty/NettyServer.java new file mode 100644 index 0000000000..b9d35859d0 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/NettyServer.java @@ -0,0 +1,49 @@ +package com.baeldung.netty; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; + +public class NettyServer { + + private int port; + + public NettyServer(int port) { + this.port = port; + } + + public static void main(String[] args) throws Exception { + int port; + if (args.length > 0) { + port = Integer.parseInt(args[0]); + } else { + port = 8080; + } + new NettyServer(port).run(); + } + + public void run() throws Exception { + EventLoopGroup bossGroup = new NioEventLoopGroup(); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(new RequestDecoder(), new ResponseDataEncoder(), new ProcessingHandler()); + } + }).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true); + + ChannelFuture f = b.bind(port).sync(); + f.channel().closeFuture().sync(); + } finally { + workerGroup.shutdownGracefully(); + bossGroup.shutdownGracefully(); + } + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/ProcessingHandler.java b/libraries/src/main/java/com/baeldung/netty/ProcessingHandler.java new file mode 100644 index 0000000000..6de4d3fca8 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/ProcessingHandler.java @@ -0,0 +1,19 @@ +package com.baeldung.netty; + +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +public class ProcessingHandler extends ChannelInboundHandlerAdapter { + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + RequestData requestData = (RequestData) msg; + ResponseData responseData = new ResponseData(); + responseData.setIntValue(requestData.getIntValue() * 2); + ChannelFuture future = ctx.writeAndFlush(responseData); + future.addListener(ChannelFutureListener.CLOSE); + System.out.println(requestData); + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/RequestData.java b/libraries/src/main/java/com/baeldung/netty/RequestData.java new file mode 100644 index 0000000000..e7404c1663 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/RequestData.java @@ -0,0 +1,30 @@ +package com.baeldung.netty; + +public class RequestData { + private int intValue; + private String stringValue; + + public int getIntValue() { + return intValue; + } + + public void setIntValue(int intValue) { + this.intValue = intValue; + } + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(String stringValue) { + this.stringValue = stringValue; + } + + @Override + public String toString() { + return "RequestData{" + + "intValue=" + intValue + + ", stringValue='" + stringValue + '\'' + + '}'; + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/RequestDataEncoder.java b/libraries/src/main/java/com/baeldung/netty/RequestDataEncoder.java new file mode 100644 index 0000000000..205a48699e --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/RequestDataEncoder.java @@ -0,0 +1,19 @@ +package com.baeldung.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +import java.nio.charset.Charset; + +public class RequestDataEncoder extends MessageToByteEncoder { + + private final Charset charset = Charset.forName("UTF-8"); + + @Override + protected void encode(ChannelHandlerContext ctx, RequestData msg, ByteBuf out) throws Exception { + out.writeInt(msg.getIntValue()); + out.writeInt(msg.getStringValue().length()); + out.writeCharSequence(msg.getStringValue(), charset); + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/RequestDecoder.java b/libraries/src/main/java/com/baeldung/netty/RequestDecoder.java new file mode 100644 index 0000000000..38b78fc877 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/RequestDecoder.java @@ -0,0 +1,22 @@ +package com.baeldung.netty; + +import java.nio.charset.Charset; +import java.util.List; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ReplayingDecoder; + +public class RequestDecoder extends ReplayingDecoder { + + private final Charset charset = Charset.forName("UTF-8"); + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { + RequestData data = new RequestData(); + data.setIntValue(in.readInt()); + int strLen = in.readInt(); + data.setStringValue(in.readCharSequence(strLen, charset).toString()); + out.add(data); + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/ResponseData.java b/libraries/src/main/java/com/baeldung/netty/ResponseData.java new file mode 100644 index 0000000000..ce388a9a3d --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/ResponseData.java @@ -0,0 +1,20 @@ +package com.baeldung.netty; + +public class ResponseData { + private int intValue; + + public int getIntValue() { + return intValue; + } + + public void setIntValue(int intValue) { + this.intValue = intValue; + } + + @Override + public String toString() { + return "ResponseData{" + + "intValue=" + intValue + + '}'; + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/ResponseDataDecoder.java b/libraries/src/main/java/com/baeldung/netty/ResponseDataDecoder.java new file mode 100644 index 0000000000..ee33679dfe --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/ResponseDataDecoder.java @@ -0,0 +1,17 @@ +package com.baeldung.netty; + +import java.util.List; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ReplayingDecoder; + +public class ResponseDataDecoder extends ReplayingDecoder { + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { + ResponseData data = new ResponseData(); + data.setIntValue(in.readInt()); + out.add(data); + } +} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/netty/ResponseDataEncoder.java b/libraries/src/main/java/com/baeldung/netty/ResponseDataEncoder.java new file mode 100644 index 0000000000..c73be11a44 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/ResponseDataEncoder.java @@ -0,0 +1,13 @@ +package com.baeldung.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +public class ResponseDataEncoder extends MessageToByteEncoder { + + @Override + protected void encode(ChannelHandlerContext ctx, ResponseData msg, ByteBuf out) throws Exception { + out.writeInt(msg.getIntValue()); + } +} diff --git a/libraries/src/main/java/com/baeldung/netty/SimpleProcessingHandler.java b/libraries/src/main/java/com/baeldung/netty/SimpleProcessingHandler.java new file mode 100644 index 0000000000..d12089f0bb --- /dev/null +++ b/libraries/src/main/java/com/baeldung/netty/SimpleProcessingHandler.java @@ -0,0 +1,39 @@ +package com.baeldung.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +public class SimpleProcessingHandler extends ChannelInboundHandlerAdapter { + private ByteBuf tmp; + + @Override + public void handlerAdded(ChannelHandlerContext ctx) { + System.out.println("Handler added"); + tmp = ctx.alloc().buffer(4); + } + + @Override + public void handlerRemoved(ChannelHandlerContext ctx) { + System.out.println("Handler removed"); + tmp.release(); + tmp = null; + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) { + ByteBuf m = (ByteBuf) msg; + tmp.writeBytes(m); + m.release(); + if (tmp.readableBytes() >= 4) { + RequestData requestData = new RequestData(); + requestData.setIntValue(tmp.readInt()); + ResponseData responseData = new ResponseData(); + responseData.setIntValue(requestData.getIntValue() * 2); + ChannelFuture future = ctx.writeAndFlush(responseData); + future.addListener(ChannelFutureListener.CLOSE); + } + } +} diff --git a/libraries/src/main/java/com/baeldung/opennlp/OpenNLP.java b/libraries/src/main/java/com/baeldung/opennlp/OpenNLP.java new file mode 100644 index 0000000000..dd44e96a3a --- /dev/null +++ b/libraries/src/main/java/com/baeldung/opennlp/OpenNLP.java @@ -0,0 +1,188 @@ +package com.baeldung.opennlp; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.logging.Logger; + +import opennlp.tools.chunker.ChunkerME; +import opennlp.tools.chunker.ChunkerModel; +import opennlp.tools.cmdline.postag.POSModelLoader; +import opennlp.tools.doccat.DoccatFactory; +import opennlp.tools.doccat.DoccatModel; +import opennlp.tools.doccat.DocumentCategorizerME; +import opennlp.tools.doccat.DocumentSample; +import opennlp.tools.doccat.DocumentSampleStream; +import opennlp.tools.namefind.NameFinderME; +import opennlp.tools.namefind.TokenNameFinderModel; +import opennlp.tools.postag.POSModel; +import opennlp.tools.postag.POSSample; +import opennlp.tools.postag.POSTaggerME; +import opennlp.tools.sentdetect.SentenceDetectorME; +import opennlp.tools.sentdetect.SentenceModel; +import opennlp.tools.tokenize.Tokenizer; +import opennlp.tools.tokenize.TokenizerME; +import opennlp.tools.tokenize.TokenizerModel; +import opennlp.tools.tokenize.WhitespaceTokenizer; +import opennlp.tools.util.InputStreamFactory; +import opennlp.tools.util.InvalidFormatException; +import opennlp.tools.util.ObjectStream; +import opennlp.tools.util.PlainTextByLineStream; +import opennlp.tools.util.Span; +import opennlp.tools.util.TrainingParameters; + +public class OpenNLP { + + private final static Logger LOGGER = Logger.getLogger(OpenNLP.class.getName()); + private final static String text = buildString(); + private final static String sentence[] = new String[] { "James", "Jordan", "live", "in", "Oklahoma", "city", "." }; + + private DoccatModel docCatModel; + + public static void main(String[] args) { + new OpenNLP(); + } + + public static String buildString(){ + StringBuilder sb = new StringBuilder(); + sb.append("To get to the south:"); + sb.append(" Go to the store."); + sb.append(" Buy a compass."); + sb.append(" Use the compass."); + sb.append(" Then walk to the south."); + return sb.toString(); + } + + public OpenNLP() { + try { + sentenceDetector(); + tokenizer(); + nameFinder(); + locationFinder(); + trainDocumentCategorizer(); + documentCategorizer(); + partOfSpeechTagger(); + chunker(); + } catch (InvalidFormatException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void sentenceDetector() throws InvalidFormatException, IOException { + + InputStream is = new FileInputStream("OpenNLP/en-sent.bin"); + SentenceModel model = new SentenceModel(is); + SentenceDetectorME sdetector = new SentenceDetectorME(model); + String sentences[] = sdetector.sentDetect(text); + for (String sentence : sentences) { + LOGGER.info(sentence); + } + is.close(); + } + + public void tokenizer() throws InvalidFormatException, IOException { + InputStream is = new FileInputStream("OpenNLP/en-token.bin"); + TokenizerModel model = new TokenizerModel(is); + Tokenizer tokenizer = new TokenizerME(model); + String tokens[] = tokenizer.tokenize(text); + for (String token : tokens) { + LOGGER.info(token); + } + is.close(); + } + + public static void nameFinder() throws IOException { + InputStream is = new FileInputStream("OpenNLP/en-ner-person.bin"); + TokenNameFinderModel model = new TokenNameFinderModel(is); + is.close(); + NameFinderME nameFinder = new NameFinderME(model); + Span nameSpans[] = nameFinder.find(sentence); + String[] names = Span.spansToStrings(nameSpans, sentence); + Arrays.stream(names).forEach(LOGGER::info); + for (String name : names) { + LOGGER.info(name); + } + } + + public static void locationFinder() throws IOException { + InputStream is = new FileInputStream("OpenNLP/en-ner-location.bin"); + TokenNameFinderModel model = new TokenNameFinderModel(is); + is.close(); + NameFinderME nameFinder = new NameFinderME(model); + Span locationSpans[] = nameFinder.find(sentence); + String[] locations = Span.spansToStrings(locationSpans, sentence); + Arrays.stream(locations).forEach(LOGGER::info); + for (String location : locations) { + LOGGER.info(location); + } + } + + public void trainDocumentCategorizer() { + + try { + InputStreamFactory isf = new InputStreamFactory() { + public InputStream createInputStream() throws IOException { + return new FileInputStream("OpenNLP/doc-cat.train"); + } + }; + ObjectStream lineStream = new PlainTextByLineStream(isf, "UTF-8"); + ObjectStream sampleStream = new DocumentSampleStream(lineStream); + DoccatFactory docCatFactory = new DoccatFactory(); + docCatModel = DocumentCategorizerME.train("en", sampleStream, TrainingParameters.defaultParams(), docCatFactory); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void documentCategorizer() { + DocumentCategorizerME myCategorizer = new DocumentCategorizerME(docCatModel); + double[] outcomes = myCategorizer.categorize(sentence); + String category = myCategorizer.getBestCategory(outcomes); + + if (category.equalsIgnoreCase("GOOD")) { + LOGGER.info("Document is positive :) "); + } else { + LOGGER.info("Document is negative :( "); + } + } + + public static void partOfSpeechTagger() throws IOException { + try { + POSModel posModel = new POSModelLoader().load(new File("OpenNLP/en-pos-maxent.bin")); + POSTaggerME posTaggerME = new POSTaggerME(posModel); + InputStreamFactory isf = new InputStreamFactory() { + public InputStream createInputStream() throws IOException { + return new FileInputStream("OpenNLP/PartOfSpeechTag.txt"); + } + }; + ObjectStream lineStream = new PlainTextByLineStream(isf, "UTF-8"); + String line; + while ((line = lineStream.read()) != null) { + String whitespaceTokenizerLine[] = WhitespaceTokenizer.INSTANCE.tokenize(line); + String[] tags = posTaggerME.tag(whitespaceTokenizerLine); + POSSample posSample = new POSSample(whitespaceTokenizerLine, tags); + LOGGER.info(posSample.toString()); + } + lineStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void chunker() throws IOException { + InputStream is = new FileInputStream("OpenNLP/en-chunker.bin"); + ChunkerModel cModel = new ChunkerModel(is); + ChunkerME chunkerME = new ChunkerME(cModel); + String[] taggedSentence = new String[] {"Out", "of", "the", "night", "that", "covers", "me"}; + String pos[] = new String[] { "IN", "IN", "DT", "NN", "WDT", "VBZ", "PRP"}; + String chunks[] = chunkerME.chunk(taggedSentence, pos); + for (String chunk : chunks) { + LOGGER.info(chunk); + } + } + +} diff --git a/libraries/src/main/java/com/baeldung/quartz/JobA.java b/libraries/src/main/java/com/baeldung/quartz/JobA.java new file mode 100644 index 0000000000..76eb1118e6 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/quartz/JobA.java @@ -0,0 +1,13 @@ +package com.baeldung.quartz; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +public class JobA implements Job { + + public void execute(JobExecutionContext arg0) throws JobExecutionException { + System.out.println("This is the job A"); + } + +} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/quartz/JobB.java b/libraries/src/main/java/com/baeldung/quartz/JobB.java new file mode 100644 index 0000000000..1a5e353c74 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/quartz/JobB.java @@ -0,0 +1,13 @@ +package com.baeldung.quartz; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +public class JobB implements Job { + + public void execute(JobExecutionContext arg0) throws JobExecutionException { + System.out.println("This is the job B"); + } + +} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/quartz/QuartzExample.java b/libraries/src/main/java/com/baeldung/quartz/QuartzExample.java index 1e37fc028b..20853aa01b 100644 --- a/libraries/src/main/java/com/baeldung/quartz/QuartzExample.java +++ b/libraries/src/main/java/com/baeldung/quartz/QuartzExample.java @@ -21,6 +21,8 @@ public class QuartzExample { JobDetail job = JobBuilder.newJob(SimpleJob.class) .withIdentity("myJob", "group1") + .usingJobData("jobSays", "Hello World!") + .usingJobData("myFloatValue", 3.141f) .build(); Trigger trigger = TriggerBuilder.newTrigger() @@ -30,8 +32,36 @@ public class QuartzExample { .withIntervalInSeconds(40) .repeatForever()) .build(); + + JobDetail jobA = JobBuilder.newJob(JobA.class) + .withIdentity("jobA", "group2") + .build(); + + JobDetail jobB = JobBuilder.newJob(JobB.class) + .withIdentity("jobB", "group2") + .build(); + + Trigger triggerA = TriggerBuilder.newTrigger() + .withIdentity("triggerA", "group2") + .startNow() + .withPriority(15) + .withSchedule(SimpleScheduleBuilder.simpleSchedule() + .withIntervalInSeconds(40) + .repeatForever()) + .build(); + + Trigger triggerB = TriggerBuilder.newTrigger() + .withIdentity("triggerB", "group2") + .startNow() + .withPriority(10) + .withSchedule(SimpleScheduleBuilder.simpleSchedule() + .withIntervalInSeconds(20) + .repeatForever()) + .build(); sched.scheduleJob(job, trigger); + sched.scheduleJob(jobA, triggerA); + sched.scheduleJob(jobB, triggerB); sched.start(); } catch (SchedulerException e) { diff --git a/libraries/src/main/java/com/baeldung/quartz/SimpleJob.java b/libraries/src/main/java/com/baeldung/quartz/SimpleJob.java index 370d698d13..986c5e96e5 100644 --- a/libraries/src/main/java/com/baeldung/quartz/SimpleJob.java +++ b/libraries/src/main/java/com/baeldung/quartz/SimpleJob.java @@ -1,13 +1,21 @@ package com.baeldung.quartz; import org.quartz.Job; +import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class SimpleJob implements Job { - public void execute(JobExecutionContext arg0) throws JobExecutionException { - System.out.println("This is a quartz job!"); + public void execute(JobExecutionContext context) throws JobExecutionException { + JobDataMap dataMap = context.getJobDetail() + .getJobDataMap(); + + String jobSays = dataMap.getString("jobSays"); + float myFloatValue = dataMap.getFloat("myFloatValue"); + + System.out.println("Job says: " + jobSays + ", and val is: " + myFloatValue); + } } \ No newline at end of file diff --git a/libraries/src/main/resources/META-INF/BenchmarkList b/libraries/src/main/resources/META-INF/BenchmarkList new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceUnitTest.java b/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceUnitTest.java new file mode 100644 index 0000000000..4f07d556b9 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/awaitility/AsyncServiceUnitTest.java @@ -0,0 +1,84 @@ +package com.baeldung.awaitility; + +import static org.awaitility.Awaitility.await; +import static org.awaitility.Awaitility.fieldIn; +import static org.awaitility.Awaitility.given; +import static org.awaitility.proxy.AwaitilityClassProxy.to; +import static org.hamcrest.Matchers.equalTo; + +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +import org.awaitility.Awaitility; +import org.awaitility.Duration; +import org.junit.Before; +import org.junit.Test; + +public class AsyncServiceUnitTest { + private AsyncService asyncService; + + @Before + public void setUp() { + asyncService = new AsyncService(); + } + + @Test + public void givenAsyncService_whenInitialize_thenInitOccurs1() { + asyncService.initialize(); + Callable isInitialized = () -> asyncService.isInitialized(); + await().until(isInitialized); + } + + @Test + public void givenAsyncService_whenInitialize_thenInitOccurs2() { + asyncService.initialize(); + Callable isInitialized = () -> asyncService.isInitialized(); + await().atLeast(Duration.ONE_HUNDRED_MILLISECONDS) + .atMost(Duration.FIVE_SECONDS) + .with().pollInterval(Duration.ONE_HUNDRED_MILLISECONDS) + .until(isInitialized); + } + + @Test + public void givenAsyncService_whenInitialize_thenInitOccurs_withDefualts() { + Awaitility.setDefaultPollInterval(10, TimeUnit.MILLISECONDS); + Awaitility.setDefaultPollDelay(Duration.ZERO); + Awaitility.setDefaultTimeout(Duration.ONE_MINUTE); + + asyncService.initialize(); + await().until(() -> asyncService.isInitialized()); + } + + @Test + public void givenAsyncService_whenInitialize_thenInitOccurs_withProxy() { + asyncService.initialize(); + await().untilCall(to(asyncService).isInitialized(), equalTo(true)); + } + + @Test + public void givenAsyncService_whenInitialize_thenInitOccurs3() { + asyncService.initialize(); + await().until(fieldIn(asyncService) + .ofType(boolean.class) + .andWithName("initialized"), equalTo(true)); + } + + @Test + public void givenValue_whenAddValue_thenValueAdded() { + asyncService.initialize(); + await().until(() -> asyncService.isInitialized()); + long value = 5; + asyncService.addValue(value); + await().until(asyncService::getValue, equalTo(value)); + } + + @Test + public void givenAsyncService_whenGetValue_thenExceptionIgnored() { + asyncService.initialize(); + given().ignoreException(IllegalStateException.class) + .await() + .atMost(Duration.FIVE_SECONDS) + .atLeast(Duration.FIVE_HUNDRED_MILLISECONDS) + .until(asyncService::getValue, equalTo(0L)); + } +} diff --git a/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceTest.java b/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceTest.java new file mode 100644 index 0000000000..5407477a00 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceTest.java @@ -0,0 +1,53 @@ +package com.baeldung.commons.beanutils; + +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +public class CourseServiceTest { + + @Test + public void givenCourse_whenSetValuesUsingPropertyUtil_thenReturnSetValues() + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + Course course = new Course(); + String name = "Computer Science"; + List codes = Arrays.asList("CS", "CS01"); + CourseService.setValues(course, name, codes); + + Assert.assertEquals(name, course.getName()); + Assert.assertEquals(2, course.getCodes().size()); + Assert.assertEquals("CS", course.getCodes().get(0)); + + CourseService.setIndexedValue(course, 1, "CS02"); + Assert.assertEquals("CS02", course.getCodes().get(1)); + + Student student = new Student(); + String studentName = "Joe"; + student.setName(studentName); + + CourseService.setMappedValue(course, "ST-1", student); + Assert.assertEquals(student, course.getEnrolledStudent("ST-1")); + + String accessedStudentName = CourseService.getNestedValue(course, "ST-1", "name"); + Assert.assertEquals(studentName, accessedStudentName); + } + + @Test + public void givenCopyProperties_whenCopyCourseToCourseEntity_thenCopyPropertyWithSameName() + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + Course course = new Course(); + course.setName("Computer Science"); + course.setCodes(Arrays.asList("CS")); + course.setEnrolledStudent("ST-1", new Student()); + + CourseEntity courseEntity = new CourseEntity(); + + CourseService.copyProperties(course, courseEntity); + Assert.assertEquals(course.getName(), courseEntity.getName()); + Assert.assertEquals(course.getCodes(), courseEntity.getCodes()); + Assert.assertNull(courseEntity.getStudent("ST-1")); + } +} diff --git a/libraries/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java b/libraries/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java new file mode 100644 index 0000000000..64a3932fb3 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.commons.collections; + +import org.apache.commons.collections4.BidiMap; +import org.apache.commons.collections4.bidimap.DualHashBidiMap; +import org.apache.commons.collections4.bidimap.DualLinkedHashBidiMap; +import org.apache.commons.collections4.bidimap.DualTreeBidiMap; +import org.apache.commons.collections4.bidimap.TreeBidiMap; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by smatt on 03/07/2017. + */ +public class BidiMapUnitTest { + + @Test + public void givenKeyValue_whenPut_thenAddEntryToMap() { + BidiMap map = new DualHashBidiMap<>(); + map.put("key1", "value1"); + map.put("key2", "value2"); + assertEquals(map.size(), 2); + } + + @Test + public void whenInverseBidiMap_thenInverseKeyValue() { + BidiMap map = new DualHashBidiMap<>(); + map.put("key1", "value1"); + map.put("key2", "value2"); + BidiMap rMap = map.inverseBidiMap(); + assertTrue(rMap.containsKey("value1") && rMap.containsKey("value2")); + } + + @Test + public void givenValue_whenRemoveValue_thenRemoveMatchingMapEntry() { + BidiMap map = new DualHashBidiMap<>(); + map.put("key1", "value1"); + map.put("key2", "value2"); + map.removeValue("value2"); + assertFalse(map.containsKey("key2")); + } + + @Test + public void givenValue_whenGetKey_thenMappedKey() { + BidiMap map = new DualHashBidiMap<>(); + map.put("key1", "value1"); + assertEquals(map.getKey("value1"), "key1"); + } +} diff --git a/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideTest.java b/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideTest.java new file mode 100644 index 0000000000..9166865484 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideTest.java @@ -0,0 +1,113 @@ +package com.baeldung.commons.collections; + + +import com.baeldung.commons.collectionutil.Address; +import com.baeldung.commons.collectionutil.Customer; +import org.apache.commons.collections4.Closure; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; +import org.junit.Before; +import org.junit.Test; + +import java.util.*; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class CollectionUtilsGuideTest { + + + Customer customer1 = new Customer(1, "Daniel", 123456l, "locality1", "city1", "1234"); + Customer customer4 = new Customer(4, "Bob", 456789l, "locality4", "city4", "4567"); + List list1, list2, list3, linkedList1; + + @Before + public void setup() { + Customer customer2 = new Customer(2, "Fredrik", 234567l, "locality2", "city2", "2345"); + Customer customer3 = new Customer(3, "Kyle", 345678l, "locality3", "city3", "3456"); + Customer customer5 = new Customer(5, "Cat", 567890l, "locality5", "city5", "5678"); + Customer customer6 = new Customer(6, "John", 678901l, "locality6", "city6", "6789"); + + list1 = Arrays.asList(customer1, customer2, customer3); + list2 = Arrays.asList(customer4, customer5, customer6); + list3 = Arrays.asList(customer1, customer2); + + linkedList1 = new LinkedList<>(list1); + } + + @Test + public void givenList_whenAddIgnoreNull_thenNoNullAdded() { + CollectionUtils.addIgnoreNull(list1, null); + assertFalse(list1.contains(null)); + } + + @Test + public void givenTwoSortedLists_whenCollated_thenSorted() { + List sortedList = CollectionUtils.collate(list1, list2); + + assertEquals(6, sortedList.size()); + assertTrue(sortedList.get(0).getName().equals("Bob")); + assertTrue(sortedList.get(2).getName().equals("Daniel")); + } + + @Test + public void givenListOfCustomers_whenTransformed_thenListOfAddress() { + Collection
addressCol = CollectionUtils.collect(list1, customer -> { + return new Address(customer.getLocality(), customer.getCity(), customer.getZip()); + }); + + List
addressList = new ArrayList<>(addressCol); + assertTrue(addressList.size() == 3); + assertTrue(addressList.get(0).getLocality().equals("locality1")); + } + + @Test + public void givenCustomerList_whenFiltered_thenCorrectSize() { + + boolean isModified = CollectionUtils.filter(linkedList1, customer -> Arrays.asList("Daniel","Kyle").contains(customer.getName())); + + //filterInverse does the opposite. It removes the element from the list if the Predicate returns true + //select and selectRejected work the same way except that they do not remove elements from the given collection and return a new collection + + assertTrue(isModified && linkedList1.size() == 2); + } + + @Test + public void givenNonEmptyList_whenCheckedIsNotEmpty_thenTrue() { + List emptyList = new ArrayList<>(); + List nullList = null; + + //Very handy at times where we want to check if a collection is not null and not empty too. + //isNotEmpty does the opposite. Handy because using ! operator on isEmpty makes it missable while reading + assertTrue(CollectionUtils.isNotEmpty(list1)); + assertTrue(CollectionUtils.isEmpty(nullList)); + assertTrue(CollectionUtils.isEmpty(emptyList)); + } + + @Test + public void givenCustomerListAndASubcollection_whenChecked_thenTrue() { + assertTrue(CollectionUtils.isSubCollection(list3, list1)); + } + + @Test + public void givenTwoLists_whenIntersected_thenCheckSize() { + Collection intersection = CollectionUtils.intersection(list1, list3); + assertTrue(intersection.size() == 2); + } + + @Test + public void givenTwoLists_whenSubtracted_thenCheckElementNotPresentInA() { + Collection result = CollectionUtils.subtract(list1, list3); + assertFalse(result.contains(customer1)); + } + + @Test + public void givenTwoLists_whenUnioned_thenCheckElementPresentInResult() { + Collection union = CollectionUtils.union(list1, list2); + assertTrue(union.contains(customer1)); + assertTrue(union.contains(customer4)); + } + +} \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java b/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java new file mode 100644 index 0000000000..4d264e3aea --- /dev/null +++ b/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.commons.collections; + +import org.apache.commons.collections4.SetUtils; +import org.apache.commons.collections4.set.TransformedSet; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Created by smatt on 21/06/2017. + */ +public class SetUtilsUnitTest { + + @Test(expected = IllegalArgumentException.class) + public void givenSetAndPredicate_whenPredicatedSet_thenValidateSet_and_throw_IllegalArgumentException() { + Set sourceSet = new HashSet<>(); + sourceSet.addAll(Arrays.asList("London", "Lagos", "Err Source1")); + Set validatingSet + = SetUtils.predicatedSet(sourceSet, (s) -> s.startsWith("L")); + validatingSet.add("Err Source2"); + } + + @Test + public void givenTwoSets_whenDifference_thenSetView() { + Set a = new HashSet<>(Arrays.asList(1,2,5)); + Set b = new HashSet<>(Arrays.asList(1,2)); + SetUtils.SetView result = SetUtils.difference(a, b); + assertTrue(result.size() == 1 && result.contains(5)); + } + + @Test + public void givenTwoSets_whenUnion_thenUnionResult() { + Set a = new HashSet<>(Arrays.asList(1,2,5)); + Set b = new HashSet<>(Arrays.asList(1,2)); + Set expected = new HashSet<>(Arrays.asList(1,2,5)); + SetUtils.SetView union = SetUtils.union(a, b); + assertTrue(SetUtils.isEqualSet(expected, union)); + } + + @Test + public void givenTwoSets_whenIntersection_thenIntersectionResult() { + Set a = new HashSet<>(Arrays.asList(1,2,5)); + Set b = new HashSet<>(Arrays.asList(1,2)); + Set expected = new HashSet<>(Arrays.asList(1,2)); + SetUtils.SetView intersect = SetUtils.intersection(a, b); + assertTrue(SetUtils.isEqualSet(expected, intersect)); + } + + @Test + public void givenSet_whenTransformedSet_thenTransformedResult() { + Set a = SetUtils.transformedSet(new HashSet<>(), (e) -> e * 2 ); + a.add(2); + assertEquals(a.toArray()[0], 4); + + Set source = new HashSet<>(Arrays.asList(1)); + Set newSet = TransformedSet.transformedSet(source, (e) -> e * 2); + assertEquals(newSet.toArray()[0], 2); + assertEquals(source.toArray()[0], 2); + } + + @Test + public void givenTwoSet_whenDisjunction_thenDisjunctionSet() { + Set a = new HashSet<>(Arrays.asList(1,2,5)); + Set b = new HashSet<>(Arrays.asList(1,2,3)); + SetUtils.SetView result = SetUtils.disjunction(a, b); + assertTrue(result.toSet().contains(5) && result.toSet().contains(3)); + } + + @Test + public void givenSet_when_OrderedSet_thenMaintainElementOrder() { + Set set = new HashSet<>(Arrays.asList(10,1,5)); + System.out.println("unordered set: " + set); + + Set orderedSet = SetUtils.orderedSet(new HashSet<>()); + orderedSet.addAll(Arrays.asList(10,1,5)); + System.out.println("ordered set = " + orderedSet); + } +} \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java b/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java new file mode 100644 index 0000000000..6b2777c289 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java @@ -0,0 +1,211 @@ +package com.baeldung.commons.collections.orderedmap; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.collections4.OrderedMap; +import org.apache.commons.collections4.OrderedMapIterator; +import org.apache.commons.collections4.map.LinkedMap; +import org.apache.commons.collections4.map.ListOrderedMap; +import org.junit.Before; +import org.junit.Test; + +public class OrderedMapUnitTest { + + private String[] names = {"Emily", "Mathew", "Rose", "John", "Anna"}; + private Integer[] ages = {37, 28, 40, 36, 21}; + + private int RUNNERS_COUNT = names.length; + + private OrderedMap runnersLinkedMap; + private OrderedMap runnersListOrderedMap; + + @Before + public void createRunners() { + // First implementation: ListOrderedMap + this.runnersListOrderedMap = new ListOrderedMap<>(); + this.loadOrderedMapOfRunners(this.runnersListOrderedMap); + + // Second implementation: LinkedMap + this.runnersLinkedMap = new LinkedMap<>(); + this.loadOrderedMapOfRunners(this.runnersLinkedMap); + } + + private void loadOrderedMapOfRunners(OrderedMap runners) { + for (int i = 0; i < RUNNERS_COUNT; i++) { + runners.put(this.names[i], this.ages[i]); + } + } + + @Test + public void givenALinkedMap_whenIteratedWithMapIterator_thenPreservesOrder() { + // Tests that the order in map iterator is the same + // as defined in the constant arrays of names and ages: + + OrderedMapIterator runnersIterator = this.runnersLinkedMap.mapIterator(); + int i = 0; + while (runnersIterator.hasNext()) { + runnersIterator.next(); + assertEquals(runnersIterator.getKey(), this.names[i]); + assertEquals(runnersIterator.getValue(), this.ages[i]); + i++; + } + } + + @Test + public void givenAListOrderedMap_whenIteratedWithMapIterator_thenPreservesOrder() { + // Tests that the order in map iterator is the same + // as defined in the constant arrays of names and ages: + + OrderedMapIterator runnersIterator = this.runnersListOrderedMap.mapIterator(); + int i = 0; + while (runnersIterator.hasNext()) { + runnersIterator.next(); + assertEquals(runnersIterator.getKey(), this.names[i]); + assertEquals(runnersIterator.getValue(), this.ages[i]); + i++; + } + } + + @Test + public void givenALinkedMap_whenIteratedForwards_thenPreservesOrder() { + // Tests that the order in the forward iteration is the same + // as defined in the constant arrays of names and ages + + String name = this.runnersLinkedMap.firstKey(); + int i = 0; + while (name != null) { + assertEquals(name, this.names[i]); + name = this.runnersLinkedMap.nextKey(name); + i++; + } + } + + @Test + public void givenAListOrderedMap_whenIteratedForwards_thenPreservesOrder() { + // Tests that the order in the forward iteration is the same + // as defined in the constant arrays of names and ages + + String name = this.runnersListOrderedMap.firstKey(); + int i = 0; + while (name != null) { + assertEquals(name, this.names[i]); + name = this.runnersListOrderedMap.nextKey(name); + i++; + } + } + + @Test + public void givenALinkedMap_whenIteratedBackwards_thenPreservesOrder() { + // Tests that the order in the backwards iteration is the same + // as defined in the constant arrays of names and ages + + String name = this.runnersLinkedMap.lastKey(); + int i = RUNNERS_COUNT - 1; + while (name != null) { + assertEquals(name, this.names[i]); + name = this.runnersLinkedMap.previousKey(name); + i--; + } + } + + @Test + public void givenAListOrderedMap_whenIteratedBackwards_thenPreservesOrder() { + // Tests that the order in the backwards iteration is the same + // as defined in the constant arrays of names and ages + + String name = this.runnersListOrderedMap.lastKey(); + int i = RUNNERS_COUNT - 1; + while (name != null) { + assertEquals(name, this.names[i]); + name = this.runnersListOrderedMap.previousKey(name); + i--; + } + } + + @Test + public void givenALinkedMap_whenObjectIsSearched_thenMatchesConstantArray() { + assertEquals(ages[4], this.runnersLinkedMap.get("Anna")); + } + + @Test + public void givenALinkedMap_whenConvertedToList_thenMatchesKeySet() { + // Casting the OrderedMap to a LinkedMap we can use asList() method + + LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; + List listKeys = new ArrayList<>(); + listKeys.addAll(this.runnersLinkedMap.keySet()); + List linkedMap = lmap.asList(); + assertEquals(listKeys, linkedMap); + } + + @Test + public void givenALinkedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() { + LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; + + for (int i = 0; i < RUNNERS_COUNT; i++) { + // accessed by index: + String name = lmap.get(i); + assertEquals(name, this.names[i]); + + // index of key concides with position in array + assertEquals(lmap.indexOf(this.names[i]), i); + } + } + + @Test + public void givenALinkedMap_whenElementRemoved_thenSizeDecrease() { + LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; + Integer johnAge = lmap.remove("John");// by object + assertEquals(johnAge, new Integer(36)); + assertEquals(lmap.size(), RUNNERS_COUNT - 1); + + Integer emilyAge = lmap.remove(0);// by index + assertEquals(emilyAge, new Integer(37)); + assertEquals(lmap.size(), RUNNERS_COUNT - 2); + } + + @Test + public void givenAListOrderedMap_whenObjectIsSearched_thenMatchesConstantArray() { + assertEquals(ages[4], this.runnersListOrderedMap.get("Anna")); + } + + @Test + public void givenAListOrderedMap_whenConvertedToList_thenMatchesKeySet() { + ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; + List listKeys = new ArrayList<>(); + listKeys.addAll(this.runnersListOrderedMap.keySet()); + List lomapList = lomap.asList(); + assertEquals(listKeys, lomapList); + } + + @Test + public void givenAListOrderedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() { + ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; + + for (int i = 0; i < RUNNERS_COUNT; i++) { + // accessed by index: + String name = lomap.get(i); + assertEquals(name, this.names[i]); + + // index of key concides with position in array + assertEquals(lomap.indexOf(this.names[i]), i); + } + } + + @Test + public void givenAListOrderedMap_whenElementRemoved_thenSizeDecrease() { + ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; + + Integer johnAge = lomap.remove("John");// by object + + assertEquals(johnAge, new Integer(36)); + assertEquals(lomap.size(), RUNNERS_COUNT - 1); + + Integer emilyAge = lomap.remove(0);// by index + assertEquals(emilyAge, new Integer(37)); + assertEquals(lomap.size(), RUNNERS_COUNT - 2); + } +} diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java b/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java index 39f9907316..97db4ddbe4 100644 --- a/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java @@ -2,77 +2,78 @@ package com.baeldung.commons.lang3; import org.apache.commons.lang3.ArrayUtils; import org.junit.Test; -import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; public class ArrayUtilsUnitTest { @Test public void givenArray_whenAddingElementAtSpecifiedPosition_thenCorrect() { - int[] oldArray = { 2, 3, 4, 5 }; + int[] oldArray = {2, 3, 4, 5}; int[] newArray = ArrayUtils.add(oldArray, 0, 1); - int[] expectedArray = { 1, 2, 3, 4, 5 }; + int[] expectedArray = {1, 2, 3, 4, 5}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenAddingElementAtTheEnd_thenCorrect() { - int[] oldArray = { 2, 3, 4, 5 }; + int[] oldArray = {2, 3, 4, 5}; int[] newArray = ArrayUtils.add(oldArray, 1); - int[] expectedArray = { 2, 3, 4, 5, 1 }; + int[] expectedArray = {2, 3, 4, 5, 1}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenAddingAllElementsAtTheEnd_thenCorrect() { - int[] oldArray = { 0, 1, 2 }; + int[] oldArray = {0, 1, 2}; int[] newArray = ArrayUtils.addAll(oldArray, 3, 4, 5); - int[] expectedArray = { 0, 1, 2, 3, 4, 5 }; + int[] expectedArray = {0, 1, 2, 3, 4, 5}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingElementAtSpecifiedPosition_thenCorrect() { - int[] oldArray = { 1, 2, 3, 4, 5 }; + int[] oldArray = {1, 2, 3, 4, 5}; int[] newArray = ArrayUtils.remove(oldArray, 1); - int[] expectedArray = { 1, 3, 4, 5 }; + int[] expectedArray = {1, 3, 4, 5}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingAllElementsAtSpecifiedPositions_thenCorrect() { - int[] oldArray = { 1, 2, 3, 4, 5 }; + int[] oldArray = {1, 2, 3, 4, 5}; int[] newArray = ArrayUtils.removeAll(oldArray, 1, 3); - int[] expectedArray = { 1, 3, 5 }; + int[] expectedArray = {1, 3, 5}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingAnElement_thenCorrect() { - int[] oldArray = { 1, 2, 3, 3, 4 }; + int[] oldArray = {1, 2, 3, 3, 4}; int[] newArray = ArrayUtils.removeElement(oldArray, 3); - int[] expectedArray = { 1, 2, 3, 4 }; + int[] expectedArray = {1, 2, 3, 4}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingElements_thenCorrect() { - int[] oldArray = { 1, 2, 3, 3, 4 }; + int[] oldArray = {1, 2, 3, 3, 4}; int[] newArray = ArrayUtils.removeElements(oldArray, 2, 3, 5); - int[] expectedArray = { 1, 3, 4 }; + int[] expectedArray = {1, 3, 4}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenRemovingAllElementOccurences_thenCorrect() { - int[] oldArray = { 1, 2, 2, 2, 3 }; + int[] oldArray = {1, 2, 2, 2, 3}; int[] newArray = ArrayUtils.removeAllOccurences(oldArray, 2); - int[] expectedArray = { 1, 3 }; + int[] expectedArray = {1, 3}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenCheckingExistingElement_thenCorrect() { - int[] array = { 1, 3, 5, 7, 9 }; + int[] array = {1, 3, 5, 7, 9}; boolean evenContained = ArrayUtils.contains(array, 2); boolean oddContained = ArrayUtils.contains(array, 7); assertEquals(false, evenContained); @@ -81,57 +82,57 @@ public class ArrayUtilsUnitTest { @Test public void givenArray_whenReversingElementsWithinARange_thenCorrect() { - int[] originalArray = { 1, 2, 3, 4, 5 }; + int[] originalArray = {1, 2, 3, 4, 5}; ArrayUtils.reverse(originalArray, 1, 4); - int[] expectedArray = { 1, 4, 3, 2, 5 }; + int[] expectedArray = {1, 4, 3, 2, 5}; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenReversingAllElements_thenCorrect() { - int[] originalArray = { 1, 2, 3, 4, 5 }; + int[] originalArray = {1, 2, 3, 4, 5}; ArrayUtils.reverse(originalArray); - int[] expectedArray = { 5, 4, 3, 2, 1 }; + int[] expectedArray = {5, 4, 3, 2, 1}; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenShiftingElementsWithinARange_thenCorrect() { - int[] originalArray = { 1, 2, 3, 4, 5 }; + int[] originalArray = {1, 2, 3, 4, 5}; ArrayUtils.shift(originalArray, 1, 4, 1); - int[] expectedArray = { 1, 4, 2, 3, 5 }; + int[] expectedArray = {1, 4, 2, 3, 5}; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenShiftingAllElements_thenCorrect() { - int[] originalArray = { 1, 2, 3, 4, 5 }; + int[] originalArray = {1, 2, 3, 4, 5}; ArrayUtils.shift(originalArray, 1); - int[] expectedArray = { 5, 1, 2, 3, 4 }; + int[] expectedArray = {5, 1, 2, 3, 4}; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenExtractingElements_thenCorrect() { - int[] oldArray = { 1, 2, 3, 4, 5 }; + int[] oldArray = {1, 2, 3, 4, 5}; int[] newArray = ArrayUtils.subarray(oldArray, 2, 7); - int[] expectedArray = { 3, 4, 5 }; + int[] expectedArray = {3, 4, 5}; assertArrayEquals(expectedArray, newArray); } @Test public void givenArray_whenSwapingElementsWithinARange_thenCorrect() { - int[] originalArray = { 1, 2, 3, 4, 5 }; + int[] originalArray = {1, 2, 3, 4, 5}; ArrayUtils.swap(originalArray, 0, 3, 2); - int[] expectedArray = { 4, 5, 3, 1, 2 }; + int[] expectedArray = {4, 5, 3, 1, 2}; assertArrayEquals(expectedArray, originalArray); } @Test public void givenArray_whenSwapingElementsAtSpecifiedPositions_thenCorrect() { - int[] originalArray = { 1, 2, 3, 4, 5 }; + int[] originalArray = {1, 2, 3, 4, 5}; ArrayUtils.swap(originalArray, 0, 3); - int[] expectedArray = { 4, 2, 3, 1, 5 }; + int[] expectedArray = {4, 2, 3, 1, 5}; assertArrayEquals(expectedArray, originalArray); } } diff --git a/libraries/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java b/libraries/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java index b10086eabe..ae92617849 100644 --- a/libraries/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java +++ b/libraries/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java @@ -8,7 +8,7 @@ public class ComplexUnitTest { @Test public void whenComplexPow_thenCorrect() { - Complex first = new Complex(1.0, 3.0); + Complex first = new Complex(1.0, 3.0); Complex second = new Complex(2.0, 5.0); Complex power = first.pow(second); diff --git a/libraries/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java b/libraries/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java index a5613e2406..f864c5f017 100644 --- a/libraries/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/flink/WordCountIntegrationTest.java @@ -35,9 +35,9 @@ public class WordCountIntegrationTest { //then List> collect = result.collect(); assertThat(collect).containsExactlyInAnyOrder( - new Tuple2<>("a", 3), new Tuple2<>("sentence", 2), new Tuple2<>("word", 1), - new Tuple2<>("is", 2), new Tuple2<>("this", 2), new Tuple2<>("second", 1), - new Tuple2<>("first", 1), new Tuple2<>("with", 1), new Tuple2<>("one", 1)); + new Tuple2<>("a", 3), new Tuple2<>("sentence", 2), new Tuple2<>("word", 1), + new Tuple2<>("is", 2), new Tuple2<>("this", 2), new Tuple2<>("second", 1), + new Tuple2<>("first", 1), new Tuple2<>("with", 1), new Tuple2<>("one", 1)); } @Test @@ -48,9 +48,9 @@ public class WordCountIntegrationTest { //when List collect = amounts - .filter(a -> a > threshold) - .reduce((integer, t1) -> integer + t1) - .collect(); + .filter(a -> a > threshold) + .reduce((integer, t1) -> integer + t1) + .collect(); //then assertThat(collect.get(0)).isEqualTo(90); @@ -78,13 +78,13 @@ public class WordCountIntegrationTest { Tuple2 fourthPerson = new Tuple2<>(200, "Michael"); Tuple2 firstPerson = new Tuple2<>(1, "Jack"); DataSet> transactions = env.fromElements(fourthPerson, secondPerson, - thirdPerson, firstPerson); + thirdPerson, firstPerson); //when List> sorted = transactions - .sortPartition(new IdKeySelectorTransaction(), Order.ASCENDING) - .collect(); + .sortPartition(new IdKeySelectorTransaction(), Order.ASCENDING) + .collect(); //then assertThat(sorted).containsExactly(firstPerson, secondPerson, thirdPerson, fourthPerson); @@ -99,15 +99,15 @@ public class WordCountIntegrationTest { Tuple2 firstTransaction = new Tuple2<>(1, "Transaction_1"); DataSet> transactions = - env.fromElements(firstTransaction, new Tuple2<>(12, "Transaction_2")); + env.fromElements(firstTransaction, new Tuple2<>(12, "Transaction_2")); //when List, Tuple3>> joined = - transactions.join(addresses) - .where(new IdKeySelectorTransaction()) - .equalTo(new IdKeySelectorAddress()) - .collect(); + transactions.join(addresses) + .where(new IdKeySelectorTransaction()) + .equalTo(new IdKeySelectorAddress()) + .collect(); //then assertThat(joined).hasSize(1); @@ -121,7 +121,7 @@ public class WordCountIntegrationTest { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream text - = env.fromElements("This is a first sentence", "This is a second sentence with a one word"); + = env.fromElements("This is a first sentence", "This is a second sentence with a one word"); SingleOutputStreamOperator upperCase = text.map(String::toUpperCase); @@ -139,8 +139,8 @@ public class WordCountIntegrationTest { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); SingleOutputStreamOperator> windowed = env.fromElements( - new Tuple2<>(16, ZonedDateTime.now().plusMinutes(25).toInstant().getEpochSecond()), - new Tuple2<>(15, ZonedDateTime.now().plusMinutes(2).toInstant().getEpochSecond()) + new Tuple2<>(16, ZonedDateTime.now().plusMinutes(25).toInstant().getEpochSecond()), + new Tuple2<>(15, ZonedDateTime.now().plusMinutes(2).toInstant().getEpochSecond()) ).assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor>(Time.seconds(20)) { @Override public long extractTimestamp(Tuple2 element) { @@ -149,8 +149,8 @@ public class WordCountIntegrationTest { }); SingleOutputStreamOperator> reduced = windowed - .windowAll(TumblingEventTimeWindows.of(Time.seconds(5))) - .maxBy(0, true); + .windowAll(TumblingEventTimeWindows.of(Time.seconds(5))) + .maxBy(0, true); reduced.print(); diff --git a/libraries/src/test/java/com/baeldung/hikaricp/HikariCPUnitTest.java b/libraries/src/test/java/com/baeldung/hikaricp/HikariCPUnitTest.java index 0e29e3390a..1a1c5ef868 100644 --- a/libraries/src/test/java/com/baeldung/hikaricp/HikariCPUnitTest.java +++ b/libraries/src/test/java/com/baeldung/hikaricp/HikariCPUnitTest.java @@ -1,9 +1,9 @@ package com.baeldung.hikaricp; -import java.util.List; - import org.junit.Test; +import java.util.List; + import static org.junit.Assert.assertEquals; public class HikariCPUnitTest { diff --git a/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java b/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java index dd1d1dbcf3..30c034aa5e 100644 --- a/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java +++ b/libraries/src/test/java/com/baeldung/javassist/JavasisstUnitTest.java @@ -4,7 +4,15 @@ package com.baeldung.javassist; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.NotFoundException; -import javassist.bytecode.*; +import javassist.bytecode.AccessFlag; +import javassist.bytecode.BadBytecode; +import javassist.bytecode.Bytecode; +import javassist.bytecode.ClassFile; +import javassist.bytecode.CodeAttribute; +import javassist.bytecode.CodeIterator; +import javassist.bytecode.FieldInfo; +import javassist.bytecode.MethodInfo; +import javassist.bytecode.Mnemonic; import org.junit.Test; import java.io.DataOutputStream; @@ -66,7 +74,7 @@ public class JavasisstUnitTest { //then assertEquals(operations, - Arrays.asList("aload_0", "iload_1", "putfield", "aload_0", "iload_2", "putfield", "return")); + Arrays.asList("aload_0", "iload_1", "putfield", "aload_0", "iload_2", "putfield", "return")); } @@ -112,7 +120,7 @@ public class JavasisstUnitTest { } assertEquals(operations, - Arrays.asList("aload_0", "invokespecial", "return")); + Arrays.asList("aload_0", "invokespecial", "return")); } diff --git a/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java b/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java index c99b4d28a2..a341d5957a 100644 --- a/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java +++ b/libraries/src/test/java/com/baeldung/javatuples/JavaTuplesUnitTest.java @@ -1,10 +1,5 @@ package com.baeldung.javatuples; -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Arrays; -import java.util.List; - import org.javatuples.KeyValue; import org.javatuples.LabelValue; import org.javatuples.Pair; @@ -13,6 +8,11 @@ import org.javatuples.Triplet; import org.javatuples.Unit; import org.junit.Test; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + public class JavaTuplesUnitTest { @SuppressWarnings("unused") @@ -26,7 +26,7 @@ public class JavaTuplesUnitTest { Pair pairFromList = Pair.fromIterable(collectionOfNames, 2); - String[] names = new String[] { "john", "doe", "anne" }; + String[] names = new String[]{"john", "doe", "anne"}; Triplet triplet2 = Triplet.fromArray(names); } diff --git a/libraries/src/test/java/com/baeldung/javers/JaversUnitTest.java b/libraries/src/test/java/com/baeldung/javers/JaversUnitTest.java index f261174062..3cdb833953 100644 --- a/libraries/src/test/java/com/baeldung/javers/JaversUnitTest.java +++ b/libraries/src/test/java/com/baeldung/javers/JaversUnitTest.java @@ -74,11 +74,11 @@ public class JaversUnitTest { Javers javers = JaversBuilder.javers().build(); PersonWithAddress person = - new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"))); + new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"))); PersonWithAddress personWithNewAddress = - new PersonWithAddress(1, "Tom", - Arrays.asList(new Address("England"), new Address("USA"))); + new PersonWithAddress(1, "Tom", + Arrays.asList(new Address("England"), new Address("USA"))); //when @@ -96,10 +96,10 @@ public class JaversUnitTest { Javers javers = JaversBuilder.javers().build(); PersonWithAddress person = - new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"))); + new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England"))); PersonWithAddress personWithNewAddress = - new PersonWithAddress(1, "Tom", Collections.emptyList()); + new PersonWithAddress(1, "Tom", Collections.emptyList()); //when diff --git a/libraries/src/test/java/com/baeldung/jdo/GuideToJDOIntegrationTest.java b/libraries/src/test/java/com/baeldung/jdo/GuideToJDOIntegrationTest.java index 65f89d75b2..578f9ff902 100644 --- a/libraries/src/test/java/com/baeldung/jdo/GuideToJDOIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/jdo/GuideToJDOIntegrationTest.java @@ -24,14 +24,14 @@ public class GuideToJDOIntegrationTest { pumd.addProperty("javax.jdo.option.ConnectionURL", "jdbc:h2:mem:mypersistence"); pumd.addProperty("javax.jdo.option.ConnectionUserName", "sa"); pumd.addProperty("javax.jdo.option.ConnectionPassword", ""); - pumd.addProperty("datanucleus.autoCreateSchema", "true"); + pumd.addProperty("datanucleus.autoCreateSchema", "true"); PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); try { tx.begin(); - for (int i = 0; i < 100; i++){ + for (int i = 0; i < 100; i++) { String nam = "Product-" + i; Product productx = new Product(nam, (double) i); pm.makePersistent(productx); @@ -58,7 +58,7 @@ public class GuideToJDOIntegrationTest { pumd.addProperty("javax.jdo.option.ConnectionURL", "jdbc:h2:mem:mypersistence"); pumd.addProperty("javax.jdo.option.ConnectionUserName", "sa"); pumd.addProperty("javax.jdo.option.ConnectionPassword", ""); - pumd.addProperty("datanucleus.autoCreateSchema", "true"); + pumd.addProperty("datanucleus.autoCreateSchema", "true"); PersistenceManagerFactory pmf = new JDOPersistenceManagerFactory(pumd, null); PersistenceManager pm = pmf.getPersistenceManager(); @@ -93,9 +93,7 @@ public class GuideToJDOIntegrationTest { Query q = pm2.newQuery("SELECT FROM " + Product.class.getName() + " WHERE price == 200"); @SuppressWarnings("unchecked") List products = (List) q.execute(); - Iterator iter = products.iterator(); - while (iter.hasNext()) { - Product p = iter.next(); + for (Product p : products) { assertEquals("Laptop", p.name); } diff --git a/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java b/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java index 38595e49d9..bdbc101b15 100644 --- a/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java +++ b/libraries/src/test/java/com/baeldung/jsonassert/JsonAssertUnitTest.java @@ -1,8 +1,6 @@ package com.baeldung.jsonassert; -import static org.assertj.core.api.Assertions.assertThat; - import org.json.JSONException; import org.json.JSONObject; import org.junit.Test; @@ -13,6 +11,8 @@ import org.skyscreamer.jsonassert.RegularExpressionValueMatcher; import org.skyscreamer.jsonassert.comparator.ArraySizeComparator; import org.skyscreamer.jsonassert.comparator.CustomComparator; +import static org.assertj.core.api.Assertions.assertThat; + public class JsonAssertUnitTest { @Test @@ -44,7 +44,7 @@ public class JsonAssertUnitTest { @Test public void givenDifferentOrderForJsonObject_whenAssertEquals_thenPass() throws JSONException { String result = "{id:1,name:\"John\"}"; - + JSONAssert.assertEquals("{name:\"John\",id:1}", result, JSONCompareMode.STRICT); JSONAssert.assertEquals("{name:\"John\",id:1}", result, JSONCompareMode.LENIENT); } @@ -55,7 +55,7 @@ public class JsonAssertUnitTest { JSONObject actual = new JSONObject(); expected.put("id", Integer.valueOf(12345)); actual.put("id", Double.valueOf(12345)); - + JSONAssert.assertEquals(expected, actual, false); JSONAssert.assertEquals(expected, actual, JSONCompareMode.LENIENT); } @@ -63,11 +63,11 @@ public class JsonAssertUnitTest { @Test public void givenNestedObjects_whenAssertEquals_thenPass() throws JSONException { String result = "{id:1,name:\"Juergen\", address:{city:\"Hollywood\", " - + "state:\"LA\", zip:91601}}"; + + "state:\"LA\", zip:91601}}"; JSONAssert.assertEquals("{id:1,name:\"Juergen\", address:{city:\"Hollywood\", " - + "state:\"LA\", zip:91601}}", result, false); + + "state:\"LA\", zip:91601}}", result, false); } - + @Test public void whenMessageUsedInAssertion_thenDisplayMessageOnFailure() throws JSONException { String actual = "{id:123,name:\"John\"}"; @@ -94,36 +94,36 @@ public class JsonAssertUnitTest { JSONAssert.assertNotEquals("[1,2,3]", result, JSONCompareMode.LENIENT); JSONAssert.assertNotEquals("[1,2,3,4,5,6]", result, JSONCompareMode.LENIENT); } - + @Test public void whenComparingSizeOfArray_thenPass() throws JSONException { String names = "{names:[Alex, Barbera, Charlie, Xavier]}"; JSONAssert.assertEquals( - "{names:[4]}", - names, - new ArraySizeComparator(JSONCompareMode.LENIENT)); + "{names:[4]}", + names, + new ArraySizeComparator(JSONCompareMode.LENIENT)); } - + @Test public void whenComparingContentsOfArray_thenPass() throws JSONException { String ratings = "{ratings:[3.2,3.5,4.1,5,1]}"; JSONAssert.assertEquals( - "{ratings:[1,5]}", - ratings, - new ArraySizeComparator(JSONCompareMode.LENIENT)); + "{ratings:[1,5]}", + ratings, + new ArraySizeComparator(JSONCompareMode.LENIENT)); } - + @Test public void givenValueMatcher_whenComparingUsingRegex_thenPass() throws IllegalArgumentException, JSONException { - JSONAssert.assertEquals("{entry:{id:x}}", "{entry:{id:1, id:2}}", - new CustomComparator( - JSONCompareMode.STRICT, - new Customization("entry.id", - new RegularExpressionValueMatcher("\\d")))); - - JSONAssert.assertNotEquals("{entry:{id:x}}", "{entry:{id:1, id:as}}", - new CustomComparator(JSONCompareMode.STRICT, - new Customization("entry.id", - new RegularExpressionValueMatcher("\\d")))); + JSONAssert.assertEquals("{entry:{id:x}}", "{entry:{id:1, id:2}}", + new CustomComparator( + JSONCompareMode.STRICT, + new Customization("entry.id", + new RegularExpressionValueMatcher("\\d")))); + + JSONAssert.assertNotEquals("{entry:{id:x}}", "{entry:{id:1, id:as}}", + new CustomComparator(JSONCompareMode.STRICT, + new Customization("entry.id", + new RegularExpressionValueMatcher("\\d")))); } } diff --git a/libraries/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java b/libraries/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java index c9141a6e57..1c95956761 100644 --- a/libraries/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java +++ b/libraries/src/test/java/com/baeldung/junitparams/SafeAdditionUtilTest.java @@ -1,13 +1,12 @@ package com.baeldung.junitparams; -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.RunWith; - import junitparams.FileParameters; import junitparams.JUnitParamsRunner; import junitparams.Parameters; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.assertEquals; @RunWith(JUnitParamsRunner.class) public class SafeAdditionUtilTest { @@ -15,7 +14,7 @@ public class SafeAdditionUtilTest { private SafeAdditionUtil serviceUnderTest = new SafeAdditionUtil(); @Test - @Parameters({ "1, 2, 3", "-10, 30, 20", "15, -5, 10", "-5, -10, -15" }) + @Parameters({"1, 2, 3", "-10, 30, 20", "15, -5, 10", "-5, -10, -15"}) public void whenCalledWithAnnotationProvidedParams_thenSafeAddAndReturn(int a, int b, int expectedValue) { assertEquals(expectedValue, serviceUnderTest.safeAdd(a, b)); } @@ -27,7 +26,7 @@ public class SafeAdditionUtilTest { } private Object[] parametersToTestAdd() { - return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -8, Integer.MIN_VALUE } }; + return new Object[]{new Object[]{1, 2, 3}, new Object[]{-10, 30, 20}, new Object[]{Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, new Object[]{Integer.MIN_VALUE, -8, Integer.MIN_VALUE}}; } @Test @@ -37,7 +36,7 @@ public class SafeAdditionUtilTest { } private Object[] parametersForWhenCalledWithnoParam_thenLoadByNameSafeAddAndReturn() { - return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -8, Integer.MIN_VALUE } }; + return new Object[]{new Object[]{1, 2, 3}, new Object[]{-10, 30, 20}, new Object[]{Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, new Object[]{Integer.MIN_VALUE, -8, Integer.MIN_VALUE}}; } @Test diff --git a/libraries/src/test/java/com/baeldung/junitparams/TestDataProvider.java b/libraries/src/test/java/com/baeldung/junitparams/TestDataProvider.java index d318345a56..08a472502e 100644 --- a/libraries/src/test/java/com/baeldung/junitparams/TestDataProvider.java +++ b/libraries/src/test/java/com/baeldung/junitparams/TestDataProvider.java @@ -3,11 +3,11 @@ package com.baeldung.junitparams; public class TestDataProvider { public static Object[] provideBasicData() { - return new Object[] { new Object[] { 1, 2, 3 }, new Object[] { -10, 30, 20 }, new Object[] { 15, -5, 10 }, new Object[] { -5, -10, -15 } }; + return new Object[]{new Object[]{1, 2, 3}, new Object[]{-10, 30, 20}, new Object[]{15, -5, 10}, new Object[]{-5, -10, -15}}; } public static Object[] provideEdgeCaseData() { - return new Object[] { new Object[] { Integer.MAX_VALUE, 2, Integer.MAX_VALUE }, new Object[] { Integer.MIN_VALUE, -2, Integer.MIN_VALUE }, }; + return new Object[]{new Object[]{Integer.MAX_VALUE, 2, Integer.MAX_VALUE}, new Object[]{Integer.MIN_VALUE, -2, Integer.MIN_VALUE},}; } } diff --git a/libraries/src/test/java/com/baeldung/lsh/LocalSensitiveHashingUnitTest.java b/libraries/src/test/java/com/baeldung/lsh/LocalSensitiveHashingUnitTest.java new file mode 100644 index 0000000000..fbcda2a70d --- /dev/null +++ b/libraries/src/test/java/com/baeldung/lsh/LocalSensitiveHashingUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.lsh; + +import info.debatty.java.lsh.LSHMinHash; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class LocalSensitiveHashingUnitTest { + + @Ignore("for simplicity of the example number of input vectors is very low, that's why LSH may yield non deterministic results") + @Test() + public void givenNVectors_whenPerformLSH_thenShouldCalculateSameHashForSimilarVectors() { + //given + boolean[] vector1 = new boolean[]{true, true, true, true, true}; + boolean[] vector2 = new boolean[]{false, false, false, true, false}; + boolean[] vector3 = new boolean[]{false, false, true, true, false}; + + int sizeOfVectors = 5; + int numberOfBuckets = 10; + int stages = 4; + + LSHMinHash lsh = new LSHMinHash(stages, numberOfBuckets, sizeOfVectors); + + //when + int[] firstHash = lsh.hash(vector1); + int[] secondHash = lsh.hash(vector2); + int[] thirdHash = lsh.hash(vector3); + + System.out.println(Arrays.toString(firstHash)); + System.out.println(Arrays.toString(secondHash)); + System.out.println(Arrays.toString(thirdHash)); + + //then + int lastIndexOfResult = stages - 1; + assertThat(firstHash[lastIndexOfResult]).isNotEqualTo(secondHash[lastIndexOfResult]); + assertThat(firstHash[lastIndexOfResult]).isNotEqualTo(thirdHash[lastIndexOfResult]); + assertThat(isCloseOrEqual(secondHash[lastIndexOfResult], thirdHash[lastIndexOfResult], numberOfBuckets)).isTrue(); + } + + private boolean isCloseOrEqual(int secondHash, int thirdHash, int numberOfBuckets) { + return Math.abs(secondHash - thirdHash) < numberOfBuckets / 2; + } +} + diff --git a/libraries/src/test/java/com/baeldung/opennlp/OpenNLPTests.java b/libraries/src/test/java/com/baeldung/opennlp/OpenNLPTests.java new file mode 100644 index 0000000000..38bc8e002b --- /dev/null +++ b/libraries/src/test/java/com/baeldung/opennlp/OpenNLPTests.java @@ -0,0 +1,151 @@ +package com.baeldung.opennlp; + +import opennlp.tools.chunker.ChunkerME; +import opennlp.tools.chunker.ChunkerModel; +import opennlp.tools.cmdline.postag.POSModelLoader; +import opennlp.tools.doccat.DoccatFactory; +import opennlp.tools.doccat.DoccatModel; +import opennlp.tools.doccat.DocumentCategorizerME; +import opennlp.tools.doccat.DocumentSample; +import opennlp.tools.doccat.DocumentSampleStream; +import opennlp.tools.namefind.NameFinderME; +import opennlp.tools.namefind.TokenNameFinderModel; +import opennlp.tools.postag.POSModel; +import opennlp.tools.postag.POSSample; +import opennlp.tools.postag.POSTaggerME; +import opennlp.tools.sentdetect.SentenceDetectorME; +import opennlp.tools.sentdetect.SentenceModel; +import opennlp.tools.tokenize.WhitespaceTokenizer; +import opennlp.tools.util.InputStreamFactory; +import opennlp.tools.util.ObjectStream; +import opennlp.tools.util.PlainTextByLineStream; +import opennlp.tools.util.Span; +import opennlp.tools.util.TrainingParameters; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.assertEquals; + +public class OpenNLPTests { + + private final static String text = "To get to the south: Go to the store. Buy a compass. Use the compass. Then walk to the south."; + private final static String sentence[] = new String[]{"James", "Jordan", "live", "in", "Oklahoma", "city", "."}; + + @Test + public void givenText_WhenDetectSentences_ThenCountSentences() { + InputStream is; + SentenceModel model; + try { + is = new FileInputStream("OpenNLP/en-sent.bin"); + model = new SentenceModel(is); + SentenceDetectorME sdetector = new SentenceDetectorME(model); + String sentences[] = sdetector.sentDetect(text); + assertEquals(4, sentences.length); + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void givenText_WhenDetectTokens_ThenVerifyNames() { + InputStream is; + TokenNameFinderModel model; + try { + is = new FileInputStream("OpenNLP/en-ner-person.bin"); + model = new TokenNameFinderModel(is); + is.close(); + NameFinderME nameFinder = new NameFinderME(model); + Span nameSpans[] = nameFinder.find(sentence); + String[] names = Span.spansToStrings(nameSpans, sentence); + assertEquals(1, names.length); + assertEquals("James Jordan", names[0]); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void givenText_WhenDetectTokens_ThenVerifyLocations() { + InputStream is; + TokenNameFinderModel model; + try { + is = new FileInputStream("OpenNLP/en-ner-location.bin"); + model = new TokenNameFinderModel(is); + is.close(); + NameFinderME nameFinder = new NameFinderME(model); + Span locationSpans[] = nameFinder.find(sentence); + String[] locations = Span.spansToStrings(locationSpans, sentence); + assertEquals(1, locations.length); + assertEquals("Oklahoma", locations[0]); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void givenText_WhenCategorizeDocument_ThenVerifyDocumentContent() { + DoccatModel docCatModel; + try { + InputStreamFactory isf = new InputStreamFactory() { + public InputStream createInputStream() throws IOException { + return new FileInputStream("OpenNLP/doc-cat.train"); + } + }; + ObjectStream lineStream = new PlainTextByLineStream(isf, "UTF-8"); + ObjectStream sampleStream = new DocumentSampleStream(lineStream); + DoccatFactory docCatFactory = new DoccatFactory(); + docCatModel = DocumentCategorizerME.train("en", sampleStream, TrainingParameters.defaultParams(), docCatFactory); + DocumentCategorizerME myCategorizer = new DocumentCategorizerME(docCatModel); + double[] outcomes = myCategorizer.categorize(sentence); + String category = myCategorizer.getBestCategory(outcomes); + assertEquals("GOOD", category); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void givenText_WhenTagDocument_ThenVerifyTaggedString() { + try { + POSModel posModel = new POSModelLoader().load(new File("OpenNLP/en-pos-maxent.bin")); + POSTaggerME posTaggerME = new POSTaggerME(posModel); + InputStreamFactory isf = new InputStreamFactory() { + public InputStream createInputStream() throws IOException { + return new FileInputStream("OpenNLP/PartOfSpeechTag.txt"); + } + }; + ObjectStream lineStream = new PlainTextByLineStream(isf, "UTF-8"); + String line; + while ((line = lineStream.read()) != null) { + String whitespaceTokenizerLine[] = WhitespaceTokenizer.INSTANCE.tokenize(line); + String[] tags = posTaggerME.tag(whitespaceTokenizerLine); + POSSample posSample = new POSSample(whitespaceTokenizerLine, tags); + assertEquals("Out_IN of_IN the_DT night_NN that_WDT covers_VBZ me_PRP", posSample.toString()); + } + lineStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void givenText_WhenChunked_ThenCountChunks() { + try { + InputStream is = new FileInputStream("OpenNLP/en-chunker.bin"); + ChunkerModel cModel = new ChunkerModel(is); + ChunkerME chunkerME = new ChunkerME(cModel); + String pos[] = new String[]{"NNP", "NNP", "NNP", "POS", "NNP", "NN", "VBD"}; + String chunks[] = chunkerME.chunk(sentence, pos); + assertEquals(7, chunks.length); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java b/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java new file mode 100644 index 0000000000..2952938cd9 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/pact/PactConsumerDrivenContractUnitTest.java @@ -0,0 +1,82 @@ +package com.baeldung.pact; + + +import au.com.dius.pact.consumer.Pact; +import au.com.dius.pact.consumer.PactProviderRuleMk2; +import au.com.dius.pact.consumer.PactVerification; +import au.com.dius.pact.consumer.dsl.PactDslWithProvider; +import au.com.dius.pact.model.RequestResponsePact; +import org.junit.Rule; +import org.junit.Test; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PactConsumerDrivenContractUnitTest { + + @Rule + public PactProviderRuleMk2 mockProvider + = new PactProviderRuleMk2("test_provider", "localhost", 8080, this); + + @Pact(consumer = "test_consumer") + public RequestResponsePact createPact(PactDslWithProvider builder) { + Map headers = new HashMap(); + headers.put("Content-Type", "application/json"); + + return builder + .given("test GET ") + .uponReceiving("GET REQUEST") + .path("/") + .method("GET") + .willRespondWith() + .status(200) + .headers(headers) + .body("{\"condition\": true, \"name\": \"tom\"}") + .given("test POST") + .uponReceiving("POST REQUEST") + .method("POST") + .headers(headers) + .body("{\"name\": \"Michael\"}") + .path("/create") + .willRespondWith() + .status(201) + .headers(headers) + .body("") + .toPact(); + } + + + @Test + @PactVerification() + public void givenGet_whenSendRequest_shouldReturn200WithProperHeaderAndBody() { + //when + ResponseEntity response + = new RestTemplate().getForEntity(mockProvider.getUrl(), String.class); + + //then + assertThat(response.getStatusCode().value()).isEqualTo(200); + assertThat(response.getHeaders().get("Content-Type").contains("application/json")).isTrue(); + assertThat(response.getBody()).contains("condition", "true", "name", "tom"); + + //and + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + String jsonBody = "{\"name\": \"Michael\"}"; + + //when + ResponseEntity postResponse = new RestTemplate().exchange( + mockProvider.getUrl() + "/create", + HttpMethod.POST, + new HttpEntity<>(jsonBody, httpHeaders), + String.class + ); + + //then + assertThat(postResponse.getStatusCode().value()).isEqualTo(201); + } + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/GithubUserProfilePayloadIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/GithubUserProfilePayloadIntegrationTest.java index bfec945e63..09db11a184 100644 --- a/libraries/src/test/java/com/baeldung/serenity/GithubUserProfilePayloadIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/GithubUserProfilePayloadIntegrationTest.java @@ -2,9 +2,6 @@ package com.baeldung.serenity; import net.serenitybdd.jbehave.SerenityStory; -/** - * @author aiet - */ public class GithubUserProfilePayloadIntegrationTest extends SerenityStory { } diff --git a/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java new file mode 100644 index 0000000000..1ebbd49e79 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchLiveTest.java @@ -0,0 +1,37 @@ +package com.baeldung.serenity; + +import net.serenitybdd.junit.runners.SerenityRunner; +import net.thucydides.core.annotations.Managed; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.openqa.selenium.By; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.ui.WebDriverWait; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; +import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated; + +@RunWith(SerenityRunner.class) +public class GoogleSearchLiveTest { + + @Managed(driver = "chrome") + private WebDriver browser; + + @Test + public void whenGoogleBaeldungThenShouldSeeEugen() { + browser.get("https://www.google.com/ncr"); + + browser + .findElement(By.name("q")) + .sendKeys("baeldung", Keys.ENTER); + + new WebDriverWait(browser, 5).until(visibilityOfElementLocated(By.cssSelector("._ksh"))); + + assertThat(browser + .findElement(By.cssSelector("._ksh")) + .getText(), containsString("Eugen (Baeldung)")); + } + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java new file mode 100644 index 0000000000..47fcdd5403 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchPageObjectLiveTest.java @@ -0,0 +1,27 @@ +package com.baeldung.serenity; + +import com.baeldung.serenity.pageobjects.GoogleSearchPageObject; +import net.serenitybdd.junit.runners.SerenityRunner; +import net.thucydides.core.annotations.Managed; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.openqa.selenium.WebDriver; + +@RunWith(SerenityRunner.class) +public class GoogleSearchPageObjectLiveTest { + + @Managed(driver = "chrome") + private WebDriver browser; + + private GoogleSearchPageObject googleSearch; + + @Test + public void whenGoogleBaeldungThenShouldSeeEugen() { + googleSearch.open(); + + googleSearch.searchFor("baeldung"); + + googleSearch.resultMatches("Eugen (Baeldung)"); + } + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/GoogleSearchScreenplayLiveTest.java b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchScreenplayLiveTest.java new file mode 100644 index 0000000000..63a70ddff4 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/serenity/GoogleSearchScreenplayLiveTest.java @@ -0,0 +1,44 @@ +package com.baeldung.serenity; + +import com.baeldung.serenity.screenplay.GoogleSearchResults; +import com.baeldung.serenity.screenplay.SearchForKeyword; +import com.baeldung.serenity.screenplay.StartWith; +import net.serenitybdd.junit.runners.SerenityRunner; +import net.serenitybdd.screenplay.Actor; +import net.serenitybdd.screenplay.abilities.BrowseTheWeb; +import net.thucydides.core.annotations.Managed; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.openqa.selenium.WebDriver; + +import static net.serenitybdd.screenplay.GivenWhenThen.givenThat; +import static net.serenitybdd.screenplay.GivenWhenThen.seeThat; +import static net.serenitybdd.screenplay.GivenWhenThen.then; +import static net.serenitybdd.screenplay.GivenWhenThen.when; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.hasItem; + +@RunWith(SerenityRunner.class) +public class GoogleSearchScreenplayLiveTest { + + @Managed(driver = "chrome") + private WebDriver browser; + + private Actor kitty = Actor.named("kitty"); + + @Before + public void setup() { + kitty.can(BrowseTheWeb.with(browser)); + } + + @Test + public void whenGoogleBaeldungThenShouldSeeEugen() { + givenThat(kitty).wasAbleTo(StartWith.googleSearchPage()); + + when(kitty).attemptsTo(SearchForKeyword.of("baeldung")); + + then(kitty).should(seeThat(GoogleSearchResults.displayed(), hasItem(containsString("Eugen (Baeldung)")))); + } + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java index 30faf92c6e..18488f9380 100644 --- a/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/MemberStatusIntegrationTest.java @@ -16,7 +16,8 @@ import static com.baeldung.serenity.membership.MemberGrade.Silver; @RunWith(SerenityRunner.class) public class MemberStatusIntegrationTest { - @Steps MemberStatusSteps memberSteps; + @Steps + private MemberStatusSteps memberSteps; @Test public void membersShouldStartWithBronzeStatus() { @@ -42,7 +43,7 @@ public class MemberStatusIntegrationTest { @Test @Title("Members with 50,000 points can exchange a MacBook Pro") - public void memberWith50000PointsCanExchangeAMacbookpro(){ + public void memberWith50000PointsCanExchangeAMacbookpro() { memberSteps.aMemberHasPointsOf(50_000); memberSteps.aMemberExchangeA(MacBookPro); memberSteps.memberShouldHavePointsLeft(); @@ -55,7 +56,7 @@ public class MemberStatusIntegrationTest { @Test @Ignore @Title("Members with 500 points should have a Gold status when added 4,000 points ($40,000)") - public void memberWith500PointsEarnsGoldAfterSpends$40000(){ + public void memberWith500PointsEarnsGoldAfterSpends$40000() { memberSteps.aMemberHasPointsOf(500); memberSteps.theMemberSpends(40_000); memberSteps.theMemberShouldHaveAStatusOf(Gold); @@ -64,7 +65,7 @@ public class MemberStatusIntegrationTest { @Test @Ignore @Title("Members with 100 points would have a Gold status when added 10,000 points ($100,000)") - public void memberWith100EarnsGoldAfterSpends$100000(){ + public void memberWith100EarnsGoldAfterSpends$100000() { memberSteps.aMemberHasPointsOf(100); memberSteps.theMemberSpends(100_000); memberSteps.theMemberShouldHaveAStatusOf(Gold); diff --git a/libraries/src/test/java/com/baeldung/serenity/github/GithubRestAssuredUserAPISteps.java b/libraries/src/test/java/com/baeldung/serenity/github/GithubRestAssuredUserAPISteps.java index cc434d6d19..eba406a8b5 100644 --- a/libraries/src/test/java/com/baeldung/serenity/github/GithubRestAssuredUserAPISteps.java +++ b/libraries/src/test/java/com/baeldung/serenity/github/GithubRestAssuredUserAPISteps.java @@ -8,25 +8,22 @@ import java.io.IOException; import static net.serenitybdd.rest.SerenityRest.rest; import static net.serenitybdd.rest.SerenityRest.then; -/** - * @author aiet - */ -public class GithubRestAssuredUserAPISteps { +class GithubRestAssuredUserAPISteps { private String api; @Step("Given the github REST API for user profile") - public void withUserProfileAPIEndpoint() { + void withUserProfileAPIEndpoint() { api = "https://api.github.com/users/{username}"; } @Step("When looking for {0} via the api") - public void getProfileOfUser(String username) throws IOException { + void getProfileOfUser(String username) throws IOException { rest().get(api, username); } @Step("Then there should be a login field with value {0} in payload of user {0}") - public void profilePayloadShouldContainLoginValue(String username) { + void profilePayloadShouldContainLoginValue(String username) { then().body("login", Matchers.equalTo(username)); } diff --git a/libraries/src/test/java/com/baeldung/serenity/github/GithubRestUserAPISteps.java b/libraries/src/test/java/com/baeldung/serenity/github/GithubRestUserAPISteps.java index 6e7fbace49..2ba5b1c8ed 100644 --- a/libraries/src/test/java/com/baeldung/serenity/github/GithubRestUserAPISteps.java +++ b/libraries/src/test/java/com/baeldung/serenity/github/GithubRestUserAPISteps.java @@ -14,9 +14,6 @@ import java.io.IOException; import static org.hamcrest.MatcherAssert.assertThat; -/** - * @author aiet - */ public class GithubRestUserAPISteps { private String api; diff --git a/libraries/src/test/java/com/baeldung/serenity/github/GithubUserProfilePayloadStepDefinitions.java b/libraries/src/test/java/com/baeldung/serenity/github/GithubUserProfilePayloadStepDefinitions.java index f3b374b66c..959f462dbd 100644 --- a/libraries/src/test/java/com/baeldung/serenity/github/GithubUserProfilePayloadStepDefinitions.java +++ b/libraries/src/test/java/com/baeldung/serenity/github/GithubUserProfilePayloadStepDefinitions.java @@ -9,11 +9,8 @@ import java.io.IOException; public class GithubUserProfilePayloadStepDefinitions { -// @Steps -// GithubRestUserAPISteps userAPISteps; - @Steps - GithubRestAssuredUserAPISteps userAPISteps; + private GithubRestAssuredUserAPISteps userAPISteps; @Given("github user profile api") public void givenGithubUserProfileApi() { diff --git a/libraries/src/test/java/com/baeldung/serenity/membership/MemberStatusSteps.java b/libraries/src/test/java/com/baeldung/serenity/membership/MemberStatusSteps.java index 02b3f0130e..49ed8cae7d 100644 --- a/libraries/src/test/java/com/baeldung/serenity/membership/MemberStatusSteps.java +++ b/libraries/src/test/java/com/baeldung/serenity/membership/MemberStatusSteps.java @@ -6,12 +6,9 @@ import net.thucydides.core.annotations.Step; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; -/** - * @author aiet - */ public class MemberStatusSteps { - Member member; + private Member member; @Step("Given a member has {0} points") public void aMemberHasPointsOf(int points) { @@ -35,7 +32,7 @@ public class MemberStatusSteps { @Pending @Step("When the member exchange {}") - public void aMemberExchangeA(Commodity commodity){ + public void aMemberExchangeA(Commodity commodity) { //TODO } diff --git a/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java b/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java new file mode 100644 index 0000000000..bdba8a69bc --- /dev/null +++ b/libraries/src/test/java/com/baeldung/serenity/pageobjects/GoogleSearchPageObject.java @@ -0,0 +1,33 @@ +package com.baeldung.serenity.pageobjects; + +import net.thucydides.core.annotations.DefaultUrl; +import net.thucydides.core.pages.PageObject; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; + +@DefaultUrl("https://www.google.com/ncr") +public class GoogleSearchPageObject extends PageObject { + + @FindBy(name = "q") + private WebElement search; + + @FindBy(css = "._ksh") + private WebElement result; + + public void searchFor(String keyword) { + search.sendKeys(keyword, Keys.ENTER); + } + + public void resultMatches(String expected) { + withTimeoutOf(5, SECONDS) + .waitFor(result) + .waitUntilVisible(); + assertThat(result.getText(), containsString(expected)); + } + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java new file mode 100644 index 0000000000..b60c929c05 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchPage.java @@ -0,0 +1,21 @@ +package com.baeldung.serenity.screenplay; + +import net.serenitybdd.core.pages.PageObject; +import net.serenitybdd.screenplay.targets.Target; +import net.thucydides.core.annotations.DefaultUrl; + +/** + * @author baoqiang + */ +@DefaultUrl("https://www.google.com/ncr") +class GoogleSearchPage extends PageObject { + + static final Target SEARCH_RESULT_TITLES = Target + .the("search results") + .locatedBy("._ksh"); + + static final Target SEARCH_INPUT_BOX = Target + .the("search input box") + .locatedBy("#lst-ib"); + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java new file mode 100644 index 0000000000..38990e13b6 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/GoogleSearchResults.java @@ -0,0 +1,21 @@ +package com.baeldung.serenity.screenplay; + +import net.serenitybdd.screenplay.Actor; +import net.serenitybdd.screenplay.Question; +import net.serenitybdd.screenplay.questions.Text; + +import java.util.List; + +public class GoogleSearchResults implements Question> { + + public static Question> displayed() { + return new GoogleSearchResults(); + } + + public List answeredBy(Actor actor) { + return Text + .of(GoogleSearchPage.SEARCH_RESULT_TITLES) + .viewedBy(actor) + .asList(); + } +} diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java new file mode 100644 index 0000000000..1628ef8ed7 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/SearchForKeyword.java @@ -0,0 +1,32 @@ +package com.baeldung.serenity.screenplay; + +import net.serenitybdd.core.steps.Instrumented; +import net.serenitybdd.screenplay.Actor; +import net.serenitybdd.screenplay.Task; +import net.serenitybdd.screenplay.actions.Enter; +import net.thucydides.core.annotations.Step; +import org.openqa.selenium.Keys; + +public class SearchForKeyword implements Task { + + @Step("{0} searches for '#keyword'") + public void performAs(T actor) { + actor.attemptsTo(Enter + .theValue(keyword) + .into(GoogleSearchPage.SEARCH_INPUT_BOX) + .thenHit(Keys.RETURN)); + } + + private String keyword; + + public SearchForKeyword(String keyword) { + this.keyword = keyword; + } + + public static Task of(String keyword) { + return Instrumented + .instanceOf(SearchForKeyword.class) + .withProperties(keyword); + } + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java b/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java new file mode 100644 index 0000000000..52c6d07fda --- /dev/null +++ b/libraries/src/test/java/com/baeldung/serenity/screenplay/StartWith.java @@ -0,0 +1,25 @@ +package com.baeldung.serenity.screenplay; + +import net.serenitybdd.screenplay.Actor; +import net.serenitybdd.screenplay.Task; +import net.serenitybdd.screenplay.actions.Open; +import net.thucydides.core.annotations.Step; + +import static net.serenitybdd.screenplay.Tasks.instrumented; + +public class StartWith implements Task { + + public static StartWith googleSearchPage() { + return instrumented(StartWith.class); + } + + private GoogleSearchPage googleSearchPage; + + @Step("{0} starts a google search") + public void performAs(T t) { + t.attemptsTo(Open + .browserOn() + .the(googleSearchPage)); + } + +} diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderClassDirtiesContextIntegrationTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderClassDirtiesContextIntegrationTest.java index bb25186cee..82dbad0f11 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderClassDirtiesContextIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderClassDirtiesContextIntegrationTest.java @@ -14,23 +14,21 @@ import org.springframework.test.context.ContextConfiguration; import static com.baeldung.serenity.spring.RandomNumberUtil.randomInt; import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_CLASS; -/** - * @author aiet - */ - @RunWith(Suite.class) @Suite.SuiteClasses({ - AdderClassDirtiesContextIntegrationTest.DirtiesContextTest.class, AdderClassDirtiesContextIntegrationTest.AnotherDirtiesContextTest.class - }) + AdderClassDirtiesContextIntegrationTest.DirtiesContextTest.class, AdderClassDirtiesContextIntegrationTest.AnotherDirtiesContextTest.class +}) public class AdderClassDirtiesContextIntegrationTest { @RunWith(SerenityRunner.class) @ContextConfiguration(classes = AdderService.class) public static abstract class Base { - @Steps AdderServiceSteps adderServiceSteps; + @Steps + AdderServiceSteps adderServiceSteps; - @ClassRule public static SpringIntegrationClassRule springIntegrationClassRule = new SpringIntegrationClassRule(); + @ClassRule + public static SpringIntegrationClassRule springIntegrationClassRule = new SpringIntegrationClassRule(); void whenAccumulate_thenSummedUp() { adderServiceSteps.whenAccumulate(); diff --git a/libraries/src/test/java/com/baeldung/serenity/spring/AdderTest.java b/libraries/src/test/java/com/baeldung/serenity/spring/AdderTest.java index a57b924211..771f389cb1 100644 --- a/libraries/src/test/java/com/baeldung/serenity/spring/AdderTest.java +++ b/libraries/src/test/java/com/baeldung/serenity/spring/AdderTest.java @@ -6,13 +6,11 @@ import org.jbehave.core.annotations.BeforeStory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; -/** - * @author aiet - */ -@ContextConfiguration(classes = { AdderController.class, AdderService.class }) +@ContextConfiguration(classes = {AdderController.class, AdderService.class}) public class AdderTest extends SerenityStory { - @Autowired private AdderService adderService; + @Autowired + private AdderService adderService; @BeforeStory public void init() { diff --git a/libraries/src/test/java/com/baeldung/stm/AccountTest.java b/libraries/src/test/java/com/baeldung/stm/AccountTest.java index d45490df94..be3edf058c 100644 --- a/libraries/src/test/java/com/baeldung/stm/AccountTest.java +++ b/libraries/src/test/java/com/baeldung/stm/AccountTest.java @@ -1,9 +1,7 @@ package com.baeldung.stm; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; diff --git a/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsTest.java b/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsTest.java index e73861d8af..e14a91ce67 100644 --- a/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsTest.java +++ b/libraries/src/test/java/com/baeldung/stream/JoolMergeStreamsTest.java @@ -5,31 +5,35 @@ import org.junit.Assert; import org.junit.Test; import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static junit.framework.TestCase.assertEquals; public class JoolMergeStreamsTest { @Test public void givenTwoStreams_whenMergingStreams_thenResultingStreamContainsElementsFromBothStreams() { - Seq seq1 = Seq.of(1, 3, 5); - Seq seq2 = Seq.of(2, 4, 6); + Stream seq1 = Stream.of(1, 3, 5); + Stream seq2 = Stream.of(2, 4, 6); - Seq resultingSeq = seq1.append(seq2); + Stream resultingSeq = Seq.ofType(seq1, Integer.class) + .append(seq2); assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), - resultingSeq.toList()); + resultingSeq.collect(Collectors.toList())); } @Test public void givenThreeStreams_whenAppendingAndPrependingStreams_thenResultingStreamContainsElementsFromAllStreams() { - Seq seq = Seq.of("foo", "bar"); - Seq openingBracketSeq = Seq.of("["); - Seq closingBracketSeq = Seq.of("]"); + Stream seq = Stream.of("foo", "bar"); + Stream openingBracketSeq = Stream.of("["); + Stream closingBracketSeq = Stream.of("]"); - Seq resultingStream = seq.append(closingBracketSeq) - .prepend(openingBracketSeq); + Stream resultingStream = Seq.ofType(seq, String.class) + .append(closingBracketSeq) + .prepend(openingBracketSeq); Assert.assertEquals(Arrays.asList("[", "foo", "bar", "]"), - resultingStream.toList()); + resultingStream.collect(Collectors.toList())); } } \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/stream/MergeStreamsTest.java b/libraries/src/test/java/com/baeldung/stream/MergeStreamsTest.java index 217d2b5b64..23110947b6 100644 --- a/libraries/src/test/java/com/baeldung/stream/MergeStreamsTest.java +++ b/libraries/src/test/java/com/baeldung/stream/MergeStreamsTest.java @@ -17,10 +17,10 @@ public class MergeStreamsTest { Stream stream2 = Stream.of(2, 4, 6); Stream resultingStream = Stream.concat(stream1, - stream2); + stream2); assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), - resultingStream.collect(Collectors.toList())); + resultingStream.collect(Collectors.toList())); } @Test @@ -30,11 +30,11 @@ public class MergeStreamsTest { Stream stream3 = Stream.of(18, 15, 36); Stream resultingStream = Stream.concat(Stream.concat(stream1, - stream2), - stream3); + stream2), + stream3); assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36), - resultingStream.collect(Collectors.toList())); + resultingStream.collect(Collectors.toList())); } @Test @@ -47,7 +47,7 @@ public class MergeStreamsTest { Stream resultingStream = Stream.of(stream1, stream2, stream3, stream4).flatMap(Function.identity()); assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), - resultingStream.collect(Collectors.toList())); + resultingStream.collect(Collectors.toList())); } } \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsTest.java b/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsTest.java index a964d76e8a..5104ec0682 100644 --- a/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsTest.java +++ b/libraries/src/test/java/com/baeldung/stream/StreamExMergeStreamsTest.java @@ -4,6 +4,8 @@ import one.util.streamex.StreamEx; import org.junit.Test; import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.junit.Assert.assertEquals; @@ -11,41 +13,43 @@ public class StreamExMergeStreamsTest { @Test public void givenTwoStreams_whenMergingStreams_thenResultingStreamContainsElementsFromBothStreams() { - StreamEx stream1 = StreamEx.of(1, 3, 5); - StreamEx stream2 = StreamEx.of(2, 4, 6); + Stream stream1 = Stream.of(1, 3, 5); + Stream stream2 = Stream.of(2, 4, 6); - StreamEx resultingStream = stream1.append(stream2); + Stream resultingStream = StreamEx.of(stream1).append(stream2); assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6), - resultingStream.toList()); + resultingStream.collect(Collectors.toList())); } @Test public void givenFourStreams_whenMergingStreams_thenResultingStreamContainsElementsFromAllStreams() { - StreamEx stream1 = StreamEx.of(1, 3, 5); - StreamEx stream2 = StreamEx.of(2, 4, 6); - StreamEx stream3 = StreamEx.of(18, 15, 36); - StreamEx stream4 = StreamEx.of(99); + Stream stream1 = Stream.of(1, 3, 5); + Stream stream2 = Stream.of(2, 4, 6); + Stream stream3 = Stream.of(18, 15, 36); + Stream stream4 = Stream.of(99); - StreamEx resultingStream = stream1.append(stream2) - .append(stream3) - .append(stream4); + Stream resultingStream = StreamEx.of(stream1) + .append(stream2) + .append(stream3) + .append(stream4); assertEquals(Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), - resultingStream.toList()); + resultingStream.collect(Collectors.toList())); } @Test public void givenThreeStreams_whenAppendingAndPrependingStreams_thenResultingStreamContainsElementsFromAllStreams() { - StreamEx stream1 = StreamEx.of("foo", "bar"); - StreamEx openingBracketStream = StreamEx.of("["); - StreamEx closingBracketStream = StreamEx.of("]"); + Stream stream1 = Stream.of("foo", "bar"); + Stream openingBracketStream = Stream.of("["); + Stream closingBracketStream = Stream.of("]"); - StreamEx resultingStream = stream1.append(closingBracketStream) - .prepend(openingBracketStream); + Stream resultingStream = StreamEx.of(stream1) + .append(closingBracketStream) + .prepend(openingBracketStream); assertEquals(Arrays.asList("[", "foo", "bar", "]"), - resultingStream.toList()); + resultingStream.collect(Collectors.toList())); } } diff --git a/libraries/src/test/java/com/baeldung/text/DiffTest.java b/libraries/src/test/java/com/baeldung/text/DiffTest.java new file mode 100644 index 0000000000..95370013b6 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/DiffTest.java @@ -0,0 +1,18 @@ +package com.baeldung.text; + +import org.apache.commons.text.diff.EditScript; +import org.apache.commons.text.diff.StringsComparator; +import org.junit.Assert; +import org.junit.Test; + +public class DiffTest { + + @Test + public void whenEditScript_thenCorrect() { + StringsComparator cmp = new StringsComparator("ABCFGH", "BCDEFG"); + EditScript script = cmp.getScript(); + int mod = script.getModifications(); + + Assert.assertEquals(4, mod); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java b/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java new file mode 100644 index 0000000000..80ca0cfbba --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceTest.java @@ -0,0 +1,25 @@ +package com.baeldung.text; + +import org.apache.commons.text.similarity.LongestCommonSubsequence; +import org.apache.commons.text.similarity.LongestCommonSubsequenceDistance; +import org.junit.Assert; +import org.junit.Test; + +public class LongestCommonSubsequenceTest { + + @Test + public void whenCompare_thenCorrect() { + LongestCommonSubsequence lcs = new LongestCommonSubsequence(); + int countLcs = lcs.apply("New York", "New Hampshire"); + + Assert.assertEquals(5, countLcs); + } + + @Test + public void whenCalculateDistance_thenCorrect() { + LongestCommonSubsequenceDistance lcsd = new LongestCommonSubsequenceDistance(); + int countLcsd = lcsd.apply("New York", "New Hampshire"); + + Assert.assertEquals(11, countLcsd); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java b/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java new file mode 100644 index 0000000000..a8dbaadc5a --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/StrBuilderTest.java @@ -0,0 +1,24 @@ +package com.baeldung.text; + +import org.apache.commons.text.StrBuilder; +import org.junit.Assert; +import org.junit.Test; + +public class StrBuilderTest { + + @Test + public void whenReplaced_thenCorrect() { + StrBuilder strBuilder = new StrBuilder("example StrBuilder!"); + strBuilder.replaceAll("example", "new"); + + Assert.assertEquals(new StrBuilder("new StrBuilder!"), strBuilder); + } + + @Test + public void whenCleared_thenEmpty() { + StrBuilder strBuilder = new StrBuilder("example StrBuilder!"); + strBuilder.clear(); + + Assert.assertEquals(new StrBuilder(""), strBuilder); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/StrSubstitutorTest.java b/libraries/src/test/java/com/baeldung/text/StrSubstitutorTest.java new file mode 100644 index 0000000000..24e6ff59c8 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/StrSubstitutorTest.java @@ -0,0 +1,23 @@ +package com.baeldung.text; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.text.StrSubstitutor; +import org.junit.Assert; +import org.junit.Test; + +public class StrSubstitutorTest { + + @Test + public void whenSubstituted_thenCorrect() { + Map substitutes = new HashMap<>(); + substitutes.put("name", "John"); + substitutes.put("college", "University of Stanford"); + String templateString = "My name is ${name} and I am a student at the ${college}."; + StrSubstitutor sub = new StrSubstitutor(substitutes); + String result = sub.replace(templateString); + + Assert.assertEquals("My name is John and I am a student at the University of Stanford.", result); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/UnicodeEscaperTest.java b/libraries/src/test/java/com/baeldung/text/UnicodeEscaperTest.java new file mode 100644 index 0000000000..5a52bfd0db --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/UnicodeEscaperTest.java @@ -0,0 +1,16 @@ +package com.baeldung.text; + +import org.apache.commons.text.translate.UnicodeEscaper; +import org.junit.Assert; +import org.junit.Test; + +public class UnicodeEscaperTest { + + @Test + public void whenTranslate_thenCorrect() { + UnicodeEscaper ue = UnicodeEscaper.above(0); + String result = ue.translate("ABCD"); + + Assert.assertEquals("\\u0041\\u0042\\u0043\\u0044", result); + } +} diff --git a/libraries/src/test/java/com/baeldung/text/WordUtilsTest.java b/libraries/src/test/java/com/baeldung/text/WordUtilsTest.java new file mode 100644 index 0000000000..b9268d67b3 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/text/WordUtilsTest.java @@ -0,0 +1,23 @@ +package com.baeldung.text; + +import org.apache.commons.text.WordUtils; +import org.junit.Assert; +import org.junit.Test; + +public class WordUtilsTest { + + @Test + public void whenCapitalized_thenCorrect() { + String toBeCapitalized = "to be capitalized!"; + String result = WordUtils.capitalize(toBeCapitalized); + + Assert.assertEquals("To Be Capitalized!", result); + } + + @Test + public void whenContainsWords_thenCorrect() { + boolean containsWords = WordUtils.containsAllWords("String to search", "to", "search"); + + Assert.assertTrue(containsWords); + } +} diff --git a/liquibase/pom.xml b/liquibase/pom.xml new file mode 100644 index 0000000000..d26acc8c98 --- /dev/null +++ b/liquibase/pom.xml @@ -0,0 +1,47 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + liquibase + + + + mysql + mysql-connector-java + 5.1.6 + + + + + baeldung-liquibase-demo + + + org.apache.maven.plugins + maven-compiler-plugin + 2.5.1 + + 1.8 + 1.8 + + + + + org.liquibase + liquibase-maven-plugin + 3.4.2 + + liquibase/liquibase.properties + liquibase/db-changelog.xml + + + + + + \ No newline at end of file diff --git a/liquibase/src/main/resources/liquibase/db-changelog.xml b/liquibase/src/main/resources/liquibase/db-changelog.xml new file mode 100644 index 0000000000..e6ed8501aa --- /dev/null +++ b/liquibase/src/main/resources/liquibase/db-changelog.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liquibase/src/main/resources/liquibase/liquibase.properties b/liquibase/src/main/resources/liquibase/liquibase.properties new file mode 100644 index 0000000000..2d5e5b7d9d --- /dev/null +++ b/liquibase/src/main/resources/liquibase/liquibase.properties @@ -0,0 +1,4 @@ +driver=com.mysql.jdbc.Driver +url=jdbc:mysql://localhost:3306/baeldung_liquibase +username=root +password=password \ No newline at end of file diff --git a/metrics/pom.xml b/metrics/pom.xml index 1053c66ff5..794c53b157 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -15,6 +15,7 @@ 3.1.2 3.1.0 + 0.12.16 @@ -43,6 +44,11 @@ javax.servlet-api ${dep.ver.servlet} + + com.netflix.servo + servo-core + ${netflix.servo.ver} + diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationTest.java new file mode 100644 index 0000000000..3d6a73912f --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricAnnotationTest.java @@ -0,0 +1,56 @@ +package com.baeldung.metrics.servo; + +import com.netflix.servo.Metric; +import com.netflix.servo.annotations.DataSourceType; +import com.netflix.servo.annotations.Monitor; +import com.netflix.servo.annotations.MonitorTags; +import com.netflix.servo.monitor.Monitors; +import com.netflix.servo.tag.BasicTag; +import com.netflix.servo.tag.BasicTagList; +import com.netflix.servo.tag.TagList; +import org.junit.Test; + +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import static com.google.common.collect.Lists.newArrayList; +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +/** + * @author aiet + */ +public class MetricAnnotationTest extends MetricTestBase { + + @Monitor(name = "integerCounter", type = DataSourceType.COUNTER, description = "Total number of update operations.") + private final AtomicInteger updateCount = new AtomicInteger(0); + + @MonitorTags private TagList tags = new BasicTagList(newArrayList(new BasicTag("tag-key", "tag-value"))); + + @Test + public void givenAnnotatedMonitor_whenUpdated_thenDataCollected() throws Exception { + Monitors.registerObject("testObject", this); + assertTrue(Monitors.isObjectRegistered("testObject", this)); + + updateCount.incrementAndGet(); + updateCount.incrementAndGet(); + SECONDS.sleep(1); + + List> metrics = observer.getObservations(); + System.out.println(metrics); + assertThat(metrics, hasSize(greaterThanOrEqualTo(1))); + + Iterator> metricIterator = metrics.iterator(); + //skip first empty observation + metricIterator.next(); + while (metricIterator.hasNext()) { + assertThat(metricIterator.next(), hasItem(hasProperty("config", hasProperty("name", is("integerCounter"))))); + } + + } +} diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverTest.java new file mode 100644 index 0000000000..14d3c2646f --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricObserverTest.java @@ -0,0 +1,70 @@ +package com.baeldung.metrics.servo; + +import com.netflix.servo.DefaultMonitorRegistry; +import com.netflix.servo.Metric; +import com.netflix.servo.monitor.BasicGauge; +import com.netflix.servo.monitor.DynamicCounter; +import com.netflix.servo.monitor.Gauge; +import com.netflix.servo.monitor.MonitorConfig; +import org.junit.Test; + +import java.util.Iterator; +import java.util.List; + +import static com.netflix.servo.annotations.DataSourceType.GAUGE; +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +/** + * @author aiet + */ +public class MetricObserverTest extends MetricTestBase { + + @Test + public void givenMetrics_whenRegister_thenMonitored() throws InterruptedException { + Gauge gauge = new BasicGauge<>(MonitorConfig + .builder("test") + .build(), () -> 2.32); + assertEquals(2.32, gauge.getValue(), 0.01); + + DefaultMonitorRegistry + .getInstance() + .register(gauge); + + for (int i = 0; i < 2; i++) { + SECONDS.sleep(1); + } + + List> metrics = observer.getObservations(); + assertThat(metrics, hasSize(greaterThanOrEqualTo(2))); + + Iterator> metricIterator = metrics.iterator(); + //skip first empty observation + metricIterator.next(); + while (metricIterator.hasNext()) { + assertThat(metricIterator.next(), hasItem(allOf(hasProperty("config", hasProperty("tags", hasItem(GAUGE))), hasProperty("value", is(2.32))))); + } + + } + + @Test + public void givenMetrics_whenRegisterDynamically_thenMonitored() throws Exception { + for (int i = 0; i < 2; i++) { + DynamicCounter.increment("monitor-name", "tag-key", "tag-value"); + SECONDS.sleep(1); + } + + List> metrics = observer.getObservations(); + assertThat(metrics, hasSize(greaterThanOrEqualTo(2))); + + Iterator> metricIterator = metrics.iterator(); + //skip first empty observation + metricIterator.next(); + while (metricIterator.hasNext()) { + assertThat(metricIterator.next(), hasItem(hasProperty("value", greaterThanOrEqualTo(1.0)))); + } + } + +} diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerTest.java new file mode 100644 index 0000000000..4a9a77efde --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricPollerTest.java @@ -0,0 +1,50 @@ +package com.baeldung.metrics.servo; + +import com.netflix.servo.Metric; +import com.netflix.servo.publish.*; +import org.junit.Test; + +import java.util.List; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.stream.Collectors.toList; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertThat; + +/** + * @author aiet + */ +public class MetricPollerTest { + + @Test + public void givenJvmPoller_whenMonitor_thenDataCollected() throws Exception { + MemoryMetricObserver observer = new MemoryMetricObserver(); + PollRunnable pollRunnable = new PollRunnable(new JvmMetricPoller(), new BasicMetricFilter(true), observer); + PollScheduler + .getInstance() + .start(); + PollScheduler + .getInstance() + .addPoller(pollRunnable, 1, SECONDS); + + SECONDS.sleep(1); + + PollScheduler + .getInstance() + .stop(); + List> metrics = observer.getObservations(); + assertThat(metrics, hasSize(greaterThanOrEqualTo(1))); + + List args = metrics + .stream() + .filter(m -> !m.isEmpty()) + .flatMap(ms -> ms + .stream() + .map(m -> m + .getConfig() + .getName())) + .collect(toList()); + assertThat(args, hasItems("loadedClassCount", "initUsage", "maxUsage", "threadCount")); + } + +} diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricTestBase.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTestBase.java new file mode 100644 index 0000000000..86a9d201e8 --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTestBase.java @@ -0,0 +1,40 @@ +package com.baeldung.metrics.servo; + +import com.netflix.servo.publish.*; +import org.junit.After; +import org.junit.Before; + +import static java.util.concurrent.TimeUnit.SECONDS; + +/** + * @author aiet + */ +abstract class MetricTestBase { + + MemoryMetricObserver observer; + + @Before + public void prepareScheduler() { + System.setProperty("servo.pollers", "1000"); + observer = new MemoryMetricObserver(); + PollScheduler + .getInstance() + .start(); + MetricFilter metricFilter = new BasicMetricFilter(true); + PollRunnable task = new PollRunnable(new MonitorRegistryMetricPoller(), metricFilter, observer); + PollScheduler + .getInstance() + .addPoller(task, 1, SECONDS); + } + + @After + public void stopScheduler() { + if (PollScheduler + .getInstance() + .isStarted()) { + PollScheduler + .getInstance() + .stop(); + } + } +} diff --git a/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java new file mode 100644 index 0000000000..68ba23244d --- /dev/null +++ b/metrics/src/test/java/com/baeldung/metrics/servo/MetricTypeTest.java @@ -0,0 +1,220 @@ +package com.baeldung.metrics.servo; + +import com.netflix.servo.monitor.*; +import com.netflix.servo.stats.StatsConfig; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.Map; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.stream.Collectors.toMap; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +/** + * Unit test for simple App. + */ +public class MetricTypeTest { + + @Test + public void givenDefaultCounter_whenManipulate_thenCountValid() { + Counter counter = Monitors.newCounter("test"); + assertEquals("counter should start with 0", 0, counter + .getValue() + .intValue()); + counter.increment(); + assertEquals("counter should have increased by 1", 1, counter + .getValue() + .intValue()); + counter.increment(-1); + assertEquals("counter should have decreased by 1", 0, counter + .getValue() + .intValue()); + } + + @Test + public void givenBasicCounter_whenManipulate_thenCountValid() { + Counter counter = new BasicCounter(MonitorConfig + .builder("test") + .build()); + assertEquals("counter should start with 0", 0, counter + .getValue() + .intValue()); + counter.increment(); + assertEquals("counter should have increased by 1", 1, counter + .getValue() + .intValue()); + counter.increment(-1); + assertEquals("counter should have decreased by 1", 0, counter + .getValue() + .intValue()); + } + + @Ignore + @Test + public void givenStepCounter_whenManipulate_thenRateValid() throws Exception { + System.setProperty("servo.pollers", "1000"); + Counter counter = new StepCounter(MonitorConfig + .builder("test") + .build()); + assertEquals("counter should start with rate 0.0", 0.0, counter.getValue()); + + counter.increment(); + SECONDS.sleep(1); + + assertEquals("counter rate should have increased to 1.0", 1.0, counter.getValue()); + } + + @Test + public void givenPeakRateCounter_whenManipulate_thenPeakRateReturn() throws Exception { + Counter counter = new PeakRateCounter(MonitorConfig + .builder("test") + .build()); + assertEquals("counter should start with 0", 0, counter + .getValue() + .intValue()); + + counter.increment(); + SECONDS.sleep(1); + counter.increment(); + counter.increment(); + + assertEquals("peak rate should have be 2", 2, counter + .getValue() + .intValue()); + } + + @Test + public void givenTimer_whenExecuteTask_thenTimerUpdated() throws Exception { + BasicTimer timer = new BasicTimer(MonitorConfig + .builder("test") + .build(), SECONDS); + + Stopwatch stopwatch = timer.start(); + SECONDS.sleep(1); + timer.record(2, SECONDS); + stopwatch.stop(); + + assertEquals("timer should count 1 second", 1, timer + .getValue() + .intValue()); + assertEquals("timer should count 3 seconds in total", 3.0, timer.getTotalTime(), 0.01); + assertEquals("timer should record 2 updates", 2, timer + .getCount() + .intValue()); + + assertEquals("timer should have max 2", 2, timer.getMax(), 0.01); + } + + @Test + public void givenBucketTimer_whenRecord_thenStatsCalculated() throws Exception { + BucketTimer timer = new BucketTimer(MonitorConfig + .builder("test") + .build(), new BucketConfig.Builder() + .withBuckets(new long[] { 2L, 5L }) + .withTimeUnit(SECONDS) + .build(), SECONDS); + timer.record(3); + timer.record(6); + + assertEquals("timer should count 9 seconds in total", 9, timer + .getTotalTime() + .intValue()); + + final Map metricMap = timer + .getMonitors() + .stream() + .filter(monitor -> monitor + .getConfig() + .getTags() + .containsKey("servo.bucket")) + .collect(toMap(monior -> getMonitorTagValue(monior, "servo.bucket"), monitor -> (Long) monitor.getValue())); + + assertThat(metricMap, allOf(hasEntry("bucket=2s", 0L), hasEntry("bucket=5s", 1L), hasEntry("bucket=overflow", 1L))); + } + + private static String getMonitorTagValue(Monitor monitor, String tagKey) { + return monitor + .getConfig() + .getTags() + .getTag(tagKey) + .getValue(); + } + + @Test + public void givenStatsTimer_whenExecuteTask_thenStatsCalculated() throws Exception { + System.setProperty("netflix.servo", "1000"); + StatsTimer timer = new StatsTimer(MonitorConfig + .builder("test") + .build(), new StatsConfig.Builder() + .withComputeFrequencyMillis(2000) + .withPercentiles(new double[] { 99.0, 95.0, 90.0 }) + .withPublishMax(true) + .withPublishMin(true) + .withPublishCount(true) + .withPublishMean(true) + .withPublishStdDev(true) + .withPublishVariance(true) + .build(), SECONDS); + + Stopwatch stopwatch = timer.start(); + SECONDS.sleep(1); + timer.record(3, SECONDS); + stopwatch.stop(); + + stopwatch = timer.start(); + timer.record(6, SECONDS); + SECONDS.sleep(2); + stopwatch.stop(); + + assertEquals("timer should count 12 seconds in total", 12, timer.getTotalTime()); + assertEquals("timer should count 12 seconds in total", 12, timer.getTotalMeasurement()); + assertEquals("timer should record 4 updates", 4, timer.getCount()); + assertEquals("stats timer value time-cost/update should be 2", 3, timer + .getValue() + .intValue()); + + final Map metricMap = timer + .getMonitors() + .stream() + .collect(toMap(monitor -> getMonitorTagValue(monitor, "statistic"), monitor -> (Number) monitor.getValue())); + + assertThat(metricMap.keySet(), containsInAnyOrder("count", "totalTime", "max", "min", "variance", "stdDev", "avg", "percentile_99", "percentile_95", "percentile_90")); + } + + @Test + public void givenGauge_whenCall_thenValueReturned() { + Gauge gauge = new BasicGauge<>(MonitorConfig + .builder("test") + .build(), () -> 2.32); + assertEquals(2.32, gauge.getValue(), 0.01); + } + + @Test + public void givenMaxGauge_whenUpdateMultipleTimes_thenMaxReturned() { + MaxGauge gauge = new MaxGauge(MonitorConfig + .builder("test") + .build()); + assertEquals(0, gauge + .getValue() + .intValue()); + + gauge.update(4); + assertEquals(4, gauge.getCurrentValue(0)); + + gauge.update(1); + assertEquals(4, gauge.getCurrentValue(0)); + } + + @Test + public void givenInformationalMonitor_whenRecord_thenInformationCollected() throws Exception { + BasicInformational informational = new BasicInformational(MonitorConfig + .builder("test") + .build()); + informational.setValue("information collected"); + assertEquals("information collected", informational.getValue()); + } + +} diff --git a/mustache/README.md b/mustache/README.md new file mode 100644 index 0000000000..b616b2df8a --- /dev/null +++ b/mustache/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +[Introduction to Mustache](http://www.baeldung.com/mustache) diff --git a/pom.xml b/pom.xml index e6e11326d7..818d131359 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.baeldung parent-modules @@ -11,20 +12,21 @@ UTF-8 refs/heads/master - + 4.12 - 1.3 + 1.3 1.10.19 1.7.21 1.1.7 - 2.19.1 - 3.6.0 + 2.19.1 + 3.6.0 aws + akka-streams algorithms annotations apache-cxf @@ -69,7 +71,7 @@ immutables jackson - + vavr javax-servlets javaxval @@ -86,14 +88,12 @@ junit5 jws - kotlin - libraries log-mdc log4j log4j2 lombok - + mapstruct metrics mesos-marathon @@ -121,16 +121,16 @@ selenium-junit-testng solr spark-java - spring-5 - spring-5-mvc + + spring-5-mvc spring-akka spring-amqp spring-all spring-amqp-simple spring-apache-camel spring-batch + spring-bom spring-boot - spring-boot-kotlin spring-cloud-data-flow spring-cloud spring-core @@ -140,7 +140,6 @@ spring-data-couchbase-2 spring-data-dynamodb spring-data-elasticsearch - spring-data-javaslang spring-data-mongodb spring-data-neo4j spring-data-redis @@ -166,7 +165,6 @@ spring-mvc-java spring-mvc-tiles spring-mvc-velocity - spring-mvc-web-vs-initializer spring-mvc-webflow spring-mvc-xml spring-mvc-simple @@ -176,6 +174,7 @@ spring-rest-angular spring-rest-docs spring-rest + spring-rest-simple spring-security-cache-control spring-security-client/spring-security-jsp-authentication spring-security-client/spring-security-jsp-authorize @@ -192,11 +191,12 @@ spring-security-mvc-login spring-security-mvc-persisted-remember-me spring-security-mvc-session + spring-security-mvc-socket spring-security-rest-basic-auth spring-security-rest-custom - spring-security-rest-digest-auth spring-security-rest-full spring-security-rest + spring-security-sso spring-security-x509 spring-session spring-sleuth @@ -207,6 +207,7 @@ spring-userservice spring-zuul spring-reactor + spring-vertx testing testng @@ -225,6 +226,8 @@ mybatis spring-drools drools + liquibase + spring-boot-property-exp @@ -243,12 +246,12 @@ ch.qos.logback logback-core ${logback.version} - + org.slf4j jcl-over-slf4j ${org.slf4j.version} - + @@ -268,8 +271,8 @@ hamcrest-library ${org.hamcrest.version} test - - + + org.hamcrest hamcrest-all ${org.hamcrest.version} @@ -281,7 +284,7 @@ ${mockito.version} test - + @@ -296,7 +299,7 @@ org.apache.maven.plugins maven-surefire-plugin - ${maven-surefire-plugin.version} + ${maven-surefire-plugin.version} 3 true @@ -313,12 +316,12 @@ org.apache.maven.plugins maven-compiler-plugin - ${maven-compiler-plugin.version} + ${maven-compiler-plugin.version} 1.8 1.8 - + + + @@ -35,12 +36,12 @@ org.springframework.boot spring-boot-starter-web - + org.apache.commons - commons-lang3 + commons-lang3 org.slf4j @@ -48,7 +49,24 @@ org.slf4j - jcl-over-slf4j + jcl-over-slf4j + + + + + org.jetbrains.kotlin + kotlin-stdlib-jre8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + com.fasterxml.jackson.module + jackson-module-kotlin + 2.8.7 @@ -74,12 +92,12 @@ test - + junit junit test - + com.jayway.restassured rest-assured @@ -90,18 +108,58 @@ - + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 1.8 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + org.apache.maven.plugins - maven-surefire-plugin + maven-surefire-plugin - true - false - - **/*IntegrationTest.java - **/*LiveTest.java - - + true + false + + **/*IntegrationTest.java + **/*LiveTest.java + + @@ -145,10 +203,11 @@ - 2.9.0 + 2.9.0 UTF-8 UTF-8 - 1.8 + 1.8 + 1.1.2 diff --git a/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt similarity index 87% rename from spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt rename to spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt index 02b57bac5f..69be7dac7e 100644 --- a/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt +++ b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloController.kt @@ -4,7 +4,7 @@ import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController @RestController -class HelloController constructor(val helloService: HelloService) { +class HelloController(val helloService: HelloService) { @GetMapping("/hello") fun helloKotlin(): String { diff --git a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt new file mode 100644 index 0000000000..f61c101f0f --- /dev/null +++ b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt @@ -0,0 +1,3 @@ +package com.baeldung.springbootkotlin + +data class HelloDto(val greeting: String) diff --git a/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt similarity index 98% rename from spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt rename to spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt index c988b64e05..67791a0c2d 100644 --- a/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt +++ b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/HelloService.kt @@ -4,6 +4,7 @@ import org.springframework.stereotype.Service @Service class HelloService { + fun getHello(): String { return "hello service" } diff --git a/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt similarity index 77% rename from spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt rename to spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt index dbe5694b6d..f95586af80 100644 --- a/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt +++ b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt @@ -3,7 +3,7 @@ package com.baeldung.springbootkotlin import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication -@SpringBootApplication +@SpringBootApplication(scanBasePackages = arrayOf("com.baeldung.springbootkotlin")) class KotlinDemoApplication fun main(args: Array) { diff --git a/spring-5-mvc/src/test/java/com/baeldung/test/Spring5ApplicationIntegrationTest.java b/spring-5-mvc/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java similarity index 84% rename from spring-5-mvc/src/test/java/com/baeldung/test/Spring5ApplicationIntegrationTest.java rename to spring-5-mvc/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java index c3790333ff..cf28d54385 100644 --- a/spring-5-mvc/src/test/java/com/baeldung/test/Spring5ApplicationIntegrationTest.java +++ b/spring-5-mvc/src/test/java/com/baeldung/Spring5ApplicationIntegrationTest.java @@ -1,12 +1,10 @@ -package com.baeldung.test; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.Spring5Application; - @RunWith(SpringRunner.class) @SpringBootTest(classes = Spring5Application.class) public class Spring5ApplicationIntegrationTest { diff --git a/spring-5-mvc/src/test/java/com/baeldung/test/LiveTest.java b/spring-5-mvc/src/test/kotlin/com/baeldung/LiveTest.java similarity index 82% rename from spring-5-mvc/src/test/java/com/baeldung/test/LiveTest.java rename to spring-5-mvc/src/test/kotlin/com/baeldung/LiveTest.java index f6dd921b25..1b52f89117 100644 --- a/spring-5-mvc/src/test/java/com/baeldung/test/LiveTest.java +++ b/spring-5-mvc/src/test/kotlin/com/baeldung/LiveTest.java @@ -1,54 +1,52 @@ -package com.baeldung.test; - -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.springframework.http.MediaType; - -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.response.Response; -import com.jayway.restassured.specification.RequestSpecification; - -public class LiveTest { - - private static String APP_ROOT = "http://localhost:8081"; - - - @Test - public void givenUser_whenResourceCreatedWithNullName_then400BadRequest() { - final Response response = givenAuth("user", "pass").contentType(MediaType.APPLICATION_JSON.toString()).body(resourceWithNullName()).post(APP_ROOT + "/foos"); - assertEquals(400, response.getStatusCode()); - } - - @Test - public void givenUser_whenResourceCreated_then201Created() { - final Response response = givenAuth("user", "pass").contentType(MediaType.APPLICATION_JSON.toString()).body(resourceString()).post(APP_ROOT + "/foos"); - assertEquals(201, response.getStatusCode()); - } - - /*@Test - public void givenUser_whenGetAllFoos_thenOK() { - final Response response = givenAuth("user", "pass").get(APP_ROOT + "/foos"); - assertEquals(200, response.getStatusCode()); - }*/ - - - - // - - private final String resourceWithNullName() { - final String roleData = "{\"name\":null}"; - return roleData; - } - - private final String resourceString() { - final String roleData = "{\"name\":\"" + randomAlphabetic(8) + "\"}"; - return roleData; - } - - private final RequestSpecification givenAuth(String username, String password) { - return RestAssured.given().auth().preemptive().basic(username, password); - } - +package com.baeldung; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.springframework.http.MediaType; + +import com.jayway.restassured.RestAssured; +import com.jayway.restassured.response.Response; +import com.jayway.restassured.specification.RequestSpecification; + +public class LiveTest { + + private static String APP_ROOT = "http://localhost:8081"; + + + @Test + public void givenUser_whenResourceCreatedWithNullName_then400BadRequest() { + final Response response = givenAuth("user", "pass").contentType(MediaType.APPLICATION_JSON.toString()).body(resourceWithNullName()).post(APP_ROOT + "/foos"); + assertEquals(400, response.getStatusCode()); + } + + @Test + public void givenUser_whenResourceCreated_then201Created() { + final Response response = givenAuth("user", "pass").contentType(MediaType.APPLICATION_JSON.toString()).body(resourceString()).post(APP_ROOT + "/foos"); + assertEquals(201, response.getStatusCode()); + } + + /*@Test + public void givenUser_whenGetAllFoos_thenOK() { + final Response response = givenAuth("user", "pass").get(APP_ROOT + "/foos"); + assertEquals(200, response.getStatusCode()); + }*/ + + + + // + + private final String resourceWithNullName() { + return "{\"name\":null}"; + } + + private final String resourceString() { + return "{\"name\":\"" + randomAlphabetic(8) + "\"}"; + } + + private final RequestSpecification givenAuth(String username, String password) { + return RestAssured.given().auth().preemptive().basic(username, password); + } + } \ No newline at end of file diff --git a/spring-5-mvc/src/test/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplicationIntegrationTest.kt b/spring-5-mvc/src/test/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplicationIntegrationTest.kt new file mode 100644 index 0000000000..d0667177c8 --- /dev/null +++ b/spring-5-mvc/src/test/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplicationIntegrationTest.kt @@ -0,0 +1,52 @@ +package com.baeldung.springbootkotlin + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Test +import org.junit.runner.RunWith +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.web.client.TestRestTemplate +import org.springframework.http.HttpStatus +import org.springframework.test.context.junit4.SpringRunner + +@RunWith(SpringRunner::class) +@SpringBootTest( + classes = arrayOf(KotlinDemoApplication::class), + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class KotlinDemoApplicationIntegrationTest { + + @Autowired + lateinit var testRestTemplate: TestRestTemplate + + @Test + fun whenCalled_thenShouldReturnHello() { + val result = testRestTemplate.withBasicAuth("user", "pass") + .getForEntity("/hello", String::class.java) + + assertNotNull(result) + assertEquals(HttpStatus.OK, result?.statusCode) + assertEquals("hello world", result?.body) + } + + @Test + fun whenCalled_thenShouldReturnHelloService() { + val result = testRestTemplate.withBasicAuth("user", "pass") + .getForEntity("/hello-service", String::class.java) + + assertNotNull(result) + assertEquals(HttpStatus.OK, result?.statusCode) + assertEquals(result?.body, "hello service") + } + + @Test + fun whenCalled_thenShouldReturnJson() { + val result = testRestTemplate.withBasicAuth("user", "pass") + .getForEntity("/hello-dto", HelloDto::class.java) + + assertNotNull(result) + assertEquals(HttpStatus.OK, result?.statusCode) + assertEquals(result?.body, HelloDto("Hello from the dto")) + } + +} diff --git a/spring-5/README.md b/spring-5/README.md index 31f665f4a2..510ee45f03 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -7,3 +7,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) - [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) +- [Exploring the Spring MVC URL Matching Improvements](http://www.baeldung.com/spring-mvc-url-matching) diff --git a/spring-5/pom.xml b/spring-5/pom.xml index 605dbe39e1..c2c565aef6 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -39,6 +39,11 @@ org.springframework.boot spring-boot-starter-webflux + + org.projectreactor + reactor-spring + 1.0.1.RELEASE + @@ -177,6 +182,7 @@ 1.0.0-M4 5.0.0-M4 2.20 + 5.0.0.RC2 diff --git a/spring-5/src/main/java/com/baeldung/Spring5Application.java b/spring-5/src/main/java/com/baeldung/Spring5Application.java index 41b5c1eed1..aaff1797ff 100644 --- a/spring-5/src/main/java/com/baeldung/Spring5Application.java +++ b/spring-5/src/main/java/com/baeldung/Spring5Application.java @@ -2,8 +2,10 @@ package com.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; @SpringBootApplication +@ComponentScan(basePackages = {"com.baeldung.web"}) public class Spring5Application { public static void main(String[] args) { diff --git a/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java b/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java new file mode 100644 index 0000000000..b7436c5ba7 --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java @@ -0,0 +1,61 @@ +package com.baeldung.functional; + +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import org.apache.catalina.Context; +import org.apache.catalina.startup.Tomcat; +import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; +import org.springframework.boot.web.server.WebServer; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; +import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + +public class ExploreSpring5URLPatternUsingRouterFunctions { + + private RouterFunction routingFunction() { + + return route(GET("/p?ths"), serverRequest -> ok().body(fromObject("/p?ths"))).andRoute(GET("/test/{*id}"), serverRequest -> ok().body(fromObject(serverRequest.pathVariable("id")))) + .andRoute(GET("/*card"), serverRequest -> ok().body(fromObject("/*card path was accessed"))) + .andRoute(GET("/{var1}_{var2}"), serverRequest -> ok().body(fromObject(serverRequest.pathVariable("var1") + " , " + serverRequest.pathVariable("var2")))) + .andRoute(GET("/{baeldung:[a-z]+}"), serverRequest -> ok().body(fromObject("/{baeldung:[a-z]+} was accessed and baeldung=" + serverRequest.pathVariable("baeldung")))) + .and(RouterFunctions.resources("/files/{*filepaths}", new ClassPathResource("files/"))); + } + + WebServer start() throws Exception { + WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); + HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) + .prependFilter(new IndexRewriteFilter()) + .build(); + + Tomcat tomcat = new Tomcat(); + tomcat.setHostname("localhost"); + tomcat.setPort(9090); + Context rootContext = tomcat.addContext("", System.getProperty("java.io.tmpdir")); + ServletHttpHandlerAdapter servlet = new ServletHttpHandlerAdapter(httpHandler); + Tomcat.addServlet(rootContext, "httpHandlerServlet", servlet); + rootContext.addServletMappingDecoded("/", "httpHandlerServlet"); + + TomcatWebServer server = new TomcatWebServer(tomcat); + server.start(); + return server; + + } + + public static void main(String[] args) { + try { + new FunctionalWebApplication().start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/spring-5/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java b/spring-5/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java index 258a23a2bf..8a808fc83a 100644 --- a/spring-5/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java +++ b/spring-5/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java @@ -15,6 +15,7 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; import reactor.core.publisher.Flux; @@ -58,7 +59,7 @@ public class FunctionalSpringBootApplication { @Bean public ServletRegistrationBean servletRegistrationBean() throws Exception { HttpHandler httpHandler = WebHttpHandlerBuilder - .webHandler(toHttpHandler(routingFunction())) + .webHandler((WebHandler) toHttpHandler(routingFunction())) .prependFilter(new IndexRewriteFilter()) .build(); ServletRegistrationBean registrationBean = new ServletRegistrationBean<>(new RootServlet(httpHandler), "/"); diff --git a/spring-5/src/main/java/com/baeldung/functional/FunctionalWebApplication.java b/spring-5/src/main/java/com/baeldung/functional/FunctionalWebApplication.java index 573813b166..29f9ea43da 100644 --- a/spring-5/src/main/java/com/baeldung/functional/FunctionalWebApplication.java +++ b/spring-5/src/main/java/com/baeldung/functional/FunctionalWebApplication.java @@ -50,7 +50,7 @@ public class FunctionalWebApplication { } WebServer start() throws Exception { - WebHandler webHandler = toHttpHandler(routingFunction()); + WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); HttpHandler httpHandler = WebHttpHandlerBuilder .webHandler(webHandler) .prependFilter(new IndexRewriteFilter()) diff --git a/spring-5/src/main/java/com/baeldung/functional/IndexRewriteFilter.java b/spring-5/src/main/java/com/baeldung/functional/IndexRewriteFilter.java index 3e19f81943..d218bba581 100644 --- a/spring-5/src/main/java/com/baeldung/functional/IndexRewriteFilter.java +++ b/spring-5/src/main/java/com/baeldung/functional/IndexRewriteFilter.java @@ -19,7 +19,7 @@ class IndexRewriteFilter implements WebFilter { .mutate() .request(builder -> builder .method(request.getMethod()) - .contextPath(request.getContextPath()) + .contextPath(request.getPath().toString()) .path("/test")) .build()); } diff --git a/spring-5/src/main/java/com/baeldung/functional/RootServlet.java b/spring-5/src/main/java/com/baeldung/functional/RootServlet.java index 54892c829f..922809e563 100644 --- a/spring-5/src/main/java/com/baeldung/functional/RootServlet.java +++ b/spring-5/src/main/java/com/baeldung/functional/RootServlet.java @@ -23,12 +23,13 @@ import static org.springframework.web.reactive.function.server.RequestPredicates import static org.springframework.web.reactive.function.server.RouterFunctions.route; import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; import static org.springframework.web.reactive.function.server.ServerResponse.ok; +import org.springframework.web.server.WebHandler; public class RootServlet extends ServletHttpHandlerAdapter { public RootServlet() { this(WebHttpHandlerBuilder - .webHandler(toHttpHandler(routingFunction())) + .webHandler((WebHandler) toHttpHandler(routingFunction())) .prependFilter(new IndexRewriteFilter()) .build()); } diff --git a/spring-5/src/main/java/com/baeldung/web/PathPatternController.java b/spring-5/src/main/java/com/baeldung/web/PathPatternController.java new file mode 100644 index 0000000000..15b689257a --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/web/PathPatternController.java @@ -0,0 +1,40 @@ +package com.baeldung.web; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PathPatternController { + + @GetMapping("/spring5/{*id}") + public String URIVariableHandler(@PathVariable String id) { + return id; + } + + @GetMapping("/s?ring5") + public String wildcardTakingExactlyOneChar() { + return "/s?ring5"; + } + + @GetMapping("/spring5/*id") + public String wildcardTakingZeroOrMoreChar() { + return "/spring5/*id"; + } + + @GetMapping("/resources/**") + public String wildcardTakingZeroOrMorePathSegments() { + return "/resources/**"; + } + + @GetMapping("/{baeldung:[a-z]+}") + public String regexInPathVariable(@PathVariable String baeldung) { + return baeldung; + } + + @GetMapping("/{var1}_{var2}") + public String multiplePathVariablesInSameSegment(@PathVariable String var1, @PathVariable String var2) { + return "Two variables are var1=" + var1 + " and var2=" + var2; + } +} diff --git a/spring-5/src/main/java/com/baeldung/web/reactive/client/WebClientController.java b/spring-5/src/main/java/com/baeldung/web/reactive/client/WebClientController.java new file mode 100644 index 0000000000..3a2e1b1a75 --- /dev/null +++ b/spring-5/src/main/java/com/baeldung/web/reactive/client/WebClientController.java @@ -0,0 +1,86 @@ +package com.baeldung.web.reactive.client; + +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.springframework.http.*; +import org.springframework.http.client.reactive.ClientHttpRequest; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.BodyInserter; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.net.URI; +import java.nio.charset.Charset; +import java.time.ZonedDateTime; +import java.util.Collections; + +@RestController +public class WebClientController { + + @ResponseStatus(HttpStatus.OK) + @GetMapping("/resource") + public void getResource() { + } + + public void demonstrateWebClient() { + // request + WebClient.UriSpec request1 = createWebClientWithServerURLAndDefaultValues().method(HttpMethod.POST); + WebClient.UriSpec request2 = createWebClientWithServerURLAndDefaultValues().post(); + + // request body specifications + WebClient.RequestBodySpec uri1 = createWebClientWithServerURLAndDefaultValues().method(HttpMethod.POST).uri("/resource"); + WebClient.RequestBodySpec uri2 = createWebClientWithServerURLAndDefaultValues().post().uri(URI.create("/resource")); + + // request header specification + WebClient.RequestHeadersSpec requestSpec1 = uri1.body(BodyInserters.fromPublisher(Mono.just("data"), String.class)); + WebClient.RequestHeadersSpec requestSpec2 = uri2.body(BodyInserters.fromObject("data")); + + // inserters + BodyInserter, ReactiveHttpOutputMessage> inserter1 = BodyInserters + .fromPublisher(Subscriber::onComplete, String.class); + + + LinkedMultiValueMap map = new LinkedMultiValueMap<>(); + map.add("key1", "value1"); + map.add("key2", "value2"); + + BodyInserter, ClientHttpRequest> inserter2 = BodyInserters.fromMultipartData(map); + BodyInserter inserter3 = BodyInserters.fromObject("body"); + + // responses + WebClient.ResponseSpec response1 = uri1 + .body(inserter3) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML) + .acceptCharset(Charset.forName("UTF-8")) + .ifNoneMatch("*") + .ifModifiedSince(ZonedDateTime.now()) + .retrieve(); + WebClient.ResponseSpec response2 = requestSpec2.retrieve(); + + } + + private WebClient createWebClient() { + return WebClient.create(); + } + + private WebClient createWebClientWithServerURL() { + return WebClient.create("http://localhost:8081"); + } + + private WebClient createWebClientWithServerURLAndDefaultValues() { + return WebClient + .builder() + .baseUrl("http://localhost:8081") + .defaultCookie("cookieKey", "cookieValue") + .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) + .defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080")) + .build(); + } + +} diff --git a/spring-5/src/main/resources/files/test/test.txt b/spring-5/src/main/resources/files/test/test.txt new file mode 100644 index 0000000000..30d74d2584 --- /dev/null +++ b/spring-5/src/main/resources/files/test/test.txt @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/spring-5/src/test/java/com/baeldung/ParallelIntegrationTest.java b/spring-5/src/test/java/com/baeldung/ParallelIntegrationTest.java index 1ce96de4ef..cbb7a2867b 100644 --- a/spring-5/src/test/java/com/baeldung/ParallelIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/ParallelIntegrationTest.java @@ -9,14 +9,14 @@ public class ParallelIntegrationTest { @Test public void runTests() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + final Class[] classes = {Example1IntegrationTest.class, Example2IntegrationTest.class}; JUnitCore.runClasses(new Computer(), classes); } @Test public void runTestsInParallel() { - final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; + final Class[] classes = {Example1IntegrationTest.class, Example2IntegrationTest.class}; JUnitCore.runClasses(new ParallelComputer(true, true), classes); } diff --git a/spring-5/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java b/spring-5/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java index 938ee7fd43..a155de20fa 100644 --- a/spring-5/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/Spring5JUnit4ConcurrentIntegrationTest.java @@ -15,9 +15,6 @@ import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -/** - * @author aiet - */ @RunWith(SpringRunner.class) @ContextConfiguration(classes = Spring5JUnit4ConcurrentIntegrationTest.SimpleConfiguration.class) public class Spring5JUnit4ConcurrentIntegrationTest implements ApplicationContextAware, InitializingBean { diff --git a/spring-5/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java b/spring-5/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java new file mode 100644 index 0000000000..7a38fa697f --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctionsTest.java @@ -0,0 +1,110 @@ +package com.baeldung.functional; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.boot.web.server.WebServer; +import org.springframework.test.web.reactive.server.WebTestClient; + +public class ExploreSpring5URLPatternUsingRouterFunctionsTest { + + private static WebTestClient client; + private static WebServer server; + + @BeforeClass + public static void setup() throws Exception { + server = new ExploreSpring5URLPatternUsingRouterFunctions().start(); + client = WebTestClient.bindToServer() + .baseUrl("http://localhost:" + server.getPort()) + .build(); + } + + @AfterClass + public static void destroy() { + server.stop(); + } + + @Test + public void givenRouter_whenGetPathWithSingleCharWildcard_thenGotPathPattern() throws Exception { + client.get() + .uri("/paths") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("/p?ths"); + } + + @Test + public void givenRouter_whenMultipleURIVariablePattern_thenGotPathVariable() throws Exception { + client.get() + .uri("/test/ab/cd") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("/ab/cd"); + } + + @Test + public void givenRouter_whenGetMultipleCharWildcard_thenGotPathPattern() throws Exception { + + client.get() + .uri("/wildcard") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("/*card path was accessed"); + } + + @Test + public void givenRouter_whenGetMultiplePathVaribleInSameSegment_thenGotPathVariables() throws Exception { + + client.get() + .uri("/baeldung_tutorial") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("baeldung , tutorial"); + } + + @Test + public void givenRouter_whenGetRegexInPathVarible_thenGotPathVariable() throws Exception { + + client.get() + .uri("/abcd") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("/{baeldung:[a-z]+} was accessed and baeldung=abcd"); + + client.get() + .uri("/1234") + .exchange() + .expectStatus() + .is4xxClientError(); + } + + @Test + public void givenResources_whenAccess_thenGot() throws Exception { + client.get() + .uri("/files/test/test.txt") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("test"); + + client.get() + .uri("/files/hello.txt") + .exchange() + .expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("hello"); + } + +} diff --git a/spring-5/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java b/spring-5/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java index cf1029c12f..6f39f11b00 100644 --- a/spring-5/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java @@ -8,7 +8,6 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.http.MediaType; import org.springframework.test.web.reactive.server.WebTestClient; - import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyInserters; diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java index b90012edf6..42d27b90f4 100644 --- a/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ComposedAnnotationIntegrationTest.java @@ -16,10 +16,10 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; class Spring5JUnit5ComposedAnnotationIntegrationTest { @Autowired - Task task; + private Task task; @Autowired - List tasks; + private List tasks; @Test @DisplayName("ApplicationContext injected into method") diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java index f0cc55fc80..0f00a85832 100644 --- a/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5IntegrationTest.java @@ -1,7 +1,7 @@ package com.baeldung.jupiter; import com.baeldung.web.reactive.Task; - +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -10,14 +10,12 @@ import org.springframework.test.context.ContextConfiguration; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import org.junit.jupiter.api.Test; - @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = TestConfig.class) class Spring5JUnit5IntegrationTest { @Autowired - Task task; + private Task task; @Test void givenAMethodName_whenInjecting_thenApplicationContextInjectedIntoMetho(ApplicationContext applicationContext) { diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java index 1794da45f5..fb6bb27684 100644 --- a/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5JUnit5ParallelIntegrationTest.java @@ -7,10 +7,10 @@ import org.junit.jupiter.api.Test; import org.junit.runner.Computer; import org.junit.runner.JUnitCore; -public class Spring5JUnit5ParallelIntegrationTest { +class Spring5JUnit5ParallelIntegrationTest { @Test - public void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingParallel() { + void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingParallel() { final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; @@ -19,7 +19,7 @@ public class Spring5JUnit5ParallelIntegrationTest { } @Test - public void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingLinear() { + void givenTwoTestClasses_whenJUnitRunParallel_thenTheTestsExecutingLinear() { final Class[] classes = { Example1IntegrationTest.class, Example2IntegrationTest.class }; diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java index 97efa19255..2c3a71fb3e 100644 --- a/spring-5/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5Java8NewFeaturesIntegrationTest.java @@ -1,25 +1,25 @@ package com.baeldung.jupiter; import org.junit.jupiter.api.Test; + import java.util.function.Supplier; import java.util.regex.Pattern; import java.util.stream.Collectors; + import static org.junit.jupiter.api.Assertions.assertEquals; -public class Spring5Java8NewFeaturesIntegrationTest { +class Spring5Java8NewFeaturesIntegrationTest { @FunctionalInterface public interface FunctionalInterfaceExample { Result reverseString(Input input); } - public class StringUtils{ - public FunctionalInterfaceExample - functionLambdaString = s -> { - return Pattern.compile(" +").splitAsStream(s) - .map(word->new StringBuilder(word).reverse()) + public class StringUtils { + FunctionalInterfaceExample + functionLambdaString = s -> Pattern.compile(" +").splitAsStream(s) + .map(word -> new StringBuilder(word).reverse()) .collect(Collectors.joining(" ")); - }; } @Test diff --git a/spring-5/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java b/spring-5/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java index c44728c856..5c289c3e34 100644 --- a/spring-5/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/jupiter/Spring5ReactiveServerClientIntegrationTest.java @@ -3,16 +3,8 @@ package com.baeldung.jupiter; import com.baeldung.web.reactive.Task; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.ClientRequest; -import org.springframework.web.reactive.function.client.ExchangeFunction; -import org.springframework.web.reactive.function.client.ExchangeFunctions; -import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; @@ -21,10 +13,8 @@ import reactor.core.publisher.Mono; import reactor.ipc.netty.NettyContext; import reactor.ipc.netty.http.server.HttpServer; -import java.net.URI; import java.time.Duration; -import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.web.reactive.function.server.RequestPredicates.GET; import static org.springframework.web.reactive.function.server.RequestPredicates.POST; diff --git a/spring-5/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-5/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java new file mode 100644 index 0000000000..90e3e7c445 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/web/PathPatternsUsingHandlerMethodIntegrationTest.java @@ -0,0 +1,101 @@ +package com.baeldung.web; + +import com.baeldung.Spring5Application; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Spring5Application.class) +public class PathPatternsUsingHandlerMethodIntegrationTest { + + private static WebTestClient client; + + @BeforeClass + public static void setUp() { + client = WebTestClient.bindToController(new PathPatternController()) + .build(); + } + + @Test + public void givenHandlerMethod_whenMultipleURIVariablePattern_then200() { + + client.get() + .uri("/spring5/ab/cd") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("/ab/cd"); + } + + @Test + public void givenHandlerMethod_whenURLWithWildcardTakingZeroOrMoreChar_then200() { + + client.get() + .uri("/spring5/userid") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("/spring5/*id"); + } + + @Test + public void givenHandlerMethod_whenURLWithWildcardTakingExactlyOneChar_then200() { + + client.get() + .uri("/string5") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("/s?ring5"); + } + + @Test + public void givenHandlerMethod_whenURLWithWildcardTakingZeroOrMorePathSegments_then200() { + + client.get() + .uri("/resources/baeldung") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("/resources/**"); + } + + @Test + public void givenHandlerMethod_whenURLWithRegexInPathVariable_thenExpectedOutput() { + + client.get() + .uri("/abc") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("abc"); + + client.get() + .uri("/123") + .exchange() + .expectStatus() + .is4xxClientError(); + } + + @Test + public void givenHandlerMethod_whenURLWithMultiplePathVariablesInSameSegment_then200() { + + client.get() + .uri("/baeldung_tutorial") + .exchange() + .expectStatus() + .is2xxSuccessful() + .expectBody() + .equals("Two variables are var1=baeldung and var2=tutorial"); + } + +} diff --git a/spring-5/src/test/java/com/baeldung/web/client/WebTestClientTest.java b/spring-5/src/test/java/com/baeldung/web/client/WebTestClientTest.java new file mode 100644 index 0000000000..4127f22c01 --- /dev/null +++ b/spring-5/src/test/java/com/baeldung/web/client/WebTestClientTest.java @@ -0,0 +1,58 @@ +package com.baeldung.web.client; + +import com.baeldung.Spring5Application; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.web.reactive.function.server.RequestPredicates; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; +import reactor.core.publisher.Mono; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Spring5Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class WebTestClientTest { + + @LocalServerPort + private int port; + + private final RouterFunction ROUTER_FUNCTION = RouterFunctions.route( + RequestPredicates.GET("/resource"), + request -> ServerResponse.ok().build() + ); + private final WebHandler WEB_HANDLER = exchange -> Mono.empty(); + + @Test + public void testWebTestClientWithServerWebHandler() { + WebTestClient.bindToWebHandler(WEB_HANDLER).build(); + } + + @Test + public void testWebTestClientWithRouterFunction() { + WebTestClient + .bindToRouterFunction(ROUTER_FUNCTION) + .build().get().uri("/resource") + .exchange() + .expectStatus().isOk() + .expectBody().isEmpty(); + } + + @Test + public void testWebTestClientWithServerURL() { + WebTestClient + .bindToServer() + .baseUrl("http://localhost:" + port) + .build() + .get() + .uri("/resource") + .exchange() + .expectStatus().is4xxClientError() + .expectBody(); + } + +} diff --git a/spring-all/src/main/java/com/baeldung/contexts/Greeting.java b/spring-all/src/main/java/com/baeldung/contexts/Greeting.java new file mode 100644 index 0000000000..99b473c6c4 --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/contexts/Greeting.java @@ -0,0 +1,19 @@ +package com.baeldung.contexts; + +public class Greeting { + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return "Greeting [message=" + message + "]"; + } +} diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java b/spring-all/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java new file mode 100644 index 0000000000..c3ff90cf39 --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java @@ -0,0 +1,35 @@ +package com.baeldung.contexts.config; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +@Configuration +public class ApplicationInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); + rootContext.register(RootApplicationConfig.class); + servletContext.addListener(new ContextLoaderListener(rootContext)); + + AnnotationConfigWebApplicationContext normalWebAppContext = new AnnotationConfigWebApplicationContext(); + normalWebAppContext.register(NormalWebAppConfig.class); + ServletRegistration.Dynamic normal = servletContext.addServlet("normal-webapp", new DispatcherServlet(normalWebAppContext)); + normal.setLoadOnStartup(1); + normal.addMapping("/api/*"); + + AnnotationConfigWebApplicationContext secureWebAppContext = new AnnotationConfigWebApplicationContext(); + secureWebAppContext.register(SecureWebAppConfig.class); + ServletRegistration.Dynamic secure = servletContext.addServlet("secure-webapp", new DispatcherServlet(secureWebAppContext)); + secure.setLoadOnStartup(1); + secure.addMapping("/s/api/*"); + } + +} diff --git a/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/config/MvcConfig.java b/spring-all/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java similarity index 54% rename from spring-mvc-web-vs-initializer/src/main/java/org/baeldung/config/MvcConfig.java rename to spring-all/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java index d460113458..c250cedc49 100644 --- a/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/config/MvcConfig.java +++ b/spring-all/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.contexts.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -7,19 +7,19 @@ import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; @Configuration @EnableWebMvc -@ComponentScan(basePackages = "org.baeldung.controller.java") -public class MvcConfig extends WebMvcConfigurerAdapter { +@ComponentScan(basePackages = { "com.baeldung.contexts.normal" }) +public class NormalWebAppConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver viewResolver() { - InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); - viewResolver.setPrefix("/WEB-INF/view/"); - viewResolver.setSuffix(".jsp"); - - return viewResolver; + InternalResourceViewResolver resolver = new InternalResourceViewResolver(); + resolver.setPrefix("/WEB-INF/view/"); + resolver.setSuffix(".jsp"); + resolver.setViewClass(JstlView.class); + return resolver; } - } diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java b/spring-all/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java new file mode 100644 index 0000000000..59821076d2 --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java @@ -0,0 +1,19 @@ +package com.baeldung.contexts.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.contexts.Greeting; + +@Configuration +@ComponentScan(basePackages = { "com.baeldung.contexts.services" }) +public class RootApplicationConfig { + + @Bean + public Greeting greeting() { + Greeting greeting = new Greeting(); + greeting.setMessage("Hello World !!"); + return greeting; + } +} diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java b/spring-all/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java new file mode 100644 index 0000000000..f499a4ceba --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.contexts.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.view.InternalResourceViewResolver; +import org.springframework.web.servlet.view.JstlView; + +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = { "com.baeldung.contexts.secure" }) +public class SecureWebAppConfig extends WebMvcConfigurerAdapter { + + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver resolver = new InternalResourceViewResolver(); + resolver.setPrefix("/WEB-INF/secure/view/"); + resolver.setSuffix(".jsp"); + resolver.setViewClass(JstlView.class); + return resolver; + } +} diff --git a/spring-all/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java b/spring-all/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java new file mode 100644 index 0000000000..dd70ce8e97 --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java @@ -0,0 +1,41 @@ +package com.baeldung.contexts.normal; + +import java.util.Arrays; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.ContextLoader; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.ModelAndView; + +import com.baeldung.contexts.services.ApplicationContextUtilService; +import com.baeldung.contexts.services.GreeterService; + +@Controller +public class HelloWorldController { + + @Autowired + WebApplicationContext webApplicationContext; + + @Autowired + private GreeterService greeterService; + + private void processContext() { + WebApplicationContext rootContext = ContextLoader.getCurrentWebApplicationContext(); + + System.out.println("root context : " + rootContext); + System.out.println("root context Beans: " + Arrays.asList(rootContext.getBeanDefinitionNames())); + + System.out.println("context : " + webApplicationContext); + System.out.println("context Beans: " + Arrays.asList(webApplicationContext.getBeanDefinitionNames())); + } + + @RequestMapping(path = "/welcome") + public ModelAndView helloWorld() { + processContext(); + String message = "
" + "

" + greeterService.greet() + "

"; + return new ModelAndView("welcome", "message", message); + } +} diff --git a/spring-all/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java b/spring-all/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java new file mode 100644 index 0000000000..b46ace91ae --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java @@ -0,0 +1,49 @@ +package com.baeldung.contexts.secure; + +import java.util.Arrays; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.ContextLoader; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.ModelAndView; + +import com.baeldung.contexts.services.ApplicationContextUtilService; +import com.baeldung.contexts.services.GreeterService; + +@Controller +public class HelloWorldSecureController { + + @Autowired + WebApplicationContext webApplicationContext; + + @Autowired + private GreeterService greeterService; + + @Autowired + @Qualifier("contextAware") + private ApplicationContextUtilService contextUtilService; + + private void processContext() { + ApplicationContext context = contextUtilService.getApplicationContext(); + System.out.println("application context : " + context); + System.out.println("application context Beans: " + Arrays.asList(context.getBeanDefinitionNames())); + + WebApplicationContext rootContext = ContextLoader.getCurrentWebApplicationContext(); + System.out.println("context : " + rootContext); + System.out.println("context Beans: " + Arrays.asList(rootContext.getBeanDefinitionNames())); + + System.out.println("context : " + webApplicationContext); + System.out.println("context Beans: " + Arrays.asList(webApplicationContext.getBeanDefinitionNames())); + } + + @RequestMapping(path = "/welcome") + public ModelAndView helloWorld() { + processContext(); + String message = "
" + "

" + greeterService.greet() + "

"; + return new ModelAndView("welcome", "message", message); + } +} diff --git a/spring-all/src/main/java/com/baeldung/contexts/services/ApplicationContextUtilService.java b/spring-all/src/main/java/com/baeldung/contexts/services/ApplicationContextUtilService.java new file mode 100644 index 0000000000..332cb10620 --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/contexts/services/ApplicationContextUtilService.java @@ -0,0 +1,21 @@ +package com.baeldung.contexts.services; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Service; + +@Service(value="contextAware") +public class ApplicationContextUtilService implements ApplicationContextAware { + + private ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + public ApplicationContext getApplicationContext() { + return applicationContext; + } +} diff --git a/spring-all/src/main/java/com/baeldung/contexts/services/GreeterService.java b/spring-all/src/main/java/com/baeldung/contexts/services/GreeterService.java new file mode 100644 index 0000000000..f68b2fe5af --- /dev/null +++ b/spring-all/src/main/java/com/baeldung/contexts/services/GreeterService.java @@ -0,0 +1,19 @@ +package com.baeldung.contexts.services; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import com.baeldung.contexts.Greeting; + +@Service +public class GreeterService { + + @Resource + private Greeting greeting; + + public String greet(){ + return greeting.getMessage(); + } + +} diff --git a/spring-all/src/main/resources/beanInjection-setter.xml b/spring-all/src/main/resources/beanInjection-setter.xml index b07826c31e..b2d3a05594 100644 --- a/spring-all/src/main/resources/beanInjection-setter.xml +++ b/spring-all/src/main/resources/beanInjection-setter.xml @@ -11,5 +11,4 @@ - \ No newline at end of file diff --git a/spring-all/src/main/webapp/WEB-INF/index.jsp b/spring-all/src/main/webapp/WEB-INF/index.jsp new file mode 100644 index 0000000000..c38169bb95 --- /dev/null +++ b/spring-all/src/main/webapp/WEB-INF/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/spring-all/src/main/webapp/WEB-INF/normal-webapp-servlet.xml b/spring-all/src/main/webapp/WEB-INF/normal-webapp-servlet.xml new file mode 100644 index 0000000000..d358e2d62b --- /dev/null +++ b/spring-all/src/main/webapp/WEB-INF/normal-webapp-servlet.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/spring-all/src/main/webapp/WEB-INF/rootApplicationContext.xml b/spring-all/src/main/webapp/WEB-INF/rootApplicationContext.xml new file mode 100644 index 0000000000..cd79c64e79 --- /dev/null +++ b/spring-all/src/main/webapp/WEB-INF/rootApplicationContext.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/spring-all/src/main/webapp/WEB-INF/secure-webapp-servlet.xml b/spring-all/src/main/webapp/WEB-INF/secure-webapp-servlet.xml new file mode 100644 index 0000000000..5bca724670 --- /dev/null +++ b/spring-all/src/main/webapp/WEB-INF/secure-webapp-servlet.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/spring-all/src/main/webapp/WEB-INF/secure/view/welcome.jsp b/spring-all/src/main/webapp/WEB-INF/secure/view/welcome.jsp new file mode 100644 index 0000000000..49ca0f8e87 --- /dev/null +++ b/spring-all/src/main/webapp/WEB-INF/secure/view/welcome.jsp @@ -0,0 +1,11 @@ + + + Spring Web Contexts + + +
+
+ Secure Web Application : ${message} +
+ + \ No newline at end of file diff --git a/spring-all/src/main/webapp/WEB-INF/view/welcome.jsp b/spring-all/src/main/webapp/WEB-INF/view/welcome.jsp new file mode 100644 index 0000000000..6a82fb1d5a --- /dev/null +++ b/spring-all/src/main/webapp/WEB-INF/view/welcome.jsp @@ -0,0 +1,11 @@ + + + Spring Web Contexts + + +
+
+ Normal Web Application : ${message} +
+ + \ No newline at end of file diff --git a/spring-all/src/main/webapp/WEB-INF/web.xml b/spring-all/src/main/webapp/WEB-INF/web.xml index 3ac9e9ed8c..2050f28f81 100644 --- a/spring-all/src/main/webapp/WEB-INF/web.xml +++ b/spring-all/src/main/webapp/WEB-INF/web.xml @@ -3,7 +3,48 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> - + + + + contextConfigLocation + /WEB-INF/rootApplicationContext.xml + + + + org.springframework.web.context.ContextLoaderListener + + + + + + secure-webapp + + org.springframework.web.servlet.DispatcherServlet + + 1 + + contextConfigLocation + /WEB-INF/secure-webapp-servlet.xml + + + + secure-webapp + /s/api/* + + + + + normal-webapp + + org.springframework.web.servlet.DispatcherServlet + + 1 + + + normal-webapp + /api/* + + test-mvc diff --git a/spring-all/src/main/webapp/index.jsp b/spring-all/src/main/webapp/index.jsp new file mode 100644 index 0000000000..c38169bb95 --- /dev/null +++ b/spring-all/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/spring-aop/.gitignore b/spring-aop/.gitignore new file mode 100644 index 0000000000..62c893550a --- /dev/null +++ b/spring-aop/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/spring-bom/README.md b/spring-bom/README.md new file mode 100644 index 0000000000..10e3502d11 --- /dev/null +++ b/spring-bom/README.md @@ -0,0 +1,3 @@ + +### Relevant Articles: +- [Spring with Maven BOM] diff --git a/spring-bom/pom.xml b/spring-bom/pom.xml new file mode 100644 index 0000000000..306632eb21 --- /dev/null +++ b/spring-bom/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + com.baeldung + spring-bom + 1.0.0-SNAPSHOT + spring-bom + http://maven.apache.org + + UTF-8 + + + + + org.springframework + spring-framework-bom + 4.3.8.RELEASE + pom + import + + + + + + org.springframework + spring-context + + + org.springframework + spring-web + + + diff --git a/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldApp.java b/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldApp.java new file mode 100644 index 0000000000..7c1e7f7c1d --- /dev/null +++ b/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldApp.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.bom; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +public class HelloWorldApp { + + public static void main(String[] args) { + ApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfig.class); + HelloWorldBean helloWorldBean = ctx.getBean(HelloWorldBean.class); + System.out.println(helloWorldBean.sayHello()); + } + +} diff --git a/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldBean.java b/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldBean.java new file mode 100644 index 0000000000..f51b150f0a --- /dev/null +++ b/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldBean.java @@ -0,0 +1,8 @@ +package com.baeldung.spring.bom; + +public class HelloWorldBean { + + public String sayHello() { + return "Hello World With Maven BOM"; + } +} diff --git a/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldConfig.java b/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldConfig.java new file mode 100644 index 0000000000..8dc0e2c806 --- /dev/null +++ b/spring-bom/src/main/java/com/baeldung/spring/bom/HelloWorldConfig.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.bom; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class HelloWorldConfig { + + @Bean + public HelloWorldBean helloWorldBean() { + return new HelloWorldBean(); + } +} diff --git a/spring-boot-bootstrap/.gitignore b/spring-boot-bootstrap/.gitignore new file mode 100644 index 0000000000..2af7cefb0a --- /dev/null +++ b/spring-boot-bootstrap/.gitignore @@ -0,0 +1,24 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ \ No newline at end of file diff --git a/spring-boot-bootstrap/pom.xml b/spring-boot-bootstrap/pom.xml new file mode 100644 index 0000000000..697a139eb5 --- /dev/null +++ b/spring-boot-bootstrap/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + org.baeldung + spring-boot-bootstrap + 0.0.1-SNAPSHOT + jar + + spring-boot-bootstrap + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + + org.springframework.boot + spring-boot-starter-security + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + io.rest-assured + rest-assured + 3.0.3 + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/Application.java b/spring-boot-bootstrap/src/main/java/org/baeldung/Application.java new file mode 100644 index 0000000000..f7e7bb0347 --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/Application.java @@ -0,0 +1,19 @@ +package org.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@SpringBootApplication +@ComponentScan("org.baeldung") +@EnableJpaRepositories("org.baeldung.persistence.repo") +@EntityScan("org.baeldung.persistence.model") +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/model/Book.java b/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/model/Book.java new file mode 100644 index 0000000000..02060e17c9 --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/model/Book.java @@ -0,0 +1,96 @@ +package org.baeldung.persistence.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + @Column(nullable = false, unique = true) + private String title; + + @Column(nullable = false) + private String author; + + // + + public Book() { + super(); + } + + public Book(String title, String author) { + super(); + this.title = title; + this.author = author; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((author == null) ? 0 : author.hashCode()); + result = prime * result + (int) (id ^ (id >>> 32)); + result = prime * result + ((title == null) ? 0 : title.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Book other = (Book) obj; + if (author == null) { + if (other.author != null) + return false; + } else if (!author.equals(other.author)) + return false; + if (id != other.id) + return false; + if (title == null) { + if (other.title != null) + return false; + } else if (!title.equals(other.title)) + return false; + return true; + } + + @Override + public String toString() { + return "Book [id=" + id + ", title=" + title + ", author=" + author + "]"; + } + +} \ No newline at end of file diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/repo/BookRepository.java b/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/repo/BookRepository.java new file mode 100644 index 0000000000..ec3a3e25bc --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/repo/BookRepository.java @@ -0,0 +1,10 @@ +package org.baeldung.persistence.repo; + +import java.util.List; + +import org.baeldung.persistence.model.Book; +import org.springframework.data.repository.CrudRepository; + +public interface BookRepository extends CrudRepository { + List findByTitle(String title); +} diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/web/BookController.java b/spring-boot-bootstrap/src/main/java/org/baeldung/web/BookController.java new file mode 100644 index 0000000000..544ac80217 --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/web/BookController.java @@ -0,0 +1,74 @@ +package org.baeldung.web; + +import java.util.List; + +import org.baeldung.persistence.model.Book; +import org.baeldung.persistence.repo.BookRepository; +import org.baeldung.web.exception.BookIdMismatchException; +import org.baeldung.web.exception.BookNotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/books") +public class BookController { + + @Autowired + private BookRepository bookRepository; + + @GetMapping + public Iterable findAll() { + return bookRepository.findAll(); + } + + @GetMapping("/title/{bookTitle}") + public List findByTitle(@PathVariable String bookTitle) { + return bookRepository.findByTitle(bookTitle); + } + + @GetMapping("/{id}") + public Book findOne(@PathVariable Long id) { + final Book book = bookRepository.findOne(id); + if (book == null) { + throw new BookNotFoundException(); + } + return book; + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public Book create(@RequestBody Book book) { + return bookRepository.save(book); + } + + @DeleteMapping("/{id}") + public void delete(@PathVariable Long id) { + final Book book = bookRepository.findOne(id); + if (book == null) { + throw new BookNotFoundException(); + } + bookRepository.delete(id); + } + + @PutMapping("/{id}") + public Book updateBook(@RequestBody Book book, @PathVariable Long id) { + if (book.getId() != id) { + throw new BookIdMismatchException(); + } + final Book old = bookRepository.findOne(id); + if (old == null) { + throw new BookNotFoundException(); + } + return bookRepository.save(book); + } + +} diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/web/RestExceptionHandler.java b/spring-boot-bootstrap/src/main/java/org/baeldung/web/RestExceptionHandler.java new file mode 100644 index 0000000000..60153fc92f --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/web/RestExceptionHandler.java @@ -0,0 +1,32 @@ +package org.baeldung.web; + +import org.baeldung.web.exception.BookIdMismatchException; +import org.baeldung.web.exception.BookNotFoundException; +import org.hibernate.exception.ConstraintViolationException; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@ControllerAdvice +public class RestExceptionHandler extends ResponseEntityExceptionHandler { + + public RestExceptionHandler() { + super(); + } + + @ExceptionHandler({ BookNotFoundException.class }) + protected ResponseEntity handleNotFound(Exception ex, WebRequest request) { + return handleExceptionInternal(ex, "Book not found", new HttpHeaders(), HttpStatus.NOT_FOUND, request); + } + + @ExceptionHandler({ BookIdMismatchException.class, ConstraintViolationException.class, DataIntegrityViolationException.class }) + public ResponseEntity handleBadRequest(Exception ex, WebRequest request) { + return handleExceptionInternal(ex, ex.getLocalizedMessage(), new HttpHeaders(), HttpStatus.BAD_REQUEST, request); + } + +} \ No newline at end of file diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/web/SimpleController.java b/spring-boot-bootstrap/src/main/java/org/baeldung/web/SimpleController.java new file mode 100644 index 0000000000..0bec973a75 --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/web/SimpleController.java @@ -0,0 +1,19 @@ +package org.baeldung.web; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class SimpleController { + @Value("${spring.application.name}") + String appName; + + @RequestMapping("/") + public String homePage(Model model) { + model.addAttribute("appName", appName); + return "home"; + } + +} diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/web/exception/BookIdMismatchException.java b/spring-boot-bootstrap/src/main/java/org/baeldung/web/exception/BookIdMismatchException.java new file mode 100644 index 0000000000..23c55e2d38 --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/web/exception/BookIdMismatchException.java @@ -0,0 +1,20 @@ +package org.baeldung.web.exception; + +public class BookIdMismatchException extends RuntimeException { + + public BookIdMismatchException() { + super(); + } + + public BookIdMismatchException(final String message, final Throwable cause) { + super(message, cause); + } + + public BookIdMismatchException(final String message) { + super(message); + } + + public BookIdMismatchException(final Throwable cause) { + super(cause); + } +} diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/web/exception/BookNotFoundException.java b/spring-boot-bootstrap/src/main/java/org/baeldung/web/exception/BookNotFoundException.java new file mode 100644 index 0000000000..3ff416b3f3 --- /dev/null +++ b/spring-boot-bootstrap/src/main/java/org/baeldung/web/exception/BookNotFoundException.java @@ -0,0 +1,20 @@ +package org.baeldung.web.exception; + +public class BookNotFoundException extends RuntimeException { + + public BookNotFoundException() { + super(); + } + + public BookNotFoundException(final String message, final Throwable cause) { + super(message, cause); + } + + public BookNotFoundException(final String message) { + super(message); + } + + public BookNotFoundException(final Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/spring-boot-bootstrap/src/main/resources/application.properties b/spring-boot-bootstrap/src/main/resources/application.properties new file mode 100644 index 0000000000..b7e6b1e80e --- /dev/null +++ b/spring-boot-bootstrap/src/main/resources/application.properties @@ -0,0 +1,21 @@ +server.port = 8081 + +spring.application.name = Bootstrap Spring Boot + +spring.thymeleaf.cache = false +spring.thymeleaf.enabled=true +spring.thymeleaf.prefix=classpath:/templates/ +spring.thymeleaf.suffix=.html + +security.basic.enabled=true +security.user.name=john +security.user.password=123 + + +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:bootapp;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +spring.datasource.username=sa +spring.datasource.password= + +server.error.path=/error +server.error.whitelabel.enabled=false \ No newline at end of file diff --git a/spring-boot-bootstrap/src/main/resources/templates/error.html b/spring-boot-bootstrap/src/main/resources/templates/error.html new file mode 100644 index 0000000000..f2b51a1938 --- /dev/null +++ b/spring-boot-bootstrap/src/main/resources/templates/error.html @@ -0,0 +1,19 @@ + + +Error Occurred + + + +
+

Error Occurred!

+ +
+ + + \ No newline at end of file diff --git a/spring-boot-bootstrap/src/main/resources/templates/home.html b/spring-boot-bootstrap/src/main/resources/templates/home.html new file mode 100644 index 0000000000..5707cfb82a --- /dev/null +++ b/spring-boot-bootstrap/src/main/resources/templates/home.html @@ -0,0 +1,7 @@ + +Home Page + +

Hello !

+

Welcome to Our App

+ + \ No newline at end of file diff --git a/spring-boot-bootstrap/src/test/java/org/baeldung/LiveTest.java b/spring-boot-bootstrap/src/test/java/org/baeldung/LiveTest.java new file mode 100644 index 0000000000..5ecd4023bd --- /dev/null +++ b/spring-boot-bootstrap/src/test/java/org/baeldung/LiveTest.java @@ -0,0 +1,142 @@ +package org.baeldung; + +import static io.restassured.RestAssured.preemptive; +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.apache.commons.lang3.RandomStringUtils.randomNumeric; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import io.restassured.RestAssured; +import io.restassured.response.Response; + +import java.util.List; + +import org.baeldung.persistence.model.Book; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = { Application.class }, webEnvironment = WebEnvironment.DEFINED_PORT) +public class LiveTest { + + @Before + public void setUp() { + RestAssured.authentication = preemptive().basic("john", "123"); + } + + private static final String API_ROOT = "http://localhost:8081/api/books"; + + @Test + public void whenGetAllBooks_thenOK() { + final Response response = RestAssured.get(API_ROOT); + assertEquals(HttpStatus.OK.value(), response.getStatusCode()); + } + + @Test + public void whenGetBooksByTitle_thenOK() { + final Book book = createRandomBook(); + createBookAsUri(book); + + final Response response = RestAssured.get(API_ROOT + "/title/" + book.getTitle()); + assertEquals(HttpStatus.OK.value(), response.getStatusCode()); + assertTrue(response.as(List.class) + .size() > 0); + } + + @Test + public void whenGetCreatedBookById_thenOK() { + final Book book = createRandomBook(); + final String location = createBookAsUri(book); + + final Response response = RestAssured.get(location); + assertEquals(HttpStatus.OK.value(), response.getStatusCode()); + assertEquals(book.getTitle(), response.jsonPath() + .get("title")); + } + + @Test + public void whenGetNotExistBookById_thenNotFound() { + final Response response = RestAssured.get(API_ROOT + "/" + randomNumeric(4)); + assertEquals(HttpStatus.NOT_FOUND.value(), response.getStatusCode()); + } + + // POST + @Test + public void whenCreateNewBook_thenCreated() { + final Book book = createRandomBook(); + + final Response response = RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(book) + .post(API_ROOT); + assertEquals(HttpStatus.CREATED.value(), response.getStatusCode()); + } + + @Test + public void whenInvalidBook_thenError() { + final Book book = createRandomBook(); + book.setAuthor(null); + + final Response response = RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(book) + .post(API_ROOT); + assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatusCode()); + } + + @Test + public void whenUpdateCreatedBook_thenUpdated() { + final Book book = createRandomBook(); + final String location = createBookAsUri(book); + + book.setId(Long.parseLong(location.split("api/books/")[1])); + book.setAuthor("newAuthor"); + Response response = RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(book) + .put(location); + assertEquals(HttpStatus.OK.value(), response.getStatusCode()); + + response = RestAssured.get(location); + assertEquals(HttpStatus.OK.value(), response.getStatusCode()); + assertEquals("newAuthor", response.jsonPath() + .get("author")); + + } + + @Test + public void whenDeleteCreatedBook_thenOk() { + final Book book = createRandomBook(); + final String location = createBookAsUri(book); + + Response response = RestAssured.delete(location); + assertEquals(HttpStatus.OK.value(), response.getStatusCode()); + + response = RestAssured.get(location); + assertEquals(HttpStatus.NOT_FOUND.value(), response.getStatusCode()); + } + + // =============================== + + private Book createRandomBook() { + final Book book = new Book(); + book.setTitle(randomAlphabetic(10)); + book.setAuthor(randomAlphabetic(15)); + return book; + } + + private String createBookAsUri(Book book) { + final Response response = RestAssured.given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(book) + .post(API_ROOT); + return API_ROOT + "/" + response.jsonPath() + .get("id"); + } + +} \ No newline at end of file diff --git a/spring-boot-bootstrap/src/test/java/org/baeldung/SpringBootBootstrapApplicationTests.java b/spring-boot-bootstrap/src/test/java/org/baeldung/SpringBootBootstrapApplicationTests.java new file mode 100644 index 0000000000..f32315ef03 --- /dev/null +++ b/spring-boot-bootstrap/src/test/java/org/baeldung/SpringBootBootstrapApplicationTests.java @@ -0,0 +1,16 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringBootBootstrapApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-boot-kotlin/pom.xml b/spring-boot-kotlin/pom.xml deleted file mode 100644 index c882daa816..0000000000 --- a/spring-boot-kotlin/pom.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 2.0.0.BUILD-SNAPSHOT - - - -spring-boot-kotlin -1.0.0-SNAPSHOT - - - true - UTF-8 - UTF-8 - 1.8 - 1.1.2 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.jetbrains.kotlin - kotlin-stdlib-jre8 - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-reflect - ${kotlin.version} - - - com.fasterxml.jackson.module - jackson-module-kotlin - 2.8.7 - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - ${project.basedir}/src/main/kotlin - ${project.basedir}/src/test/kotlin - - - org.springframework.boot - spring-boot-maven-plugin - - - kotlin-maven-plugin - org.jetbrains.kotlin - ${kotlin.version} - - - spring - - 1.8 - - - - compile - compile - - compile - - - - test-compile - test-compile - - test-compile - - - - - - org.jetbrains.kotlin - kotlin-maven-allopen - ${kotlin.version} - - - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - - \ No newline at end of file diff --git a/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt b/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt deleted file mode 100644 index 3f0139b5a9..0000000000 --- a/spring-boot-kotlin/src/main/kotlin/com/baeldung/springbootkotlin/HelloDto.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.baeldung.springbootkotlin - -data class HelloDto constructor(val greeting: String) diff --git a/spring-boot-kotlin/src/test/kotlin/springbootkotlin/KotlinDemoApplicationTests.kt b/spring-boot-kotlin/src/test/kotlin/springbootkotlin/KotlinDemoApplicationTests.kt deleted file mode 100644 index 15ddc916e2..0000000000 --- a/spring-boot-kotlin/src/test/kotlin/springbootkotlin/KotlinDemoApplicationTests.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.example.kotlindemo - -import com.baeldung.springbootkotlin.HelloDto -import com.baeldung.springbootkotlin.KotlinDemoApplication -import org.junit.Assert -import org.junit.Test -import org.junit.runner.RunWith -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.boot.test.web.client.TestRestTemplate -import org.springframework.http.HttpStatus -import org.springframework.test.context.junit4.SpringRunner - -@RunWith(SpringRunner::class) -@SpringBootTest(classes = arrayOf(KotlinDemoApplication::class), webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -class KotlinDemoApplicationTests { - - @Autowired - val testRestTemplate: TestRestTemplate? = null - - @Test - fun contextLoads() { - } - - @Test - fun testHelloController() { - var result = testRestTemplate?.getForEntity("/hello", String::class.java) - - Assert.assertNotNull(result) - Assert.assertEquals(result?.statusCode, HttpStatus.OK) - Assert.assertEquals(result?.body, "hello world") - } - - @Test - fun testHelloService() { - var result = testRestTemplate?.getForEntity("/hello-service", String::class.java) - - Assert.assertNotNull(result) - Assert.assertEquals(result?.statusCode, HttpStatus.OK) - Assert.assertEquals(result?.body, "hello service") - } - - @Test - fun testHelloDto() { - var result = testRestTemplate?.getForEntity("/hello-dto", HelloDto::class.java) - - Assert.assertNotNull(result) - Assert.assertEquals(result?.statusCode, HttpStatus.OK) - Assert.assertEquals(result?.body, HelloDto("Hello from the dto")) - } - -} diff --git a/spring-boot-property-exp/README.md b/spring-boot-property-exp/README.md new file mode 100644 index 0000000000..5b2552ade7 --- /dev/null +++ b/spring-boot-property-exp/README.md @@ -0,0 +1,2 @@ +## The Module Holds Sources for the Following Articles + - [Automatic Property Expansion with Spring Boot] (http://www.baeldung.com/property-expansion-spring-boot) \ No newline at end of file diff --git a/spring-boot-property-exp/pom.xml b/spring-boot-property-exp/pom.xml new file mode 100644 index 0000000000..f554bb5b99 --- /dev/null +++ b/spring-boot-property-exp/pom.xml @@ -0,0 +1,32 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + 4.0.0 + + com.baeldung + spring-boot-property-exp + 0.0.1-SNAPSHOT + + pom + + spring-boot-property-exp + http://maven.apache.org + + + UTF-8 + + + + property-exp-default + property-exp-custom + + + + diff --git a/spring-boot-property-exp/property-exp-custom/pom.xml b/spring-boot-property-exp/property-exp-custom/pom.xml new file mode 100644 index 0000000000..234404a6c0 --- /dev/null +++ b/spring-boot-property-exp/property-exp-custom/pom.xml @@ -0,0 +1,60 @@ + + + spring-boot-property-exp + com.baeldung + 0.0.1-SNAPSHOT + + 4.0.0 + + com.baeldung + property-exp-custom + 0.0.1-SNAPSHOT + jar + + property-exp-custom + http://maven.apache.org + + + UTF-8 + Custom Property Value + + + + + org.springframework.boot + spring-boot-starter + 1.5.4.RELEASE + + + + + + + ${basedir}/src/main/resources + true + + **/application*.yml + **/application*.yaml + **/application*.properties + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.7 + + + @ + + true + + + + + + + diff --git a/spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java b/spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java new file mode 100644 index 0000000000..d88dbf0123 --- /dev/null +++ b/spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java @@ -0,0 +1,13 @@ +package com.baeldung.propertyexpansion; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootPropertyExpansionApp { + + public static void main(String[] args) { + SpringApplication.run(SpringBootPropertyExpansionApp.class, args); + } + +} diff --git a/spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java b/spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java new file mode 100644 index 0000000000..920996e120 --- /dev/null +++ b/spring-boot-property-exp/property-exp-custom/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java @@ -0,0 +1,37 @@ +package com.baeldung.propertyexpansion.components; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Component +public class PropertyLoggerBean { + + private static final Logger log = LoggerFactory.getLogger(PropertyLoggerBean.class); + + @Value("${expanded.project.version}") + private String projectVersion; + + @Value("${expanded.project.property}") + private String projectProperty; + + + @PostConstruct + public void printProperties() { + + log.info(""); + log.info("Properties logged in a bean:"); + log.info("==========================================="); + log.info("Project version : {}", projectVersion); + log.info("Project property : {}", projectProperty); + log.info("==========================================="); + log.info(""); + + } + + + +} diff --git a/spring-boot-property-exp/property-exp-custom/src/main/resources/application.properties b/spring-boot-property-exp/property-exp-custom/src/main/resources/application.properties new file mode 100644 index 0000000000..545fcc2e46 --- /dev/null +++ b/spring-boot-property-exp/property-exp-custom/src/main/resources/application.properties @@ -0,0 +1,2 @@ +expanded.project.version=${project.version} +expanded.project.property=${custom.property} \ No newline at end of file diff --git a/spring-boot-property-exp/property-exp-custom/src/main/resources/banner.txt b/spring-boot-property-exp/property-exp-custom/src/main/resources/banner.txt new file mode 100644 index 0000000000..2b5d7f1ee5 --- /dev/null +++ b/spring-boot-property-exp/property-exp-custom/src/main/resources/banner.txt @@ -0,0 +1,21 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@########@@@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@:..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@#. @@@@@* *@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@#o @@@@@* @@@@@* @@@:*.*@@@@@@@: *8@@@ @@@@&:.#@. @o**@@@@**:@o*o@@:.:@@@@@:.o#@&*:@@@@ +@@@@@@@@@@@@* @@@@@* 8888 8@ @@@8 #@o 8@# .@ @@* :. @* @@@@ @. : &@ ** .@@@@ +@@@@@@@@@@. @ o@@@@@* *@@@o::& .* 8@@@@. @@ 8@@@@. @* @@@@ @. @@@& * @@@@# .@@@@ +@@@@@@@@@& @ @@@@@@* @@@@@@ 8 @@@@ .. o&&&&&&& @@ #@@@@. @* @@@@ @. @@@# * @@@@@ .@@@@ +@@@@@@@@@ @@o @@@@@@@* oooo* 8 @@@& @* @@@ # 88. 88. *& o#: @. @@@# *@ &#& .@@@@ +@@@@@@@@# @@@8 @@@@@@@* .*@@@#. *@@ @@@& :#@@@o .@@: *&@8 @o o@@: @. @@@# *@@#. :8# .@@@@ +@@@@@@@@@ @@@@ &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@# o@@@@ @@@@@ +@@@@@& &@@@@ 8@@@@@@@@@8&8@@@@@#8#@@@o8@#&@@o&@@@&@@8@@&@@@@88@@8#@8&@@##@@@@@@#8@@#8@@88@@@@@ *@@@@@@@ +@@@# #@@@@#. @@@@@@@@@@@@@8@@8#o@&#@@@@o.@o*@@*.@@@.@&:8o8*@@@8&@@#@@@8@@@@8@#@@@8&@@@@@@#@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +These values are expanded in banner.txt +========================================================== +expanded.project.version value is ${expanded.project.version} + +expanded.project.property value is ${expanded.project.property} +========================================================== \ No newline at end of file diff --git a/spring-boot-property-exp/property-exp-default/build.gradle b/spring-boot-property-exp/property-exp-default/build.gradle new file mode 100644 index 0000000000..f3c5f4a378 --- /dev/null +++ b/spring-boot-property-exp/property-exp-default/build.gradle @@ -0,0 +1,50 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE") + } +} + +apply plugin: 'java' +apply plugin: 'maven' +apply plugin: 'idea' +apply plugin: 'org.springframework.boot' + +group = 'com.baeldung' +version = '0.0.1-SNAPSHOT' + +description = """spring-boot""" + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +repositories { + mavenCentral() +} + +import org.apache.tools.ant.filters.ReplaceTokens +processResources { + with copySpec { + from 'src/main/resources' + include '**/application*.yml' + include '**/application*.yaml' + include '**/application*.properties' + project.properties.findAll().each { prop -> + + if (prop.value != null) { + filter(ReplaceTokens, tokens: [ (prop.key): prop.value]) + filter(ReplaceTokens, tokens: [ ('project.' + prop.key): prop.value]) + } + + } + } +} + +dependencies { + compile("org.springframework.boot:spring-boot-starter") +} diff --git a/spring-boot-property-exp/property-exp-default/gradle.properties b/spring-boot-property-exp/property-exp-default/gradle.properties new file mode 100644 index 0000000000..e0ec84d851 --- /dev/null +++ b/spring-boot-property-exp/property-exp-default/gradle.properties @@ -0,0 +1 @@ +custom.property=Custom Gradle Property \ No newline at end of file diff --git a/spring-boot-property-exp/property-exp-default/pom.xml b/spring-boot-property-exp/property-exp-default/pom.xml new file mode 100644 index 0000000000..3629e56111 --- /dev/null +++ b/spring-boot-property-exp/property-exp-default/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + com.baeldung + property-exp-default + 0.0.1-SNAPSHOT + jar + + property-exp-default + http://maven.apache.org + + + UTF-8 + Custom Property Value + + + + + org.springframework.boot + spring-boot-starter + + + + diff --git a/spring-boot-property-exp/property-exp-default/settings.gradle b/spring-boot-property-exp/property-exp-default/settings.gradle new file mode 100644 index 0000000000..faccf1c7f3 --- /dev/null +++ b/spring-boot-property-exp/property-exp-default/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'property-exp-default' diff --git a/spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java b/spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java new file mode 100644 index 0000000000..d88dbf0123 --- /dev/null +++ b/spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/SpringBootPropertyExpansionApp.java @@ -0,0 +1,13 @@ +package com.baeldung.propertyexpansion; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootPropertyExpansionApp { + + public static void main(String[] args) { + SpringApplication.run(SpringBootPropertyExpansionApp.class, args); + } + +} diff --git a/spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java b/spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java new file mode 100644 index 0000000000..b7427d5eab --- /dev/null +++ b/spring-boot-property-exp/property-exp-default/src/main/java/com/baeldung/propertyexpansion/components/PropertyLoggerBean.java @@ -0,0 +1,36 @@ +package com.baeldung.propertyexpansion.components; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Component +public class PropertyLoggerBean { + + private static final Logger log = LoggerFactory.getLogger(PropertyLoggerBean.class); + + @Value("${expanded.project.version}") + private String projectVersion; + + @Value("${expanded.project.property}") + private String projectProperty; + + @PostConstruct + public void printProperties() { + + log.info(""); + log.info("Properties logged from logger bean"); + log.info("==========================================="); + log.info("Project version : {}", projectVersion); + log.info("Project property : {}", projectProperty); + log.info("==========================================="); + log.info(""); + + } + + + +} diff --git a/spring-boot-property-exp/property-exp-default/src/main/resources/application.properties b/spring-boot-property-exp/property-exp-default/src/main/resources/application.properties new file mode 100644 index 0000000000..4e28ccadaa --- /dev/null +++ b/spring-boot-property-exp/property-exp-default/src/main/resources/application.properties @@ -0,0 +1,2 @@ +expanded.project.version=@project.version@ +expanded.project.property=@custom.property@ \ No newline at end of file diff --git a/spring-boot-property-exp/property-exp-default/src/main/resources/banner.txt b/spring-boot-property-exp/property-exp-default/src/main/resources/banner.txt new file mode 100644 index 0000000000..20963b0447 --- /dev/null +++ b/spring-boot-property-exp/property-exp-default/src/main/resources/banner.txt @@ -0,0 +1,21 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@########@@@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@:..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@#. @@@@@* *@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@#o @@@@@* @@@@@* @@@:*.*@@@@@@@: *8@@@ @@@@&:.#@. @o**@@@@**:@o*o@@:.:@@@@@:.o#@&*:@@@@ +@@@@@@@@@@@@* @@@@@* 8888 8@ @@@8 #@o 8@# .@ @@* :. @* @@@@ @. : &@ ** .@@@@ +@@@@@@@@@@. @ o@@@@@* *@@@o::& .* 8@@@@. @@ 8@@@@. @* @@@@ @. @@@& * @@@@# .@@@@ +@@@@@@@@@& @ @@@@@@* @@@@@@ 8 @@@@ .. o&&&&&&& @@ #@@@@. @* @@@@ @. @@@# * @@@@@ .@@@@ +@@@@@@@@@ @@o @@@@@@@* oooo* 8 @@@& @* @@@ # 88. 88. *& o#: @. @@@# *@ &#& .@@@@ +@@@@@@@@# @@@8 @@@@@@@* .*@@@#. *@@ @@@& :#@@@o .@@: *&@8 @o o@@: @. @@@# *@@#. :8# .@@@@ +@@@@@@@@@ @@@@ &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@# o@@@@ @@@@@ +@@@@@& &@@@@ 8@@@@@@@@@8&8@@@@@#8#@@@o8@#&@@o&@@@&@@8@@&@@@@88@@8#@8&@@##@@@@@@#8@@#8@@88@@@@@ *@@@@@@@ +@@@# #@@@@#. @@@@@@@@@@@@@8@@8#o@&#@@@@o.@o*@@*.@@@.@&:8o8*@@@8&@@#@@@8@@@@8@#@@@8&@@@@@@#@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +These values are expanded in banner.txt +========================================================== +{expanded.project.version} is ${expanded.project.version} + +{expanded.project.property} is ${expanded.project.property} +========================================================== \ No newline at end of file diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 4199b43e9a..9a4a9f3686 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -23,3 +23,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Create a Custom Auto-Configuration with Spring Boot](http://www.baeldung.com/spring-boot-custom-auto-configuration) - [Testing in Spring Boot](http://www.baeldung.com/spring-boot-testing) - [Guide to @ConfigurationProperties in Spring Boot](http://www.baeldung.com/configuration-properties-in-spring-boot) +- [Spring Boot and Togglz Aspect](http://www.baeldung.com/spring-togglz) diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 691137e495..2a1de00039 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -45,7 +45,13 @@ spring-boot-starter-tomcat provided - + + + org.springframework.boot + spring-boot-starter-test + test + + org.apache.tomcat.embed tomcat-embed-core diff --git a/spring-boot/src/main/java/com/baeldung/displayallbeans/Application.java b/spring-boot/src/main/java/com/baeldung/displayallbeans/Application.java new file mode 100644 index 0000000000..cd015e6554 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/displayallbeans/Application.java @@ -0,0 +1,23 @@ +package com.baeldung.displayallbeans; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class, args); + + displayAllBeans(); + } + + public static void displayAllBeans() { + String[] allBeanNames = applicationContext.getBeanDefinitionNames(); + for(String beanName : allBeanNames) { + System.out.println(beanName); + } + } +} diff --git a/spring-boot/src/main/java/com/baeldung/displayallbeans/controller/FooController.java b/spring-boot/src/main/java/com/baeldung/displayallbeans/controller/FooController.java new file mode 100644 index 0000000000..9f483b18d1 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/displayallbeans/controller/FooController.java @@ -0,0 +1,22 @@ +package com.baeldung.displayallbeans.controller; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.baeldung.displayallbeans.service.FooService; + +@Controller +public class FooController { + @Autowired + private FooService fooService; + + @RequestMapping(value="/displayallbeans") + public String getHeaderAndBody (Map model){ + model.put("header", fooService.getHeader()); + model.put("message", fooService.getBody()); + return "displayallbeans"; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/displayallbeans/service/FooService.java b/spring-boot/src/main/java/com/baeldung/displayallbeans/service/FooService.java new file mode 100644 index 0000000000..e29f18c94a --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/displayallbeans/service/FooService.java @@ -0,0 +1,18 @@ +package com.baeldung.displayallbeans.service; + +import org.springframework.stereotype.Service; + +@Service +public class FooService { + + public String getHeader() { + return "Display All Beans"; + } + + public String getBody() { + return "This is a sample application that displays all beans " + + "in Spring IoC container using ListableBeanFactory interface " + + "and Spring Boot Actuators."; + } + +} diff --git a/spring-boot/src/main/java/org/baeldung/websocket/client/StompClient.java b/spring-boot/src/main/java/org/baeldung/websocket/client/StompClient.java index da2dbeac3d..71f5471fb1 100644 --- a/spring-boot/src/main/java/org/baeldung/websocket/client/StompClient.java +++ b/spring-boot/src/main/java/org/baeldung/websocket/client/StompClient.java @@ -1,20 +1,15 @@ package org.baeldung.websocket.client; -import java.util.Collections; -import java.util.List; import java.util.Scanner; import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.simp.stomp.StompSessionHandler; +import org.springframework.web.socket.client.WebSocketClient; import org.springframework.web.socket.client.standard.StandardWebSocketClient; import org.springframework.web.socket.messaging.WebSocketStompClient; -import org.springframework.web.socket.sockjs.client.SockJsClient; -import org.springframework.web.socket.sockjs.client.Transport; -import org.springframework.web.socket.sockjs.client.WebSocketTransport; /** * Stand alone WebSocketStompClient. - * @author Kalyan * */ public class StompClient { @@ -22,13 +17,11 @@ public class StompClient { private static String URL = "ws://localhost:8080/spring-mvc-java/chat"; public static void main(String[] args) { - Transport webSocketTransport = new WebSocketTransport(new StandardWebSocketClient()); - List transports = Collections.singletonList(webSocketTransport); - SockJsClient sockJsClient = new SockJsClient(transports); - - WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient); + WebSocketClient client = new StandardWebSocketClient(); + WebSocketStompClient stompClient = new WebSocketStompClient(client); + stompClient.setMessageConverter(new MappingJackson2MessageConverter()); - + StompSessionHandler sessionHandler = new MyStompSessionHandler(); stompClient.connect(URL, sessionHandler); diff --git a/spring-boot/src/main/resources/application.properties b/spring-boot/src/main/resources/application.properties index 444f68d50a..458b4e0d46 100644 --- a/spring-boot/src/main/resources/application.properties +++ b/spring-boot/src/main/resources/application.properties @@ -45,4 +45,7 @@ servlet.mapping=/dispatcherExampleURL #banner.image.margin= //TODO #banner.image.invert= //TODO -contactInfoType=email \ No newline at end of file +contactInfoType=email + +endpoints.beans.id=springbeans +endpoints.beans.sensitive=false diff --git a/spring-boot/src/main/resources/templates/displayallbeans.html b/spring-boot/src/main/resources/templates/displayallbeans.html new file mode 100644 index 0000000000..5fc78a7fca --- /dev/null +++ b/spring-boot/src/main/resources/templates/displayallbeans.html @@ -0,0 +1,10 @@ + + + + Baeldung + + +

+

+ + diff --git a/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java new file mode 100644 index 0000000000..530b8e9cb3 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/displayallbeans/DisplayBeanIntegrationTest.java @@ -0,0 +1,83 @@ +package com.baeldung.displayallbeans; + +import static org.assertj.core.api.BDDAssertions.then; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.embedded.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.context.WebApplicationContext; + +import com.baeldung.displayallbeans.Application; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@TestPropertySource(properties = {"management.port=0", "endpoints.beans.id=springbeans", "endpoints.beans.sensitive=false"}) +public class DisplayBeanIntegrationTest { + + @LocalServerPort + private int port; + + @Value("${local.management.port}") + private int mgt; + + @Autowired + private TestRestTemplate testRestTemplate; + + @Autowired + private WebApplicationContext context; + + @Test + public void givenRestTemplate_whenAccessServerUrl_thenHttpStatusOK() throws Exception { + ResponseEntity entity = this.testRestTemplate.getForEntity( + "http://localhost:" + this.port + "/displayallbeans", String.class); + + then(entity.getStatusCode()).isEqualTo(HttpStatus.OK); + } + + @Test + public void givenRestTemplate_whenAccessEndpointUrl_thenHttpStatusOK() throws Exception { + @SuppressWarnings("rawtypes") + ResponseEntity entity = this.testRestTemplate.getForEntity( + "http://localhost:" + this.mgt + "/springbeans", List.class); + + then(entity.getStatusCode()).isEqualTo(HttpStatus.OK); + } + + @Test + public void givenRestTemplate_whenAccessEndpointUrl_thenReturnsBeanNames() throws Exception { + @SuppressWarnings("rawtypes") + ResponseEntity entity = this.testRestTemplate.getForEntity( + "http://localhost:" + this.mgt + "/springbeans", List.class); + + List> allBeans = (List) ((Map) entity.getBody().get(0)).get("beans"); + List beanNamesList = allBeans.stream().map(x -> (String) x.get("bean")).collect(Collectors.toList()); + + assertThat( beanNamesList, hasItem("fooController")); + assertThat( beanNamesList, hasItem("fooService")); + } + + @Test + public void givenWebApplicationContext_whenAccessGetBeanDefinitionNames_thenReturnsBeanNames() throws Exception { + String[] beanNames = context.getBeanDefinitionNames(); + + List beanNamesList = Arrays.asList(beanNames); + assertTrue(beanNamesList.contains("fooController")); + assertTrue(beanNamesList.contains("fooService")); + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/README.MD b/spring-cloud/spring-cloud-bootstrap/README.MD index d8eedc3249..a174fba3dd 100644 --- a/spring-cloud/spring-cloud-bootstrap/README.MD +++ b/spring-cloud/spring-cloud-bootstrap/README.MD @@ -2,6 +2,7 @@ - [Spring Cloud – Bootstrapping](http://www.baeldung.com/spring-cloud-bootstrapping) - [Spring Cloud – Securing Services](http://www.baeldung.com/spring-cloud-securing-services) - [Spring Cloud – Tracing Services with Zipkin](http://www.baeldung.com/tracing-services-with-zipkin) +- [Spring Cloud – Adding Angular 4](http://www.baeldung.com/spring-cloud-angular) - To run the project: diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml index 3d8c40afdd..84dc2a6ca9 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml @@ -44,6 +44,10 @@ org.springframework.cloud spring-cloud-starter-zipkin
+ + org.springframework.cloud + spring-cloud-starter-feign + diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java index 16aae66cab..10ed66bfd4 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/GatewayApplication.java @@ -1,5 +1,7 @@ package com.baeldung.spring.cloud.bootstrap.gateway; +import com.baeldung.spring.cloud.bootstrap.gateway.client.book.BooksClient; +import com.baeldung.spring.cloud.bootstrap.gateway.client.rating.RatingsClient; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import org.springframework.beans.factory.annotation.Autowired; @@ -8,6 +10,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.ribbon.RibbonClientSpecification; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @@ -16,6 +19,8 @@ import org.springframework.cloud.sleuth.zipkin.HttpZipkinSpanReporter; import org.springframework.cloud.sleuth.zipkin.ZipkinProperties; import org.springframework.cloud.sleuth.zipkin.ZipkinSpanReporter; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; import org.springframework.web.client.RestTemplate; import zipkin.Span; @@ -25,6 +30,7 @@ import java.util.List; @SpringBootApplication @EnableZuulProxy @EnableEurekaClient +@EnableFeignClients public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java new file mode 100644 index 0000000000..d6a4d9269b --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/Book.java @@ -0,0 +1,46 @@ +package com.baeldung.spring.cloud.bootstrap.gateway.client.book; + +import com.baeldung.spring.cloud.bootstrap.gateway.client.rating.Rating; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Book { + private Long id; + private String author; + private String title; + private List ratings; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getRatings() { + return ratings; + } + + public void setRatings(List ratings) { + this.ratings = ratings; + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java new file mode 100644 index 0000000000..f60f65d23c --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/book/BooksClient.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.cloud.bootstrap.gateway.client.book; + +import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@FeignClient(value = "book-service") +public interface BooksClient { + + @RequestMapping(value = "/books/{bookId}", method = {RequestMethod.GET}) + Book getBookById(@PathVariable("bookId") Long bookId); +} diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java new file mode 100644 index 0000000000..21f9db2d98 --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/Rating.java @@ -0,0 +1,34 @@ +package com.baeldung.spring.cloud.bootstrap.gateway.client.rating; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Rating { + private Long id; + private Long bookId; + private int stars; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getBookId() { + return bookId; + } + + public void setBookId(Long bookId) { + this.bookId = bookId; + } + + public int getStars() { + return stars; + } + + public void setStars(int stars) { + this.stars = stars; + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java new file mode 100644 index 0000000000..9728111c5e --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/client/rating/RatingsClient.java @@ -0,0 +1,17 @@ +package com.baeldung.spring.cloud.bootstrap.gateway.client.rating; + +import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(value = "rating-service") +public interface RatingsClient { + + @RequestMapping(value = "/ratings", method = {RequestMethod.GET}) + List getRatingsByBookId(@RequestParam("bookId") Long bookId, @RequestHeader("Cookie") String session); +} diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java new file mode 100644 index 0000000000..f04991f81d --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/main/java/com/baeldung/spring/cloud/bootstrap/gateway/controller/CombinedController.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.cloud.bootstrap.gateway.controller; + +import com.baeldung.spring.cloud.bootstrap.gateway.client.book.Book; +import com.baeldung.spring.cloud.bootstrap.gateway.client.book.BooksClient; +import com.baeldung.spring.cloud.bootstrap.gateway.client.rating.Rating; +import com.baeldung.spring.cloud.bootstrap.gateway.client.rating.RatingsClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/combined") +public class CombinedController { + + private final BooksClient booksClient; + private final RatingsClient ratingsClient; + + @Autowired + public CombinedController(BooksClient booksClient, RatingsClient ratingsClient) { + this.booksClient = booksClient; + this.ratingsClient = ratingsClient; + } + + @GetMapping + public Book getCombinedResponse(@RequestParam Long bookId, @CookieValue("SESSION") String session){ + Book book = booksClient.getBookById(bookId); + List ratings = ratingsClient.getRatingsByBookId(bookId, "SESSION="+session); + book.setRatings(ratings); + return book; + } +} diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java index 04ddc0ee7a..2bef67934b 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/LiveTest.java @@ -1,5 +1,7 @@ package com.baeldung.spring.cloud.bootstrap.gateway; +import com.baeldung.spring.cloud.bootstrap.gateway.client.book.Book; +import com.baeldung.spring.cloud.bootstrap.gateway.client.rating.Rating; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.restassured.RestAssured; import io.restassured.authentication.FormAuthConfig; @@ -80,7 +82,9 @@ public class LiveTest { @Test public void whenAddnewRating_thenSuccess() { - final Rating rating = new Rating(1L, 4); + final Rating rating = new Rating(); + rating.setBookId(1L); + rating.setStars(4); // request the protected resource final Response ratingResponse = RestAssured.given() @@ -98,7 +102,9 @@ public class LiveTest { @Test public void whenAddnewBook_thenSuccess() { - final Book book = new Book("Baeldung", "How to spring cloud"); + final Book book = new Book(); + book.setTitle("How to spring cloud"); + book.setAuthor("Baeldung"); // request the protected resource final Response bookResponse = RestAssured.given() @@ -115,83 +121,17 @@ public class LiveTest { } - @JsonIgnoreProperties(ignoreUnknown = true) - public static class Book { - - private Long id; - private String author; - private String title; - - public Book() { - } - - public Book(String author, String title) { - this.author = author; - this.title = title; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } + @Test + public void accessCombinedEndpoint() { + final Response response = RestAssured.given() + .auth() + .form("user", "password", formConfig) + .get(ROOT_URI + "/combined?bookId=1"); + Assert.assertEquals(HttpStatus.OK.value(), response.getStatusCode()); + Assert.assertNotNull(response.getBody()); + final Book result = response.as(Book.class); + Assert.assertEquals(new Long(1), result.getId()); + Assert.assertNotNull(result.getRatings()); + Assert.assertTrue(result.getRatings().size() > 0); } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class Rating { - private Long id; - private Long bookId; - private int stars; - - public Rating() { - } - - public Rating(Long bookId, int stars) { - this.bookId = bookId; - this.stars = stars; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public Long getBookId() { - return bookId; - } - - public void setBookId(Long bookId) { - this.bookId = bookId; - } - - public int getStars() { - return stars; - } - - public void setStars(int stars) { - this.stars = stars; - } - } - } \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml index 7879031a2a..736a6114cf 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml @@ -1,78 +1,87 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - com.baeldung.spring.cloud - svc-rating - 1.0.0-SNAPSHOT + com.baeldung.spring.cloud + svc-rating + 1.0.0-SNAPSHOT - - parent-boot-4 - com.baeldung - 0.0.1-SNAPSHOT - ../../../parent-boot-4 - + + parent-boot-4 + com.baeldung + 0.0.1-SNAPSHOT + ../../../parent-boot-4 + - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.cloud - spring-cloud-starter-eureka - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-security - + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.cloud + spring-cloud-starter-eureka + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + - - org.springframework.session - spring-session - - - org.springframework.boot - spring-boot-starter-data-redis - + + org.springframework.session + spring-session + + + org.springframework.boot + spring-boot-starter-data-redis + - - org.springframework.boot - spring-boot-starter-data-jpa - + + org.springframework.boot + spring-boot-starter-data-jpa + - - com.h2database - h2 - runtime - + + org.springframework.cloud + spring-cloud-starter-hystrix + + + org.springframework.boot + spring-boot-starter-actuator + - - org.springframework.cloud - spring-cloud-starter-zipkin - + + com.h2database + h2 + runtime + - + + org.springframework.cloud + spring-cloud-starter-zipkin + - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud-dependencies.version} - pom - import - - - + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + Brixton.SR7 + - - Brixton.SR7 - - \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java index 0d85c5c825..31ca69c139 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/RatingServiceApplication.java @@ -1,21 +1,32 @@ package com.baeldung.spring.cloud.bootstrap.svcrating; -import com.netflix.appinfo.InstanceInfo; -import com.netflix.discovery.EurekaClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.cloud.sleuth.metric.SpanMetricReporter; import org.springframework.cloud.sleuth.zipkin.HttpZipkinSpanReporter; import org.springframework.cloud.sleuth.zipkin.ZipkinProperties; import org.springframework.cloud.sleuth.zipkin.ZipkinSpanReporter; +import org.springframework.context.annotation.AdviceMode; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import com.netflix.appinfo.InstanceInfo; +import com.netflix.discovery.EurekaClient; +import com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect; + import zipkin.Span; @SpringBootApplication @EnableEurekaClient +@EnableHystrix +@EnableTransactionManagement(order=Ordered.LOWEST_PRECEDENCE, mode=AdviceMode.ASPECTJ) public class RatingServiceApplication { @Autowired private EurekaClient eurekaClient; @@ -48,4 +59,11 @@ public class RatingServiceApplication { } }; } + + @Bean + @Primary + @Order(value=Ordered.HIGHEST_PRECEDENCE) + public HystrixCommandAspect hystrixAspect() { + return new HystrixCommandAspect(); + } } \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java index 171fbba7af..9b6afc8059 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SecurityConfig.java @@ -20,17 +20,20 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { - http.httpBasic() - .disable() + http .authorizeRequests() .regexMatchers("^/ratings\\?bookId.*$").authenticated() .antMatchers(HttpMethod.POST,"/ratings").authenticated() .antMatchers(HttpMethod.PATCH,"/ratings/*").hasRole("ADMIN") .antMatchers(HttpMethod.DELETE,"/ratings/*").hasRole("ADMIN") .antMatchers(HttpMethod.GET,"/ratings").hasRole("ADMIN") + .antMatchers(HttpMethod.GET,"/hystrix").authenticated() .anyRequest().authenticated() .and() + .httpBasic().and() .csrf() .disable(); + + } } diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java index 62bc701868..6e8fcd10d4 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/SessionConfig.java @@ -1,10 +1,28 @@ package com.baeldung.spring.cloud.bootstrap.svcrating; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.env.Environment; +import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; @Configuration @EnableRedisHttpSession public class SessionConfig extends AbstractHttpSessionApplicationInitializer { + @Autowired + Environment properties; + + @Bean + @Primary + public JedisConnectionFactory connectionFactory() { + JedisConnectionFactory factory = new JedisConnectionFactory(); + factory.setHostName(properties.getProperty("spring.redis.host","localhost")); + factory.setPort(properties.getProperty("spring.redis.port", Integer.TYPE,6379)); + factory.afterPropertiesSet(); + factory.setUsePool(true); + return factory; + } } diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java index c37099f3c1..2c7069926c 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/Rating.java @@ -1,22 +1,34 @@ package com.baeldung.spring.cloud.bootstrap.svcrating.rating; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Transient; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @Entity @JsonIgnoreProperties(ignoreUnknown = true) -public class Rating { +public class Rating implements Serializable { + /** + * + */ + private static final long serialVersionUID = 3308900941650386473L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private Long bookId; private int stars; + @Transient + private boolean fromCache; + @Transient + private Long cachedTS = -1L; + public Rating() { } @@ -54,4 +66,21 @@ public class Rating { public void setStars(int stars) { this.stars = stars; } + + public boolean isFromCache() { + return fromCache; + } + + public void setFromCache(boolean fromCache) { + this.fromCache = fromCache; + } + + public Long getCachedTS() { + return cachedTS; + } + + public void setCachedTS(Long cachedTS) { + this.cachedTS = cachedTS; + } + } diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java new file mode 100644 index 0000000000..d9f3a3584e --- /dev/null +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingCacheRepository.java @@ -0,0 +1,118 @@ +package com.baeldung.spring.cloud.bootstrap.svcrating.rating; + +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.core.SetOperations; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.stereotype.Repository; + +@Repository +public class RatingCacheRepository implements InitializingBean { + + @Autowired + private JedisConnectionFactory cacheConnectionFactory; + + private StringRedisTemplate redisTemplate; + private ValueOperations valueOps; + private SetOperations setOps; + + private ObjectMapper jsonMapper; + + public List findCachedRatingsByBookId(Long bookId) { + return setOps.members("book-" + bookId) + .stream() + .map(rtId -> { + try { + return jsonMapper.readValue(valueOps.get(rtId), Rating.class); + } catch (IOException ex) { + return null; + } + }) + .collect(Collectors.toList()); + } + + public Rating findCachedRatingById(Long ratingId) { + + try { + return jsonMapper.readValue(valueOps.get("rating-" + ratingId), Rating.class); + } catch (IOException e) { + return null; + } + + } + + public List findAllCachedRatings() { + List ratings = null; + + ratings = redisTemplate.keys("rating*") + .stream() + .map(rtId -> { + try { + + return jsonMapper.readValue(valueOps.get(rtId), Rating.class); + + } catch (IOException e) { + return null; + } + }) + .collect(Collectors.toList()); + + return ratings; + } + + public boolean createRating(Rating persisted) { + try { + valueOps.set("rating-" + persisted.getId(), jsonMapper.writeValueAsString(persisted)); + setOps.add("book-" + persisted.getBookId(), "rating-" + persisted.getId()); + return true; + } catch (JsonProcessingException ex) { + return false; + } + } + + public boolean updateRating(Rating persisted) { + try { + valueOps.set("rating-" + persisted.getId(), jsonMapper.writeValueAsString(persisted)); + return true; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return false; + } + + public boolean deleteRating(Long ratingId) { + Rating toDel; + try { + + toDel = jsonMapper.readValue(valueOps.get("rating-" + ratingId), Rating.class); + setOps.remove("book-" + toDel.getBookId(), "rating-" + ratingId); + redisTemplate.delete("rating-" + ratingId); + return true; + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + @Override + public void afterPropertiesSet() throws Exception { + + this.redisTemplate = new StringRedisTemplate(cacheConnectionFactory); + + this.valueOps = redisTemplate.opsForValue(); + this.setOps = redisTemplate.opsForSet(); + + jsonMapper = new ObjectMapper(); + jsonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java index 6ab5e0acff..395ff50bd7 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/main/java/com/baeldung/spring/cloud/bootstrap/svcrating/rating/RatingService.java @@ -1,14 +1,16 @@ package com.baeldung.spring.cloud.bootstrap.svcrating.rating; -import com.google.common.base.Preconditions; +import java.util.List; +import java.util.Map; +import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import com.google.common.base.Preconditions; +import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; @Service @Transactional(readOnly = true) @@ -17,30 +19,51 @@ public class RatingService { @Autowired private RatingRepository ratingRepository; + @Autowired + private RatingCacheRepository cacheRepository; + + @HystrixCommand(commandKey = "ratingsByBookIdFromDB", fallbackMethod = "findCachedRatingsByBookId") + public List findRatingsByBookId(Long bookId) { + return ratingRepository.findRatingsByBookId(bookId); + } + + public List findCachedRatingsByBookId(Long bookId) { + return cacheRepository.findCachedRatingsByBookId(bookId); + } + + @HystrixCommand(commandKey = "ratingsFromDB", fallbackMethod = "findAllCachedRatings") + public List findAllRatings() { + return ratingRepository.findAll(); + } + + public List findAllCachedRatings() { + return cacheRepository.findAllCachedRatings(); + } + + @HystrixCommand(commandKey = "ratingsByIdFromDB", fallbackMethod = "findCachedRatingById", ignoreExceptions = { RatingNotFoundException.class }) public Rating findRatingById(Long ratingId) { return Optional.ofNullable(ratingRepository.findOne(ratingId)) .orElseThrow(() -> new RatingNotFoundException("Rating not found. ID: " + ratingId)); } - public List findRatingsByBookId(Long bookId) { - return ratingRepository.findRatingsByBookId(bookId); - } - - public List findAllRatings() { - return ratingRepository.findAll(); + public Rating findCachedRatingById(Long ratingId) { + return cacheRepository.findCachedRatingById(ratingId); } @Transactional(propagation = Propagation.REQUIRED) public Rating createRating(Rating rating) { - final Rating newRating = new Rating(); + Rating newRating = new Rating(); newRating.setBookId(rating.getBookId()); newRating.setStars(rating.getStars()); - return ratingRepository.save(newRating); + Rating persisted = ratingRepository.save(newRating); + cacheRepository.createRating(persisted); + return persisted; } @Transactional(propagation = Propagation.REQUIRED) public void deleteRating(Long ratingId) { ratingRepository.delete(ratingId); + cacheRepository.deleteRating(ratingId); } @Transactional(propagation = Propagation.REQUIRED) @@ -54,7 +77,9 @@ public class RatingService { break; } }); - return ratingRepository.save(rating); + Rating persisted = ratingRepository.save(rating); + cacheRepository.updateRating(persisted); + return persisted; } @Transactional(propagation = Propagation.REQUIRED) @@ -64,4 +89,5 @@ public class RatingService { Preconditions.checkNotNull(ratingRepository.findOne(ratingId)); return ratingRepository.save(rating); } + } diff --git a/spring-core/README.md b/spring-core/README.md index 3f2abe42a1..380b3138fe 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -5,3 +5,4 @@ - [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) - [Constructor Injection in Spring with Lombok](http://www.baeldung.com/spring-injection-lombok) - [A Quick Guide to Spring @Value](http://www.baeldung.com/spring-value-annotation) +- [Spring YAML Configuration](http://www.baeldung.com/spring-yaml) diff --git a/spring-core/pom.xml b/spring-core/pom.xml index 70002bf3c1..85cf4573aa 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -58,12 +58,17 @@ lombok ${lombok.version} + + org.springframework.boot + spring-boot-starter + 1.5.2.RELEASE + org.springframework.boot spring-boot-test ${mockito.spring.boot.version} test - + diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/AnotherSampleDAOBean.java b/spring-core/src/main/java/com/baeldung/beaninjection/AnotherSampleDAOBean.java deleted file mode 100644 index 6313ba5a65..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/AnotherSampleDAOBean.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.beaninjection; - -public class AnotherSampleDAOBean implements IAnotherSampleDAO { - - private String propertyY; - - public AnotherSampleDAOBean(String propertyY) { - this.propertyY = propertyY; - } - - // standard setters and getters - - public String getPropertyY() { - return propertyY; - } - -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/ExampleDAOBean.java b/spring-core/src/main/java/com/baeldung/beaninjection/ExampleDAOBean.java deleted file mode 100644 index cbc7b35a7c..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/ExampleDAOBean.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.beaninjection; - -import java.util.List; - -public class ExampleDAOBean implements IExampleDAO { - - private String propertyX; - - public ExampleDAOBean(String propertyX) { - this.propertyX = propertyX; - } - - public String getPropertyX() { - return propertyX; - } - - public void setPropertyX(String propertyX) { - this.propertyX = propertyX; - } - - @Override - public List getDomainList() { - // TODO Auto-generated method stub - return null; - } - - @Override - public SampleDomainObject createNewDomain(SampleDomainObject inputDomain) { - // TODO Auto-generated method stub - return null; - } - - @Override - public SampleDomainObject getSomeDomain() { - // TODO Auto-generated method stub - return new SampleDomainObject(); - } - -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/ExampleServiceBean.java b/spring-core/src/main/java/com/baeldung/beaninjection/ExampleServiceBean.java deleted file mode 100644 index e5a5dfff5d..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/ExampleServiceBean.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.beaninjection; - -import java.util.List; - -public class ExampleServiceBean implements IExampleService { - - private IExampleDAO exampleDAO; - private IAnotherSampleDAO anotherSampleDAO; - - public ExampleServiceBean(IExampleDAO exampleDAO) { - this.exampleDAO = exampleDAO; - } - - public void setAnotherSampleDAO(IAnotherSampleDAO anotherSampleDAO) { - this.anotherSampleDAO = anotherSampleDAO; - } - - // standard setters and getters - - public IAnotherSampleDAO getAnotherSampleDAO() { - return anotherSampleDAO; - } - - public void setExampleDAO(ExampleDAOBean exampleDAO) { - this.exampleDAO = exampleDAO; - } - - public IExampleDAO getExampleDAO() { - return exampleDAO; - } - - private String propertyX; - - public String getPropertyX() { - return propertyX; - } - - public void setPropertyX(String propertyX) { - this.propertyX = propertyX; - } - - public List serviceMethodX() { - /*get domain list from DAO .. business logic on domain objects..return*/ - return exampleDAO.getDomainList(); - } - -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/FileReader.java b/spring-core/src/main/java/com/baeldung/beaninjection/FileReader.java deleted file mode 100644 index 7ea64e2ce6..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/FileReader.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.beaninjection; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class FileReader { - - @Autowired - private Location location; - - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/FtpReader.java b/spring-core/src/main/java/com/baeldung/beaninjection/FtpReader.java deleted file mode 100644 index 259710ce94..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/FtpReader.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.beaninjection; - -public class FtpReader { - private String ftpHost = null; - private Integer ftpPort = null; - - // Constructor with arguments - public FtpReader(String host, Integer port) { - this.ftpHost = host; - this.ftpPort = port; - } - - public String getFtpHost() { - return ftpHost; - } - - public void setFtpHost(String ftpHost) { - this.ftpHost = ftpHost; - } - - public Integer getFtpPort() { - return ftpPort; - } - - public void setFtpPort(Integer ftpPort) { - this.ftpPort = ftpPort; - } -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/IAnotherSampleDAO.java b/spring-core/src/main/java/com/baeldung/beaninjection/IAnotherSampleDAO.java deleted file mode 100644 index ed4ad42705..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/IAnotherSampleDAO.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.beaninjection; - -public interface IAnotherSampleDAO { - -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/IExampleDAO.java b/spring-core/src/main/java/com/baeldung/beaninjection/IExampleDAO.java deleted file mode 100644 index f7dbd2f9fe..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/IExampleDAO.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.beaninjection; - -import java.util.List; - -public interface IExampleDAO { - - List getDomainList(); - - SampleDomainObject createNewDomain(SampleDomainObject domainObject); - - SampleDomainObject getSomeDomain(); -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/IExampleService.java b/spring-core/src/main/java/com/baeldung/beaninjection/IExampleService.java deleted file mode 100644 index 9ea572d16b..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/IExampleService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.beaninjection; - -import java.util.List; - -public interface IExampleService { - - List serviceMethodX(); - -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/Location.java b/spring-core/src/main/java/com/baeldung/beaninjection/Location.java deleted file mode 100644 index 9ecab83ef6..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/Location.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.beaninjection; - -import org.springframework.stereotype.Component; - -@Component -public class Location { - private String filePath; - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/ReaderApplicationConfig.java b/spring-core/src/main/java/com/baeldung/beaninjection/ReaderApplicationConfig.java deleted file mode 100644 index cf4d91b1f5..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/ReaderApplicationConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.beaninjection; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ComponentScan(basePackages = { "com.baeldung.beaninjection" }) -public class ReaderApplicationConfig { - - @Bean - public FtpReader exampleDAO() { - return new FtpReader("localhost", 21); - } -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/ReaderManager.java b/spring-core/src/main/java/com/baeldung/beaninjection/ReaderManager.java deleted file mode 100644 index 155f2d6eea..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/ReaderManager.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.beaninjection; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class ReaderManager { - private FileReader fileReader; - private FtpReader ftpReader; - - @Autowired - public ReaderManager(FtpReader ftpReader) { - this.ftpReader = ftpReader; - } - - @Autowired - public void setFileReader(FileReader fileReader) { - this.fileReader = fileReader; - } - - public FileReader getFileReader() { - return fileReader; - } - - public void setFtpReader(FtpReader ftpReader) { - this.ftpReader = ftpReader; - } - - public FtpReader getFtpReader() { - return ftpReader; - } - -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/ReaderService.java b/spring-core/src/main/java/com/baeldung/beaninjection/ReaderService.java deleted file mode 100644 index 60bdac61e5..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/ReaderService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.beaninjection; - -public class ReaderService { - private FtpReader ftpReader; - - public void setFtpReader(FtpReader reader) { - this.ftpReader = reader; - } - - public FtpReader getFtpReader() { - return ftpReader; - } - -} diff --git a/spring-core/src/main/java/com/baeldung/beaninjection/SampleDomainObject.java b/spring-core/src/main/java/com/baeldung/beaninjection/SampleDomainObject.java deleted file mode 100644 index 3a5a913aa6..0000000000 --- a/spring-core/src/main/java/com/baeldung/beaninjection/SampleDomainObject.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.beaninjection; - -import java.io.Serializable; - -public class SampleDomainObject implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 449859763481296747L; - - private String domainPropX; - private String domainPropY; - - public String getDomainPropX() { - return domainPropX; - } - - public void setDomainPropX(String domainPropX) { - this.domainPropX = domainPropX; - } - - public String getDomainPropY() { - return domainPropY; - } - - public void setDomainPropY(String domainPropY) { - this.domainPropY = domainPropY; - } - -} diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestBeanInjectionTypes.java b/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestBeanInjectionTypes.java deleted file mode 100644 index 3939abf148..0000000000 --- a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestBeanInjectionTypes.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.configuration; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -import com.baeldung.beaninjection.AnotherSampleDAOBean; -import com.baeldung.beaninjection.ExampleDAOBean; -import com.baeldung.beaninjection.ExampleServiceBean; -import com.baeldung.beaninjection.IAnotherSampleDAO; -import com.baeldung.beaninjection.IExampleDAO; -import com.baeldung.beaninjection.IExampleService; - -@Configuration -@ComponentScan(basePackages = { "com.baeldung.beaninjection" }) -public class ApplicationContextTestBeanInjectionTypes { - - @Bean - public IExampleDAO exampleDAO() { - return new ExampleDAOBean("Mandatory DAO Property X"); - } - - @Bean - public IExampleService exampleServiceBean() { - ExampleServiceBean serviceBean = new ExampleServiceBean(exampleDAO()); - serviceBean.setAnotherSampleDAO(anotherSampleDAO()); - serviceBean.setPropertyX("Some Service Property X"); - return serviceBean; - } - - @Bean - public IAnotherSampleDAO anotherSampleDAO() { - return new AnotherSampleDAOBean("Mandatory DAO Property Y"); - } - -} diff --git a/spring-core/src/main/java/com/baeldung/yaml/MyApplication.java b/spring-core/src/main/java/com/baeldung/yaml/MyApplication.java new file mode 100644 index 0000000000..4a585df998 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/yaml/MyApplication.java @@ -0,0 +1,31 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.yaml; + +import java.util.Collections; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MyApplication implements CommandLineRunner { + + @Autowired + private YAMLConfig myConfig; + + public static void main(String[] args) { + SpringApplication app = new SpringApplication(MyApplication.class); + app.run(); + } + + public void run(String... args) throws Exception { + System.out.println("using environment:" + myConfig.getEnvironment()); + System.out.println("name:" + myConfig.getName()); + System.out.println("servers:" + myConfig.getServers()); + } + +} diff --git a/spring-core/src/main/java/com/baeldung/yaml/YAMLConfig.java b/spring-core/src/main/java/com/baeldung/yaml/YAMLConfig.java new file mode 100644 index 0000000000..313b920502 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/yaml/YAMLConfig.java @@ -0,0 +1,41 @@ +package com.baeldung.yaml; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties +@ConfigurationProperties +public class YAMLConfig { + private String name; + private String environment; + private List servers = new ArrayList(); + + public List getServers() { + return servers; + } + + public void setServers(List servers) { + this.servers = servers; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEnvironment() { + return environment; + } + + public void setEnvironment(String environment) { + this.environment = environment; + } + +} diff --git a/spring-core/src/main/resources/application.properties b/spring-core/src/main/resources/application.properties index fdc6536237..11710b49aa 100644 --- a/spring-core/src/main/resources/application.properties +++ b/spring-core/src/main/resources/application.properties @@ -1,2 +1,2 @@ -someInitialValue=This is only sample value -anotherValue=Another configured value \ No newline at end of file +spring.profiles.active=prod + diff --git a/spring-core/src/main/resources/application.yml b/spring-core/src/main/resources/application.yml new file mode 100644 index 0000000000..6fc6f67cd0 --- /dev/null +++ b/spring-core/src/main/resources/application.yml @@ -0,0 +1,17 @@ +spring: + profiles: test +name: test-YAML +environment: test +servers: + - www.abc.test.com + - www.xyz.test.com + +--- + +spring: + profiles: prod +name: prod-YAML +environment: production +servers: + - www.abc.com + - www.xyz.com diff --git a/spring-core/src/test/java/com/baeldung/beaninjection/FileReaderTest.java b/spring-core/src/test/java/com/baeldung/beaninjection/FileReaderTest.java deleted file mode 100644 index f843fddd4d..0000000000 --- a/spring-core/src/test/java/com/baeldung/beaninjection/FileReaderTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.beaninjection; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = ReaderApplicationConfig.class) -public class FileReaderTest { - - @Autowired - private ApplicationContext context; - - @Test - public void testAutowiredAnnotation_WhenField_ThenInjected() { - FileReader service = context.getBean(FileReader.class); - assertNotNull(service.getLocation()); - } -} diff --git a/spring-core/src/test/java/com/baeldung/beaninjection/FtpReaderTest.java b/spring-core/src/test/java/com/baeldung/beaninjection/FtpReaderTest.java deleted file mode 100644 index a11afff9ea..0000000000 --- a/spring-core/src/test/java/com/baeldung/beaninjection/FtpReaderTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.beaninjection; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = "classpath:injectiontypes.xml") -public class FtpReaderTest { - - @Autowired - private ApplicationContext context; - - @Test - public void testXMLBeanConfig_WhenConstructorArguments_ThenInjected() { - FtpReader service = context.getBean(FtpReader.class); - assertNotNull(service.getFtpHost()); - assertNotNull(service.getFtpPort()); - } -} diff --git a/spring-core/src/test/java/com/baeldung/beaninjection/ReaderManagerTest.java b/spring-core/src/test/java/com/baeldung/beaninjection/ReaderManagerTest.java deleted file mode 100644 index 7d85c0bf07..0000000000 --- a/spring-core/src/test/java/com/baeldung/beaninjection/ReaderManagerTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.beaninjection; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = ReaderApplicationConfig.class) -public class ReaderManagerTest { - - @Autowired - private ApplicationContext context; - - @Test - public void testAutowiredAnnotation_WhenConstructorAndSetter_ThenInjected() { - ReaderManager service = context.getBean(ReaderManager.class); - assertNotNull(service.getFtpReader()); - assertNotNull(service.getFileReader()); - } -} diff --git a/spring-core/src/test/java/com/baeldung/beaninjection/ReaderServiceTest.java b/spring-core/src/test/java/com/baeldung/beaninjection/ReaderServiceTest.java deleted file mode 100644 index da4684ad4e..0000000000 --- a/spring-core/src/test/java/com/baeldung/beaninjection/ReaderServiceTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.beaninjection; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = "classpath:injectiontypes.xml") -public class ReaderServiceTest { - - @Autowired - private ApplicationContext context; - - @Test - public void testXMLBeanConfig_WhenSetter_ThenInjected() { - ReaderService service = context.getBean(ReaderService.class); - assertNotNull(service.getFtpReader()); - } -} diff --git a/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionJavaConfigIntegrationTest.java b/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionJavaConfigIntegrationTest.java deleted file mode 100644 index 809ce02519..0000000000 --- a/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionJavaConfigIntegrationTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.test.beaninjection; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baeldung.beaninjection.AnotherSampleDAOBean; -import com.baeldung.beaninjection.ExampleDAOBean; -import com.baeldung.beaninjection.ExampleServiceBean; -import com.baeldung.configuration.ApplicationContextTestBeanInjectionTypes; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = ApplicationContextTestBeanInjectionTypes.class) -public class BeanInjectionJavaConfigIntegrationTest implements ApplicationContextAware { - - private ApplicationContext beanInjectedContext; - - @Test - public void testDAOInjectionByJava() { - ExampleServiceBean serviceBean = beanInjectedContext.getBean(ExampleServiceBean.class); - assertNotNull("Failed: Constructor Injection,Bean Reference Injection,Java Config, ExampleServiceBean", serviceBean.getExampleDAO()); - assertNotNull("Failed: Constructor Injection,Bean Reference Injection,Java Config, ExampleServiceBean", serviceBean.getAnotherSampleDAO()); - assertTrue("Failed: Constructor Injection,String Property , Java Config", serviceBean.getPropertyX() - .equals("Some Service Property X")); - } - - @Test - public void testPropertyInjectioninDAOByJava() { - ExampleDAOBean daoBean = beanInjectedContext.getBean(ExampleDAOBean.class); - assertTrue("Failed: Constructor Injection,String Property , Java Config", daoBean.getPropertyX() - .equals("Mandatory DAO Property X")); - - AnotherSampleDAOBean anotherDAOBean = beanInjectedContext.getBean(AnotherSampleDAOBean.class); - assertTrue("Failed: Constructor Injection,String Property , XML Config", anotherDAOBean.getPropertyY() - .equals("Mandatory DAO Property Y")); - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - // TODO Auto-generated method stub - this.beanInjectedContext = applicationContext; - } -} diff --git a/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionXMLConfigIntegrationTest.java b/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionXMLConfigIntegrationTest.java deleted file mode 100644 index 2f29bb52a8..0000000000 --- a/spring-core/src/test/java/com/baeldung/test/beaninjection/BeanInjectionXMLConfigIntegrationTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.test.beaninjection; - -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baeldung.beaninjection.AnotherSampleDAOBean; -import com.baeldung.beaninjection.ExampleDAOBean; -import com.baeldung.beaninjection.ExampleServiceBean; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = "classpath:beaninjectiontypes-context.xml") -public class BeanInjectionXMLConfigIntegrationTest implements ApplicationContextAware { - - private ApplicationContext beanInjectedContext; - - @Test - public void testDAOInjectionByXML() { - ExampleServiceBean serviceBean = beanInjectedContext.getBean(ExampleServiceBean.class); - assertNotNull("Failed: Constructor Injection,Bean Reference Injection,XML Config, ExampleServiceBean", serviceBean.getExampleDAO()); - assertNotNull("Failed: Constructor Injection,Bean Reference Injection,XML Config, ExampleServiceBean", serviceBean.getAnotherSampleDAO()); - assertTrue("Failed: Constructor Injection,String Property , XML Config", serviceBean.getPropertyX() - .equals("Some Service Property X")); - } - - @Test - public void testPropertyInjectioninDAOByXML() { - ExampleDAOBean daoBean = beanInjectedContext.getBean(ExampleDAOBean.class); - assertTrue("Failed: Constructor Injection,String Property , XML Config", daoBean.getPropertyX() - .equals("Mandatory DAO Property X")); - - AnotherSampleDAOBean anotherDAOBean = beanInjectedContext.getBean(AnotherSampleDAOBean.class); - assertTrue("Failed: Constructor Injection,String Property , XML Config", anotherDAOBean.getPropertyY() - .equals("Mandatory DAO Property Y")); - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - // TODO Auto-generated method stub - this.beanInjectedContext = applicationContext; - } -} diff --git a/spring-data-javaslang/.gitignore b/spring-data-javaslang/.gitignore deleted file mode 100644 index 7ee5423d14..0000000000 --- a/spring-data-javaslang/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/target/ -/project/ -.idea -.classpath -.eclipse diff --git a/spring-data-javaslang/pom.xml b/spring-data-javaslang/pom.xml deleted file mode 100644 index 02d214344e..0000000000 --- a/spring-data-javaslang/pom.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - 4.0.0 - spring-data-javaslang - spring-data-javaslang - 0.0.1-SNAPSHOT - - - 2.9.1-01 - 2.3.7-01 - 2.4.8 - 2.0.5 - 1.5.1.RELEASE - 4.3.6.RELEASE - 4.3.6.RELEASE - 4.3.6.RELEASE - ${basedir}/src/test/java - - - - parent-boot-5 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-5 - - - - - test-app - - verify - - - org.springframework.boot - spring-boot-maven-plugin - - - spring-boot-run - verify - - run - - false - - - - - - - - - - - org.springframework.boot - spring-boot-devtools - true - - - - com.h2database - h2 - 1.4.193 - - - - io.javaslang - javaslang - ${javaslang.version} - - - - org.springframework.data - spring-data-jpa - 1.11.0.RELEASE - - - - org.springframework.boot - spring-boot - ${spring-boot.version} - - - - org.springframework.boot - spring-boot-starter-data-jpa - ${spring-boot.version} - - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot.version} - - - - org.springframework - spring-context - ${spring-context.version} - - - - org.springframework - spring-core - ${spring-core.version} - - - - \ No newline at end of file diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/Book.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/Book.java deleted file mode 100644 index 95653abb6c..0000000000 --- a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/Book.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.spring_data.model; - -import javaslang.collection.Seq; - -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; - -@Entity -@Table(name = "book") -public class Book { - - @GeneratedValue - @Id - private Long id; - - private String title; - - private Seq authors; - - - public void setTitle(String title){ - this.title = title; - } - - public String getTitle(){ - return this.title; - } - - public Long getId(){ - return this.id; - } - - public void setAuthors(Seq authors){ - this.authors = authors; - } - - public Seq getAuthors(){ - return this.authors; - } -} diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/JavaBook.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/JavaBook.java deleted file mode 100644 index ab99b0d929..0000000000 --- a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/model/JavaBook.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.spring_data.model; - -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; - -import java.util.List; - -@Entity -@Table(name = "java_book") -public class JavaBook { - - @GeneratedValue - @Id - private Long id; - - private String title; - - @ElementCollection - private List authors; - - - public void setAuthors(List authors){ - this.authors = authors; - } - - public void setTitle(String title){ - this.title = title; - } - - public String getTitle(){ - return this.title; - } - - public Long getId(){ - return this.id; - } -} - diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/BookRepository.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/BookRepository.java deleted file mode 100644 index 75b6d0b426..0000000000 --- a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/BookRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.spring_data.repository; - -import com.baeldung.spring_data.model.Book; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import javaslang.collection.Seq; -import javaslang.control.Option; - -@Repository -public interface BookRepository extends JpaRepository{ - Book save(Book book); - - Option findById(Long id); - - Option> findByTitleContaining(String title); - -} diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/JavaBookRepository.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/JavaBookRepository.java deleted file mode 100644 index a4aeab85ee..0000000000 --- a/spring-data-javaslang/src/main/java/com/baeldung/spring_data/repository/JavaBookRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.spring_data.repository; - -import com.baeldung.spring_data.model.JavaBook; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface JavaBookRepository extends JpaRepository{ - JavaBook save(JavaBook book); - - JavaBook findById(Long id); - - List findByTitleContaining(String title); -} \ No newline at end of file diff --git a/spring-data-javaslang/src/main/java/com/baeldung/spring_data_app/MainApp.java b/spring-data-javaslang/src/main/java/com/baeldung/spring_data_app/MainApp.java deleted file mode 100644 index d8a194e92e..0000000000 --- a/spring-data-javaslang/src/main/java/com/baeldung/spring_data_app/MainApp.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.spring_data_app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@Configuration -@EnableJpaRepositories("com.baeldung.spring_data.repository") -@EnableTransactionManagement -@EntityScan("com.baeldung.spring_data.model") -@SpringBootApplication -public class MainApp { - public static void main(String[] args){ - SpringApplication.run(MainApp.class, args); - } -} diff --git a/spring-data-javaslang/src/test/java/com/baeldung/spring_data_tests/SpringIntegrationTest.java b/spring-data-javaslang/src/test/java/com/baeldung/spring_data_tests/SpringIntegrationTest.java deleted file mode 100644 index 7a23fa1ef2..0000000000 --- a/spring-data-javaslang/src/test/java/com/baeldung/spring_data_tests/SpringIntegrationTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.baeldung.spring_data_tests; - -import com.baeldung.spring_data.model.Book; -import com.baeldung.spring_data.model.JavaBook; -import com.baeldung.spring_data.repository.BookRepository; -import com.baeldung.spring_data.repository.JavaBookRepository; -import com.baeldung.spring_data_app.MainApp; -import javaslang.collection.List; -import javaslang.collection.Seq; -import javaslang.control.Option; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.ArrayList; - -import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = MainApp.class,webEnvironment = WebEnvironment.NONE) -public class SpringIntegrationTest { - - @Autowired - private JavaBookRepository javaRepository; - - @Autowired - private BookRepository repository; - - @Test - public void should_return_seq(){ - Seq authors = List.of("author1","author2"); - Book testBook = new Book(); - testBook.setTitle("Javaslang in Spring Data Seq Test Return"); - testBook.setAuthors(authors); - Book book = repository.save(testBook); - Option> books = repository.findByTitleContaining("Seq Test"); - - assertThat(books).isNotEmpty(); - } - - - @Test - public void should_return_option_with_book(){ - Seq authors = List.of("author1","author2"); - Book testBook = new Book(); - testBook.setTitle("Javaslang in Spring Data"); - testBook.setAuthors(authors); - Book book = repository.save(testBook); - Option retBook = repository.findById(1L); - - assertThat(retBook.isDefined()).isTrue(); - assertThat(retBook).isNotEmpty(); - } - - @Test - public void should_return_list(){ - ArrayList authors = new ArrayList(); - authors.add("author1"); - authors.add("author2"); - JavaBook testBook = new JavaBook(); - testBook.setTitle("Javaslang in Spring Data Seq Return"); - testBook.setAuthors(authors); - JavaBook book = javaRepository.save(testBook); - java.util.List books = javaRepository.findByTitleContaining("Seq"); - assertThat(books) - .isNotEmpty() - .hasSize(1) - .extracting("title") - .contains("Javaslang in Spring Data Seq Return"); - } - - @Test - public void should_return_book(){ - ArrayList authors = new ArrayList(); - authors.add("author1"); - authors.add("author2"); - JavaBook testBook = new JavaBook(); - testBook.setTitle("Javaslang in Spring Data"); - testBook.setAuthors(authors); - JavaBook book = javaRepository.save(testBook); - JavaBook retBook = javaRepository.findById(1L); - - assertThat(retBook.getId()).isEqualTo(1L); - assertThat(retBook.getTitle()).isEqualTo("Javaslang in Spring Data"); - } -} \ No newline at end of file diff --git a/spring-drools/pom.xml b/spring-drools/pom.xml index 8dba1271d7..239c0c065c 100644 --- a/spring-drools/pom.xml +++ b/spring-drools/pom.xml @@ -14,42 +14,10 @@ - 1.1.1.RELEASE - 4.0-alpha6 - 7.0.0.CR1 - 3.13 + 7.0.0.Final + 4.3.3.RELEASE - - - - io.spring.platform - platform-bom - ${spring-boot-version} - pom - import - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-actuator - - - org.apache.httpcomponents - httpcore - ${http-component-version} - org.kie @@ -61,7 +29,6 @@ drools-decisiontables ${drools-version} - org.drools drools-core @@ -72,54 +39,18 @@ drools-compiler ${drools-version} - - org.apache.poi - poi - ${apache-poi-version} - - - org.apache.poi - poi-ooxml - ${apache-poi-version} - + org.kie kie-spring - 6.4.0.Final - - - org.springframework - spring-tx - - - org.springframework - spring-beans - - - org.springframework - spring-core - - - org.springframework - spring-context - - + ${drools-version} + + + org.springframework + spring-test + ${spring-framework.version} + test - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - \ No newline at end of file diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/Application.java b/spring-drools/src/main/java/com/baeldung/spring/drools/Application.java deleted file mode 100644 index 8f5b915f88..0000000000 --- a/spring-drools/src/main/java/com/baeldung/spring/drools/Application.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.spring.drools; - - -import com.baeldung.spring.drools.model.Applicant; -import com.baeldung.spring.drools.model.Product; -import com.baeldung.spring.drools.model.SuggestedRole; -import com.baeldung.spring.drools.service.ApplicantService; -import com.baeldung.spring.drools.service.ProductService; -import org.kie.api.KieServices; -import org.kie.api.runtime.KieContainer; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; - -@SpringBootApplication -@Import(DroolConfiguration.class) -public class Application { - - public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(Application.class, args); - ApplicantService applicantService=(ApplicantService)ctx.getBean("applicantService"); - applicantService.suggestARoleForApplicant(new Applicant("Baljeet",37,1200000.0,8),new SuggestedRole()); - - ProductService productService=(ProductService)ctx.getBean("productService"); - Product returnedProduct=productService.applyLabelToProduct(new Product("Microwave","Book")); - } - -} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/DroolConfiguration.java b/spring-drools/src/main/java/com/baeldung/spring/drools/DroolConfiguration.java deleted file mode 100644 index 7a5e833ed5..0000000000 --- a/spring-drools/src/main/java/com/baeldung/spring/drools/DroolConfiguration.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.baeldung.spring.drools; - -import com.baeldung.spring.drools.service.ApplicantService; -import com.baeldung.spring.drools.service.ProductService; -import org.kie.api.KieBase; -import org.kie.api.KieServices; -import org.kie.api.builder.*; -import org.kie.api.runtime.KieContainer; -import org.kie.api.runtime.KieSession; -import org.kie.internal.io.ResourceFactory; -import org.kie.spring.KModuleBeanFactoryPostProcessor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; - -import java.io.IOException; - -@Configuration -public class DroolConfiguration { - - private static final String RULES_PATH = "com/baeldung/spring/drools/rules/"; - - @Bean - public KieFileSystem kieFileSystem() throws IOException { - KieFileSystem kieFileSystem = getKieServices().newKieFileSystem(); - for (Resource file : getRuleFiles()) { - kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8")); - } - return kieFileSystem; - } - - private Resource[] getRuleFiles() throws IOException { - ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); - return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*"); - } - - @Bean - public KieContainer kieContainer() throws IOException { - final KieRepository kieRepository = getKieServices().getRepository(); - - kieRepository.addKieModule(new KieModule() { - public ReleaseId getReleaseId() { - return kieRepository.getDefaultReleaseId(); - } - }); - - KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem()); - kieBuilder.buildAll(); - - return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId()); - } - - private KieServices getKieServices() { - return KieServices.Factory.get(); - } - - @Bean - public KieBase kieBase() throws IOException { - return kieContainer().getKieBase(); - } - - @Bean - public KieSession kieSession() throws IOException { - return kieContainer().newKieSession(); - } - - @Bean - public ApplicantService getApplicantService(){ - return new ApplicantService(); - } - - @Bean - public ProductService getProductService(KieContainer kieContainer){ - return new ProductService(); - } - - @Bean - public KModuleBeanFactoryPostProcessor kiePostProcessor() { - return new KModuleBeanFactoryPostProcessor(); - } -} \ No newline at end of file diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/app/ApplicationRunner.java b/spring-drools/src/main/java/com/baeldung/spring/drools/app/ApplicationRunner.java new file mode 100644 index 0000000000..82b12cbc95 --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/app/ApplicationRunner.java @@ -0,0 +1,23 @@ +package com.baeldung.spring.drools.app; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import com.baeldung.spring.drools.model.TaxiRide; +import com.baeldung.spring.drools.model.Fare; +import com.baeldung.spring.drools.service.TaxiFareCalculatorService; +import com.baeldung.spring.drools.service.TaxiFareConfiguration; + +public class ApplicationRunner { + + public static void main(String[] args) { + ApplicationContext context = new AnnotationConfigApplicationContext(TaxiFareConfiguration.class); + TaxiFareCalculatorService taxiFareCalculatorService = (TaxiFareCalculatorService) context.getBean(TaxiFareCalculatorService.class); + TaxiRide taxiRide = new TaxiRide(); + taxiRide.setIsNightSurcharge(true); + taxiRide.setDistanceInMile(190L); + Fare rideFare = new Fare(); + taxiFareCalculatorService.calculateFare(taxiRide, rideFare); + } + +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/model/Applicant.java b/spring-drools/src/main/java/com/baeldung/spring/drools/model/Applicant.java deleted file mode 100644 index f28d0fcab7..0000000000 --- a/spring-drools/src/main/java/com/baeldung/spring/drools/model/Applicant.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.spring.drools.model; - -public class Applicant { - - private String name; - private int age; - private double currentSalary; - private int experienceInYears; - - public Applicant(String name, int age, Double currentSalary, int experienceInYears) { - this.name = name; - this.age = age; - this.currentSalary = currentSalary; - this.experienceInYears = experienceInYears; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - public Double getCurrentSalary() { - return currentSalary; - } - - public void setCurrentSalary(Double currentSalary) { - this.currentSalary = currentSalary; - } - - public int getExperienceInYears() { - return experienceInYears; - } - - public void setExperienceInYears(int experienceInYears) { - this.experienceInYears = experienceInYears; - } -} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/model/Fare.java b/spring-drools/src/main/java/com/baeldung/spring/drools/model/Fare.java new file mode 100644 index 0000000000..5a25ddc6d3 --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/model/Fare.java @@ -0,0 +1,33 @@ +package com.baeldung.spring.drools.model; + +public class Fare { + + private Long nightSurcharge; + private Long rideFare; + + public Fare() { + nightSurcharge = 0L; + rideFare = 0L; + } + + public Long getNightSurcharge() { + return nightSurcharge; + } + + public void setNightSurcharge(Long nightSurcharge) { + this.nightSurcharge = nightSurcharge; + } + + public Long getRideFare() { + return rideFare; + } + + public void setRideFare(Long rideFare) { + this.rideFare = rideFare; + } + + public Long getTotalFare() { + return nightSurcharge + rideFare; + } + +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/model/Product.java b/spring-drools/src/main/java/com/baeldung/spring/drools/model/Product.java deleted file mode 100644 index a861df5834..0000000000 --- a/spring-drools/src/main/java/com/baeldung/spring/drools/model/Product.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.spring.drools.model; - -public class Product { - private String name; - private String type; - - private String label; - - public Product(String name, String type) { - this.name = name; - this.type = type; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - -} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/model/SuggestedRole.java b/spring-drools/src/main/java/com/baeldung/spring/drools/model/SuggestedRole.java deleted file mode 100644 index 1ace5aa4ae..0000000000 --- a/spring-drools/src/main/java/com/baeldung/spring/drools/model/SuggestedRole.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.spring.drools.model; - -public class SuggestedRole { - - private String role; - - public String getRole() { - return role; - } - - public void setRole(String role) { - this.role = role; - } -} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/model/TaxiRide.java b/spring-drools/src/main/java/com/baeldung/spring/drools/model/TaxiRide.java new file mode 100644 index 0000000000..8dc0f373b1 --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/model/TaxiRide.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.drools.model; + +public class TaxiRide { + + private Boolean isNightSurcharge; + private Long distanceInMile; + + public Boolean getIsNightSurcharge() { + return isNightSurcharge; + } + + public void setIsNightSurcharge(Boolean isNightSurcharge) { + this.isNightSurcharge = isNightSurcharge; + } + + public Long getDistanceInMile() { + return distanceInMile; + } + + public void setDistanceInMile(Long distanceInMile) { + this.distanceInMile = distanceInMile; + } + +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/service/ApplicantService.java b/spring-drools/src/main/java/com/baeldung/spring/drools/service/ApplicantService.java deleted file mode 100644 index f78ffe668b..0000000000 --- a/spring-drools/src/main/java/com/baeldung/spring/drools/service/ApplicantService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.spring.drools.service; - -import com.baeldung.spring.drools.model.Applicant; -import com.baeldung.spring.drools.model.SuggestedRole; -import org.kie.api.runtime.KieContainer; -import org.kie.api.runtime.KieSession; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class ApplicantService { - - @Autowired - private KieContainer kieContainer; - - public SuggestedRole suggestARoleForApplicant(Applicant applicant,SuggestedRole suggestedRole){ - KieSession kieSession = kieContainer.newKieSession(); - kieSession.insert(applicant); - kieSession.setGlobal("suggestedRole",suggestedRole); - kieSession.fireAllRules(); - System.out.println(suggestedRole.getRole()); - return suggestedRole; - - } -} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/service/ProductService.java b/spring-drools/src/main/java/com/baeldung/spring/drools/service/ProductService.java deleted file mode 100644 index 21ca9c9730..0000000000 --- a/spring-drools/src/main/java/com/baeldung/spring/drools/service/ProductService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.spring.drools.service; - -import com.baeldung.spring.drools.model.Product; -import org.kie.api.runtime.KieContainer; -import org.kie.api.runtime.KieSession; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class ProductService { - - @Autowired - private KieContainer kieContainer; - - public Product applyLabelToProduct(Product product){ - KieSession kieSession = kieContainer.newKieSession(); - kieSession.insert(product); - kieSession.fireAllRules(); - System.out.println(product.getLabel()); - return product; - - } - -} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/service/TaxiFareCalculatorService.java b/spring-drools/src/main/java/com/baeldung/spring/drools/service/TaxiFareCalculatorService.java new file mode 100644 index 0000000000..c2c5b399df --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/service/TaxiFareCalculatorService.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.drools.service; + +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.spring.drools.model.Fare; +import com.baeldung.spring.drools.model.TaxiRide; + +@Service +public class TaxiFareCalculatorService { + + @Autowired + private KieContainer kContainer; + + public Long calculateFare(TaxiRide taxiRide, Fare rideFare) { + KieSession kieSession = kContainer.newKieSession(); + kieSession.setGlobal("rideFare", rideFare); + kieSession.insert(taxiRide); + kieSession.fireAllRules(); + kieSession.dispose(); + System.out.println("!! RIDE FARE !! " + rideFare.getTotalFare()); + return rideFare.getTotalFare(); + } +} diff --git a/spring-drools/src/main/java/com/baeldung/spring/drools/service/TaxiFareConfiguration.java b/spring-drools/src/main/java/com/baeldung/spring/drools/service/TaxiFareConfiguration.java new file mode 100644 index 0000000000..e7b614694e --- /dev/null +++ b/spring-drools/src/main/java/com/baeldung/spring/drools/service/TaxiFareConfiguration.java @@ -0,0 +1,32 @@ +package com.baeldung.spring.drools.service; + +import org.kie.api.KieServices; +import org.kie.api.builder.KieBuilder; +import org.kie.api.builder.KieFileSystem; +import org.kie.api.builder.KieModule; +import org.kie.api.runtime.KieContainer; +import org.kie.internal.io.ResourceFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("com.baeldung.spring.drools.service") +public class TaxiFareConfiguration { + + public static final String drlFile = "TAXI_FARE_RULE.drl"; + + @Bean + public KieContainer kieContainer() { + KieServices kieServices = KieServices.Factory.get(); + + KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); + kieFileSystem.write(ResourceFactory.newClassPathResource(drlFile)); + KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); + kieBuilder.buildAll(); + KieModule kieModule = kieBuilder.getKieModule(); + + return kieServices.newKieContainer(kieModule.getReleaseId()); + + } +} diff --git a/spring-drools/src/main/resources/TAXI_FARE_RULE.drl b/spring-drools/src/main/resources/TAXI_FARE_RULE.drl new file mode 100644 index 0000000000..97f40ddae2 --- /dev/null +++ b/spring-drools/src/main/resources/TAXI_FARE_RULE.drl @@ -0,0 +1,57 @@ +import com.baeldung.spring.drools.model.TaxiRide; +import com.baeldung.spring.drools.model.Fare; +import java.util.*; + +global com.baeldung.spring.drools.model.Fare rideFare; +dialect "mvel" + +rule "Calculate Taxi Fare - Scenario 1" + when + taxiRideInstance:TaxiRide(isNightSurcharge == false && distanceInMile < 10); + then + rideFare.setNightSurcharge(0); + rideFare.setRideFare(70); +end + +rule "Calculate Taxi Fare - Scenario 2" + when + taxiRideInstance:TaxiRide(isNightSurcharge == true && distanceInMile < 10); + then + rideFare.setNightSurcharge(30); + rideFare.setRideFare(70); +end + + +rule "Calculate Taxi Fare - Scenario 3" + when + taxiRideInstance:TaxiRide(isNightSurcharge == false && distanceInMile >= 10 && distanceInMile < 100); + then + rideFare.setNightSurcharge(0); + rideFare.setRideFare(70+(2*taxiRideInstance.getDistanceInMile())); +end + + +rule "Calculate Taxi Fare - Scenario 4" + when + taxiRideInstance:TaxiRide(isNightSurcharge == true && distanceInMile >= 10 && distanceInMile < 100); + then + rideFare.setNightSurcharge(30+taxiRideInstance.getDistanceInMile()); + rideFare.setRideFare(70+(2*taxiRideInstance.getDistanceInMile())); +end + + +rule "Calculate Taxi Fare - Scenario 5" + when + taxiRideInstance:TaxiRide(isNightSurcharge == false && distanceInMile >= 100); + then + rideFare.setNightSurcharge(0); + rideFare.setRideFare(70+(1.5*taxiRideInstance.getDistanceInMile())); +end + +rule "Calculate Taxi Fare - Scenario 6" + when + taxiRideInstance:TaxiRide(isNightSurcharge == true && distanceInMile >= 100); + then + rideFare.setNightSurcharge(30+taxiRideInstance.getDistanceInMile()); + rideFare.setRideFare(70+(1.5*taxiRideInstance.getDistanceInMile())); +end diff --git a/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/Product_rules.xls b/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/Product_rules.xls deleted file mode 100644 index 24caaf2470..0000000000 Binary files a/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/Product_rules.xls and /dev/null differ diff --git a/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/SuggestApplicant.drl b/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/SuggestApplicant.drl deleted file mode 100644 index baaf29d0b4..0000000000 --- a/spring-drools/src/main/resources/com/baeldung/spring/drools/rules/SuggestApplicant.drl +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.spring.drools.rules; - -import com.baeldung.spring.drools.model.Applicant; - -global com.baeldung.spring.drools.model.SuggestedRole suggestedRole; - -dialect "mvel" - -rule "Suggest Manager Role" - when - Applicant(experienceInYears > 10) - Applicant(currentSalary > 1000000 && currentSalary <= 2500000) - then - suggestedRole.setRole("Manager"); -end - -rule "Suggest Senior developer Role" - when - Applicant(experienceInYears > 5 && experienceInYears <= 10) - Applicant(currentSalary > 500000 && currentSalary <= 1500000) - then - suggestedRole.setRole("Senior developer"); -end - -rule "Suggest Developer Role" - when - Applicant(experienceInYears > 0 && experienceInYears <= 5) - Applicant(currentSalary > 200000 && currentSalary <= 1000000) - then - suggestedRole.setRole("Developer"); -end diff --git a/spring-drools/src/test/java/com/baeldung/spring/drools/service/ApplicantServiceIntegrationTest.java b/spring-drools/src/test/java/com/baeldung/spring/drools/service/ApplicantServiceIntegrationTest.java deleted file mode 100644 index d7e7634c00..0000000000 --- a/spring-drools/src/test/java/com/baeldung/spring/drools/service/ApplicantServiceIntegrationTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.spring.drools.service; - -import com.baeldung.spring.drools.Application; -import com.baeldung.spring.drools.DroolConfiguration; -import com.baeldung.spring.drools.model.Applicant; -import com.baeldung.spring.drools.model.SuggestedRole; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import static junit.framework.Assert.assertNull; -import static junit.framework.TestCase.assertEquals; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {DroolConfiguration.class}) -public class ApplicantServiceIntegrationTest { - - @Autowired - ApplicantService applicantService; - - @Test - public void whenCriteriaMatching_ThenSuggestManagerRole(){ - Applicant applicant=new Applicant("Davis",37,1600000.0,11); - SuggestedRole suggestedRole=new SuggestedRole(); - applicantService.suggestARoleForApplicant(applicant,suggestedRole); - assertEquals("Manager",suggestedRole.getRole()); - } - - @Test - public void whenCriteriaMatching_ThenSuggestSeniorDeveloperRole(){ - Applicant applicant=new Applicant("John",37,1200000.0,8); - SuggestedRole suggestedRole=new SuggestedRole(); - applicantService.suggestARoleForApplicant(applicant,suggestedRole); - assertEquals("Senior developer",suggestedRole.getRole()); - } - @Test - public void whenCriteriaMatching_ThenSuggestDeveloperRole(){ - Applicant applicant=new Applicant("Davis",37,800000.0,3); - SuggestedRole suggestedRole=new SuggestedRole(); - applicantService.suggestARoleForApplicant(applicant,suggestedRole); - assertEquals("Developer",suggestedRole.getRole()); - } - @Test - public void whenCriteriaNotMatching_ThenNoRole(){ - Applicant applicant=new Applicant("John",37,1200000.0,5); - SuggestedRole suggestedRole=new SuggestedRole(); - applicantService.suggestARoleForApplicant(applicant,suggestedRole); - assertNull(suggestedRole.getRole()); - } -} diff --git a/spring-drools/src/test/java/com/baeldung/spring/drools/service/ProductServiceIntegrationTest.java b/spring-drools/src/test/java/com/baeldung/spring/drools/service/ProductServiceIntegrationTest.java deleted file mode 100644 index 7a442e48fd..0000000000 --- a/spring-drools/src/test/java/com/baeldung/spring/drools/service/ProductServiceIntegrationTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.spring.drools.service; - -import com.baeldung.spring.drools.Application; -import com.baeldung.spring.drools.DroolConfiguration; -import com.baeldung.spring.drools.model.Product; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import static junit.framework.TestCase.assertEquals; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {DroolConfiguration.class}) -public class ProductServiceIntegrationTest { - - @Autowired - ProductService productService; - - @Test - public void whenProductTypeElectronic_ThenLabelBarcode(){ - Product product=new Product("Microwave","Electronic"); - product=productService.applyLabelToProduct(product); - assertEquals("BarCode",product.getLabel()); - } - - @Test - public void whenProductTypeBook_ThenLabelIsbn(){ - Product product=new Product("AutoBiography","Book"); - product=productService.applyLabelToProduct(product); - assertEquals("ISBN",product.getLabel()); - } -} diff --git a/spring-drools/src/test/java/com/baeldung/spring/drools/service/TaxiFareCalculatorServiceIntegrationTest.java b/spring-drools/src/test/java/com/baeldung/spring/drools/service/TaxiFareCalculatorServiceIntegrationTest.java new file mode 100644 index 0000000000..8ecd0d59a8 --- /dev/null +++ b/spring-drools/src/test/java/com/baeldung/spring/drools/service/TaxiFareCalculatorServiceIntegrationTest.java @@ -0,0 +1,95 @@ +package com.baeldung.spring.drools.service; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.spring.drools.model.Fare; +import com.baeldung.spring.drools.model.TaxiRide; + + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = TaxiFareConfiguration.class) +public class TaxiFareCalculatorServiceIntegrationTest { + + @Autowired + private TaxiFareCalculatorService taxiFareCalculatorService; + + @Test + public void whenNightSurchargeFalseAndDistanceLessThan10_thenFixFareWithoutNightSurcharge() { + TaxiRide taxiRide = new TaxiRide(); + taxiRide.setIsNightSurcharge(false); + taxiRide.setDistanceInMile(9L); + Fare rideFare = new Fare(); + Long totalCharge = taxiFareCalculatorService.calculateFare(taxiRide, rideFare); + + assertNotNull(totalCharge); + assertEquals(Long.valueOf(70), totalCharge); + } + + @Test + public void whenNightSurchargeTrueAndDistanceLessThan10_thenFixFareWithNightSurcharge() { + TaxiRide taxiRide = new TaxiRide(); + taxiRide.setIsNightSurcharge(true); + taxiRide.setDistanceInMile(5L); + Fare rideFare = new Fare(); + Long totalCharge = taxiFareCalculatorService.calculateFare(taxiRide, rideFare); + + assertNotNull(totalCharge); + assertEquals(Long.valueOf(100), totalCharge); + } + + @Test + public void whenNightSurchargeFalseAndDistanceLessThan100_thenDoubleFareWithoutNightSurcharge() { + TaxiRide taxiRide = new TaxiRide(); + taxiRide.setIsNightSurcharge(false); + taxiRide.setDistanceInMile(50L); + Fare rideFare = new Fare(); + Long totalCharge = taxiFareCalculatorService.calculateFare(taxiRide, rideFare); + + assertNotNull(totalCharge); + assertEquals(Long.valueOf(170), totalCharge); + } + + @Test + public void whenNightSurchargeTrueAndDistanceLessThan100_thenDoubleFareWithNightSurcharge() { + TaxiRide taxiRide = new TaxiRide(); + taxiRide.setIsNightSurcharge(true); + taxiRide.setDistanceInMile(50L); + Fare rideFare = new Fare(); + Long totalCharge = taxiFareCalculatorService.calculateFare(taxiRide, rideFare); + + assertNotNull(totalCharge); + assertEquals(Long.valueOf(250), totalCharge); + } + + @Test + public void whenNightSurchargeFalseAndDistanceGreaterThan100_thenExtraPercentFareWithoutNightSurcharge() { + TaxiRide taxiRide = new TaxiRide(); + taxiRide.setIsNightSurcharge(false); + taxiRide.setDistanceInMile(100L); + Fare rideFare = new Fare(); + Long totalCharge = taxiFareCalculatorService.calculateFare(taxiRide, rideFare); + + assertNotNull(totalCharge); + assertEquals(Long.valueOf(220), totalCharge); + } + + @Test + public void whenNightSurchargeTrueAndDistanceGreaterThan100_thenExtraPercentFareWithNightSurcharge() { + TaxiRide taxiRide = new TaxiRide(); + taxiRide.setIsNightSurcharge(true); + taxiRide.setDistanceInMile(100L); + Fare rideFare = new Fare(); + Long totalCharge = taxiFareCalculatorService.calculateFare(taxiRide, rideFare); + + assertNotNull(totalCharge); + assertEquals(Long.valueOf(350), totalCharge); + } + +} diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index e6ae05eb0f..763465be8c 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -1,8 +1,7 @@ 4.0.0 - com.baeldung - sprin-jooq + spring-jooq 0.0.1-SNAPSHOT diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index 533d37fe00..504cfcdcc7 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -22,3 +22,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Guide to Spring Handler Mappings](http://www.baeldung.com/spring-handler-mappings) - [Uploading and Displaying Excel Files with Spring MVC](http://www.baeldung.com/spring-mvc-excel-files) - [Spring MVC Custom Validation](http://www.baeldung.com/spring-mvc-custom-validator) +- [web.xml vs Initializer with Spring](http://www.baeldung.com/spring-xml-vs-java-config) diff --git a/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/config/AppInitializer.java b/spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java similarity index 97% rename from spring-mvc-web-vs-initializer/src/main/java/org/baeldung/config/AppInitializer.java rename to spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java index 21e33820ca..9cf6e384f1 100644 --- a/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/config/AppInitializer.java +++ b/spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; diff --git a/spring-mvc-java/src/main/java/com/baeldung/exception/HttpMediaTypeNotAcceptableExceptionExampleController.java b/spring-mvc-java/src/main/java/com/baeldung/exception/HttpMediaTypeNotAcceptableExceptionExampleController.java new file mode 100644 index 0000000000..539a6032a6 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/exception/HttpMediaTypeNotAcceptableExceptionExampleController.java @@ -0,0 +1,27 @@ +package com.baeldung.exception; + +import org.springframework.http.MediaType; +import org.springframework.web.HttpMediaTypeNotAcceptableException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Collections; +import java.util.Map; + +@RestController +public class HttpMediaTypeNotAcceptableExceptionExampleController { + + @PostMapping(value = "/test", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public Map test() { + return Collections.singletonMap("key", "value"); + } + + @ResponseBody + @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) + public String handleHttpMediaTypeNotAcceptableException() { + return "acceptable MIME type:" + MediaType.APPLICATION_JSON_VALUE; + } + +} diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebSocketConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebSocketConfig.java index 5f3eb1312d..93ec13da58 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebSocketConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebSocketConfig.java @@ -18,6 +18,7 @@ public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(final StompEndpointRegistry registry) { + registry.addEndpoint("/chat"); registry.addEndpoint("/chat").withSockJS(); } diff --git a/spring-mvc-web-vs-initializer/src/main/resources/mvc-configuration.xml b/spring-mvc-java/src/main/resources/mvc-configuration.xml similarity index 100% rename from spring-mvc-web-vs-initializer/src/main/resources/mvc-configuration.xml rename to spring-mvc-java/src/main/resources/mvc-configuration.xml diff --git a/spring-mvc-java/src/test/java/com/baeldung/aop/AopLoggingIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/aop/AopLoggingIntegrationTest.java index 0837100bfa..698bae4c0f 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/aop/AopLoggingIntegrationTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/aop/AopLoggingIntegrationTest.java @@ -24,7 +24,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class) public class AopLoggingIntegrationTest { @Before diff --git a/spring-mvc-java/src/test/java/com/baeldung/aop/AopPublishingIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/aop/AopPublishingIntegrationTest.java index cf9c83a93d..2503900e69 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/aop/AopPublishingIntegrationTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/aop/AopPublishingIntegrationTest.java @@ -22,7 +22,7 @@ import java.util.regex.Pattern; import static org.junit.Assert.assertTrue; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class) public class AopPublishingIntegrationTest { @Before diff --git a/spring-mvc-web-vs-initializer/README.MD b/spring-mvc-web-vs-initializer/README.MD deleted file mode 100644 index 4759cf6137..0000000000 --- a/spring-mvc-web-vs-initializer/README.MD +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: -- [web.xml vs Initializer with Spring](http://www.baeldung.com/spring-xml-vs-java-config) diff --git a/spring-mvc-web-vs-initializer/pom.xml b/spring-mvc-web-vs-initializer/pom.xml deleted file mode 100644 index 2f7b7ea98e..0000000000 --- a/spring-mvc-web-vs-initializer/pom.xml +++ /dev/null @@ -1,193 +0,0 @@ - - 4.0.0 - com.baeldung - spring-mvc-web-vs-initializer - 0.1-SNAPSHOT - - spring-mvc-web-vs-initializer - war - - - parent-boot-4 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-4 - - - - - com.fasterxml.jackson.core - jackson-databind - - - - - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - - - org.springframework - spring-context - - - - - - javax.servlet - javax.servlet-api - provided - - - - javax.servlet - jstl - runtime - - - - - - com.google.guava - guava - ${guava.version} - - - - - - org.springframework - spring-test - test - - - - org.assertj - assertj-core - test - - - - org.hamcrest - hamcrest-core - test - - - org.hamcrest - hamcrest-library - test - - - - org.mockito - mockito-core - test - - - - org.easymock - easymock - ${easymock.version} - test - - - - - - - - - - org.springframework - spring-framework-bom - ${org.springframework.version} - pom - import - - - - org.springframework - spring-core - ${org.springframework.version} - - - - - - - - spring-mvc-web-vs-initializer - - - src/main/resources - true - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*LiveTest.java - - - **/*IntegrationTest.java - - - - - - - json - - - - - - - - - - - 4.3.4.RELEASE - - - 19.0 - 3.4 - - - - \ No newline at end of file diff --git a/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/controller/java/JavaController.java b/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/controller/java/JavaController.java deleted file mode 100644 index c979c88b34..0000000000 --- a/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/controller/java/JavaController.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.baeldung.controller.java; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -@Controller -public class JavaController { - - @RequestMapping(value = "/endpoint") - public ModelAndView handleRequestFromJavaConfiguredServlet() { - ModelAndView mv = new ModelAndView(); - mv.setViewName("from-java"); - - return mv; - } - -} \ No newline at end of file diff --git a/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/controller/xml/XmlController.java b/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/controller/xml/XmlController.java deleted file mode 100644 index bdefc1781c..0000000000 --- a/spring-mvc-web-vs-initializer/src/main/java/org/baeldung/controller/xml/XmlController.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.baeldung.controller.xml; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.servlet.ModelAndView; - -@Controller -public class XmlController { - - @RequestMapping(value = "/endpoint") - public ModelAndView handleRequestFromXmlConfiguredServlet() { - ModelAndView mv = new ModelAndView(); - mv.setViewName("from-xml"); - - return mv; - } - -} \ No newline at end of file diff --git a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/view/from-java.jsp b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/view/from-java.jsp deleted file mode 100644 index e54d7520dc..0000000000 --- a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/view/from-java.jsp +++ /dev/null @@ -1,7 +0,0 @@ - - - - -

Java

- - \ No newline at end of file diff --git a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/view/from-xml.jsp b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/view/from-xml.jsp deleted file mode 100644 index 986010c183..0000000000 --- a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/view/from-xml.jsp +++ /dev/null @@ -1,7 +0,0 @@ - - - - -

XML

- - \ No newline at end of file diff --git a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml b/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 5c7a0b52d4..0000000000 --- a/spring-mvc-web-vs-initializer/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - xml-servlet - - org.springframework.web.servlet.DispatcherServlet - - - contextConfigLocation - classpath*:mvc-configuration.xml - - 1 - - - - xml-servlet - /xml-servlet/* - - - diff --git a/spring-mvc-web-vs-initializer/src/test/java/org/baeldung/controller/JavaServletIntegrationTest.java b/spring-mvc-web-vs-initializer/src/test/java/org/baeldung/controller/JavaServletIntegrationTest.java deleted file mode 100644 index 0461cc8fcc..0000000000 --- a/spring-mvc-web-vs-initializer/src/test/java/org/baeldung/controller/JavaServletIntegrationTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.baeldung.controller; - -import org.baeldung.config.MvcConfig; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.AnnotationConfigWebContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.servlet.ModelAndView; - - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(loader=AnnotationConfigWebContextLoader.class, classes = MvcConfig.class) -public class JavaServletIntegrationTest { - - private MockMvc mockMvc; - - @Autowired - private WebApplicationContext wac; - - @Before - public void setUp() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); - } - - @Test - public void testJavaEndpoint() throws Exception { - ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/endpoint")) - .andReturn() - .getModelAndView(); - - // validate view name - Assert.assertSame(mv.getViewName(), "from-java"); - } - -} diff --git a/spring-mvc-web-vs-initializer/src/test/java/org/baeldung/controller/XmlServletIntegrationTest.java b/spring-mvc-web-vs-initializer/src/test/java/org/baeldung/controller/XmlServletIntegrationTest.java deleted file mode 100644 index e1273f8f88..0000000000 --- a/spring-mvc-web-vs-initializer/src/test/java/org/baeldung/controller/XmlServletIntegrationTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.baeldung.controller; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.GenericXmlWebContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.servlet.ModelAndView; - - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(loader=GenericXmlWebContextLoader.class, locations = "classpath*:mvc-configuration.xml") -public class XmlServletIntegrationTest { - - private MockMvc mockMvc; - - @Autowired - private WebApplicationContext wac; - - @Before - public void setUp() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); - } - - @Test - public void testXmlEndpoint() throws Exception { - ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/endpoint")) - .andReturn() - .getModelAndView(); - - // validate view name - Assert.assertSame(mv.getViewName(), "from-xml"); - } - -} diff --git a/spring-mvc-webflow/README.md b/spring-mvc-webflow/README.md index e627fdbffe..2df4716e31 100644 --- a/spring-mvc-webflow/README.md +++ b/spring-mvc-webflow/README.md @@ -6,3 +6,4 @@ ### Relevant Articles: - +- [Guide to Spring Web Flow](http://www.baeldung.com/spring-web-flow) diff --git a/spring-remoting/README.md b/spring-remoting/README.md index 96a68977a5..da8238b034 100644 --- a/spring-remoting/README.md +++ b/spring-remoting/README.md @@ -4,6 +4,7 @@ - [Intro to Spring Remoting with HTTP Invokers](http://www.baeldung.com/spring-remoting-http-invoker) - [Spring Remoting with Hessian and Burlap](http://www.baeldung.com/spring-remoting-hessian-burlap) - [Spring Remoting with AMQP](http://www.baeldung.com/spring-remoting-amqp) +- [Spring Remoting with JMS](http://www.baeldung.com/spring-remoting-jms) ### Overview This Maven project contains the Java source code for various modules used in the Spring Remoting series of articles. diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml new file mode 100644 index 0000000000..f662b736ad --- /dev/null +++ b/spring-rest-simple/pom.xml @@ -0,0 +1,370 @@ + + 4.0.0 + com.baeldung + spring-rest-simple + 0.1-SNAPSHOT + spring-rest-simple + war + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-test + + + + + + org.springframework + spring-web + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + + + org.springframework + spring-oxm + + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + + + + javax.servlet + javax.servlet-api + provided + + + + javax.servlet + jstl + runtime + + + + + + com.fasterxml.jackson.core + jackson-databind + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + + com.thoughtworks.xstream + xstream + ${xstream.version} + + + + + + com.google.guava + guava + ${guava.version} + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + + org.slf4j + jcl-over-slf4j + + + + + + + com.squareup.okhttp3 + okhttp + ${com.squareup.okhttp3.version} + + + + + + junit + junit + test + + + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + + org.mockito + mockito-core + test + + + + org.springframework + spring-test + + + + com.jayway.restassured + rest-assured + ${rest-assured.version} + + + + + com.google.protobuf + protobuf-java + ${protobuf-java.version} + + + com.googlecode.protobuf-java-format + protobuf-java-format + ${protobuf-java-format.version} + + + + com.esotericsoftware + kryo + ${kryo.version} + + + + com.jayway.jsonpath + json-path + + + + + + spring-rest + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-war-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + + 3 + true + + **/*IntegrationTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/JdbcTest.java + **/*LiveTest.java + + true + + + + + org.codehaus.cargo + cargo-maven2-plugin + ${cargo-maven2-plugin.version} + + true + + tomcat8x + embedded + + + + + + + 8082 + + + + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*IntegrationTest.java + + + + + + + + + + + + live + + + + org.codehaus.cargo + cargo-maven2-plugin + + + start-server + pre-integration-test + + start + + + + stop-server + post-integration-test + + stop + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + none + + + **/*LiveTest.java + + + cargo + + + + + + + + + + + + + + 1.3.2 + 4.0.0 + 1.4 + 3.1.0 + 3.5 + 1.4.9 + + + 20.0 + 2.9.0 + + + 1.6.0 + 3.0.4 + + + 3.4.1 + + 2.2.0 + + + diff --git a/spring-rest-simple/src/main/java/org/baeldung/config/Application.java b/spring-rest-simple/src/main/java/org/baeldung/config/Application.java new file mode 100644 index 0000000000..3a98da82c9 --- /dev/null +++ b/spring-rest-simple/src/main/java/org/baeldung/config/Application.java @@ -0,0 +1,18 @@ +package org.baeldung.config; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; + +@EnableAutoConfiguration +@ComponentScan("org.baeldung") +@SpringBootApplication +public class Application extends SpringBootServletInitializer { + + public static void main(final String[] args) { + SpringApplication.run(Application.class, args); + } + +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java b/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java new file mode 100644 index 0000000000..ec92ad8349 --- /dev/null +++ b/spring-rest-simple/src/main/java/org/baeldung/config/WebConfig.java @@ -0,0 +1,68 @@ +package org.baeldung.config; + +import java.text.SimpleDateFormat; +import java.util.List; + +import org.baeldung.config.converter.KryoHttpMessageConverter; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; +import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; +import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; +import org.springframework.oxm.xstream.XStreamMarshaller; +import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/* + * Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml + */ +@Configuration +@EnableWebMvc +@ComponentScan({ "org.baeldung.web" }) +public class WebConfig extends WebMvcConfigurerAdapter { + + public WebConfig() { + super(); + } + + // + + @Override + public void configureMessageConverters(final List> messageConverters) { + final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); + builder.indentOutput(true) + .dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm")); + messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build())); + messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true) + .build())); + + messageConverters.add(createXmlHttpMessageConverter()); + // messageConverters.add(new MappingJackson2HttpMessageConverter()); + + messageConverters.add(new ProtobufHttpMessageConverter()); + messageConverters.add(new KryoHttpMessageConverter()); + messageConverters.add(new StringHttpMessageConverter()); + super.configureMessageConverters(messageConverters); + } + + private HttpMessageConverter createXmlHttpMessageConverter() { + final MarshallingHttpMessageConverter xmlConverter = new MarshallingHttpMessageConverter(); + + final XStreamMarshaller xstreamMarshaller = new XStreamMarshaller(); + xmlConverter.setMarshaller(xstreamMarshaller); + xmlConverter.setUnmarshaller(xstreamMarshaller); + + return xmlConverter; + } + + @Override + public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { + configurer.defaultContentType(MediaType.APPLICATION_JSON); + } +} diff --git a/spring-rest-simple/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java b/spring-rest-simple/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java new file mode 100644 index 0000000000..6af54c379a --- /dev/null +++ b/spring-rest-simple/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java @@ -0,0 +1,60 @@ +package org.baeldung.config.converter; + +import java.io.IOException; + +import org.baeldung.web.dto.Foo; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.MediaType; +import org.springframework.http.converter.AbstractHttpMessageConverter; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + +/** + * An {@code HttpMessageConverter} that can read and write Kryo messages. + */ +public class KryoHttpMessageConverter extends + AbstractHttpMessageConverter { + + public static final MediaType KRYO = new MediaType("application", "x-kryo"); + + private static final ThreadLocal kryoThreadLocal = new ThreadLocal() { + @Override + protected Kryo initialValue() { + final Kryo kryo = new Kryo(); + kryo.register(Foo.class, 1); + return kryo; + } + }; + + public KryoHttpMessageConverter() { + super(KRYO); + } + + @Override + protected boolean supports(final Class clazz) { + return Object.class.isAssignableFrom(clazz); + } + + @Override + protected Object readInternal(final Class clazz, + final HttpInputMessage inputMessage) throws IOException { + final Input input = new Input(inputMessage.getBody()); + return kryoThreadLocal.get().readClassAndObject(input); + } + + @Override + protected void writeInternal(final Object object, + final HttpOutputMessage outputMessage) throws IOException { + final Output output = new Output(outputMessage.getBody()); + kryoThreadLocal.get().writeClassAndObject(output, object); + output.flush(); + } + + @Override + protected MediaType getDefaultContentType(final Object object) { + return KRYO; + } +} diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java new file mode 100644 index 0000000000..1c3a1086ca --- /dev/null +++ b/spring-rest-simple/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java @@ -0,0 +1,47 @@ +package org.baeldung.web.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping(value = "/ex") +public class BarMappingExamplesController { + + public BarMappingExamplesController() { + super(); + } + + // API + + // with @RequestParam + + @RequestMapping(value = "/bars") + @ResponseBody + public String getBarBySimplePathWithRequestParam(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + @RequestMapping(value = "/bars", params = "id") + @ResponseBody + public String getBarBySimplePathWithExplicitRequestParam(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + @RequestMapping(value = "/bars", params = { "id", "second" }) + @ResponseBody + public String getBarBySimplePathWithExplicitRequestParams(@RequestParam("id") final long id) { + return "Get a specific Bar with id=" + id; + } + + // with @PathVariable + + @RequestMapping(value = "/bars/{numericId:[\\d]+}") + @ResponseBody + public String getBarsBySimplePathWithPathVariable(@PathVariable final long numericId) { + return "Get a specific Bar with id=" + numericId; + } + +} diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/BazzNewMappingsExampleController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/BazzNewMappingsExampleController.java similarity index 100% rename from spring-rest/src/main/java/org/baeldung/web/controller/BazzNewMappingsExampleController.java rename to spring-rest-simple/src/main/java/org/baeldung/web/controller/BazzNewMappingsExampleController.java diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/FooController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java similarity index 92% rename from spring-rest/src/main/java/org/baeldung/web/controller/FooController.java rename to spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java index 21ba3c6d13..3c7e5ed13c 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/FooController.java +++ b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java @@ -40,6 +40,9 @@ public class FooController { @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}", produces = { "application/x-protobuf" }) @ResponseBody public FooProtos.Foo findProtoById(@PathVariable final long id) { - return FooProtos.Foo.newBuilder().setId(1).setName("Foo Name").build(); + return FooProtos.Foo.newBuilder() + .setId(1) + .setName("Foo Name") + .build(); } } diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java similarity index 100% rename from spring-rest/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java rename to spring-rest-simple/src/main/java/org/baeldung/web/controller/FooMappingExamplesController.java diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/status/ExampleController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/status/ExampleController.java similarity index 100% rename from spring-rest/src/main/java/org/baeldung/web/controller/status/ExampleController.java rename to spring-rest-simple/src/main/java/org/baeldung/web/controller/status/ExampleController.java diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java similarity index 100% rename from spring-rest/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java rename to spring-rest-simple/src/main/java/org/baeldung/web/controller/status/ForbiddenException.java diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/Bazz.java b/spring-rest-simple/src/main/java/org/baeldung/web/dto/Bazz.java similarity index 100% rename from spring-rest/src/main/java/org/baeldung/web/dto/Bazz.java rename to spring-rest-simple/src/main/java/org/baeldung/web/dto/Bazz.java diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/dto/Foo.java b/spring-rest-simple/src/main/java/org/baeldung/web/dto/Foo.java new file mode 100644 index 0000000000..240b368b50 --- /dev/null +++ b/spring-rest-simple/src/main/java/org/baeldung/web/dto/Foo.java @@ -0,0 +1,45 @@ +package org.baeldung.web.dto; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +@XStreamAlias("Foo") +public class Foo { + private long id; + private String name; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + public Foo(final long id, final String name) { + super(); + + this.id = id; + this.name = name; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/FooProtos.java b/spring-rest-simple/src/main/java/org/baeldung/web/dto/FooProtos.java similarity index 100% rename from spring-rest/src/main/java/org/baeldung/web/dto/FooProtos.java rename to spring-rest-simple/src/main/java/org/baeldung/web/dto/FooProtos.java diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/util/LinkUtil.java b/spring-rest-simple/src/main/java/org/baeldung/web/util/LinkUtil.java new file mode 100644 index 0000000000..b2137aeeff --- /dev/null +++ b/spring-rest-simple/src/main/java/org/baeldung/web/util/LinkUtil.java @@ -0,0 +1,36 @@ +package org.baeldung.web.util; + +import javax.servlet.http.HttpServletResponse; + +/** + * Provides some constants and utility methods to build a Link Header to be stored in the {@link HttpServletResponse} object + */ +public final class LinkUtil { + + public static final String REL_COLLECTION = "collection"; + public static final String REL_NEXT = "next"; + public static final String REL_PREV = "prev"; + public static final String REL_FIRST = "first"; + public static final String REL_LAST = "last"; + + private LinkUtil() { + throw new AssertionError(); + } + + // + + /** + * Creates a Link Header to be stored in the {@link HttpServletResponse} to provide Discoverability features to the user + * + * @param uri + * the base uri + * @param rel + * the relative path + * + * @return the complete url + */ + public static String createLinkHeader(final String uri, final String rel) { + return "<" + uri + ">; rel=\"" + rel + "\""; + } + +} diff --git a/spring-rest-simple/src/main/resources/application.properties b/spring-rest-simple/src/main/resources/application.properties new file mode 100644 index 0000000000..300589f561 --- /dev/null +++ b/spring-rest-simple/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port= 8082 +server.context-path=/spring-rest \ No newline at end of file diff --git a/spring-security-rest-digest-auth/src/main/resources/logback.xml b/spring-rest-simple/src/main/resources/logback.xml similarity index 100% rename from spring-security-rest-digest-auth/src/main/resources/logback.xml rename to spring-rest-simple/src/main/resources/logback.xml diff --git a/spring-rest-simple/src/main/webapp/WEB-INF/company.html b/spring-rest-simple/src/main/webapp/WEB-INF/company.html new file mode 100644 index 0000000000..d2072bfd3c --- /dev/null +++ b/spring-rest-simple/src/main/webapp/WEB-INF/company.html @@ -0,0 +1,44 @@ + + + + + Company Data + + + + + + + +
+ + + \ No newline at end of file diff --git a/spring-rest-simple/src/main/webapp/WEB-INF/spring-views.xml b/spring-rest-simple/src/main/webapp/WEB-INF/spring-views.xml new file mode 100644 index 0000000000..2944828d6d --- /dev/null +++ b/spring-rest-simple/src/main/webapp/WEB-INF/spring-views.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/spring-rest-simple/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java b/spring-rest-simple/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java new file mode 100644 index 0000000000..40e93f2d89 --- /dev/null +++ b/spring-rest-simple/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java @@ -0,0 +1,64 @@ +package org.baeldung.client; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.io.IOException; + +import org.baeldung.web.dto.Foo; +import org.junit.Before; +import org.junit.Test; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +public class RestTemplateBasicLiveTest { + + private RestTemplate restTemplate; + + private static final String fooResourceUrl = String.format("http://localhost:%d/spring-rest/foos", 8082); + + @Before + public void beforeTest() { + restTemplate = new RestTemplate(); + } + + // GET + + @Test + public void givenResourceUrl_whenSendGetForRequestEntity_thenStatusOk() throws IOException { + final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class); + + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + @Test + public void givenResourceUrl_whenRetrievingResource_thenCorrect() throws IOException { + final Foo foo = restTemplate.getForObject(fooResourceUrl + "/1", Foo.class); + + assertThat(foo.getName(), notNullValue()); + assertThat(foo.getId(), is(1L)); + } + + // PUT + + @Test + public void givenFooService_whenPutObject_thenUpdatedObjectIsReturned() { + final HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + final Foo foo = new Foo(1, "newName"); + final String resourceUrl = fooResourceUrl + "/1"; + final HttpEntity requestUpdate = new HttpEntity<>(foo, headers); + final ResponseEntity response = restTemplate.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Foo.class); + + assertThat(foo.getName(), is(response.getBody() + .getName())); + } + +} diff --git a/spring-rest-simple/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java b/spring-rest-simple/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java new file mode 100644 index 0000000000..012221efb7 --- /dev/null +++ b/spring-rest-simple/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java @@ -0,0 +1,117 @@ +package org.baeldung.client; + +import okhttp3.Request; +import okhttp3.RequestBody; +import org.junit.Before; +import org.junit.Test; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertTrue; + +public class TestRestTemplateBasicLiveTest { + + private RestTemplate restTemplate; + + private static final String FOO_RESOURCE_URL = "http://localhost:" + 8082 + "/spring-rest/foos"; + private static final String URL_SECURED_BY_AUTHENTICATION = "http://httpbin.org/basic-auth/user/passwd"; + private static final String BASE_URL = "http://localhost:" + 8082 + "/spring-rest"; + + @Before + public void beforeTest() { + restTemplate = new RestTemplate(); + } + + // GET + @Test + public void givenTestRestTemplate_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate(); + ResponseEntity response = testRestTemplate.getForEntity(FOO_RESOURCE_URL + "/1", String.class); + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + @Test + public void givenRestTemplateWrapper_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplate); + ResponseEntity response = testRestTemplate.getForEntity(FOO_RESOURCE_URL + "/1", String.class); + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + @Test + public void givenRestTemplateBuilderWrapper_whenSendGetForEntity_thenStatusOk() { + RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder(); + restTemplateBuilder.build(); + TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder); + ResponseEntity response = testRestTemplate.getForEntity(FOO_RESOURCE_URL + "/1", String.class); + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + @Test + public void givenRestTemplateWrapperWithCredentials_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplate, "user", "passwd"); + ResponseEntity response = testRestTemplate.getForEntity(URL_SECURED_BY_AUTHENTICATION, + String.class); + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + @Test + public void givenTestRestTemplateWithCredentials_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd"); + ResponseEntity response = testRestTemplate.getForEntity(URL_SECURED_BY_AUTHENTICATION, + String.class); + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + @Test + public void givenTestRestTemplateWithBasicAuth_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate(); + ResponseEntity response = testRestTemplate.withBasicAuth("user", "passwd"). + getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class); + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + @Test + public void givenTestRestTemplateWithCredentialsAndEnabledCookies_whenSendGetForEntity_thenStatusOk() { + TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd", TestRestTemplate. + HttpClientOption.ENABLE_COOKIES); + ResponseEntity response = testRestTemplate.getForEntity(URL_SECURED_BY_AUTHENTICATION, + String.class); + assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); + } + + // HEAD + @Test + public void givenFooService_whenCallHeadForHeaders_thenReceiveAllHeaders() { + TestRestTemplate testRestTemplate = new TestRestTemplate(); + final HttpHeaders httpHeaders = testRestTemplate.headForHeaders(FOO_RESOURCE_URL); + assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON)); + } + + // POST + @Test + public void givenService_whenPostForObject_thenCreatedObjectIsReturned() { + TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd"); + final RequestBody body = RequestBody.create(okhttp3.MediaType.parse("text/html; charset=utf-8"), + "{\"id\":1,\"name\":\"Jim\"}"); + final Request request = new Request.Builder().url(BASE_URL + "/users/detail").post(body).build(); + testRestTemplate.postForObject(URL_SECURED_BY_AUTHENTICATION, request, String.class); + } + + // PUT + @Test + public void givenService_whenPutForObject_thenCreatedObjectIsReturned() { + TestRestTemplate testRestTemplate = new TestRestTemplate("user", "passwd"); + final RequestBody body = RequestBody.create(okhttp3.MediaType.parse("text/html; charset=utf-8"), + "{\"id\":1,\"name\":\"Jim\"}"); + final Request request = new Request.Builder().url(BASE_URL + "/users/detail").post(body).build(); + testRestTemplate.put(URL_SECURED_BY_AUTHENTICATION, request, String.class); + } + +} diff --git a/spring-rest-simple/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java b/spring-rest-simple/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java new file mode 100644 index 0000000000..66ffe4947d --- /dev/null +++ b/spring-rest-simple/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java @@ -0,0 +1,11 @@ +package org.baeldung.web.controller.mediatypes; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + + +@Configuration +@ComponentScan({ "org.baeldung.web" }) +public class TestConfig { + +} diff --git a/spring-rest/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java b/spring-rest-simple/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java similarity index 100% rename from spring-rest/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java rename to spring-rest-simple/src/test/java/org/baeldung/web/controller/status/ExampleControllerIntegrationTest.java diff --git a/spring-rest/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleControllerIntegrationTest.java b/spring-rest-simple/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleIntegrationTest.java similarity index 88% rename from spring-rest/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleControllerIntegrationTest.java rename to spring-rest-simple/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleIntegrationTest.java index 7bd16a3e97..266ee1938b 100644 --- a/spring-rest/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleControllerIntegrationTest.java +++ b/spring-rest-simple/src/test/java/org/baeldung/web/test/BazzNewMappingsExampleIntegrationTest.java @@ -1,6 +1,15 @@ package org.baeldung.web.test; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import org.baeldung.config.WebConfig; import org.junit.Before; import org.junit.Test; @@ -13,17 +22,11 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = WebConfig.class) @WebAppConfiguration -public class BazzNewMappingsExampleControllerIntegrationTest { +public class BazzNewMappingsExampleIntegrationTest { private MockMvc mockMvc; diff --git a/spring-rest-simple/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java b/spring-rest-simple/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java new file mode 100644 index 0000000000..9dd6b13f18 --- /dev/null +++ b/spring-rest-simple/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java @@ -0,0 +1,120 @@ +package org.baeldung.web.test; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; + +import org.junit.Test; + +import com.jayway.restassured.RestAssured; + +public class RequestMappingLiveTest { + private static String BASE_URI = "http://localhost:8082/spring-rest/ex/"; + + @Test + public void givenSimplePath_whenGetFoos_thenOk() { + RestAssured.given() + .accept("text/html") + .get(BASE_URI + "foos") + .then() + .assertThat() + .body(equalTo("Simple Get some Foos")); + } + + @Test + public void whenPostFoos_thenOk() { + RestAssured.given() + .accept("text/html") + .post(BASE_URI + "foos") + .then() + .assertThat() + .body(equalTo("Post some Foos")); + } + + @Test + public void givenOneHeader_whenGetFoos_thenOk() { + RestAssured.given() + .accept("text/html") + .header("key", "val") + .get(BASE_URI + "foos") + .then() + .assertThat() + .body(equalTo("Get some Foos with Header")); + } + + @Test + public void givenMultipleHeaders_whenGetFoos_thenOk() { + RestAssured.given() + .accept("text/html") + .headers("key1", "val1", "key2", "val2") + .get(BASE_URI + "foos") + .then() + .assertThat() + .body(equalTo("Get some Foos with Header")); + } + + @Test + public void givenAcceptHeader_whenGetFoos_thenOk() { + RestAssured.given() + .accept("application/json") + .get(BASE_URI + "foos") + .then() + .assertThat() + .body(containsString("Get some Foos with Header New")); + } + + @Test + public void givenPathVariable_whenGetFoos_thenOk() { + RestAssured.given() + .accept("text/html") + .get(BASE_URI + "foos/1") + .then() + .assertThat() + .body(equalTo("Get a specific Foo with id=1")); + } + + @Test + public void givenMultiplePathVariable_whenGetFoos_thenOk() { + RestAssured.given() + .accept("text/html") + .get(BASE_URI + "foos/1/bar/2") + .then() + .assertThat() + .body(equalTo("Get a specific Bar with id=2 from a Foo with id=1")); + } + + @Test + public void givenPathVariable_whenGetBars_thenOk() { + RestAssured.given() + .accept("text/html") + .get(BASE_URI + "bars/1") + .then() + .assertThat() + .body(equalTo("Get a specific Bar with id=1")); + } + + @Test + public void givenParams_whenGetBars_thenOk() { + RestAssured.given() + .accept("text/html") + .get(BASE_URI + "bars?id=100&second=something") + .then() + .assertThat() + .body(equalTo("Get a specific Bar with id=100")); + } + + @Test + public void whenGetFoosOrBars_thenOk() { + RestAssured.given() + .accept("text/html") + .get(BASE_URI + "advanced/foos") + .then() + .assertThat() + .body(equalTo("Advanced - Get some Foos or Bars")); + RestAssured.given() + .accept("text/html") + .get(BASE_URI + "advanced/bars") + .then() + .assertThat() + .body(equalTo("Advanced - Get some Foos or Bars")); + } +} diff --git a/spring-rest/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java b/spring-rest-simple/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java similarity index 100% rename from spring-rest/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java rename to spring-rest-simple/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersLiveTest.java diff --git a/spring-rest-simple/src/test/java/org/baeldung/web/util/HTTPLinkHeaderUtil.java b/spring-rest-simple/src/test/java/org/baeldung/web/util/HTTPLinkHeaderUtil.java new file mode 100644 index 0000000000..bb3919eacc --- /dev/null +++ b/spring-rest-simple/src/test/java/org/baeldung/web/util/HTTPLinkHeaderUtil.java @@ -0,0 +1,69 @@ +package org.baeldung.web.util; + +import java.util.List; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; + +public final class HTTPLinkHeaderUtil { + + private HTTPLinkHeaderUtil() { + throw new AssertionError(); + } + + // + + /** + * ex.
+ * https://api.github.com/users/steveklabnik/gists?page=2>; rel="next", ; rel="last" + */ + public static List extractAllURIs(final String linkHeader) { + Preconditions.checkNotNull(linkHeader); + + final List linkHeaders = Lists.newArrayList(); + final String[] links = linkHeader.split(", "); + for (final String link : links) { + final int positionOfSeparator = link.indexOf(';'); + linkHeaders.add(link.substring(1, positionOfSeparator - 1)); + } + + return linkHeaders; + } + + public static String extractURIByRel(final String linkHeader, final String rel) { + if (linkHeader == null) { + return null; + } + + String uriWithSpecifiedRel = null; + final String[] links = linkHeader.split(", "); + String linkRelation = null; + for (final String link : links) { + final int positionOfSeparator = link.indexOf(';'); + linkRelation = link.substring(positionOfSeparator + 1, link.length()).trim(); + if (extractTypeOfRelation(linkRelation).equals(rel)) { + uriWithSpecifiedRel = link.substring(1, positionOfSeparator - 1); + break; + } + } + + return uriWithSpecifiedRel; + } + + static Object extractTypeOfRelation(final String linkRelation) { + final int positionOfEquals = linkRelation.indexOf('='); + return linkRelation.substring(positionOfEquals + 2, linkRelation.length() - 1).trim(); + } + + /** + * ex.
+ * https://api.github.com/users/steveklabnik/gists?page=2>; rel="next" + */ + public static String extractSingleURI(final String linkHeader) { + Preconditions.checkNotNull(linkHeader); + final int positionOfSeparator = linkHeader.indexOf(';'); + + return linkHeader.substring(1, positionOfSeparator - 1); + } + +} diff --git a/spring-mvc-web-vs-initializer/.gitignore b/spring-rest-simple/src/test/resources/.gitignore similarity index 100% rename from spring-mvc-web-vs-initializer/.gitignore rename to spring-rest-simple/src/test/resources/.gitignore diff --git a/spring-rest/difference-uri-url-rest/pom.xml b/spring-rest/difference-uri-url-rest/pom.xml new file mode 100644 index 0000000000..5ab6e63240 --- /dev/null +++ b/spring-rest/difference-uri-url-rest/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + org.baeldung.springboot.rest + difference-uri-url-rest + 0.0.1-SNAPSHOT + war + + + 1.8 + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.2.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-web + compile + + + org.springframework.boot + spring-boot-starter-test + test + + + + \ No newline at end of file diff --git a/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/Greeting.java b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/Greeting.java new file mode 100644 index 0000000000..cc166587df --- /dev/null +++ b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/Greeting.java @@ -0,0 +1,21 @@ +package com.baeldung.springboot.rest; + +public class Greeting { + private static final long serialVersionUID = 1L; + + private Integer id = null; + private String content = null; + + public Greeting(Integer id) { + this.id = id; + this.content = "Hello World"; + } + + public Integer getId() { + return id; + } + + public String getContent() { + return content; + } +} \ No newline at end of file diff --git a/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/GreetingController.java b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/GreetingController.java new file mode 100644 index 0000000000..3fca9a1a76 --- /dev/null +++ b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/GreetingController.java @@ -0,0 +1,21 @@ +package com.baeldung.springboot.rest; + +import java.util.concurrent.atomic.AtomicLong; + +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController("/") +@Component +public class GreetingController { + + private final AtomicLong counter = new AtomicLong(); + + @RequestMapping(value = "/greetings", method = RequestMethod.GET) + public Greeting greeting() { + + return new Greeting(new Integer((int) counter.incrementAndGet())); + } +} \ No newline at end of file diff --git a/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/SpringBootWebApplication.java b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/SpringBootWebApplication.java new file mode 100644 index 0000000000..08d4c2c65e --- /dev/null +++ b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/SpringBootWebApplication.java @@ -0,0 +1,27 @@ +package com.baeldung.springboot.rest; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +@EnableAutoConfiguration +@SpringBootApplication +public class SpringBootWebApplication extends SpringBootServletInitializer { + + // method for explicit deployment on Application Server + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(SpringBootWebApplication.class); + } + + // run it as standalone JAVA application + public static void main(String[] args) throws Exception { + SpringApplication.run(SpringBootWebApplication.class, args); + } + + //Samples + // http://localhost:8080/greetings + // http://localhost:8989/difference-uri-url-rest/greetings +} \ No newline at end of file diff --git a/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/client/ApplicationClient.java b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/client/ApplicationClient.java new file mode 100644 index 0000000000..2d92c890c5 --- /dev/null +++ b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/client/ApplicationClient.java @@ -0,0 +1,27 @@ +package com.baeldung.springboot.rest.client; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.client.RestTemplate; + +public class ApplicationClient { + //private static final Logger log = LoggerFactory.getLogger(ApplicationClient.class); + final static String URI_STRING = "http://localhost:8080/difference-uri-url-rest/greetings"; + + + public ApplicationClient() { + super(); + } + + public Greeting init() { + RestTemplate restTemplate = new RestTemplate(); + Greeting greeting = restTemplate.getForObject(ApplicationClient.URI_STRING, Greeting.class); + //log.info(greeting.toString()); + return greeting; + } + public static void main(String args[]) { + Greeting greeting = new ApplicationClient().init(); + System.out.println(greeting.toString()); + } + +} diff --git a/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/client/Greeting.java b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/client/Greeting.java new file mode 100644 index 0000000000..7d1119d155 --- /dev/null +++ b/spring-rest/difference-uri-url-rest/src/main/java/com/baeldung/springboot/rest/client/Greeting.java @@ -0,0 +1,33 @@ +package com.baeldung.springboot.rest.client; + +import java.io.Serializable; + +public class Greeting implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer id = null; + private String content = null; + + /** Default constructor is mandatory for client */ + public Greeting() { + super(); + } + + public Greeting(Integer id) { + this.id = id; + this.content = "Hello World"; + } + + public Integer getId() { + return id; + } + + public String getContent() { + return content; + } + + @Override + public String toString() { + return "Id: " + getId().toString() + " Content: " + getContent(); + } +} \ No newline at end of file diff --git a/spring-rest/difference-uri-url-rest/src/test/java/com/baeldung/springboot/rest/test/DifferenceURIURLRESTTest.java b/spring-rest/difference-uri-url-rest/src/test/java/com/baeldung/springboot/rest/test/DifferenceURIURLRESTTest.java new file mode 100644 index 0000000000..4397f8e088 --- /dev/null +++ b/spring-rest/difference-uri-url-rest/src/test/java/com/baeldung/springboot/rest/test/DifferenceURIURLRESTTest.java @@ -0,0 +1,32 @@ +package com.baeldung.springboot.rest.test; + +import static org.junit.Assert.assertNotNull; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.web.client.RestTemplate; + +import com.baeldung.springboot.rest.client.Greeting; + +public class DifferenceURIURLRESTTest { + final static String URI_STRING = "http://localhost:8080/difference-uri-url-rest/greetings"; + static RestTemplate restTemplate; + Greeting greeting; + + @BeforeClass + public static void setupTest() { + restTemplate = new RestTemplate(); + } + + @Test + public void givenRestTenplate_whenIsNotNull_thenSuccess() { + assertNotNull("Rest Template not null", restTemplate); + } + + @Test + public void givenWiredConstructorParam_whenIsNotNull_thenSuccess() { + greeting = restTemplate.getForObject(URI_STRING, Greeting.class); + assertNotNull("Greeting class is not null", greeting); + } + +} diff --git a/spring-rest/src/main/java/com/baeldung/produceimage/Application.java b/spring-rest/src/main/java/com/baeldung/produceimage/ImageApplication.java similarity index 70% rename from spring-rest/src/main/java/com/baeldung/produceimage/Application.java rename to spring-rest/src/main/java/com/baeldung/produceimage/ImageApplication.java index 179671d094..82a6203fe5 100644 --- a/spring-rest/src/main/java/com/baeldung/produceimage/Application.java +++ b/spring-rest/src/main/java/com/baeldung/produceimage/ImageApplication.java @@ -3,12 +3,11 @@ package com.baeldung.produceimage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.PropertySource; @EnableAutoConfiguration @ComponentScan("com.baeldung.produceimage") -public class Application { +public class ImageApplication { public static void main(final String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(ImageApplication.class, args); } } diff --git a/spring-rest/src/main/java/org/baeldung/config/Application.java b/spring-rest/src/main/java/org/baeldung/config/MainApplication.java similarity index 76% rename from spring-rest/src/main/java/org/baeldung/config/Application.java rename to spring-rest/src/main/java/org/baeldung/config/MainApplication.java index 077213b04d..e31fdfaaa9 100644 --- a/spring-rest/src/main/java/org/baeldung/config/Application.java +++ b/spring-rest/src/main/java/org/baeldung/config/MainApplication.java @@ -7,10 +7,10 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter @EnableAutoConfiguration @ComponentScan("org.baeldung") -public class Application extends WebMvcConfigurerAdapter { +public class MainApplication extends WebMvcConfigurerAdapter { public static void main(final String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(MainApplication.class, args); } } \ No newline at end of file diff --git a/spring-rest/src/main/java/org/baeldung/config/WebConfig.java b/spring-rest/src/main/java/org/baeldung/config/WebConfig.java index f40c9477d4..3661b2c561 100644 --- a/spring-rest/src/main/java/org/baeldung/config/WebConfig.java +++ b/spring-rest/src/main/java/org/baeldung/config/WebConfig.java @@ -1,20 +1,18 @@ package org.baeldung.config; -import org.baeldung.config.converter.KryoHttpMessageConverter; +import java.text.SimpleDateFormat; +import java.util.List; + import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.oxm.xstream.XStreamMarshaller; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import java.text.SimpleDateFormat; -import java.util.List; - /* * Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml */ @@ -32,15 +30,15 @@ public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(final List> messageConverters) { final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); - builder.indentOutput(true).dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm")); + builder.indentOutput(true) + .dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm")); messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build())); // messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); // messageConverters.add(createXmlHttpMessageConverter()); // messageConverters.add(new MappingJackson2HttpMessageConverter()); - messageConverters.add(new ProtobufHttpMessageConverter()); - messageConverters.add(new KryoHttpMessageConverter()); + // messageConverters.add(new ProtobufHttpMessageConverter()); super.configureMessageConverters(messageConverters); } diff --git a/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java b/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java deleted file mode 100644 index 7e63a3ba9e..0000000000 --- a/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.baeldung.config.converter; - -import java.io.IOException; - -import org.baeldung.web.dto.Foo; -import org.springframework.http.HttpInputMessage; -import org.springframework.http.HttpOutputMessage; -import org.springframework.http.MediaType; -import org.springframework.http.converter.AbstractHttpMessageConverter; - -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - -/** - * An {@code HttpMessageConverter} that can read and write Kryo messages. - */ -public class KryoHttpMessageConverter extends AbstractHttpMessageConverter { - - public static final MediaType KRYO = new MediaType("application", "x-kryo"); - - private static final ThreadLocal kryoThreadLocal = new ThreadLocal() { - @Override - protected Kryo initialValue() { - final Kryo kryo = new Kryo(); - kryo.register(Foo.class, 1); - return kryo; - } - }; - - public KryoHttpMessageConverter() { - super(KRYO); - } - - @Override - protected boolean supports(final Class clazz) { - return Object.class.isAssignableFrom(clazz); - } - - @Override - protected Object readInternal(final Class clazz, final HttpInputMessage inputMessage) throws IOException { - final Input input = new Input(inputMessage.getBody()); - return kryoThreadLocal.get().readClassAndObject(input); - } - - @Override - protected void writeInternal(final Object object, final HttpOutputMessage outputMessage) throws IOException { - final Output output = new Output(outputMessage.getBody()); - kryoThreadLocal.get().writeClassAndObject(output, object); - output.flush(); - } - - @Override - protected MediaType getDefaultContentType(final Object object) { - return KRYO; - } -} diff --git a/spring-rest/src/main/java/org/baeldung/repository/HeavyResourceRepository.java b/spring-rest/src/main/java/org/baeldung/repository/HeavyResourceRepository.java index 5556d85f65..4ed5c21b83 100644 --- a/spring-rest/src/main/java/org/baeldung/repository/HeavyResourceRepository.java +++ b/spring-rest/src/main/java/org/baeldung/repository/HeavyResourceRepository.java @@ -1,12 +1,11 @@ package org.baeldung.repository; -import org.baeldung.web.dto.HeavyResource; -import org.baeldung.web.dto.HeavyResourceAddressOnly; -import org.baeldung.web.dto.HeavyResourceAddressPartialUpdate; - import java.util.Map; -public class HeavyResourceRepository { +import org.baeldung.web.dto.HeavyResource; +import org.baeldung.web.dto.HeavyResourceAddressOnly; + +public class HeavyResourceRepository { public void save(HeavyResource heavyResource) { } diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java b/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java index f19ddca435..061213a3e9 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java +++ b/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java @@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; @Controller -@RequestMapping(value = "/myfoos") +@RequestMapping(value = "/foos") public class MyFooController { private final Map myfoos; @@ -58,12 +58,20 @@ public class MyFooController { return foo; } + @RequestMapping(method = RequestMethod.PATCH, value = "/{id}") + @ResponseStatus(HttpStatus.OK) + public void updateFoo2(@PathVariable("id") final long id, @RequestBody final Foo foo) { + myfoos.put(id, foo); + } + @RequestMapping(method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) @ResponseBody public Foo createFoo(@RequestBody final Foo foo, HttpServletResponse response) { myfoos.put(foo.getId(), foo); - response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentRequest().path("/" + foo.getId()).toUriString()); + response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentRequest() + .path("/" + foo.getId()) + .toUriString()); return foo; } diff --git a/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml b/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml index 0f80990c16..d133bcea22 100644 --- a/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml +++ b/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml @@ -19,9 +19,8 @@ --> - - - + diff --git a/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java b/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java index c9dad8ccf0..2d12262e85 100644 --- a/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java @@ -25,6 +25,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RequestCallback; import org.springframework.web.client.RestTemplate; @@ -36,25 +37,27 @@ import com.google.common.base.Charsets; public class RestTemplateBasicLiveTest { private RestTemplate restTemplate; - private static final String fooResourceUrl = "http://localhost:" + APPLICATION_PORT + "/spring-rest/myfoos"; + private static final String fooResourceUrl = "http://localhost:" + APPLICATION_PORT + "/spring-rest/foos"; @Before public void beforeTest() { restTemplate = new RestTemplate(); + restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter())); } // GET @Test public void givenResourceUrl_whenSendGetForRequestEntity_thenStatusOk() throws IOException { - final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class); + final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", Foo.class); assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); } @Test public void givenResourceUrl_whenSendGetForRequestEntity_thenBodyCorrect() throws IOException { - final ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class); + final RestTemplate template = new RestTemplate(); + final ResponseEntity response = template.getForEntity(fooResourceUrl + "/1", String.class); final ObjectMapper mapper = new ObjectMapper(); final JsonNode root = mapper.readTree(response.getBody()); @@ -76,7 +79,8 @@ public class RestTemplateBasicLiveTest { public void givenFooService_whenCallHeadForHeaders_thenReceiveAllHeadersForThatResource() { final HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl); - assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON)); + assertTrue(httpHeaders.getContentType() + .includes(MediaType.APPLICATION_JSON)); } // POST @@ -98,15 +102,13 @@ public class RestTemplateBasicLiveTest { @Test public void givenFooService_whenPostResource_thenResourceIsCreated() { - final RestTemplate template = new RestTemplate(); + final Foo foo = new Foo("bar"); + final ResponseEntity response = restTemplate.postForEntity(fooResourceUrl, foo, Foo.class); - final HttpEntity request = new HttpEntity<>(new Foo("bar")); - - final ResponseEntity response = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); - final Foo foo = response.getBody(); - assertThat(foo, notNullValue()); - assertThat(foo.getName(), is("bar")); + final Foo fooResponse = response.getBody(); + assertThat(fooResponse, notNullValue()); + assertThat(fooResponse.getName(), is("bar")); } @Test @@ -121,44 +123,46 @@ public class RestTemplateBasicLiveTest { @Test public void givenFooService_whenPutExistingEntity_thenItIsUpdated() { - final RestTemplate template = new RestTemplate(); final HttpHeaders headers = prepareBasicAuthHeaders(); final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); // Create Resource - final ResponseEntity createResponse = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + final ResponseEntity createResponse = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); // Update Resource final Foo updatedInstance = new Foo("newName"); - updatedInstance.setId(createResponse.getBody().getId()); - final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId(); + updatedInstance.setId(createResponse.getBody() + .getId()); + final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody() + .getId(); final HttpEntity requestUpdate = new HttpEntity<>(updatedInstance, headers); - template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class); + restTemplate.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class); // Check that Resource was updated - final ResponseEntity updateResponse = template.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + final ResponseEntity updateResponse = restTemplate.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); final Foo foo = updateResponse.getBody(); assertThat(foo.getName(), is(updatedInstance.getName())); } @Test public void givenFooService_whenPutExistingEntityWithCallback_thenItIsUpdated() { - final RestTemplate template = new RestTemplate(); final HttpHeaders headers = prepareBasicAuthHeaders(); final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); // Create entity - ResponseEntity response = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + ResponseEntity response = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); // Update entity final Foo updatedInstance = new Foo("newName"); - updatedInstance.setId(response.getBody().getId()); - final String resourceUrl = fooResourceUrl + '/' + response.getBody().getId(); - template.execute(resourceUrl, HttpMethod.PUT, requestCallback(updatedInstance), clientHttpResponse -> null); + updatedInstance.setId(response.getBody() + .getId()); + final String resourceUrl = fooResourceUrl + '/' + response.getBody() + .getId(); + restTemplate.execute(resourceUrl, HttpMethod.PUT, requestCallback(updatedInstance), clientHttpResponse -> null); // Check that entity was updated - response = template.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + response = restTemplate.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); final Foo foo = response.getBody(); assertThat(foo.getName(), is(updatedInstance.getName())); } @@ -167,22 +171,26 @@ public class RestTemplateBasicLiveTest { @Test public void givenFooService_whenPatchExistingEntity_thenItIsUpdated() { - final RestTemplate template = new RestTemplate(); final HttpHeaders headers = prepareBasicAuthHeaders(); final HttpEntity request = new HttpEntity<>(new Foo("bar"), headers); // Create Resource - final ResponseEntity createResponse = template.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); + final ResponseEntity createResponse = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class); // Update Resource final Foo updatedResource = new Foo("newName"); - updatedResource.setId(createResponse.getBody().getId()); - final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId(); + updatedResource.setId(createResponse.getBody() + .getId()); + final String resourceUrl = fooResourceUrl + '/' + createResponse.getBody() + .getId(); final HttpEntity requestUpdate = new HttpEntity<>(updatedResource, headers); + final ClientHttpRequestFactory requestFactory = getSimpleClientHttpRequestFactory(); + final RestTemplate template = new RestTemplate(requestFactory); + template.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter())); template.patchForObject(resourceUrl, requestUpdate, Void.class); // Check that Resource was updated - final ResponseEntity updateResponse = template.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); + final ResponseEntity updateResponse = restTemplate.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class); final Foo foo = updateResponse.getBody(); assertThat(foo.getName(), is(updatedResource.getName())); } @@ -195,7 +203,8 @@ public class RestTemplateBasicLiveTest { final ResponseEntity response = restTemplate.postForEntity(fooResourceUrl, foo, Foo.class); assertThat(response.getStatusCode(), is(HttpStatus.CREATED)); - final String entityUrl = fooResourceUrl + "/" + response.getBody().getId(); + final String entityUrl = fooResourceUrl + "/" + response.getBody() + .getId(); restTemplate.delete(entityUrl); try { restTemplate.getForEntity(entityUrl, Foo.class); @@ -224,8 +233,10 @@ public class RestTemplateBasicLiveTest { return clientHttpRequest -> { final ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(clientHttpRequest.getBody(), updatedInstance); - clientHttpRequest.getHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); - clientHttpRequest.getHeaders().add(HttpHeaders.AUTHORIZATION, "Basic " + getBase64EncodedLogPass()); + clientHttpRequest.getHeaders() + .add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + clientHttpRequest.getHeaders() + .add(HttpHeaders.AUTHORIZATION, "Basic " + getBase64EncodedLogPass()); }; } diff --git a/spring-rest/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java b/spring-rest/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java index a4d8eb0908..a26801429e 100644 --- a/spring-rest/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java +++ b/spring-rest/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java @@ -20,7 +20,7 @@ import static org.junit.Assert.assertTrue; public class TestRestTemplateBasicLiveTest { private RestTemplate restTemplate; - private static final String FOO_RESOURCE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest/myfoos"; + private static final String FOO_RESOURCE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest/foos"; private static final String URL_SECURED_BY_AUTHENTICATION = "http://httpbin.org/basic-auth/user/passwd"; private static final String BASE_URL = "http://localhost:" + APPLICATION_PORT + "/spring-rest"; diff --git a/spring-rest/src/test/java/org/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java b/spring-rest/src/test/java/org/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java index 1dae559371..478e4948dc 100644 --- a/spring-rest/src/test/java/org/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java +++ b/spring-rest/src/test/java/org/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java @@ -1,6 +1,11 @@ package org.baeldung.web.controller; -import com.fasterxml.jackson.databind.ObjectMapper; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.HashMap; + import org.baeldung.config.WebConfig; import org.baeldung.web.dto.HeavyResource; import org.baeldung.web.dto.HeavyResourceAddressOnly; @@ -16,11 +21,7 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import java.util.HashMap; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.fasterxml.jackson.databind.ObjectMapper; @RunWith(SpringJUnit4ClassRunner.class) diff --git a/spring-rest/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java b/spring-rest/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java deleted file mode 100644 index 347b683b2d..0000000000 --- a/spring-rest/src/test/java/org/baeldung/web/test/RequestMappingLiveTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.baeldung.web.test; - -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; - -import org.junit.Test; - -import io.restassured.RestAssured; - -public class RequestMappingLiveTest { - private static String BASE_URI = "http://localhost:8082/spring-rest/ex/"; - - @Test - public void givenSimplePath_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "foos").then().assertThat().body(equalTo("Simple Get some Foos")); - } - - @Test - public void whenPostFoos_thenOk() { - RestAssured.given().accept("text/html").post(BASE_URI + "foos").then().assertThat().body(equalTo("Post some Foos")); - } - - @Test - public void givenOneHeader_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").header("key", "val").get(BASE_URI + "foos").then().assertThat().body(equalTo("Get some Foos with Header")); - } - - @Test - public void givenMultipleHeaders_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").headers("key1", "val1", "key2", "val2").get(BASE_URI + "foos").then().assertThat().body(equalTo("Get some Foos with Header")); - } - - @Test - public void givenAcceptHeader_whenGetFoos_thenOk() { - RestAssured.given().accept("application/json").get(BASE_URI + "foos").then().assertThat().body(containsString("Get some Foos with Header New")); - } - - @Test - public void givenPathVariable_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "foos/1").then().assertThat().body(equalTo("Get a specific Foo with id=1")); - } - - @Test - public void givenMultiplePathVariable_whenGetFoos_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "foos/1/bar/2").then().assertThat().body(equalTo("Get a specific Bar with id=2 from a Foo with id=1")); - } - - @Test - public void givenPathVariable_whenGetBars_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "bars/1").then().assertThat().body(equalTo("Get a specific Bar with id=1")); - } - - @Test - public void givenParams_whenGetBars_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "bars?id=100&second=something").then().assertThat().body(equalTo("Get a specific Bar with id=100")); - } - - @Test - public void whenGetFoosOrBars_thenOk() { - RestAssured.given().accept("text/html").get(BASE_URI + "advanced/foos").then().assertThat().body(equalTo("Advanced - Get some Foos or Bars")); - RestAssured.given().accept("text/html").get(BASE_URI + "advanced/bars").then().assertThat().body(equalTo("Advanced - Get some Foos or Bars")); - } -} diff --git a/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 b/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 index 78d5d3fcf3..f0a4a9d3fd 100644 --- a/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 +++ b/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 @@ -3,14 +3,14 @@ GET 0 HTTP/1.1 200 OK 10 -Server: nginx/1.10.0 (Ubuntu) -Date: Thu, 09 Mar 2017 10:17:25 GMT Content-Type: text/plain Content-Length: 1759 -Last-Modified: Tue, 27 May 2014 02:35:47 GMT Connection: keep-alive -ETag: "5383fa03-6df" Accept-Ranges: bytes +Server: nginx/1.10.0 (Ubuntu) +Date: Fri, 23 Jun 2017 15:44:52 GMT +Last-Modified: Tue, 27 May 2014 02:35:47 GMT +ETag: "5383fa03-6df" OkHttp-Sent-Millis: 1489054646765 OkHttp-Received-Millis: 1489054646966 diff --git a/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 b/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 index 82c93f0a86..c202030c3f 100644 --- a/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 +++ b/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 @@ -4,10 +4,10 @@ GET HTTP/1.1 301 Moved Permanently 8 Server: nginx/1.10.0 (Ubuntu) -Date: Thu, 09 Mar 2017 10:17:25 GMT +Date: Sat, 24 Jun 2017 01:06:43 GMT Content-Type: text/html Content-Length: 194 Connection: keep-alive Location: https://publicobject.com/helloworld.txt -OkHttp-Sent-Millis: 1489054646977 -OkHttp-Received-Millis: 1489054647185 +OkHttp-Sent-Millis: 1498266403462 +OkHttp-Received-Millis: 1498266403727 diff --git a/spring-rest/src/test/resources/cache/journal b/spring-rest/src/test/resources/cache/journal index 44b709c179..4640ee324c 100644 --- a/spring-rest/src/test/resources/cache/journal +++ b/spring-rest/src/test/resources/cache/journal @@ -10,3 +10,54 @@ CLEAN 2d9345a30d2cc31bb3091d70a8ef6c18 7618 1759 READ 4b217e04ba52215f3a6b64d28f6729c6 DIRTY 4b217e04ba52215f3a6b64d28f6729c6 CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 2d9345a30d2cc31bb3091d70a8ef6c18 +DIRTY 2d9345a30d2cc31bb3091d70a8ef6c18 +CLEAN 2d9345a30d2cc31bb3091d70a8ef6c18 7618 1759 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 2d9345a30d2cc31bb3091d70a8ef6c18 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 2d9345a30d2cc31bb3091d70a8ef6c18 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 2d9345a30d2cc31bb3091d70a8ef6c18 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 2d9345a30d2cc31bb3091d70a8ef6c18 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 2d9345a30d2cc31bb3091d70a8ef6c18 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 2d9345a30d2cc31bb3091d70a8ef6c18 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 diff --git a/spring-roo/README.md b/spring-roo/README.md new file mode 100644 index 0000000000..b63b6f35d4 --- /dev/null +++ b/spring-roo/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +[Quick Guide to Spring Roo](http://www.baeldung.com/spring-roo) diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java index fa10799caa..b3c98c3e71 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/Application.java @@ -2,15 +2,16 @@ package org.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @EnableAutoConfiguration -@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*"), - @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleentrypoints.*") }) -public class Application { +@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.voter.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleauthproviders.*"), + @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multiplelogin.*"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.baeldung.multipleentrypoints.*") }) +public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(Application.class, args); } diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/SetupData.java b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/SetupData.java index 631c8dfc58..2cc86167e2 100644 --- a/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/SetupData.java +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/persistence/SetupData.java @@ -12,6 +12,7 @@ import org.baeldung.persistence.model.Organization; import org.baeldung.persistence.model.Privilege; import org.baeldung.persistence.model.User; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; @Component @@ -25,6 +26,9 @@ public class SetupData { @Autowired private OrganizationRepository organizationRepository; + @Autowired + private PasswordEncoder encoder; + @PostConstruct public void init() { initOrganizations(); @@ -38,14 +42,14 @@ public class SetupData { // final User user1 = new User(); user1.setUsername("john"); - user1.setPassword("123"); + user1.setPassword(encoder.encode("123")); user1.setPrivileges(new HashSet(Arrays.asList(privilege1))); user1.setOrganization(organizationRepository.findByName("FirstOrg")); userRepository.save(user1); // final User user2 = new User(); user2.setUsername("tom"); - user2.setPassword("111"); + user2.setPassword(encoder.encode("111")); user2.setPrivileges(new HashSet(Arrays.asList(privilege1, privilege2))); user2.setOrganization(organizationRepository.findByName("SecondOrg")); userRepository.save(user2); diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/ApplicationLiveTest.java similarity index 84% rename from spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java rename to spring-security-mvc-boot/src/test/java/org/baeldung/web/ApplicationLiveTest.java index dc5c265ed8..371e53070d 100644 --- a/spring-security-mvc-boot/src/test/java/org/baeldung/web/LiveTest.java +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/ApplicationLiveTest.java @@ -2,20 +2,18 @@ package org.baeldung.web; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; - -import org.baeldung.persistence.model.Foo; -import org.junit.Test; -import org.springframework.http.MediaType; - import io.restassured.RestAssured; import io.restassured.authentication.FormAuthConfig; import io.restassured.response.Response; import io.restassured.specification.RequestSpecification; -public class LiveTest { +import org.baeldung.persistence.model.Foo; +import org.junit.Test; +import org.springframework.http.MediaType; - private final FormAuthConfig formAuthConfig = new FormAuthConfig("http://localhost:8082/spring-security-mvc-boot/login", "username", "password"); +public class ApplicationLiveTest { + @Test public void givenUserWithReadPrivilegeAndHasPermission_whenGetFooById_thenOK() { final Response response = givenAuth("john", "123").get("http://localhost:8082/spring-security-mvc-boot/foos/1"); @@ -31,7 +29,7 @@ public class LiveTest { @Test public void givenUserWithWritePrivilegeAndHasPermission_whenPostFoo_thenOk() { - final Response response = givenAuth("tom", "111").contentType(MediaType.APPLICATION_JSON_VALUE).body(new Foo("sample")).post("http://localhost:8082/spring-security-mvc-boot/foos"); + final Response response = givenAuth("tom", "111").and().body(new Foo("sample")).and().contentType(MediaType.APPLICATION_JSON_VALUE).post("http://localhost:8082/spring-security-mvc-boot/foos"); assertEquals(201, response.getStatusCode()); assertTrue(response.asString().contains("id")); } @@ -62,6 +60,6 @@ public class LiveTest { // private RequestSpecification givenAuth(String username, String password) { - return RestAssured.given().auth().form(username, password, formAuthConfig); + return RestAssured.given().log().uri().auth().form(username, password, new FormAuthConfig("/spring-security-mvc-boot/login","username","password")); } } \ No newline at end of file diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java index 3dd4b236f9..503354256f 100644 --- a/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java @@ -21,22 +21,22 @@ import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.boot.test.context.SpringBootTest; @RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = { MvcConfig.class, SecurityConfig.class, PersistenceConfig.class }) +@SpringBootTest(classes = {MvcConfig.class, SecurityConfig.class, PersistenceConfig.class}) @WebAppConfiguration public class CustomUserDetailsServiceIntegrationTest { - public static final String USERNAME = "user"; - public static final String PASSWORD = "pass"; - public static final String USERNAME2 = "user2"; + private static final String USERNAME = "user"; + private static final String PASSWORD = "pass"; + private static final String USERNAME2 = "user2"; @Autowired - UserRepository myUserRepository; + private UserRepository myUserRepository; @Autowired - AuthenticationProvider authenticationProvider; + private AuthenticationProvider authenticationProvider; @Autowired - PasswordEncoder passwordEncoder; + private PasswordEncoder passwordEncoder; // diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationTests.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java similarity index 97% rename from spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationTests.java rename to spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java index 0d70cd64e4..9ef09f1f67 100644 --- a/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationTests.java +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java @@ -16,7 +16,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = MultipleAuthProvidersApplication.class) -public class MultipleAuthProvidersApplicationTests { +public class MultipleAuthProvidersApplicationIntegrationTest { @Autowired private TestRestTemplate restTemplate; diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java index 737b716209..157480c3f1 100644 --- a/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java +++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java @@ -21,6 +21,7 @@ import static org.springframework.security.test.web.servlet.request.SecurityMock @WebAppConfiguration @SpringBootTest(classes = MultipleEntryPointsApplication.class) public class MultipleEntryPointsIntegrationTest { + @Autowired private WebApplicationContext wac; diff --git a/spring-security-mvc-digest-auth/README.md b/spring-security-mvc-digest-auth/README.md index 8b79b6b113..be0bf0a675 100644 --- a/spring-security-mvc-digest-auth/README.md +++ b/spring-security-mvc-digest-auth/README.md @@ -7,3 +7,5 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Article: - [Spring Security Digest Authentication](http://www.baeldung.com/spring-security-digest-authentication) +- [RestTemplate with Digest Authentication](http://www.baeldung.com/resttemplate-digest-authentication) + diff --git a/spring-security-mvc-digest-auth/pom.xml b/spring-security-mvc-digest-auth/pom.xml index 50fd0fa479..202d98da54 100644 --- a/spring-security-mvc-digest-auth/pom.xml +++ b/spring-security-mvc-digest-auth/pom.xml @@ -84,6 +84,18 @@ ${org.springframework.version} + + org.springframework + spring-oxm + ${org.springframework.version} + + + + org.springframework + spring-web + ${org.springframework.version} + + @@ -108,6 +120,39 @@ ${guava.version} + + org.apache.httpcomponents + httpcore + ${httpcore.version} + + + commons-logging + commons-logging + + + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + commons-logging + commons-logging + + + + + + + org.springframework + spring-test + ${org.springframework.version} + test + + + diff --git a/spring-security-rest-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java b/spring-security-mvc-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java similarity index 99% rename from spring-security-rest-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java rename to spring-security-mvc-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java index 49487da545..1e6f213305 100644 --- a/spring-security-rest-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java +++ b/spring-security-mvc-digest-auth/src/main/java/org/baeldung/client/HttpComponentsClientHttpRequestFactoryDigestAuth.java @@ -1,7 +1,5 @@ package org.baeldung.client; -import java.net.URI; - import org.apache.http.HttpHost; import org.apache.http.client.AuthCache; import org.apache.http.client.HttpClient; @@ -13,6 +11,8 @@ import org.apache.http.protocol.HttpContext; import org.springframework.http.HttpMethod; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import java.net.URI; + public class HttpComponentsClientHttpRequestFactoryDigestAuth extends HttpComponentsClientHttpRequestFactory { HttpHost host; diff --git a/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/ClientConfig.java b/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/ClientConfig.java new file mode 100644 index 0000000000..f305321f13 --- /dev/null +++ b/spring-security-mvc-digest-auth/src/main/java/org/baeldung/spring/ClientConfig.java @@ -0,0 +1,44 @@ +package org.baeldung.spring; + +import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.baeldung.client.HttpComponentsClientHttpRequestFactoryDigestAuth; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ClientConfig { + private static final String DEFAULT_USER = "user1"; + private static final String DEFAULT_PASS = "user1Pass"; + + public ClientConfig() { + super(); + } + + @Bean + public RestTemplate restTemplate() { + HttpHost host = new HttpHost("localhost", 8080, "http"); + CloseableHttpClient client = HttpClientBuilder.create(). + setDefaultCredentialsProvider(provider()).useSystemProperties().build(); + HttpComponentsClientHttpRequestFactory requestFactory = + new HttpComponentsClientHttpRequestFactoryDigestAuth(host, client); + + return new RestTemplate(requestFactory); + } + + private CredentialsProvider provider() { + CredentialsProvider provider = new BasicCredentialsProvider(); + UsernamePasswordCredentials credentials = + new UsernamePasswordCredentials("user1", "user1Pass"); + provider.setCredentials(AuthScope.ANY, credentials); + return provider; + } + +} \ No newline at end of file diff --git a/spring-security-rest-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java b/spring-security-mvc-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java similarity index 50% rename from spring-security-rest-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java rename to spring-security-mvc-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java index 83e888e793..90c2a29968 100644 --- a/spring-security-rest-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java +++ b/spring-security-mvc-digest-auth/src/test/java/org/baeldung/client/RawClientLiveTest.java @@ -1,49 +1,47 @@ package org.baeldung.client; -import java.io.IOException; -import java.util.Timer; -import java.util.TimerTask; - import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.baeldung.client.spring.ClientConfig; +import org.baeldung.spring.ClientConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; + @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { ClientConfig.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = {ClientConfig.class}, loader = AnnotationConfigContextLoader.class) public class RawClientLiveTest { // tests @Test - public final void whenSecuredRestApiIsConsumed_then200OK() throws ClientProtocolException, IOException { - final CloseableHttpClient httpClient = HttpClientBuilder.create().build(); + public void whenSecuredRestApiIsConsumed_then200OK() throws IOException { + CloseableHttpClient httpClient = HttpClientBuilder.create().build(); - final int timeout = 20; // seconds - final RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeout).setConnectTimeout(timeout).setSocketTimeout(timeout).build(); - final HttpGet getMethod = new HttpGet("http://localhost:8082/spring-security-rest-basic-auth/api/bars/1"); + int timeout = 20; // seconds + RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeout) + .setConnectTimeout(timeout).setSocketTimeout(timeout).build(); + HttpGet getMethod = new HttpGet("http://localhost:8082/spring-security-rest-basic-auth/api/bars/1"); getMethod.setConfig(requestConfig); - final int hardTimeout = 5; // seconds - final TimerTask task = new TimerTask() { + int hardTimeout = 5; // seconds + TimerTask task = new TimerTask() { @Override public void run() { - if (getMethod != null) { - getMethod.abort(); - } + getMethod.abort(); } }; new Timer(true).schedule(task, hardTimeout * 1000); - final HttpResponse response = httpClient.execute(getMethod); + HttpResponse response = httpClient.execute(getMethod); System.out.println("HTTP Status of response: " + response.getStatusLine().getStatusCode()); } diff --git a/spring-security-mvc-socket/.gitignore b/spring-security-mvc-socket/.gitignore new file mode 100644 index 0000000000..6daae96b0b --- /dev/null +++ b/spring-security-mvc-socket/.gitignore @@ -0,0 +1,5 @@ +node_modules +.idea +target +*.iml +out \ No newline at end of file diff --git a/spring-security-mvc-socket/README.md b/spring-security-mvc-socket/README.md new file mode 100644 index 0000000000..2144765a04 --- /dev/null +++ b/spring-security-mvc-socket/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Intro to Security and WebSockets](http://www.baeldung.com/intro-to-security-and-websockets) \ No newline at end of file diff --git a/spring-security-mvc-socket/pom.xml b/spring-security-mvc-socket/pom.xml new file mode 100644 index 0000000000..c1715d36d2 --- /dev/null +++ b/spring-security-mvc-socket/pom.xml @@ -0,0 +1,181 @@ + + + 4.0.0 + com.baeldung.springsecuredsockets + spring-security-mvc-socket + war + 1.0.0 + spring-security-mvc-socket + + 4.3.8.RELEASE + 4.2.3.RELEASE + 2.8.7 + 1.7.25 + + + + + org.springframework + spring-core + ${springframework.version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-web + ${springframework.version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-webmvc + ${springframework.version} + + + commons-logging + commons-logging + + + + + + + org.springframework.security + spring-security-web + ${springsecurity.version} + + + org.springframework.security + spring-security-config + ${springsecurity.version} + + + + + org.springframework.data + spring-data-jpa + 1.11.3.RELEASE + + + org.hibernate + hibernate-core + 5.2.10.Final + + + com.h2database + h2 + 1.4.196 + + + + + org.springframework + spring-websocket + ${springframework.version} + + + org.springframework + spring-messaging + ${springframework.version} + + + org.springframework.security + spring-security-messaging + ${springsecurity.version} + + + + + org.slf4j + jcl-over-slf4j + ${slf4j.version} + + + ch.qos.logback + logback-classic + 1.2.3 + + + + + javax.servlet + javax.servlet-api + 3.1.0 + + + javax.servlet.jsp.jstl + jstl-api + 1.2 + + + javax.servlet.jsp + javax.servlet.jsp-api + 2.3.1 + + + javax.servlet + jstl + 1.2 + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + + + + + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + /spring-security-mvc-socket + + + + org.apache.maven.plugins + maven-war-plugin + 3.0.0 + + src/main/webapp + false + + + + + spring-security-mvc-socket + + \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java new file mode 100644 index 0000000000..da687a328a --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java @@ -0,0 +1,56 @@ +package com.baeldung.springsecuredsockets.config; + +import org.h2.tools.Server; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.resource.PathResourceResolver; +import org.springframework.web.servlet.view.JstlView; +import org.springframework.web.servlet.view.UrlBasedViewResolver; +import java.sql.SQLException; + +@Configuration +@EnableWebMvc +@EnableJpaRepositories +@ComponentScan("com.baeldung.springsecuredsockets") +@Import({ SecurityConfig.class, DataStoreConfig.class, SocketBrokerConfig.class, SocketSecurityConfig.class }) +public class AppConfig extends WebMvcConfigurerAdapter { + + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + registry.addViewController("/login").setViewName("login"); + registry.addViewController("/secured/socket").setViewName("socket"); + registry.addViewController("/secured/success").setViewName("success"); + registry.addViewController("/denied").setViewName("denied"); + } + + @Bean + public UrlBasedViewResolver viewResolver() { + final UrlBasedViewResolver bean = new UrlBasedViewResolver(); + bean.setPrefix("/WEB-INF/jsp/"); + bean.setSuffix(".jsp"); + bean.setViewClass(JstlView.class); + return bean; + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/resources/**") + .addResourceLocations("/", "/resources/") + .setCachePeriod(3600) + .resourceChain(true) + .addResolver(new PathResourceResolver()); + } + + // View H2 + @Bean(initMethod="start", destroyMethod="stop") + public Server h2Console () throws SQLException { + return Server.createWebServer("-web","-webAllowOthers","-webDaemon","-webPort", "8082"); + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java new file mode 100644 index 0000000000..2246c0055b --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java @@ -0,0 +1,69 @@ +package com.baeldung.springsecuredsockets.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.Database; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; +import java.util.Properties; + +@Configuration +@ComponentScan("com.baeldung.springsecuredsockets") +@EnableTransactionManagement +@EnableJpaRepositories("com.baeldung.springsecuredsockets.repositories") +public class DataStoreConfig { + + //Configuration for embededded data store through H2 + @Bean + public DataSource dataSource() { + return new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .setName("socketDB") + .addScript("classpath:schema.sql") + .addScript("classpath:data.sql") + .setScriptEncoding("UTF-8") + .continueOnError(true) + .ignoreFailedDrops(true) + .build(); + } + + @Bean + public JpaVendorAdapter jpaVendorAdapter() { + final HibernateJpaVendorAdapter bean = new HibernateJpaVendorAdapter(); + bean.setDatabase(Database.H2); + bean.setGenerateDdl(true); + return bean; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + final LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean(); + bean.setDataSource(dataSource); + bean.setJpaVendorAdapter(jpaVendorAdapter()); + bean.setPackagesToScan("com.baeldung.springsecuredsockets"); + + //Set properties on Hibernate + Properties properties = new Properties(); + properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + properties.setProperty("hibernate.hbm2ddl.auto", "update"); + bean.setJpaProperties(properties); + + return bean; + } + + @Bean + public JpaTransactionManager transactionManager(EntityManagerFactory emf) { + return new JpaTransactionManager(emf); + } + +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java new file mode 100644 index 0000000000..7006619d35 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java @@ -0,0 +1,136 @@ +package com.baeldung.springsecuredsockets.config; + +import com.baeldung.springsecuredsockets.security.CustomAccessDeniedHandler; +import com.baeldung.springsecuredsockets.security.CustomDaoAuthenticationProvider; +import com.baeldung.springsecuredsockets.security.CustomLoginSuccessHandler; +import com.baeldung.springsecuredsockets.security.CustomLogoutSuccessHandler; +import com.baeldung.springsecuredsockets.security.CustomUserDetailsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +/** + * @EnableGlobalAuthentication annotates: + * @EnableWebSecurity + * @EnableWebMvcSecurity + * @EnableGlobalMethodSecurity Passing in 'prePostEnabled = true' allows: + *

+ * Pre/Post annotations such as: + * @PreAuthorize("hasRole('ROLE_USER')") + */ + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +@EnableWebSecurity +@ComponentScan("com.baeldung.springsecuredsockets") +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private CustomUserDetailsService customUserDetailsService; + + /** + * Login, Logout, Success, and Access Denied beans/handlers + */ + + @Bean + public AccessDeniedHandler accessDeniedHandler() { + return new CustomAccessDeniedHandler(); + } + + @Bean + public LogoutSuccessHandler logoutSuccessHandler() { + return new CustomLogoutSuccessHandler(); + } + + @Bean + public AuthenticationSuccessHandler loginSuccessHandler() { + return new CustomLoginSuccessHandler(); + } + + /** + * Authentication beans + */ + + @Bean + public PasswordEncoder encoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public DaoAuthenticationProvider authenticationProvider() { + final DaoAuthenticationProvider bean = new CustomDaoAuthenticationProvider(); + bean.setUserDetailsService(customUserDetailsService); + bean.setPasswordEncoder(encoder()); + return bean; + } + + /** + * Order of precedence is very important. + *

+ * Matching occurs from top to bottom - so, the topmost match succeeds first. + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() + .antMatchers("/", "/index", "/authenticate") + .permitAll() + .antMatchers("/secured/**/**", + "/secured/success", "/secured/socket", "/secured/success") + .authenticated() + .anyRequest().authenticated() + .and() + .formLogin() + .loginPage("/login").permitAll() + .usernameParameter("username") + .passwordParameter("password") + .loginProcessingUrl("/authenticate") + .successHandler(loginSuccessHandler()) + .failureUrl("/denied").permitAll() + .and() + .logout() + .logoutSuccessHandler(logoutSuccessHandler()) + .and() + /** + * Applies to User Roles - not to login failures or unauthenticated access attempts. + */ + .exceptionHandling() + .accessDeniedHandler(accessDeniedHandler()) + .and() + .authenticationProvider(authenticationProvider()); + + /** Disabled for local testing */ + http + .csrf().disable(); + + /** This is solely required to support H2 console viewing in Spring MVC with Spring Security */ + http + .headers() + .frameOptions() + .disable(); + } + + @Override + protected void configure(final AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(authenticationProvider()); + } + + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring().antMatchers("/resources/**"); + } + +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java new file mode 100644 index 0000000000..5affbd4c0e --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java @@ -0,0 +1,27 @@ +package com.baeldung.springsecuredsockets.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; + + +@Configuration +@EnableWebSocketMessageBroker +@ComponentScan("com.baeldung.springsecuredsockets.controllers") +public class SocketBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer { + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/secured/history"); + config.setApplicationDestinationPrefixes("/spring-security-mvc-socket"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/secured/chat").withSockJS(); + } +} + diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketSecurityConfig.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketSecurityConfig.java new file mode 100644 index 0000000000..a37dfb7672 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/SocketSecurityConfig.java @@ -0,0 +1,21 @@ +package com.baeldung.springsecuredsockets.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.messaging.MessageSecurityMetadataSourceRegistry; +import org.springframework.security.config.annotation.web.socket.AbstractSecurityWebSocketMessageBrokerConfigurer; + +@Configuration +public class SocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer { + + @Override + protected boolean sameOriginDisabled() { + return true; + } + + @Override + protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { + messages + .simpDestMatchers("/secured/**").authenticated() + .anyMessage().authenticated(); + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java new file mode 100644 index 0000000000..20311426c7 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java @@ -0,0 +1,24 @@ +package com.baeldung.springsecuredsockets.config; + +import org.hibernate.cfg.Configuration; +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; + +public class WebAppInitializer implements WebApplicationInitializer { + + @Override + public void onStartup(ServletContext container) throws ServletException { + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + context.register(AppConfig.class); + context.setServletContext(container); + + ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(context)); + servlet.setLoadOnStartup(1); + servlet.addMapping("/"); + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java new file mode 100644 index 0000000000..3d10dad391 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java @@ -0,0 +1,18 @@ +package com.baeldung.springsecuredsockets.controllers; + +import org.springframework.security.web.csrf.CsrfToken; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; + +@Controller +public class CsrfTokenController { + @GetMapping("/csrf") + public @ResponseBody + String getCsrfToken(HttpServletRequest request) { + CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName()); + return csrf.getToken(); + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java new file mode 100644 index 0000000000..68c5e306d8 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java @@ -0,0 +1,28 @@ +package com.baeldung.springsecuredsockets.controllers; + +import com.baeldung.springsecuredsockets.transfer.socket.Message; +import com.baeldung.springsecuredsockets.transfer.socket.OutputMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Controller; +import java.text.SimpleDateFormat; +import java.util.Date; + +@Controller +public class SocketController { + + @Autowired + private SimpMessagingTemplate simpMessagingTemplate; + private static final Logger log = LoggerFactory.getLogger(SocketController.class); + + @MessageMapping("/secured/chat") + @SendTo("/secured/history") + public OutputMessage send(Message msg) throws Exception { + OutputMessage out = new OutputMessage(msg.getFrom(), msg.getText(), new SimpleDateFormat("HH:mm").format(new Date())); + return out; + } +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java new file mode 100644 index 0000000000..09fee9a31b --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java @@ -0,0 +1,51 @@ +package com.baeldung.springsecuredsockets.domain; + +import javax.persistence.*; +import java.util.Set; + +@Entity +@Table(name = "role") +public class Role { + + @Id + //Slight increase in performance over GenerationType.IDENTITY + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "role_id", updatable = false, nullable = false) + private long role_id; + + @Column(name = "role", nullable = false) + private String role; + + /** + * Many to Many Example - see Role. + *

+ * One User many have many Roles. + * Each Role may be assigned to many Users. + */ + @ManyToMany(mappedBy = "roles", fetch = FetchType.EAGER) + private Set users; + + public long getRole_id() { + return role_id; + } + + public void setRole_id(long role_id) { + this.role_id = role_id; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public Set getUsers() { + return users; + } + + public void setUsers(Set users) { + this.users = users; + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/domain/User.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/domain/User.java new file mode 100644 index 0000000000..8f84b2246d --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/domain/User.java @@ -0,0 +1,65 @@ +package com.baeldung.springsecuredsockets.domain; + +import javax.persistence.*; +import java.util.Set; + +//Custom User Model + +@Entity +@Table(name = "user") +public class User { + + @Id + //Slight increase in performance over GenerationType.IDENTITY + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "user_id", updatable = false, nullable = false) + private long user_id; + + @Column(name = "username", nullable = false) + private String username; + + @Column(name = "password", nullable = false) + private String password; + + /** + * Many to Many Example - see Role. + *

+ * One User many have many Roles. + * Each Role may be assigned to many Users. + */ + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) + private Set roles; + + public long getUser_id() { + return user_id; + } + + public void setUser_id(long user_id) { + this.user_id = user_id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Set getRoles() { + return roles; + } + + public void setRoles(Set roles) { + this.roles = roles; + } +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/repositories/UserRepository.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/repositories/UserRepository.java new file mode 100644 index 0000000000..fae5cfac6e --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/repositories/UserRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.springsecuredsockets.repositories; + + +import com.baeldung.springsecuredsockets.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends JpaRepository { + User findByUsername(String username); +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java new file mode 100644 index 0000000000..0ab31a9c86 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java @@ -0,0 +1,23 @@ +package com.baeldung.springsecuredsockets.security; + +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Applies to User Roles - not to login failures or unauthenticaed access attempts. + */ + +public class CustomAccessDeniedHandler implements AccessDeniedHandler { + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc) throws IOException, ServletException { + response.setStatus(HttpStatus.BAD_REQUEST.value()); + response.sendRedirect(request.getContextPath() + "/denied"); + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomDaoAuthenticationProvider.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomDaoAuthenticationProvider.java new file mode 100644 index 0000000000..576495bedf --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomDaoAuthenticationProvider.java @@ -0,0 +1,42 @@ +package com.baeldung.springsecuredsockets.security; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +public class CustomDaoAuthenticationProvider extends DaoAuthenticationProvider { + + Logger log = LoggerFactory.getLogger(CustomDaoAuthenticationProvider.class); + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + + String name = authentication.getName(); + String password = authentication.getCredentials().toString(); + UserDetails u = null; + + try { + u = getUserDetailsService().loadUserByUsername(name); + } catch (UsernameNotFoundException ex) { + log.error("User '" + name + "' not found"); + } catch (Exception e) { + log.error("Exception in CustomDaoAuthenticationProvider: " + e); + } + + if (u != null) { + if (u.getPassword().equals(password)) { + return new UsernamePasswordAuthenticationToken(u, password, u.getAuthorities()); + } + } + + throw new BadCredentialsException(messages.getMessage("CustomDaoAuthenticationProvider.badCredentials", "Bad credentials")); + + } +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java new file mode 100644 index 0000000000..281fd0f163 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java @@ -0,0 +1,25 @@ +package com.baeldung.springsecuredsockets.security; + +import com.baeldung.springsecuredsockets.domain.User; +import com.baeldung.springsecuredsockets.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class CustomLoginSuccessHandler implements AuthenticationSuccessHandler { + + @Autowired + UserRepository userRepository; + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { + User user = userRepository.findByUsername(authentication.getName()); + response.setStatus(HttpStatus.OK.value()); + response.sendRedirect(request.getContextPath() + "/secured/success"); + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java new file mode 100644 index 0000000000..620e75fb39 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java @@ -0,0 +1,21 @@ +package com.baeldung.springsecuredsockets.security; + + +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class CustomLogoutSuccessHandler implements LogoutSuccessHandler { + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException { + + response.setStatus(HttpStatus.OK.value()); + response.sendRedirect(request.getContextPath() + "/index"); + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java new file mode 100644 index 0000000000..a0eb4d4bde --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java @@ -0,0 +1,51 @@ +package com.baeldung.springsecuredsockets.security; + +import com.baeldung.springsecuredsockets.domain.Role; +import com.baeldung.springsecuredsockets.domain.User; +import com.baeldung.springsecuredsockets.repositories.UserRepository; +import com.baeldung.springsecuredsockets.transfer.user.CustomUserDetails; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.HashSet; + +@Service() +public class CustomUserDetailsService implements UserDetailsService { + + Logger log = LoggerFactory.getLogger(CustomUserDetailsService.class); + + @Autowired + private UserRepository userRepository; + + public CustomUserDetailsService() { + super(); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + try { + User user = userRepository.findByUsername(username); + if (user != null) return new CustomUserDetails(user, getAuthorities(user)); + } catch (Exception ex) { + log.error("Exception in CustomUserDetailsService: " + ex); + } + return null; + } + + private Collection getAuthorities(User user) { + Collection authorities = new HashSet<>(); + for (Role role : user.getRoles()) { + GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRole()); + authorities.add(grantedAuthority); + } + return authorities; + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/SecurityWebApplicationInitializer.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/SecurityWebApplicationInitializer.java new file mode 100644 index 0000000000..2fcc0d254a --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/security/SecurityWebApplicationInitializer.java @@ -0,0 +1,12 @@ +package com.baeldung.springsecuredsockets.security; + +import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; + +/** + * This is required to enable springSecurityFilterChain. + * + * Remember that Spring Security utilizes filters to intercept and manage requests + * according to the specified authorization and authentication rules + */ + +public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/Message.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/Message.java new file mode 100644 index 0000000000..024b386164 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/Message.java @@ -0,0 +1,20 @@ +package com.baeldung.springsecuredsockets.transfer.socket; + +public class Message { + + private String from; + private String text; + + public String getFrom() { + return from; + } + public void setFrom(String from) { + this.from = from; + } + public String getText() { + return text; + } + public void setText(String text) { + this.text = text; + } +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/OutputMessage.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/OutputMessage.java new file mode 100644 index 0000000000..1bfb8eabe4 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/socket/OutputMessage.java @@ -0,0 +1,17 @@ +package com.baeldung.springsecuredsockets.transfer.socket; + +public class OutputMessage extends Message { + + private String time; + + public OutputMessage(final String from, final String text, final String time) { + setFrom(from); + setText(text); + this.time = time; + } + + public String getTime() { + return time; + } + public void setTime(String time) { this.time = time; } +} diff --git a/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/user/CustomUserDetails.java b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/user/CustomUserDetails.java new file mode 100644 index 0000000000..18ccbb4586 --- /dev/null +++ b/spring-security-mvc-socket/src/main/java/com/baeldung/springsecuredsockets/transfer/user/CustomUserDetails.java @@ -0,0 +1,25 @@ +package com.baeldung.springsecuredsockets.transfer.user; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.User; + +import java.util.Collection; + +public class CustomUserDetails extends User { + + private com.baeldung.springsecuredsockets.domain.User user; + + public CustomUserDetails(com.baeldung.springsecuredsockets.domain.User user, Collection authorities) { + super(user.getUsername(), user.getPassword(), authorities); + this.user = user; + } + + public CustomUserDetails(com.baeldung.springsecuredsockets.domain.User user, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection authorities) { + super(user.getUsername(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.user = user; + } + + public com.baeldung.springsecuredsockets.domain.User getUser() { + return user; + } +} \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/resources/data.sql b/spring-security-mvc-socket/src/main/resources/data.sql new file mode 100644 index 0000000000..5137646609 --- /dev/null +++ b/spring-security-mvc-socket/src/main/resources/data.sql @@ -0,0 +1,18 @@ +INSERT INTO user (user_id, username, password) +VALUES (1, 'user', 'password'); +INSERT INTO user (user_id, username, password) +VALUES (2, 'admin','password'); +INSERT INTO user (user_id, username, password) +VALUES (3, 'mary','password'); + +INSERT INTO role (role_id, role) +VALUES (1, 'USER'); +INSERT INTO role (role_id, role) +VALUES (2, 'ADMIN'); + +INSERT INTO user_role (id, user_id, role_id) +VALUES (1, 1, 1); +INSERT INTO user_role (id, user_id, role_id) +VALUES (2, 2, 2); +INSERT INTO user_role (id, user_id, role_id) +VALUES (3, 3, 1); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/resources/schema.sql b/spring-security-mvc-socket/src/main/resources/schema.sql new file mode 100644 index 0000000000..2479b1c711 --- /dev/null +++ b/spring-security-mvc-socket/src/main/resources/schema.sql @@ -0,0 +1,26 @@ +DROP TABLE IF EXISTS user; +CREATE TABLE user ( + user_id INT(11) NOT NULL AUTO_INCREMENT, + username VARCHAR(45) NOT NULL , + password VARCHAR(45) NOT NULL , + UNIQUE KEY uni_user_username (username), + PRIMARY KEY (user_id) +); + +DROP TABLE IF EXISTS role; +CREATE TABLE role ( + role_id INT(11) NOT NULL AUTO_INCREMENT, + role VARCHAR(45) NOT NULL, + UNIQUE KEY uni_role_role (role), + PRIMARY KEY (role_id) +); + +/** JOIN TABLES */ + +DROP TABLE IF EXISTS user_role; +CREATE TABLE user_role( + id INT(11) NOT NULL AUTO_INCREMENT, + user_id INT(11) NOT NULL, + role_id INT(11) NOT NULL, + PRIMARY KEY (id) +); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/denied.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/denied.jsp new file mode 100644 index 0000000000..d61148b04f --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/denied.jsp @@ -0,0 +1,18 @@ +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> + + + + + Spring Secured Sockets + " rel="stylesheet"> + + + +

ACCESS DENIED!

+
+
+ Click to login. + + \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/index.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/index.jsp new file mode 100644 index 0000000000..d83338680e --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/index.jsp @@ -0,0 +1,30 @@ +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> + + + + + Spring Secured Sockets + " rel="stylesheet"> + + + + + + + + + + + + + +

Welcome!

+
+ {{greeting}} +
+
+ Click to login. + + \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/login.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/login.jsp new file mode 100644 index 0000000000..d50059c674 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/login.jsp @@ -0,0 +1,45 @@ +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> + + + + + Spring Secured Sockets + " rel="stylesheet"> + + + + + + + + + + + + + + + +

JSP Login Form


+
+ + + + + + + + + + + + +
User:
Password:
+
+ + + + + \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/socket.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/socket.jsp new file mode 100644 index 0000000000..b5807d74a6 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/socket.jsp @@ -0,0 +1,51 @@ +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> + + + + + Spring Secured Sockets + " rel="stylesheet"> + + + + + + + + + + + + + + + +

Socket Chat

+ +
+
+ +
+
+
+ + + +
+
+
+ + +

+
+
+ +Click to go back! +Click to start over (you will still be authenticated)! + + + + + \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/success.jsp b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/success.jsp new file mode 100644 index 0000000000..27e8f7aa44 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/WEB-INF/jsp/success.jsp @@ -0,0 +1,31 @@ +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> + + + + + Spring Secured Sockets + " rel="stylesheet"> + + + + + + + + + + + + + +

Congrats! You've logged in.

+ + Click to chat! + Click to start over (you will still be authenticated)! + + + + + \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/app.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/app.js new file mode 100644 index 0000000000..71a618a637 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/app.js @@ -0,0 +1,5 @@ +'use strict'; + +var angularApp = angular.module('angularApp', ['ngRoute']); + + diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/indexController.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/indexController.js new file mode 100644 index 0000000000..04c02e339b --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/indexController.js @@ -0,0 +1,12 @@ +'use strict'; + +angularApp + .controller('indexController', function ($scope) { + $scope.greeting = ''; + + $scope.initialize = function () { + $scope.greeting = "Howdy!" + }; + + $scope.initialize(); + }); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/loginController.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/loginController.js new file mode 100644 index 0000000000..07187d5327 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/loginController.js @@ -0,0 +1,6 @@ +'use strict'; + +angularApp + .controller('loginController', function ($scope) { + + }); diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/socketController.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/socketController.js new file mode 100644 index 0000000000..395bf85c4a --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/socketController.js @@ -0,0 +1,37 @@ +'use strict'; + +angularApp + .controller('socketController', function ($scope, SocketService) { + + $scope.stompClient = null; + $scope.sendEndpoint = '/secured/chat'; + $scope.subscribeEndpoint = '/secured/history'; + $scope.elems = { + connect: 'connect', + from: 'from', + text: 'text', + disconnect: 'disconnect', + conversationDiv: 'conversationDiv', + response: 'response' + }; + + $scope.connect = function (context) { + $scope.sendEndpoint = '/secured/chat'; + $scope.sendEndpoint = context + $scope.sendEndpoint ; + $scope.stompClient = SocketService.connect($scope.sendEndpoint, $scope.elems); + }; + + $scope.subscribe = function () { + $scope.stompClient.subscribe($scope.subscribeEndpoint, function (msgOut) { + SocketService.messageOut(JSON.parse(msgOut.body), $scope.elems); + }); + }; + + $scope.disconnect = function () { + SocketService.disconnect($scope.elems, $scope.stompClient); + }; + + $scope.sendMessage = function () { + SocketService.sendMessage( $scope.elems, $scope.stompClient, $scope.sendEndpoint); + }; + }); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/successController.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/successController.js new file mode 100644 index 0000000000..ccb972202d --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/controllers/successController.js @@ -0,0 +1,13 @@ +'use strict'; + +angularApp + .controller('successController', function ($scope) { + + $scope.successMsg = ''; + + $scope.initialize = function () { + $scope.successMsg = "You've logged in!"; + }; + + $scope.initialize(); + }); diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/routes/router.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/routes/router.js new file mode 100644 index 0000000000..70644f996d --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/routes/router.js @@ -0,0 +1,19 @@ +'use strict'; + +angularApp + .config(function ($routeProvider) { + $routeProvider + .when('/index', { + controller: 'indexController' + }) + .when('/login', { + controller: 'loginController' + }) + .when('/sockets', { + controller: 'socketController' + }) + .when('/success', { + controller: 'successController' + }) + .otherwise('/index'); + }); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/scripts/services/SocketService.js b/spring-security-mvc-socket/src/main/webapp/resources/scripts/services/SocketService.js new file mode 100644 index 0000000000..56930808a3 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/scripts/services/SocketService.js @@ -0,0 +1,46 @@ +'use strict'; + +function SocketService() { + var that = this, + idHelper = function(context) { + return document.getElementById(context); + }; + + that.setConnected = function (elems, connected) { + idHelper(elems.connect).disabled = connected; + idHelper(elems.disconnect).disabled = !connected; + idHelper(elems.conversationDiv).style.visibility = connected ? 'visible' : 'hidden'; + idHelper(elems.response).innerHTML = ''; + }; + + that.connect = function (endpoint, elems) { + var socket = new SockJS(endpoint), stompClient = Stomp.over(socket); + stompClient.connect({}, function (frame) { + that.setConnected(elems, true); + }); + return stompClient; + }; + + that.disconnect = function (elems, stompClient) { + if (stompClient !== null && stompClient !== undefined) stompClient.disconnect(); + that.setConnected(elems, false); + }; + + that.sendMessage = function (elems, stompClient, endpoint) { + stompClient.send(endpoint, {}, + JSON.stringify({ + 'from': idHelper(elems.from).value, + 'text': idHelper(elems.text).value + })); + }; + + that.messageOut = function (msg, elems) { + var r = idHelper(elems.response), p = document.createElement('p'); + p.style.wordWrap = 'break-word'; + p.appendChild(document.createTextNode(msg.from + ': ' + msg.text + ' (' + msg.time + ')')); + r.appendChild(p); + }; +} + +angularApp + .service('SocketService', SocketService); \ No newline at end of file diff --git a/spring-security-mvc-socket/src/main/webapp/resources/styles/style.css b/spring-security-mvc-socket/src/main/webapp/resources/styles/style.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spring-security-mvc-socket/src/main/webapp/resources/vendor/angular/angular-route.min.js b/spring-security-mvc-socket/src/main/webapp/resources/vendor/angular/angular-route.min.js new file mode 100644 index 0000000000..624dcb5d7b --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/vendor/angular/angular-route.min.js @@ -0,0 +1,16 @@ +/* + AngularJS v1.5.7 + (c) 2010-2016 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(F,d){'use strict';function x(t,l,g){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(b,e,a,c,k){function p(){m&&(g.cancel(m),m=null);h&&(h.$destroy(),h=null);n&&(m=g.leave(n),m.then(function(){m=null}),n=null)}function A(){var a=t.current&&t.current.locals;if(d.isDefined(a&&a.$template)){var a=b.$new(),c=t.current;n=k(a,function(a){g.enter(a,null,n||e).then(function(){!d.isDefined(z)||z&&!b.$eval(z)||l()});p()});h=c.scope=a;h.$emit("$viewContentLoaded"); +h.$eval(s)}else p()}var h,n,m,z=a.autoscroll,s=a.onload||"";b.$on("$routeChangeSuccess",A);A()}}}function w(d,l,g){return{restrict:"ECA",priority:-400,link:function(b,e){var a=g.current,c=a.locals;e.html(c.$template);var k=d(e.contents());if(a.controller){c.$scope=b;var p=l(a.controller,c);a.controllerAs&&(b[a.controllerAs]=p);e.data("$ngControllerController",p);e.children().data("$ngControllerController",p)}b[a.resolveAs||"$resolve"]=c;k(b)}}}var C=d.isArray,D=d.isObject,s=d.module("ngRoute",["ng"]).provider("$route", +function(){function t(b,e){return d.extend(Object.create(b),e)}function l(b,d){var a=d.caseInsensitiveMatch,c={originalPath:b,regexp:b},g=c.keys=[];b=b.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)(\*\?|[\?\*])?/g,function(b,a,d,c){b="?"===c||"*?"===c?"?":null;c="*"===c||"*?"===c?"*":null;g.push({name:d,optional:!!b});a=a||"";return""+(b?"":a)+"(?:"+(b?a:"")+(c&&"(.+?)"||"([^/]+)")+(b||"")+")"+(b||"")}).replace(/([\/$\*])/g,"\\$1");c.regexp=new RegExp("^"+b+"$",a?"i":"");return c}var g={};this.when= +function(b,e){var a;a=void 0;if(C(e)){a=a||[];for(var c=0,k=e.length;c").append(a).html();try{return a[0].nodeType===Na?M(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+M(b)})}catch(c){return M(d)}}function zc(a){try{return decodeURIComponent(a)}catch(b){}}function Ac(a){var b={};r((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="), +-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=zc(e),x(e)&&(f=x(f)?zc(f):!0,sa.call(b,e)?J(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Tb(a){var b=[];r(a,function(a,c){J(a)?r(a,function(a){b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))});return b.length?b.join("&"):""}function qb(a){return ja(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi, +":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function fe(a,b){var d,c,e=Oa.length;for(c=0;c/,">"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=db(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,d,c){a.$apply(function(){b.data("$injector",c);d(b)(a)})}]); +return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;E&&e.test(E.name)&&(d.debugInfoEnabled=!0,E.name=E.name.replace(e,""));if(E&&!f.test(E.name))return c();E.name=E.name.replace(f,"");ea.resumeBootstrap=function(a){r(a,function(a){b.push(a)});return c()};z(ea.resumeDeferredBootstrap)&&ea.resumeDeferredBootstrap()}function he(){E.name="NG_ENABLE_DEBUG_INFO!"+E.name;E.location.reload()}function ie(a){a=ea.element(a).injector();if(!a)throw za("test");return a.get("$$testability")}function Cc(a, +b){b=b||"_";return a.replace(je,function(a,c){return(c?b:"")+a.toLowerCase()})}function ke(){var a;if(!Dc){var b=rb();(pa=w(b)?E.jQuery:b?E[b]:void 0)&&pa.fn.on?(B=pa,R(pa.fn,{scope:Pa.scope,isolateScope:Pa.isolateScope,controller:Pa.controller,injector:Pa.injector,inheritedData:Pa.inheritedData}),a=pa.cleanData,pa.cleanData=function(b){for(var c,e=0,f;null!=(f=b[e]);e++)(c=pa._data(f,"events"))&&c.$destroy&&pa(f).triggerHandler("$destroy");a(b)}):B=U;ea.element=B;Dc=!0}}function sb(a,b,d){if(!a)throw za("areq", +b||"?",d||"required");return a}function Qa(a,b,d){d&&J(a)&&(a=a[a.length-1]);sb(z(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ra(a,b){if("hasOwnProperty"===a)throw za("badname",b);}function Ec(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g")+c[2];for(c=c[0];c--;)d=d.lastChild;f=ab(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";r(f,function(a){e.appendChild(a)}); +return e}function Pc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function U(a){if(a instanceof U)return a;var b;F(a)&&(a=W(a),b=!0);if(!(this instanceof U)){if(b&&"<"!=a.charAt(0))throw Wb("nosel");return new U(a)}if(b){b=E.document;var d;a=(d=Of.exec(a))?[b.createElement(d[1])]:(d=Oc(a,b))?d.childNodes:[]}Qc(this,a)}function Xb(a){return a.cloneNode(!0)}function wb(a,b){b||fb(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c=Ba?!1:"function"===typeof a&&/^(?:class\s|constructor\()/.test(Function.prototype.toString.call(a)+" ");return d?(c.unshift(null),new (Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=J(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d, +a))},get:d,annotate:db.$$annotate,has:function(b){return n.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Sa([],!0),n={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,da(b),!1)}),constant:d(function(a,b){Ra(a,"constant");n[a]=b;s[a]=b}),decorator:function(a,b){var c=p.get(a+"Provider"),d=c.$get;c.$get=function(){var a=I.invoke(d,c);return I.invoke(b,null, +{$delegate:a})}}}},p=n.$injector=h(n,function(a,b){ea.isString(b)&&l.push(b);throw Ha("unpr",l.join(" <- "));}),s={},V=h(s,function(a,b){var c=p.get(a+"Provider",b);return I.invoke(c.$get,c,void 0,a)}),I=V;n.$injectorProvider={$get:da(V)};var q=g(a),I=V.get("$injector");I.strictDi=b;r(q,function(a){a&&I.invoke(a)});return I}function Ye(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a, +function(a){if("a"===ua(a))return b=a,!0});return b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset;z(c)?c=c():Qb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):S(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=F(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a=== +b&&""===a||Qf(function(){c.$evalAsync(g)})});return g}]}function hb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;J(a)&&(a=a.join(" "));J(b)&&(b=b.join(" "));return a+" "+b}function Zf(a){F(a)&&(a=a.split(" "));var b=T();r(a,function(a){a.length&&(b[a]=!0)});return b}function Ia(a){return H(a)?a:{}}function $f(a,b,d,c){function e(a){try{a.apply(null,ta.call(arguments,1))}finally{if(V--,0===V)for(;I.length;)try{I.pop()()}catch(b){d.error(b)}}}function f(){y=null;g();h()}function g(){q=P(); +q=w(q)?null:q;na(q,D)&&(q=D);D=q}function h(){if(v!==k.url()||K!==q)v=k.url(),K=q,r(L,function(a){a(k.url(),q)})}var k=this,l=a.location,m=a.history,n=a.setTimeout,p=a.clearTimeout,s={};k.isMock=!1;var V=0,I=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){V++};k.notifyWhenNoOutstandingRequests=function(a){0===V?a():I.push(a)};var q,K,v=l.href,u=b.find("base"),y=null,P=c.history?function(){try{return m.state}catch(a){}}:A;g();K=q;k.url=function(b,d,e){w(e)&&(e=null);l!== +a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=K===e;if(v===b&&(!c.history||f))return k;var h=v&&Ja(v)===Ja(b);v=b;K=e;!c.history||h&&f?(h||(y=b),d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b,l.href!==b&&(y=b)):(m[d?"replaceState":"pushState"](e,"",b),g(),K=q);y&&(y=b);return k}return y||l.href.replace(/%27/g,"'")};k.state=function(){return q};var L=[],C=!1,D=null;k.onUrlChange=function(b){if(!C){if(c.history)B(a).on("popstate",f);B(a).on("hashchange", +f);C=!0}L.push(b);return b};k.$$applicationDestroyed=function(){B(a).off("hashchange popstate",f)};k.$$checkUrlChange=h;k.baseHref=function(){var a=u.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};k.defer=function(a,b){var c;V++;c=n(function(){delete s[c];e(a)},b||0);s[c]=!0;return c};k.defer.cancel=function(a){return s[a]?(delete s[a],p(a),e(A),!0):!1}}function ef(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new $f(a,c,b,d)}]}function ff(){this.$get= +function(){function a(a,c){function e(a){a!=n&&(p?p==a&&(p=a.n):p=a,f(a.n,a.p),f(a,n),n=a,n.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw O("$cacheFactory")("iid",a);var g=0,h=R({},c,{id:a}),k=T(),l=c&&c.capacity||Number.MAX_VALUE,m=T(),n=null,p=null;return b[a]={put:function(a,b){if(!w(b)){if(ll&&this.remove(p.key);return b}},get:function(a){if(l";b=la.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function N(a,b){try{a.addClass(b)}catch(c){}}function ba(a,b,c,d,e){a instanceof B||(a=B(a));for(var f=/\S+/,g=0,h=a.length;g< +h;g++){var k=a[g];k.nodeType===Na&&k.nodeValue.match(f)&&Pc(k,a[g]=E.document.createElement("span"))}var l=t(a,b,a,c,d,e);ba.$$addScopeClass(a);var n=null;return function(b,c,d){sb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var f=d.parentBoundTranscludeFn,g=d.transcludeControllers;d=d.futureParentElement;f&&f.$$boundTransclude&&(f=f.$$boundTransclude);n||(n=(d=d&&d[0])?"foreignobject"!==ua(d)&&ka.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==n?B(ca(n,B("
").append(a).html())): +c?Pa.clone.call(a):a;if(g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);ba.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function t(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,n,m,v,q;if(p)for(q=Array(c.length),n=0;nu.priority)break;if(x=u.scope)u.templateUrl||(H(x)?(X("new/isolated scope",s||v,u,N),s=u):X("new/isolated scope",s,u,N)),v=v||u;G=u.name;if(!Ca&&(u.replace&&(u.templateUrl||u.template)||u.transclude&&!u.$$tlb)){for(x=A+1;Ca=a[x++];)if(Ca.transclude&&!Ca.$$tlb||Ca.replace&& +(Ca.templateUrl||Ca.template)){wa=!0;break}Ca=!0}!u.templateUrl&&u.controller&&(x=u.controller,q=q||T(),X("'"+G+"' controllers",q[G],u,N),q[G]=u);if(x=u.transclude)if(D=!0,u.$$tlb||(X("transclusion",C,u,N),C=u),"element"==x)y=!0,p=u.priority,Q=N,N=d.$$element=B(ba.$$createComment(G,d[G])),b=N[0],da(f,ta.call(Q,0),b),Q[0].$$parentNode=Q[0].parentNode,P=ac(wa,Q,e,p,g&&g.name,{nonTlbTranscludeDirective:C});else{var M=T();Q=B(Xb(b)).contents();if(H(x)){Q=[];var S=T(),Da=T();r(x,function(a,b){var c="?"=== +a.charAt(0);a=c?a.substring(1):a;S[a]=b;M[b]=null;Da[b]=c});r(N.contents(),function(a){var b=S[xa(ua(a))];b?(Da[b]=!0,M[b]=M[b]||[],M[b].push(a)):Q.push(a)});r(Da,function(a,b){if(!a)throw fa("reqslot",b);});for(var Y in M)M[Y]&&(M[Y]=ac(wa,M[Y],e))}N.empty();P=ac(wa,Q,e,void 0,void 0,{needsNewScope:u.$$isolateScope||u.$$newScope});P.$$slots=M}if(u.template)if(I=!0,X("template",L,u,N),L=u,x=z(u.template)?u.template(N,d):u.template,x=ra(x),u.replace){g=u;Q=Vb.test(x)?$c(ca(u.templateNamespace,W(x))): +[];b=Q[0];if(1!=Q.length||1!==b.nodeType)throw fa("tplrt",G,"");da(f,N,b);E={$attr:{}};x=$b(b,[],E);var aa=a.splice(A+1,a.length-(A+1));(s||v)&&ad(x,s,v);a=a.concat(x).concat(aa);U(d,E);E=a.length}else N.html(x);if(u.templateUrl)I=!0,X("template",L,u,N),L=u,u.replace&&(g=u),m=$(a.splice(A,a.length-A),N,d,f,D&&P,h,k,{controllerDirectives:q,newScopeDirective:v!==u&&v,newIsolateScopeDirective:s,templateDirective:L,nonTlbTranscludeDirective:C}),E=a.length;else if(u.compile)try{t=u.compile(N,d,P);var Z= +u.$$originalDirective||u;z(t)?n(null,bb(Z,t),F,Ta):t&&n(bb(Z,t.pre),bb(Z,t.post),F,Ta)}catch(ea){c(ea,va(N))}u.terminal&&(m.terminal=!0,p=Math.max(p,u.priority))}m.scope=v&&!0===v.scope;m.transcludeOnThisElement=D;m.templateOnThisElement=I;m.transclude=P;l.hasElementTranscludeDirective=y;return m}function ib(a,b,c,d){var e;if(F(b)){var f=b.match(l);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=g?c.inheritedData(h): +c.data(h)}if(!e&&!f)throw fa("ctreq",b,a);}else if(J(b))for(e=[],g=0,f=b.length;gm.priority)&&-1!=m.restrict.indexOf(g)){l&&(m=Rb(m,{$$start:l,$$end:n}));if(!m.$$bindings){var q=m,s=m,L=m.name,u={isolateScope:null,bindToController:null};H(s.scope)&&(!0===s.bindToController?(u.bindToController=d(s.scope,L,!0),u.isolateScope={}):u.isolateScope=d(s.scope,L,!1));H(s.bindToController)&&(u.bindToController= +d(s.bindToController,L,!0));if(H(u.bindToController)){var C=s.controller,D=s.controllerAs;if(!C)throw fa("noctrl",L);if(!Xc(C,D))throw fa("noident",L);}var N=q.$$bindings=u;H(N.isolateScope)&&(m.$$isolateBindings=N.isolateScope)}b.push(m);k=m}}catch(G){c(G)}}return k}function S(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d"+b+"";return c.childNodes[0].childNodes;default:return b}}function ea(a,b){if("srcdoc"==b)return L.HTML;var c=ua(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return L.RESOURCE_URL}function ia(a, +c,d,e,f){var g=ea(a,e);f=k[e]||f;var h=b(d,!0,g,f);if(h){if("multiple"===e&&"select"===ua(a))throw fa("selmulti",va(a));c.push({priority:100,compile:function(){return{pre:function(a,c,k){c=k.$$observers||(k.$$observers=T());if(m.test(e))throw fa("nodomevents");var l=k[e];l!==d&&(h=l&&b(l,!0,g,f),d=l);h&&(k[e]=h(a),(c[e]||(c[e]=[])).$$inter=!0,(k.$$observers&&k.$$observers[e].$$scope||a).$watch(h,function(a,b){"class"===e&&a!=b?k.$updateClass(a,b):k.$set(e,a)}))}}}})}}function da(a,b,c){var d=b[0], +e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=b)return a;for(;b--;)8===a[b].nodeType&&bg.call(a,b,1);return a}function Xc(a,b){if(b&&F(b))return b;if(F(a)){var d=dd.exec(a);if(d)return d[3]}}function gf(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,c){Ra(b,"controller");H(b)?R(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a, +b,c,d){if(!a||!H(a.$scope))throw O("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,n;h=!0===h;k&&F(k)&&(n=k);if(F(f)){k=f.match(dd);if(!k)throw cg("ctrlfmt",f);m=k[1];n=n||k[3];f=a.hasOwnProperty(m)?a[m]:Ec(g.$scope,m,!0)||(b?Ec(c,m,!0):void 0);Qa(f,m,!0)}if(h)return h=(J(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),n&&e(g,n,l,m||f.name),R(function(){var a=d.invoke(f,l,g,m);a!==l&&(H(a)||z(a))&&(l=a,n&&e(g,n,l,m||f.name));return l},{instance:l,identifier:n});l= +d.instantiate(f,g,m);n&&e(g,n,l,m||f.name);return l}}]}function hf(){this.$get=["$window",function(a){return B(a.document)}]}function jf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function cc(a){return H(a)?ia(a)?a.toISOString():cb(a):a}function of(){this.$get=function(){return function(a){if(!a)return"";var b=[];tc(a,function(a,c){null===a||w(a)||(J(a)?r(a,function(a){b.push(ja(c)+"="+ja(cc(a)))}):b.push(ja(c)+"="+ja(cc(a))))});return b.join("&")}}}function pf(){this.$get= +function(){return function(a){function b(a,e,f){null===a||w(a)||(J(a)?r(a,function(a,c){b(a,e+"["+(H(a)?c:"")+"]")}):H(a)&&!ia(a)?tc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ja(e)+"="+ja(cc(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function dc(a,b){if(F(a)){var d=a.replace(dg,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(ed))||(c=(c=d.match(eg))&&fg[c[0]].test(d));c&&(a=xc(d))}}return a}function fd(a){var b=T(),d;F(a)?r(a.split("\n"),function(a){d= +a.indexOf(":");var e=M(W(a.substr(0,d)));a=W(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):H(a)&&r(a,function(a,d){var f=M(d),g=W(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function gd(a){var b;return function(d){b||(b=fd(a));return d?(d=b[M(d)],void 0===d&&(d=null),d):b}}function hd(a,b,d,c){if(z(c))return c(a,b,d);r(c,function(c){a=c(a,b,d)});return a}function nf(){var a=this.defaults={transformResponse:[dc],transformRequest:[function(a){return H(a)&&"[object File]"!==ka.call(a)&&"[object Blob]"!== +ka.call(a)&&"[object FormData]"!==ka.call(a)?cb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ga(ec),put:ga(ec),patch:ga(ec)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return x(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return x(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector", +function(e,f,g,h,k,l){function m(b){function c(a){var b=R({},a);b.data=hd(a.data,a.headers,a.status,f.transformResponse);a=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,b){var c,d={};r(a,function(a,e){z(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!H(b))throw O("$http")("badreq",b);if(!F(b.url))throw O("$http")("badreq",b.url);var f=R({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);f.headers=function(b){var c= +a.headers,d=R({},b.headers),f,g,h,c=R({},c.common,c[M(b.method)]);a:for(f in c){g=M(f);for(h in d)if(M(h)===g)continue a;d[f]=c[f]}return e(d,ga(b))}(b);f.method=ub(f.method);f.paramSerializer=F(f.paramSerializer)?l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=hd(b.data,gd(d),void 0,b.transformRequest);w(e)&&r(d,function(a,b){"content-type"===M(b)&&delete d[b]});w(b.withCredentials)&&!w(a.withCredentials)&&(b.withCredentials=a.withCredentials);return n(b,e).then(c, +c)},void 0],h=k.when(f);for(r(V,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b=g.shift();var m=g.shift(),h=h.then(b,m)}d?(h.success=function(a){Qa(a,"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Qa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=id("success"),h.error=id("error"));return h}function n(c,d){function g(a){if(a){var c= +{};r(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function l(a,c,d,e){function f(){n(c,a,d,e)}D&&(200<=a&&300>a?D.put(Q,[a,c,fd(d),e]):D.remove(Q));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function n(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?L.resolve:L.reject)({data:a,status:b,headers:gd(d),config:c,statusText:e})}function y(a){n(a.data,a.status,ga(a.headers()),a.statusText)}function V(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a, +1)}var L=k.defer(),C=L.promise,D,G,Aa=c.headers,Q=p(c.url,c.paramSerializer(c.params));m.pendingRequests.push(c);C.then(V,V);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(D=H(c.cache)?c.cache:H(a.cache)?a.cache:s);D&&(G=D.get(Q),x(G)?G&&z(G.then)?G.then(y,y):J(G)?n(G[1],G[0],ga(G[2]),G[3]):n(G,200,{},"OK"):D.put(Q,C));w(G)&&((G=jd(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(Aa[c.xsrfHeaderName||a.xsrfHeaderName]=G),e(c.method,Q,d,l,Aa,c.timeout,c.withCredentials, +c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers)));return C}function p(a,b){0=l&&(v.resolve(q),I(u.$$intervalId),delete g[u.$$intervalId]);K||a.$apply()},k);g[u.$$intervalId]=v;return u}var g={};f.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return f}]}function fc(a){a=a.split("/");for(var b=a.length;b--;)a[b]= +qb(a[b]);return a.join("/")}function kd(a,b){var d=qa(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=aa(d.port)||hg[d.protocol]||null}function ld(a,b){var d="/"!==a.charAt(0);d&&(a="/"+a);var c=qa(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=Ac(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function la(a,b){if(0===b.lastIndexOf(a,0))return b.substr(a.length)}function Ja(a){var b= +a.indexOf("#");return-1==b?a:a.substr(0,b)}function jb(a){return a.replace(/(#.+)|#$/,"$1")}function gc(a,b,d){this.$$html5=!0;d=d||"";kd(a,this);this.$$parse=function(a){var d=la(b,a);if(!F(d))throw Gb("ipthprfx",a,b);ld(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Tb(this.$$search),d=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)), +!0;var f,g;x(f=la(a,c))?(g=f,g=x(f=la(d,f))?b+(la("/",f)||f):a+g):x(f=la(b,c))?g=b+f:b==c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function hc(a,b,d){kd(a,this);this.$$parse=function(c){var e=la(a,c)||la(b,c),f;w(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",w(e)&&(a=c,this.replace())):(f=la(d,e),w(f)&&(f=e));ld(f,this);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.lastIndexOf(e,0)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b= +Tb(this.$$search),e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl=function(b,d){return Ja(a)==Ja(b)?(this.$$parse(b),!0):!1}}function md(a,b,d){this.$$html5=!0;hc.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Ja(c)?f=c:(g=la(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Tb(this.$$search), +e=this.$$hash?"#"+qb(this.$$hash):"";this.$$url=fc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url}}function Hb(a){return function(){return this[a]}}function nd(a,b){return function(d){if(w(d))return this[a];this[a]=b(d);this.$$compose();return this}}function sf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return x(b)?(a=b,this):a};this.html5Mode=function(a){return Ea(a)?(b.enabled=a,this):H(a)?(Ea(a.enabled)&&(b.enabled=a.enabled),Ea(a.requireBase)&& +(b.requireBase=a.requireBase),Ea(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var n=c.url(),p;if(b.enabled){if(!m&&b.requireBase)throw Gb("nobase");p=n.substring(0,n.indexOf("/", +n.indexOf("//")+2))+(m||"/");m=e.history?gc:md}else p=Ja(n),m=hc;var s=p.substr(0,Ja(p).lastIndexOf("/")+1);l=new m(p,s,"#"+a);l.$$parseLinkUrl(n,n);l.$$state=c.state();var r=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=B(a.target);"a"!==ua(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");H(h)&&"[object SVGAnimatedString]"===h.toString()&&(h= +qa(h.animVal).href);r.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}});jb(l.absUrl())!=jb(n)&&c.url(l.absUrl(),!0);var I=!0;c.onUrlChange(function(a,b){w(la(s,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=jb(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state= +e,h(c,!1,e)):(I=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=jb(c.url()),b=jb(l.absUrl()),f=c.state(),g=l.$$replace,n=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(I||n)I=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(n&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function tf(){var a=!0,b=this;this.debugEnabled=function(b){return x(b)? +(a=b,this):a};this.$get=["$window",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||A;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];r(arguments,function(b){a.push(c(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"), +debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Ua(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw ca("isecfld",b);return a}function ig(a){return a+""}function ra(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a.window===a)throw ca("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ca("isecdom",b);if(a===Object)throw ca("isecobj",b);}return a}function od(a, +b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a===jg||a===kg||a===lg)throw ca("isecff",b);}}function Ib(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw ca("isecaf",b);}function mg(a,b){return"undefined"!==typeof a?a:b}function pd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function $(a,b){var d,c;switch(a.type){case t.Program:d=!0;r(a.body,function(a){$(a.expression,b);d= +d&&a.expression.constant});a.constant=d;break;case t.Literal:a.constant=!0;a.toWatch=[];break;case t.UnaryExpression:$(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case t.BinaryExpression:$(a.left,b);$(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case t.LogicalExpression:$(a.left,b);$(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case t.ConditionalExpression:$(a.test, +b);$(a.alternate,b);$(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case t.Identifier:a.constant=!1;a.toWatch=[a];break;case t.MemberExpression:$(a.object,b);a.computed&&$(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case t.CallExpression:d=a.filter?!b(a.callee.name).$stateful:!1;c=[];r(a.arguments,function(a){$(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)}); +a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case t.AssignmentExpression:$(a.left,b);$(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case t.ArrayExpression:d=!0;c=[];r(a.elements,function(a){$(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case t.ObjectExpression:d=!0;c=[];r(a.properties,function(a){$(a.value,b);d=d&&a.value.constant&&!a.computed;a.value.constant||c.push.apply(c,a.value.toWatch)}); +a.constant=d;a.toWatch=c;break;case t.ThisExpression:a.constant=!1;a.toWatch=[];break;case t.LocalsExpression:a.constant=!1,a.toWatch=[]}}function qd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function rd(a){return a.type===t.Identifier||a.type===t.MemberExpression}function sd(a){if(1===a.body.length&&rd(a.body[0].expression))return{type:t.AssignmentExpression,left:a.body[0].expression,right:{type:t.NGValueParameter},operator:"="}}function td(a){return 0=== +a.body.length||1===a.body.length&&(a.body[0].expression.type===t.Literal||a.body[0].expression.type===t.ArrayExpression||a.body[0].expression.type===t.ObjectExpression)}function ud(a,b){this.astBuilder=a;this.$filter=b}function vd(a,b){this.astBuilder=a;this.$filter=b}function Jb(a){return"constructor"==a}function ic(a){return z(a.valueOf)?a.valueOf():ng.call(a)}function uf(){var a=T(),b=T(),d={"true":!0,"false":!1,"null":null,undefined:void 0},c,e;this.addLiteral=function(a,b){d[a]=b};this.setIdentifierFns= +function(a,b){c=a;e=b;return this};this.$get=["$filter",function(f){function g(c,d,e){var g,k,C;e=e||K;switch(typeof c){case "string":C=c=c.trim();var D=e?b:a;g=D[C];if(!g){":"===c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2));g=e?q:I;var G=new jc(g);g=(new kc(G,f,g)).parse(c);g.constant?g.$$watchDelegate=p:k?g.$$watchDelegate=g.literal?n:m:g.inputs&&(g.$$watchDelegate=l);e&&(g=h(g));D[C]=g}return s(g,d);case "function":return s(c,d);default:return s(A,d)}}function h(a){function b(c,d,e,f){var g= +K;K=!0;try{return a(c,d,e,f)}finally{K=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate;b.assign=h(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&&c=this.promise.$$state.status&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;fa)for(b in l++,f)sa.call(e,b)||(q--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1r&&(w=4-r,x[w]||(x[w]=[]),x[w].push({msg:z(a.exp)? +"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:k}));else if(a===c){q=!1;break a}}catch(B){f(B)}if(!(p=y.$$watchersCount&&y.$$childHead||y!==this&&y.$$nextSibling))for(;y!==this&&!(p=y.$$nextSibling);)y=y.$parent}while(y=p);if((q||v.length)&&!r--)throw K.$$phase=null,d("infdig",b,x);}while(q||v.length);for(K.$$phase=null;PBa)throw ya("iequirks");var c=ga(ma);c.isEnabled=function(){return a}; +c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=Ya);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;r(ma,function(a,b){var d=M(b);c[eb("parse_as_"+d)]=function(b){return e(a,b)};c[eb("get_trusted_"+d)]=function(b){return f(a,b)};c[eb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function Af(){this.$get=["$window", +"$document",function(a,b){var d={},c=!(a.chrome&&a.chrome.app&&a.chrome.app.runtime)&&a.history&&a.history.pushState,e=aa((/android (\d+)/.exec(M((a.navigator||{}).userAgent))||[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h,k=/^(Moz|webkit|ms)(?=[A-Z])/,l=g.body&&g.body.style,m=!1,n=!1;if(l){for(var p in l)if(m=k.exec(p)){h=m[0];h=h[0].toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit");m=!!("transition"in l||h+"Transition"in l);n=!!("animation"in l||h+"Animation"in +l);!e||m&&n||(m=F(l.webkitTransition),n=F(l.webkitAnimation))}return{history:!(!c||4>e||f),hasEvent:function(a){if("input"===a&&11>=Ba)return!1;if(w(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Fa(),vendorPrefix:h,transitions:m,animations:n,android:e}}]}function Cf(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,e){function f(g,h){f.totalPendingRequests++;if(!F(g)||w(b.get(g)))g=e.getTrustedResourceUrl(g); +var k=d.defaults&&d.defaults.transformResponse;J(k)?k=k.filter(function(a){return a!==dc}):k===dc&&(k=null);return d.get(g,R({cache:b,transformResponse:k},a))["finally"](function(){f.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw pg("tpload",g,a.status,a.statusText);return c.reject(a)})}f.totalPendingRequests=0;return f}]}function Df(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding"); +var g=[];r(a,function(a){var c=ea.element(a).data("$binding");c&&r(c,function(c){d?(new RegExp("(^|\\s)"+xd(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;hc&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)==mc;e++);if(e==(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)==mc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Hd&&(d=d.splice(0,Hd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function xg(a,b,d,c){var e=a.d,f=e.length-a.i;b=w(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;fh;)k.unshift(0),h++;0=b.lgSize&&h.unshift(k.splice(-b.lgSize,k.length).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize,k.length).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);f.length&&(k+=c+f.join(""));e&&(k+="e+"+e)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+k+b.posSuf}function Kb(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length-d)f+=d;0===f&&-12==d&&(f=12);return Kb(f,b,c,e)}}function kb(a,b,d){return function(c,e){var f=c["get"+a](),g=ub((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Id(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Jd(a){return function(b){var d=Id(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Kb(b,a)}}function nc(a, +b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Cd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=aa(b[9]+b[10]),g=aa(b[9]+b[11]));h.call(a,aa(b[1]),aa(b[2])-1,aa(b[3]));f=aa(b[4]||0)-f;g=aa(b[5]||0)-g;h=aa(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; +return function(c,d,f){var g="",h=[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;F(c)&&(c=yg.test(c)?aa(c):b(c));S(c)&&(c=new Date(c));if(!ia(c)||!isFinite(c.getTime()))return c;for(;d;)(l=zg.exec(d))?(h=ab(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=yc(f,m),c=Sb(c,f,!0));r(h,function(b){k=Ag[b];g+=k?k(c,a.DATETIME_FORMATS,m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function rg(){return function(a,b){w(b)&&(b=2);return cb(a,b)}}function sg(){return function(a, +b,d){b=Infinity===Math.abs(Number(b))?Number(b):aa(b);if(isNaN(b))return a;S(a)&&(a=a.toString());if(!oa(a))return a;d=!d||isNaN(d)?0:aa(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?oc(a,d,d+b):0===d?oc(a,b,a.length):oc(a,Math.max(0,d+b),d)}}function oc(a,b,d){return F(a)?a.slice(b,d):ta.call(a,b,d)}function Ed(a){function b(b){return b.map(function(b){var c=1,d=Ya;if(z(b))d=b;else if(F(b)){if("+"==b.charAt(0)||"-"==b.charAt(0))c="-"==b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var e= +d(),d=function(a){return a[e]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,k=b.type;if(d===k){var k=a.value,l=b.value;"string"===d?(k=k.toLowerCase(),l=l.toLowerCase()):"object"===d&&(H(k)&&(k=a.index),H(l)&&(l=b.index));k!==l&&(c=kb||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",m)}b.on("change",l);if(Md[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b=this.validity,c=b.badInput,d=b.typeMismatch;k=f.defer(function(){k=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)? +"":c.$viewValue;b.val()!==a&&b.val(a)}}function Nb(a,b){return function(d,c){var e,f;if(ia(d))return d;if(F(d)){'"'==d.charAt(0)&&'"'==d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(Bg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,function(a,c){c=t};g.$observe("min",function(a){t=p(a);h.$validate()})}if(x(g.max)||g.ngMax){var q;h.$validators.max=function(a){return!n(a)||w(q)||d(a)<=q};g.$observe("max",function(a){q=p(a);h.$validate()})}}}function Nd(a,b,d,c){(c.$$hasNativeValidators=H(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};return c.badInput||c.typeMismatch?void 0:a})}function Od(a, +b,d,c,e){if(x(c)){a=a(c);if(!a.constant)throw nb("constexpr",d,c);return a(b)}return e}function qc(a,b){a="ngClass"+a;return["$animate",function(d){function c(a,b){var c=[],d=0;a:for(;d(?:<\/\1>|)$/,Vb=/<|&#?\w+;/,Mf=/<([\w:-]+)/,Nf=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,ha={option:[1,'"],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ha.optgroup=ha.option;ha.tbody=ha.tfoot=ha.colgroup=ha.caption=ha.thead; +ha.th=ha.td;var Uf=E.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Pa=U.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===E.document.readyState?E.setTimeout(b):(this.on("DOMContentLoaded",b),U(E).on("load",b))},toString:function(){var a=[];r(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?B(this[a]):B(this[this.length+a])},length:0,push:Dg,sort:[].sort,splice:[].splice},Eb={};r("multiple selected checked disabled readOnly required open".split(" "), +function(a){Eb[M(a)]=a});var Vc={};r("input select option textarea button form details".split(" "),function(a){Vc[a]=!0});var cd={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};r({data:Yb,removeData:fb,hasData:function(a){for(var b in gb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b/,Xf=/^[^\(]*\(\s*([^\)]*)\)/m,Eg=/,/,Fg=/^\s*(_?)(\S+?)\1\s*$/,Vf=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ha=O("$injector");db.$$annotate= +function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw F(d)&&d||(d=a.name||Yf(a)),Ha("strictdi",d);b=Wc(a);r(b[1].split(Eg),function(a){a.replace(Fg,function(a,b,d){c.push(d)})})}a.$inject=c}}else J(a)?(b=a.length-1,Qa(a[b],"fn"),c=a.slice(0,b)):Qa(a,"fn",!0);return c};var Sd=O("$animate"),af=function(){this.$get=A},bf=function(){var a=new Sa,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=F(b)?b.split(" "):J(b)? +b:[],r(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){r(b,function(b){var c=a.get(b);if(c){var d=Zf(b.attr("class")),e="",f="";r(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});r(b,function(a){e&&Bb(a,e);f&&Ab(a,f)});a.remove(b)}});b.length=0}return{enabled:A,on:A,off:A,pin:A,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.put(g, +k),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Ze=["$provide",function(a){var b=this;this.$$registeredAnimations=Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw Sd("notcsel",d);var e=d+"-animation";b.$$registeredAnimations[d.substr(1)]=e;a.factory(e,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw Sd("nongcls", +"ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h <= >= && || ! = |".split(" "),function(a){Ob[a]=!0});var Jg={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},jc=function(a){this.options=a};jc.prototype={constructor:jc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">= +a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)},isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d= +a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=x(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ca("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index","<=",">=");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*", +"/","%");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:t.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=Z(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)? +a={type:t.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:t.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:t.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:t.MemberExpression,object:a, +property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:t.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:t.Identifier,name:a.text}}, +constant:function(){return{type:t.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:t.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:t.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()): +this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"),b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:t.ObjectExpression,properties:a}},throwError:function(a,b){throw ca("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index)); +},consume:function(a){if(0===this.tokens.length)throw ca("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ca("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a= +this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:t.ThisExpression},$locals:{type:t.LocalsExpression}}};ud.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};$(c,d.$filter);var e="",f;this.stage="assign";if(f=sd(c))this.state.computing="assign",e=this.nextId(),this.recurse(f,e),this.return_(e),e="fn.assign="+this.generateFunction("assign", +"s,v,l");f=qd(c.body);d.stage="inputs";r(f,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing="fn";this.stage="main";this.recurse(c);e='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+e+this.watchFns()+"return fn;";e=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue", +"ensureSafeAssignContext","ifDefined","plus","text",e))(this.$filter,Ua,ra,od,ig,Ib,mg,pd,a);this.state=this.stage=void 0;e.literal=td(c);e.constant=c.constant;return e},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;r(b,function(b){a.push("var "+b+"="+d.generateFunction(b,"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a= +[],b=this;r(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,e,f){var g,h,k=this,l,m,n;c=c||A;if(!f&&x(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case t.Program:r(a.body, +function(b,c){k.recurse(b.expression,void 0,void 0,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case t.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break;case t.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){h=a});m=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,m);c(m);break;case t.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){h=a});m="+"===a.operator? +this.plus(g,h):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,m);c(m);break;case t.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case t.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case t.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(), +this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);Ua(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Jb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case t.MemberExpression:g= +d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,void 0,function(){k.if_(k.notNull(g),function(){e&&1!==e&&k.addEnsureSafeAssignContext(g);if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),m=k.ensureSafeObject(k.computedMember(g,h)),k.assign(b,m),d&&(d.computed=!0,d.name=h);else{Ua(a.property.name);e&&1!==e&&k.if_(k.not(k.nonComputedMember(g, +a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));m=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Jb(a.property.name))m=k.ensureSafeObject(m);k.assign(b,m);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!e);break;case t.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],r(a.arguments,function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),m=h+"("+l.join(",")+")",k.assign(b,m),c(b)):(h= +k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);r(a.arguments,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),m=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):m=h+"("+l.join(",")+")";m=k.ensureSafeObject(m);k.assign(b,m)},function(){k.assign(b,"undefined")});c(b)}));break;case t.AssignmentExpression:h=this.nextId();g= +{};if(!rd(a.left))throw ca("lval");this.recurse(a.left,void 0,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);m=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case t.ArrayExpression:l=[];r(a.elements,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(m);break;case t.ObjectExpression:l= +[];n=!1;r(a.properties,function(a){a.computed&&(n=!0)});n?(b=b||this.nextId(),this.assign(b,"{}"),r(a.properties,function(a){a.computed?(g=k.nextId(),k.recurse(a.key,g)):g=a.key.type===t.Identifier?a.key.name:""+a.key.value;h=k.nextId();k.recurse(a.value,h);k.assign(k.member(b,g,a.computed),h)})):(r(a.properties,function(b){k.recurse(b.value,a.constant?void 0:k.nextId(),void 0,function(a){l.push(k.escape(b.key.type===t.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b, +m));c(b||m);break;case t.ThisExpression:this.assign(b,"s");c("s");break;case t.LocalsExpression:this.assign(b,"l");c("l");break;case t.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0)); +return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/[$_a-zA-Z][$_a-zA-Z0-9]*/.test(b)? +a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a), +";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a, +b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(F(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(S(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw ca("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}}; +vd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;$(c,d.$filter);var e,f;if(e=sd(c))f=this.recurse(e);e=qd(c.body);var g;e&&(g=[],r(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];r(c.body,function(a){h.push(d.recurse(a.expression))});e=0===c.body.length?A:1===c.body.length?h[0]:function(a,b){var c;r(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal= +td(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case t.Literal:return this.value(a.value,b);case t.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case t.BinaryExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case t.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case t.ConditionalExpression:return this["ternary?:"](this.recurse(a.test), +this.recurse(a.alternate),this.recurse(a.consequent),b);case t.Identifier:return Ua(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Jb(a.name),b,d,f.expression);case t.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Ua(a.property.name,f.expression),e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case t.CallExpression:return g=[],r(a.arguments, +function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var n=[],p=0;p":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a, +b,d){return function(c,e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0,name:void 0,value:a}:a}},identifier:function(a, +b,d,c,e){return function(f,g,h,k){f=g&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:void 0;b&&ra(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),m,n;null!=l&&(m=b(f,g,h,k),m+="",Ua(m,e),c&&1!==c&&(Ib(l),l&&!l[m]&&(l[m]={})),n=l[m],ra(n,e));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&(Ib(g),g&&!g[b]&&(g[b]={}));h=null!=g?g[b]:void 0;(d|| +Jb(b))&&ra(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var kc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new t(a,d);this.astCompiler=d.csp?new vd(this.ast,b):new ud(this.ast,b)};kc.prototype={constructor:kc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var ng=Object.prototype.valueOf,ya=O("$sce"),ma={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"}, +pg=O("$compile"),Y=E.document.createElement("a"),zd=qa(E.location.href);Ad.$inject=["$document"];Mc.$inject=["$provide"];var Hd=22,Gd=".",mc="0";Bd.$inject=["$locale"];Dd.$inject=["$locale"];var Ag={yyyy:X("FullYear",4,0,!1,!0),yy:X("FullYear",2,0,!0,!0),y:X("FullYear",1,0,!1,!0),MMMM:kb("Month"),MMM:kb("Month",!0),MM:X("Month",2,1),M:X("Month",1,1),LLLL:kb("Month",!1,!0),dd:X("Date",2),d:X("Date",1),HH:X("Hours",2),H:X("Hours",1),hh:X("Hours",2,-12),h:X("Hours",1,-12),mm:X("Minutes",2),m:X("Minutes", +1),ss:X("Seconds",2),s:X("Seconds",1),sss:X("Milliseconds",3),EEEE:kb("Day"),EEE:kb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Kb(Math[0=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},zg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,yg=/^\-?\d+$/;Cd.$inject=["$locale"]; +var tg=da(M),ug=da(ub);Ed.$inject=["$parse"];var pe=da({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===ka.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),vb={};r(Eb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!=a){var c=xa("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b, +e)});vb[c]=function(){return{restrict:"A",priority:100,link:e}}}});r(cd,function(a,b){vb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(Cg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});r(["src","srcset","href"],function(a){var b=xa("ng-"+a);vb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===ka.call(c.prop("href"))&& +(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ba&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});var Lb={$addControl:A,$$renameControl:function(a,b){a.$name=b},$removeControl:A,$setValidity:A,$setDirty:A,$setPristine:A,$setSubmitted:A};Kd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Td=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||A}return{name:"form",restrict:a? +"EAC":"E",require:["form","^^?form"],controller:Kd,compile:function(d,f){d.addClass(Va).addClass(ob);var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in e)){var p=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",p,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",p,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var s=g?c(n.$name):A;g&&(s(a,n),e.$observe(g, +function(b){n.$name!==b&&(s(a,void 0),n.$$parentForm.$$renameControl(n,b),s=c(n.$name),s(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n);s(a,void 0);R(n,Lb)})}}}}}]},qe=Td(),De=Td(!0),Bg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,Kg=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,Lg=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/, +Mg=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Ud=/^(\d{4,})-(\d{2})-(\d{2})$/,Vd=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,rc=/^(\d{4,})-W(\d\d)$/,Wd=/^(\d{4,})-(\d\d)$/,Xd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Md=T();r(["date","datetime-local","month","time","week"],function(a){Md[a]=!0});var Yd={text:function(a,b,d,c,e,f){lb(a,b,d,c,e,f);pc(c)},date:mb("date",Ud,Nb(Ud,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":mb("datetimelocal",Vd,Nb(Vd,"yyyy MM dd HH mm ss sss".split(" ")), +"yyyy-MM-ddTHH:mm:ss.sss"),time:mb("time",Xd,Nb(Xd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:mb("week",rc,function(a,b){if(ia(a))return a;if(F(a)){rc.lastIndex=0;var d=rc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Id(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:mb("month",Wd,Nb(Wd,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Nd(a,b,d,c);lb(a,b,d,c,e,f);c.$$parserName= +"number";c.$parsers.push(function(a){if(c.$isEmpty(a))return null;if(Mg.test(a))return parseFloat(a)});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!S(a))throw nb("numfmt",a);a=a.toString()}return a});if(x(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)||w(g)||a>=g};d.$observe("min",function(a){x(a)&&!S(a)&&(a=parseFloat(a,10));g=S(a)&&!isNaN(a)?a:void 0;c.$validate()})}if(x(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||w(h)||a<=h};d.$observe("max", +function(a){x(a)&&!S(a)&&(a=parseFloat(a,10));h=S(a)&&!isNaN(a)?a:void 0;c.$validate()})}},url:function(a,b,d,c,e,f){lb(a,b,d,c,e,f);pc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||Kg.test(d)}},email:function(a,b,d,c,e,f){lb(a,b,d,c,e,f);pc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||Lg.test(d)}},radio:function(a,b,d,c){w(d.name)&&b.attr("name",++pb);b.on("click",function(a){b[0].checked&&c.$setViewValue(d.value, +a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Od(h,a,"ngTrueValue",d.ngTrueValue,!0),l=Od(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return na(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:A,button:A,submit:A,reset:A, +file:A},Gc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Yd[M(g.type)]||Yd.text)(e,f,g,h[0],b,a,d,c)}}}}],Ng=/^(true|false|\d+)$/,Ve=function(){return{restrict:"A",priority:100,compile:function(a,b){return Ng.test(b.ngValue)?function(a,b,e){e.$set("value",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set("value",a)})}}}},ve=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b); +return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=w(a)?"":a})}}}}],xe=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=w(a)?"":a})}}}}],we=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g= +b(e.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){var d=f(b);c.html(a.getTrustedHtml(d)||"")})}}}}],Ue=da({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),ye=qc("",!0),Ae=qc("Odd",0),ze=qc("Even",1),Be=Ma({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Ce=[function(){return{restrict:"A",scope:!0,controller:"@", +priority:500}}],Lc={},Og={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=xa("ng-"+a);Lc[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g=d(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};Og[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var Fe=["$animate","$compile",function(a, +b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var h,k,l;d.$watch(e.ngIf,function(d){d?k||g(function(d,f){k=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=tb(h.clone),a.leave(l).then(function(){l=null}),h=null))})}}}],Ge=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0, +transclude:"element",controller:ea.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,m,n,p){var s=0,r,t,q,w=function(){t&&(t.remove(),t=null);r&&(r.$destroy(),r=null);q&&(d.leave(q).then(function(){t=null}),t=q,q=null)};c.$watch(f,function(f){var m=function(){!x(h)||h&&!c.$eval(h)||b()},t=++s;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&t===s){var b=c.$new();n.template=a;a=p(b,function(a){w();d.enter(a,null,e).then(m)});r=b;q=a;r.$emit("$includeContentLoaded", +f);c.$eval(g)}},function(){c.$$destroyed||t!==s||(w(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(w(),n.template=null)})}}}}],Xe=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){ka.call(d[0]).match(/SVG/)?(d.empty(),a(Oc(e.template,E.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],He=Ma({priority:450,compile:function(){return{pre:function(a, +b,d){a.$eval(d.ngInit)}}}}),Te=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||", ",f="false"!==d.ngTrim,g=f?W(e):e;c.$parsers.push(function(a){if(!w(a)){var b=[];a&&r(a.split(g),function(a){a&&b.push(f?W(a):a)});return b}});c.$formatters.push(function(a){if(J(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},ob="ng-valid",Pd="ng-invalid",Va="ng-pristine",Mb="ng-dirty",Rd="ng-pending",nb=O("ngModel"),Pg=["$scope", +"$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=void 0;this.$name=l(d.name||"",!1)(a); +this.$$parentForm=Lb;var m=e(d.ngModel),n=m.assign,p=m,s=n,t=null,I,q=this;this.$$setOptions=function(a){if((q.$options=a)&&a.getterSetter){var b=e(d.ngModel+"()"),f=e(d.ngModel+"($$$p)");p=function(a){var c=m(a);z(c)&&(c=b(a));return c};s=function(a,b){z(m(a))?f(a,{$$$p:b}):n(a,b)}}else if(!m.assign)throw nb("nonassign",d.ngModel,va(c));};this.$render=A;this.$isEmpty=function(a){return w(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){q.$isEmpty(a)?(f.removeClass(c,"ng-not-empty"), +f.addClass(c,"ng-empty")):(f.removeClass(c,"ng-empty"),f.addClass(c,"ng-not-empty"))};var K=0;Ld({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){q.$dirty=!1;q.$pristine=!0;f.removeClass(c,Mb);f.addClass(c,Va)};this.$setDirty=function(){q.$dirty=!0;q.$pristine=!1;f.removeClass(c,Va);f.addClass(c,Mb);q.$$parentForm.$setDirty()};this.$setUntouched=function(){q.$touched=!1;q.$untouched=!0;f.setClass(c,"ng-untouched","ng-touched")}; +this.$setTouched=function(){q.$touched=!0;q.$untouched=!1;f.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(t);q.$viewValue=q.$$lastCommittedViewValue;q.$render()};this.$validate=function(){if(!S(q.$modelValue)||!isNaN(q.$modelValue)){var a=q.$$rawModelValue,b=q.$valid,c=q.$modelValue,d=q.$options&&q.$options.allowInvalid;q.$$runValidators(a,q.$$lastCommittedViewValue,function(e){d||b===e||(q.$modelValue=e?a:void 0,q.$modelValue!==c&&q.$$writeModelToScope())})}}; +this.$$runValidators=function(a,b,c){function d(){var c=!0;r(q.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(r(q.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;r(q.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!z(h.then))throw nb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},A):g(!0)}function f(a,b){h===K&&q.$setValidity(a,b)}function g(a){h===K&&c(a)}K++;var h= +K;(function(){var a=q.$$parserName||"parse";if(w(I))f(a,null);else return I||(r(q.$validators,function(a,b){f(b,null)}),r(q.$asyncValidators,function(a,b){f(b,null)})),f(a,I),I;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=q.$viewValue;g.cancel(t);if(q.$$lastCommittedViewValue!==a||""===a&&q.$$hasNativeValidators)q.$$updateEmptyClasses(a),q.$$lastCommittedViewValue=a,q.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=q.$$lastCommittedViewValue; +if(I=w(b)?void 0:!0)for(var c=0;ce||c.$isEmpty(b)||b.length<=e}}}}},Jc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=aa(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};E.angular.bootstrap?E.console&&console.log("WARNING: Tried to load angular more than once."):(ke(),me(ea),ea.module("ngLocale",[],["$provide",function(a){function b(a){a+= +"";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "), +WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a, +c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),B(E.document).ready(function(){ge(E.document,Bc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(''); +//# sourceMappingURL=angular.min.js.map diff --git a/spring-security-mvc-socket/src/main/webapp/resources/vendor/angular/angular.min.js.map b/spring-security-mvc-socket/src/main/webapp/resources/vendor/angular/angular.min.js.map new file mode 100644 index 0000000000..6d34cd22b3 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/vendor/angular/angular.min.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"angular.min.js", +"lineCount":315, +"mappings":"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", +"sources":["angular.js"], +"names":["window","minErr","isArrayLike","obj","isWindow","isArray","isString","jqLite","length","Object","isNumber","Array","item","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","isBlankObject","forEachSorted","keys","sort","i","reverseParams","iteratorFn","value","nextUid","uid","baseExtend","dst","objs","deep","h","$$hashKey","ii","isObject","j","jj","src","isDate","Date","valueOf","isRegExp","RegExp","nodeName","cloneNode","isElement","clone","extend","slice","arguments","merge","toInt","str","parseInt","inherit","parent","extra","create","noop","identity","$","valueFn","valueRef","hasCustomToString","toString","isUndefined","isDefined","getPrototypeOf","isScope","$evalAsync","$watch","isBoolean","isTypedArray","TYPED_ARRAY_REGEXP","test","node","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","copyRecurse","push","copyElement","stackSource","stackDest","ngMinErr","needsRecurse","copyType","undefined","constructor","buffer","copied","ArrayBuffer","byteLength","set","Uint8Array","re","match","lastIndex","type","equals","o1","o2","t1","t2","getTime","keySet","createMap","charAt","concat","array1","array2","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","document","toJson","pretty","JSON","stringify","fromJson","json","parse","timezoneToOffset","timezone","fallback","replace","ALL_COLONS","requestedTimezoneOffset","isNaN","convertTimezoneToLocal","date","reverse","dateTimezoneOffset","getTimezoneOffset","timezoneOffset","setMinutes","getMinutes","minutes","startingTag","empty","e","elemHtml","append","html","nodeType","NODE_TYPE_TEXT","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","splitPoint","substring","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","getAttribute","angularInit","bootstrap","appElement","module","config","prefix","name","hasAttribute","candidate","querySelector","strictDi","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","resumeDeferredBootstrap","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jqName","jq","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","jQuery.cleanData","elems","events","elem","_data","$destroy","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","invokeLaterAndSetModuleName","recipeName","factoryFunction","$$moduleName","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","decorator","animation","filter","directive","component","run","block","shallowCopy","publishExternalAPI","version","uppercase","counter","csp","angularModule","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","a","htmlAnchorDirective","input","inputDirective","textarea","form","formDirective","script","scriptDirective","select","selectDirective","style","styleDirective","option","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$animateCss","$CoreAnimateCssProvider","$$animateJs","$$CoreAnimateJsProvider","$$animateQueue","$$CoreAnimateQueueProvider","$$AnimateRunner","$$AnimateRunnerFactoryProvider","$$animateAsyncRun","$$AnimateAsyncRunFactoryProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$$forceReflow","$$ForceReflowProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$http","$HttpProvider","$httpParamSerializer","$HttpParamSerializerProvider","$httpParamSerializerJQLike","$HttpParamSerializerJQLikeProvider","$httpBackend","$HttpBackendProvider","$xhrFactory","$xhrFactoryProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$jqLite","$$jqLiteProvider","$$HashMap","$$HashMapProvider","$$cookieReader","$$CookieReaderProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteAcceptsData","NODE_TYPE_ELEMENT","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","jqLiteWrapNode","wrapper","parentNode","replaceChild","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","jqLiteDealoc","onlyDescendants","jqLiteRemoveData","querySelectorAll","descendants","l","jqLiteOff","unsupported","expandoStore","jqLiteExpandoStore","handle","removeHandler","listenerFns","removeEventListener","MOUSE_EVENT_MAP","expandoId","ng339","jqCache","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","jqLiteDocumentLoaded","action","win","readyState","setTimeout","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","handlerWrapper","specialHandlerWrapper","defaultHandlerWrapper","handler","specialMouseHandlerWrapper","target","related","relatedTarget","jqLiteContains","$get","this.$get","hasClass","classes","addClass","removeClass","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","extractArgs","fnText","Function","prototype","STRIP_COMMENTS","ARROW_ARG","FN_ARGS","anonFn","args","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","result","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","caller","INSTANTIATING","err","shift","injectionArgs","locals","$inject","$$annotate","msie","Type","ctor","annotate","has","$injector","instanceCache","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","protoInstanceInjector","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","some","scrollTo","scrollIntoView","scroll","yOffset","getComputedStyle","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","mergeClasses","b","splitClasses","klass","prepareAnimateOptions","options","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","error","cacheStateAndFireUrlChange","pendingLocation","cacheState","fireUrlChange","cachedState","getCurrentState","lastCachedState","lastBrowserUrl","url","lastHistoryState","urlChangeListeners","listener","history","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","href","baseElement","state","self.url","sameState","sameBase","stripHash","substr","self.state","urlChangeInit","onUrlChange","self.onUrlChange","$$applicationDestroyed","self.$$applicationDestroyed","off","$$checkUrlChange","baseHref","self.baseHref","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","cacheFactory","cacheId","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","isController","LOCAL_REGEXP","bindings","definition","scopeName","bindingCache","$compileMinErr","mode","collection","optional","attrName","assertValidDirectiveName","getDirectiveRequire","require","REQUIRE_PREFIX_REGEXP","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","restrict","this.component","makeInjectable","tElement","tAttrs","$element","$attrs","template","templateUrl","ddo","controllerAs","identifierForController","transclude","bindToController","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","TTL","onChangesTtl","this.onChangesTtl","flushOnChangesQueue","onChangesQueue","errors","Attributes","attributesToCopy","$attr","$$element","setSpecialAttr","specialAttrHolder","attributes","attribute","removeNamedItem","setNamedItem","safeAddClass","className","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","NOT_EMPTY","domNode","nodeValue","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","needsNewScope","$parent","$new","parentBoundTranscludeFn","transcludeControllers","futureParentElement","$$boundTransclude","$linkNode","wrapTemplate","controllerName","instance","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","transcludeOnThisElement","createBoundTranscludeFn","templateOnThisElement","attrs","linkFnFound","collectDirectives","applyDirectivesToNode","terminal","previousBoundTranscludeFn","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","boundSlots","$$slots","slotName","attrsMap","addDirective","directiveNormalize","isNgAttr","nAttrs","attrStartName","attrEndName","ngAttrName","NG_ATTR_BINDING","PREFIX_REGEXP","multiElementMatch","MULTI_ELEMENT_DIR_RE","directiveIsMultiElement","nName","addAttrInterpolateDirective","animVal","addTextInterpolateDirective","NODE_TYPE_COMMENT","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","groupedElementsLink","compilationGenerator","eager","compiled","lazyCompilation","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","elementControllers","slotTranscludeFn","scopeToChild","controllerScope","newScopeDirective","isSlotFilled","transcludeFn.isSlotFilled","controllerDirectives","setupControllers","templateDirective","$$originalDirective","$$isolateBindings","scopeBindingInfo","initializeDirectiveBindings","removeWatches","$on","controllerDirective","$$bindings","bindingInfo","identifier","controllerResult","getControllers","controllerInstance","$onChanges","initialChanges","$onInit","$onDestroy","callOnDestroyHook","invokeLinkFn","$postLink","terminalPriority","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","didScanForMultipleTransclusion","mightHaveMultipleTransclusionError","directiveValue","$$start","$$end","assertNoDuplicate","$$tlb","scanningIndex","candidateDirective","$$createComment","replaceWith","$$parentNode","replaceDirective","slots","contents","slotMap","filledSlots","elementSelector","filled","$$newScope","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectiveScope","mergeTemplateAttributes","compileTemplateUrl","Math","max","inheritType","dataName","property","controllerKey","$scope","$transclude","newScope","tDirectives","startAttrName","endAttrName","multiElement","srcAttr","dstAttr","$set","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","wrapModuleNameIfDefined","moduleName","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","allOrNothing","trustedContext","attrInterpolatePreLinkFn","$$observers","newValue","$$inter","$$scope","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","hasData","annotation","recordChanges","currentValue","previousValue","$$postDigest","changes","triggerOnChangesHook","SimpleChange","removeWatchCollection","initializeBinding","lastValue","parentGet","parentSet","compare","$observe","_UNINITIALIZED_VALUE","literal","assign","parentValueWatch","parentValue","$stateful","removeWatch","$watchCollection","initialValue","parentValueWatchAction","SIMPLE_ATTR_NAME","$normalize","$addClass","classVal","$removeClass","newClasses","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","ALIASED_ATTR","observer","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","compile.$$createComment","comment","createComment","previous","current","str1","str2","values","tokens1","tokens2","token","jqNodes","ident","CNTRL_REG","globals","this.has","register","this.register","allowGlobals","this.allowGlobals","addIdentifier","expression","later","$controllerMinErr","controllerPrototype","$controllerInit","exception","cause","serializeValue","v","toISOString","ngParamSerializer","params","jQueryLikeParamSerializer","serialize","toSerialize","topLevel","defaultHttpResponseTransform","headers","tempData","JSON_PROTECTION_PREFIX","contentType","jsonStart","JSON_START","JSON_ENDS","parseHeaders","line","headerVal","headerKey","headersGetter","headersObj","transformData","status","fns","defaults","transformResponse","transformRequest","d","common","CONTENT_TYPE_APPLICATION_JSON","patch","xsrfCookieName","xsrfHeaderName","paramSerializer","useApplyAsync","this.useApplyAsync","useLegacyPromise","useLegacyPromiseExtensions","this.useLegacyPromiseExtensions","interceptorFactories","interceptors","requestConfig","response","resp","reject","executeHeaderFns","headerContent","processedHeaders","headerFn","header","mergeHeaders","defHeaders","reqHeaders","defHeaderName","lowercaseDefHeaderName","reqHeaderName","chain","serverRequest","reqData","withCredentials","sendReq","promise","when","reversedInterceptors","interceptor","request","requestError","responseError","thenFn","rejectFn","success","promise.success","promise.error","$httpMinErrLegacyFn","createApplyHandlers","eventHandlers","applyHandlers","callEventHandler","$applyAsync","$$phase","done","headersString","statusText","resolveHttpPromise","resolvePromise","deferred","resolve","resolvePromiseWithResult","removePendingReq","pendingRequests","cachedResp","buildUrl","defaultCache","xsrfValue","urlIsSameOrigin","timeout","responseType","uploadEventHandlers","serializedParams","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","callbacks","$browserDefer","rawDocument","jsonpReq","callbackId","async","body","called","addEventListener","timeoutRequest","jsonpDone","xhr","abort","completeRequest","open","setRequestHeader","onload","xhr.onload","responseText","urlResolve","protocol","getAllResponseHeaders","onerror","onabort","upload","send","this.startSymbol","this.endSymbol","escape","ch","unescapeText","escapedStartRegexp","escapedEndRegexp","constantWatchDelegate","objectEquality","constantInterp","unwatch","constantInterpolateWatch","mustHaveExpression","parseStringifyInterceptor","getTrusted","$interpolateMinErr","interr","unescapedText","exp","$$watchDelegate","endIndex","parseFns","textLength","expressionPositions","startSymbolLength","endSymbolLength","throwNoconcat","compute","interpolationFn","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","interval","count","invokeApply","hasParams","iteration","setInterval","clearInterval","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","relativeUrl","prefixed","$$path","pathname","$$search","search","$$hash","stripBaseUrl","base","lastIndexOf","trimEmptyHash","LocationHtml5Url","appBase","appBaseNoFile","basePrefix","$$html5","$$parse","this.$$parse","pathUrl","$locationMinErr","$$compose","this.$$compose","$$url","$$absUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","locationGetterSetter","preprocess","html5Mode","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","setBrowserUrlWithFallback","oldUrl","oldState","$$state","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","IGNORE_URI_REGEXP","ctrlKey","metaKey","shiftKey","which","button","absHref","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","console","logFn","log","hasApply","arg1","arg2","warn","ensureSafeMemberName","fullExpression","$parseMinErr","getStringValue","ensureSafeObject","children","ensureSafeFunction","CALL","APPLY","BIND","ensureSafeAssignContext","ifDefined","plusFn","r","findConstantAndWatchExpressions","ast","allConstants","argsToWatch","AST","Program","expr","Literal","toWatch","UnaryExpression","argument","BinaryExpression","left","right","LogicalExpression","ConditionalExpression","alternate","consequent","Identifier","MemberExpression","object","computed","CallExpression","callee","AssignmentExpression","ArrayExpression","ObjectExpression","properties","ThisExpression","LocalsExpression","getInputs","lastExpression","isAssignable","assignableAST","NGValueParameter","operator","isLiteral","ASTCompiler","astBuilder","ASTInterpreter","isPossiblyDangerousMemberName","getValueOf","objectValueOf","cacheDefault","cacheExpensive","literals","identStart","identContinue","addLiteral","this.addLiteral","literalName","literalValue","setIdentifierFns","this.setIdentifierFns","identifierStart","identifierContinue","interceptorFn","expensiveChecks","parsedExpression","oneTime","cacheKey","runningChecksEnabled","parseOptions","$parseOptionsExpensive","$parseOptions","lexer","Lexer","parser","Parser","oneTimeLiteralWatchDelegate","oneTimeWatchDelegate","inputs","inputsWatchDelegate","expensiveChecksInterceptor","addInterceptor","expensiveCheckFn","expensiveCheckOldValue","expressionInputDirtyCheck","oldValueOfValue","prettyPrintExpression","inputExpressions","lastResult","oldInputValueOf","expressionInputWatch","newInputValue","oldInputValueOfValues","oldInputValues","expressionInputsWatch","changed","oneTimeWatch","oneTimeListener","old","isAllDefined","allDefined","constantWatch","watchDelegate","useInputs","regularInterceptedExpression","oneTimeInterceptedExpression","noUnsafeEval","isIdentifierStart","isIdentifierContinue","$$runningExpensiveChecks","$parse.$$runningExpensiveChecks","qFactory","nextTick","exceptionHandler","Promise","simpleBind","scheduleProcessQueue","processScheduled","pending","Deferred","$qMinErr","TypeError","onFulfilled","onRejected","progressBack","catch","finally","handleCallback","$$reject","$$resolve","that","rejectPromise","progress","makePromise","resolved","isResolved","callbackOutput","errback","$Q","resolver","resolveFn","all","promises","results","requestAnimationFrame","webkitRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","supported","createChildScopeClass","ChildScope","$$watchers","$$nextSibling","$$childHead","$$childTail","$$listeners","$$listenerCount","$$watchersCount","$id","$$ChildScope","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","destroyChildScope","$event","currentScope","cleanUpScope","$$prevSibling","$root","Scope","beginPhase","phase","incrementWatchersCount","decrementListenerCount","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","child","watchExp","watcher","last","eq","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","unwatchFn","watchGroupSubAction","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","watchLog","logIdx","asyncTask","asyncQueuePosition","asyncQueue","$eval","msg","next","postDigestQueuePosition","postDigestQueue","eventName","this.$watchGroup","$applyAsyncExpression","namedListeners","indexOfListener","$emit","targetScope","listenerArgs","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","escapeForRegexp","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","Constructor","maybeTrusted","allowed","this.enabled","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","eventSupport","hasHistoryPushState","chrome","app","runtime","pushState","android","userAgent","navigator","boxee","vendorPrefix","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","hasEvent","divElm","httpOptions","this.httpOptions","handleRequestFn","tpl","ignoreRequestError","totalPendingRequests","getTrustedResourceUrl","transformer","handleError","$templateRequestMinErr","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","$$timeoutId","timeout.cancel","urlParsingNode","requestUrl","originUrl","$$CookieReader","safeDecodeURIComponent","lastCookies","lastCookieString","cookieArray","cookie","currentCookieString","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","matchAgainstAnyProp","getTypeForFilter","expressionType","predicateFn","createPredicateFn","shouldMatchPrimitives","actual","expected","deepCompare","dontMatchWholeObject","actualType","expectedType","expectedVal","matchAnyProperty","actualVal","$locale","formats","NUMBER_FORMATS","amount","currencySymbol","fractionSize","CURRENCY_SYM","PATTERNS","maxFrac","formatNumber","GROUP_SEP","DECIMAL_SEP","number","numStr","exponent","digits","numberOfIntegerDigits","zeros","ZERO_CHAR","MAX_DIGITS","roundNumber","parsedNumber","minFrac","fractionLen","min","roundAt","digit","k","carry","reduceRight","groupSep","decimalSep","isInfinity","isFinite","isZero","abs","formattedText","integerLen","decimals","reduce","groups","lgSize","gSize","negPre","negSuf","posPre","posSuf","padNumber","num","negWrap","neg","dateGetter","dateStrGetter","shortForm","standAlone","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","round","eraGetter","ERAS","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","s","ms","parseFloat","format","DATETIME_FORMATS","NUMBER_STRING","DATE_FORMATS_SPLIT","DATE_FORMATS","spacing","limit","begin","Infinity","sliceFn","end","processPredicates","sortPredicates","map","predicate","descending","defaultCompare","v1","v2","type1","type2","value1","value2","sortPredicate","reverseOrder","compareFn","predicates","compareValues","getComparisonObject","tieBreaker","predicateValues","doComparison","ngDirective","FormController","controls","$error","$$success","$pending","$name","$dirty","$pristine","$valid","$invalid","$submitted","$$parentForm","nullFormCtrl","$rollbackViewValue","form.$rollbackViewValue","control","$commitViewValue","form.$commitViewValue","$addControl","form.$addControl","$$renameControl","form.$$renameControl","newName","oldName","$removeControl","form.$removeControl","$setValidity","addSetValidityMethod","ctrl","unset","$setDirty","form.$setDirty","PRISTINE_CLASS","DIRTY_CLASS","$setPristine","form.$setPristine","setClass","SUBMITTED_CLASS","$setUntouched","form.$setUntouched","$setSubmitted","form.$setSubmitted","stringBasedInputType","$formatters","$isEmpty","baseInputType","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","origValue","keyCode","PARTIAL_VALIDATION_TYPES","PARTIAL_VALIDATION_EVENTS","validity","origBadInput","badInput","origTypeMismatch","typeMismatch","$render","ctrl.$render","createDateParser","mapping","iso","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","NaN","createDateInputType","parseDate","dynamicDateInputType","isValidDate","parseObservedDateValue","badInputChecker","$options","previousDate","$$parserName","$parsers","parsedDate","ngModelMinErr","ngMin","minVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","ctrl.$validators.max","VALIDITY_STATE_PROPERTY","parseConstantExpr","parseFn","classDirective","arrayDifference","arrayClasses","addClasses","digestClassCounts","classCounts","classesToUpdate","updateClasses","ngClassWatchAction","$index","old$index","mod","cachedToggleClass","switchValue","classCache","toggleValidationCss","validationErrorKey","isValid","VALID_CLASS","INVALID_CLASS","setValidity","isObjectEmpty","PENDING_CLASS","combinedState","REGEX_STRING_REGEXP","documentMode","rules","ngCspElement","ngCspAttribute","noInlineStyle","name_","el","full","major","minor","dot","codeName","expando","JQLite._data","mouseleave","mouseenter","optgroup","tbody","tfoot","colgroup","caption","thead","th","td","Node","contains","compareDocumentPosition","ready","trigger","fired","removeData","jqLiteHasData","jqLiteCleanData","removeAttribute","css","NODE_TYPE_ATTRIBUTE","lowercasedName","specified","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","jqLiteOn","types","addHandler","noEventListener","one","onFn","replaceNode","insertBefore","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","FN_ARG_SPLIT","FN_ARG","argDecl","underscore","$animateMinErr","postDigestElements","updateData","handleCSSClassChanges","existing","pin","domOperation","from","to","classesAdded","add","classesRemoved","runner","complete","$$registeredAnimations","classNameFilter","this.classNameFilter","$$classNameFilter","reservedRegex","NG_ANIMATE_CLASSNAME","domInsert","parentElement","afterElement","afterNode","ELEMENT_NODE","previousElementSibling","enter","move","leave","addclass","animate","tempClasses","waitForTick","waitQueue","passed","AnimateRunner","setHost","rafTick","_doneCallbacks","_tick","this._tick","doc","hidden","_state","AnimateRunner.chain","AnimateRunner.all","runners","onProgress","DONE_COMPLETE_STATE","getPromise","resolveHandler","rejectHandler","pause","resume","_resolve","INITIAL_STATE","DONE_PENDING_STATE","initialOptions","closed","$$prepared","cleanupStyles","start","UNINITIALIZED_VALUE","isFirstChange","SimpleChange.prototype.isFirstChange","offsetWidth","APPLICATION_JSON","$httpMinErr","$interpolateMinErr.throwNoconcat","$interpolateMinErr.interr","PATH_MATCH","locationPrototype","paramValue","Location","Location.prototype.state","OPERATORS","ESCAPE","lex","tokens","readString","peek","readNumber","peekMultichar","readIdent","is","isWhitespace","ch2","ch3","op2","op3","op1","throwError","chars","codePointAt","isValidIdentifierStart","isValidIdentifierContinue","cp","charCodeAt","cp1","cp2","isExpOperator","colStr","peekCh","quote","rawString","hex","String","fromCharCode","rep","ExpressionStatement","Property","program","expressionStatement","expect","filterChain","assignment","ternary","logicalOR","consume","logicalAND","equality","relational","additive","multiplicative","unary","primary","arrayDeclaration","selfReferential","parseArguments","baseExpression","peekToken","kind","e1","e2","e3","e4","peekAhead","t","nextId","vars","own","assignable","stage","computing","recurse","return_","generateFunction","fnKey","intoId","watchId","fnString","USE","STRICT","filterPrefix","watchFns","varsPrefix","section","nameId","recursionFn","skipWatchIdCheck","if_","lazyAssign","computedMember","lazyRecurse","plus","not","getHasOwnProperty","nonComputedMember","addEnsureSafeObject","notNull","addEnsureSafeAssignContext","addEnsureSafeMemberName","addEnsureSafeFunction","member","filterName","defaultValue","UNSAFE_CHARACTERS","SAFE_IDENTIFIER","stringEscapeFn","stringEscapeRegex","c","skip","init","fn.assign","rhs","lhs","unary+","unary-","unary!","binary+","binary-","binary*","binary/","binary%","binary===","binary!==","binary==","binary!=","binary<","binary>","binary<=","binary>=","binary&&","binary||","ternary?:","astCompiler","yy","y","MMMM","MMM","M","LLLL","H","hh","EEEE","EEE","ampmGetter","AMPMS","Z","timeZoneGetter","zone","paddedZone","ww","w","G","GG","GGG","GGGG","longEraGetter","ERANAMES","xlinkHref","propName","defaultLinkFn","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","getSetter","ngFormCompile","formElement","nameAttr","ngFormPreLink","ctrls","handleFormSubmission","setter","URL_REGEXP","EMAIL_REGEXP","NUMBER_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","modelValue","viewValue","emailInputType","email","ctrl.$validators.email","radioInputType","checked","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","ngBindHtmlGetter","ngBindHtmlWatch","sceValueOf","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","$viewChangeListeners","forceAsyncEvents","ngEventHandler","previousElements","ngIfWatchAction","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","trimValues","NgModelController","$modelValue","$$rawModelValue","$asyncValidators","$untouched","$touched","parsedNgModel","parsedNgModelAssign","ngModelGet","ngModelSet","pendingDebounce","parserValid","$$setOptions","this.$$setOptions","getterSetter","invokeModelGetter","invokeModelSetter","$$$p","this.$isEmpty","$$updateEmptyClasses","this.$$updateEmptyClasses","NOT_EMPTY_CLASS","EMPTY_CLASS","currentValidationRunId","this.$setPristine","this.$setDirty","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","prevValid","prevModelValue","allowInvalid","$$runValidators","allValid","$$writeModelToScope","this.$$runValidators","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","$$parseAndValidate","this.$$parseAndValidate","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","DEFAULT_REGEXP","ngOptionsMinErr","NG_OPTIONS_REGEXP","parseOptionsExpression","optionsExp","selectElement","Option","selectValue","label","group","disabled","getOptionValuesKeys","optionValues","optionValuesKeys","keyName","itemKey","valueName","selectAs","trackBy","viewValueFn","trackByFn","getTrackByValueFn","getHashOfValue","getTrackByValue","getLocals","displayFn","groupByFn","disableWhenFn","valuesFn","getWatchables","watchedArray","optionValuesLength","disableWhen","getOptions","optionItems","selectValueMap","optionItem","getOptionFromViewValue","getViewValueFromOption","optionTemplate","optGroupTemplate","ngOptionsPreLink","registerOption","ngOptionsPostLink","updateOptionElement","updateOptions","selectCtrl","readValue","groupElementMap","providedEmptyOption","emptyOption","addOption","groupElement","listFragment","optionElement","ngModelCtrl","nextValue","unknownOption","ngModelCtrl.$isEmpty","writeValue","selectCtrl.writeValue","selectCtrl.readValue","selectedValues","selections","selectedOption","BRACE","IS_WHEN","updateElementText","newText","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","lastCount","attributeName","tmpMatch","whenKey","ngPluralizeWatchAction","countIsNaN","pluralCat","whenExpFn","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","ngSwitchController","cases","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngTranscludeMinErr","ngTranscludeCloneAttachFn","ngTranscludeSlot","noopNgModelController","SelectController","optionsMap","renderUnknownOption","self.renderUnknownOption","unknownVal","removeUnknownOption","self.removeUnknownOption","self.readValue","self.writeValue","hasOption","self.addOption","removeOption","self.removeOption","self.hasOption","self.registerOption","optionScope","optionAttrs","interpolateValueFn","interpolateTextFn","valueAttributeObserveAction","interpolateWatchAction","selectPreLink","lastView","lastViewRef","selectMultipleWatch","selectPostLink","ngModelCtrl.$render","selectCtrlName","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","intVal","ctrl.$validators.maxlength","ctrl.$validators.minlength","getDecimals","opt_precision","pow","ONE","OTHER","$$csp","head"] +} diff --git a/spring-security-mvc-socket/src/main/webapp/resources/vendor/jquery/jquery.min.js b/spring-security-mvc-socket/src/main/webapp/resources/vendor/jquery/jquery.min.js new file mode 100644 index 0000000000..88ed04cce7 --- /dev/null +++ b/spring-security-mvc-socket/src/main/webapp/resources/vendor/jquery/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.0.0 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.0.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return a&&"[object Object]"===k.call(a)?(b=e(a))?(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n):!0:!1},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;d>f;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a)?(d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e):void 0},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"===c||r.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\x00-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\x00"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[0>c?c+b:c]}),even:pa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,e>i&&ya(a.slice(i,e)),f>e&&ya(a=a.slice(e)),f>e&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;d>b;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;d>b;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(f>b)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(1>=b&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){ + return j.call(r(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthf;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;g>f;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;d>c;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;o>n;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;cc;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;m>l;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;i>l;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;e>d;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;e>d;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),0>=d||null==d){if(d=Ma(a,b,f),(0>d||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){return c?!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)}):void 0},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){return b?(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;e>g;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);g>f;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;e>d;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c); +}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){return r.isArray(b)?a.checked=r.inArray(r(a).val(),b)>-1:void 0}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?r.event.trigger(a,b,c,!0):void 0}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",0>b&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;return o.cors||Pb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("