From c79df708b14115176721aa8dbda1ccd97f88da37 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Sat, 20 Aug 2016 13:17:53 +0530 Subject: [PATCH 01/14] #211 added real world examples from Java api for creational patterns --- abstract-factory/README.md | 4 +++- builder/README.md | 3 +++ factory-method/README.md | 12 ++++++++---- singleton/README.md | 3 +++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/abstract-factory/README.md b/abstract-factory/README.md index 485599b98..fd669551d 100644 --- a/abstract-factory/README.md +++ b/abstract-factory/README.md @@ -4,7 +4,7 @@ title: Abstract Factory folder: abstract-factory permalink: /patterns/abstract-factory/ categories: Creational -tags: +tags: - Java - Gang Of Four - Difficulty-Intermediate @@ -30,6 +30,8 @@ Use the Abstract Factory pattern when ## Real world examples * [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html) +* [javax.xml.transform.TransformerFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newInstance--) +* [javax.xml.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--) ## Credits diff --git a/builder/README.md b/builder/README.md index 5d1f3d24d..9f374d94d 100644 --- a/builder/README.md +++ b/builder/README.md @@ -26,6 +26,9 @@ Use the Builder pattern when ## Real world examples * [java.lang.StringBuilder](http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html) +* [java.nio.ByteBuffer](http://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html#put-byte-) as well as similar buffers such as FloatBuffer, IntBuffer and so on. +* [java.lang.StringBuffer](http://docs.oracle.com/javase/8/docs/api/java/lang/StringBuffer.html#append-boolean-) +* All implementations of [java.lang.Appendable](http://docs.oracle.com/javase/8/docs/api/java/lang/Appendable.html) * [Apache Camel builders](https://github.com/apache/camel/tree/0e195428ee04531be27a0b659005e3aa8d159d23/camel-core/src/main/java/org/apache/camel/builder) ## Credits diff --git a/factory-method/README.md b/factory-method/README.md index 05549cf4f..c379e9609 100644 --- a/factory-method/README.md +++ b/factory-method/README.md @@ -4,7 +4,7 @@ title: Factory Method folder: factory-method permalink: /patterns/factory-method/ categories: Creational -tags: +tags: - Java - Difficulty-Beginner - Gang Of Four @@ -29,9 +29,13 @@ Use the Factory Method pattern when ## Known uses -* java.util.Calendar -* java.util.ResourceBundle -* java.text.NumberFormat#getInstance() +* [java.util.Calendar](http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--) +* [java.util.ResourceBundle](http://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-) +* [java.text.NumberFormat](http://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getInstance--) +* [java.nio.charset.Charset](http://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#forName-java.lang.String-) +* [java.net.URLStreamHandlerFactory](http://docs.oracle.com/javase/8/docs/api/java/net/URLStreamHandlerFactory.html#createURLStreamHandler-java.lang.String-) +* [java.util.EnumSet](https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html#of-E-) +* [javax.xml.bind.JAXBContext](https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBContext.html#createMarshaller--) ## Credits diff --git a/singleton/README.md b/singleton/README.md index 2a481f5c8..f821752ba 100644 --- a/singleton/README.md +++ b/singleton/README.md @@ -31,6 +31,9 @@ Use the Singleton pattern when ## Real world examples * [java.lang.Runtime#getRuntime()](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#getRuntime%28%29) +* [java.awt.Desktop#getDesktop()](http://docs.oracle.com/javase/8/docs/api/java/awt/Desktop.html#getDesktop--) +* [java.lang.System#getSecurityManager()](http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getSecurityManager--) + ## Credits From a0c77c32b58dec68b75a65ed8de4e0eff966ae15 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Sat, 20 Aug 2016 20:49:28 +0530 Subject: [PATCH 02/14] #211 added further examples for structural and behavioral patterns --- adapter/README.md | 4 ++++ chain/README.md | 1 + command/README.md | 3 ++- decorator/README.md | 8 ++++++++ flyweight/README.md | 4 ++-- interpreter/README.md | 9 ++++++++- iterator/README.md | 3 ++- mediator/README.md | 10 +++++++++- observer/README.md | 4 +++- state/README.md | 5 +++++ visitor/README.md | 3 +++ 11 files changed, 47 insertions(+), 7 deletions(-) diff --git a/adapter/README.md b/adapter/README.md index ea3baa7fa..6f517127f 100644 --- a/adapter/README.md +++ b/adapter/README.md @@ -30,6 +30,10 @@ Use the Adapter pattern when ## Real world examples * [java.util.Arrays#asList()](http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList%28T...%29) +* [java.util.Collections#list()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#list-java.util.Enumeration-) +* [java.util.Collections#enumeration()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#enumeration-java.util.Collection-) +* [javax.xml.bind.annotation.adapters.XMLAdapter](http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html#marshal-BoundType-) + ## Credits diff --git a/chain/README.md b/chain/README.md index ef18f6f64..0bf73fb92 100644 --- a/chain/README.md +++ b/chain/README.md @@ -28,6 +28,7 @@ Use Chain of Responsibility when * [java.util.logging.Logger#log()](http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#log%28java.util.logging.Level,%20java.lang.String%29) * [Apache Commons Chain](https://commons.apache.org/proper/commons-chain/index.html) +* [javax.servlet.Filter#doFilter()](http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html#doFilter-javax.servlet.ServletRequest-javax.servlet.ServletResponse-javax.servlet.FilterChain-) ## Credits diff --git a/command/README.md b/command/README.md index a5478394c..987ec6a34 100644 --- a/command/README.md +++ b/command/README.md @@ -4,7 +4,7 @@ title: Command folder: command permalink: /patterns/command/ categories: Behavioral -tags: +tags: - Java - Gang Of Four - Difficulty-Intermediate @@ -40,6 +40,7 @@ Use the Command pattern when you want to * [java.lang.Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html) * [Netflix Hystrix](https://github.com/Netflix/Hystrix/wiki) +* [javax.swing.Action](http://docs.oracle.com/javase/8/docs/api/javax/swing/Action.html) ## Credits diff --git a/decorator/README.md b/decorator/README.md index 63795114c..9acf417ad 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -27,6 +27,14 @@ Use Decorator * for responsibilities that can be withdrawn * when extension by subclassing is impractical. Sometimes a large number of independent extensions are possible and would produce an explosion of subclasses to support every combination. Or a class definition may be hidden or otherwise unavailable for subclassing +## Real World examples + * [java.io.InputStream](http://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html), [java.io.OutputStream](http://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html), + [java.io.Reader](http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html) and [java.io.Writer](http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html) + * [java.util.Collections#synchronizedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-) + * [java.util.Collections#unmodifiableXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableCollection-java.util.Collection-) + * [java.util.Collections#checkedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#checkedCollection-java.util.Collection-java.lang.Class-) + + ## Credits * [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) diff --git a/flyweight/README.md b/flyweight/README.md index a98dced8e..5bb8eb380 100644 --- a/flyweight/README.md +++ b/flyweight/README.md @@ -4,7 +4,7 @@ title: Flyweight folder: flyweight permalink: /patterns/flyweight/ categories: Structural -tags: +tags: - Java - Gang Of Four - Difficulty-Intermediate @@ -30,7 +30,7 @@ true ## Real world examples -* [java.lang.Integer#valueOf(int)](http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#valueOf%28int%29) +* [java.lang.Integer#valueOf(int)](http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#valueOf%28int%29) and similarly for Byte, Character and other wrapped types. ## Credits diff --git a/interpreter/README.md b/interpreter/README.md index 87c1c47f7..4fcc5e6ff 100644 --- a/interpreter/README.md +++ b/interpreter/README.md @@ -4,7 +4,7 @@ title: Interpreter folder: interpreter permalink: /patterns/interpreter/ categories: Behavioral -tags: +tags: - Java - Gang Of Four - Difficulty-Intermediate @@ -25,6 +25,13 @@ trees. The Interpreter pattern works best when * the grammar is simple. For complex grammars, the class hierarchy for the grammar becomes large and unmanageable. Tools such as parser generators are a better alternative in such cases. They can interpret expressions without building abstract syntax trees, which can save space and possibly time * efficiency is not a critical concern. The most efficient interpreters are usually not implemented by interpreting parse trees directly but by first translating them into another form. For example, regular expressions are often transformed into state machines. But even then, the translator can be implemented by the Interpreter pattern, so the pattern is still applicable +## Real World Applications +* [java.util.Pattern](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html) +* [java.text.Normalizer](http://docs.oracle.com/javase/8/docs/api/java/text/Normalizer.html) +* All subclasses of [java.text.Format](http://docs.oracle.com/javase/8/docs/api/java/text/Format.html) +* [javax.el.ELResolver](http://docs.oracle.com/javaee/7/api/javax/el/ELResolver.html) + + ## Credits * [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) diff --git a/iterator/README.md b/iterator/README.md index d6be7758d..723e7f03c 100644 --- a/iterator/README.md +++ b/iterator/README.md @@ -4,7 +4,7 @@ title: Iterator folder: iterator permalink: /patterns/iterator/ categories: Behavioral -tags: +tags: - Java - Difficulty-Beginner - Gang Of Four @@ -29,6 +29,7 @@ Use the Iterator pattern ## Real world examples * [java.util.Iterator](http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html) +* [java.util.Enumeration](http://docs.oracle.com/javase/8/docs/api/java/util/Enumeration.html) ## Credits diff --git a/mediator/README.md b/mediator/README.md index c7a0478c8..5a784bbcb 100644 --- a/mediator/README.md +++ b/mediator/README.md @@ -24,6 +24,14 @@ Use the Mediator pattern when * reusing an object is difficult because it refers to and communicates with many other objects * a behavior that's distributed between several classes should be customizable without a lot of subclassing +## Real World Applications + +* All scheduleXXX() methods of [java.util.Timer](http://docs.oracle.com/javase/8/docs/api/java/util/Timer.html) +* [java.util.concurrent.Executor#execute()](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html#execute-java.lang.Runnable-) +* submit() and invokeXXX() methods of [java.util.concurrent.ExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html) +* scheduleXXX() methods of [java.util.concurrent.ScheduledExecutorService](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html) +* [java.lang.reflect.Method#invoke()](http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#invoke-java.lang.Object-java.lang.Object...-) + ## Credits -* [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) +* [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) diff --git a/observer/README.md b/observer/README.md index 6fbe3cdab..e25359f02 100644 --- a/observer/README.md +++ b/observer/README.md @@ -4,7 +4,7 @@ title: Observer folder: observer permalink: /patterns/observer/ categories: Behavioral -tags: +tags: - Java - Difficulty-Beginner - Gang Of Four @@ -35,6 +35,8 @@ Use the Observer pattern in any of the following situations ## Real world examples * [java.util.Observer](http://docs.oracle.com/javase/8/docs/api/java/util/Observer.html) +* [java.util.EventListener](http://docs.oracle.com/javase/8/docs/api/java/util/EventListener.html) +* [javax.servlet.http.HttpSessionBindingListener](http://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSessionBindingListener.html) ## Credits diff --git a/state/README.md b/state/README.md index f5cb189fd..948c62a08 100644 --- a/state/README.md +++ b/state/README.md @@ -25,6 +25,11 @@ Use the State pattern in either of the following cases * an object's behavior depends on its state, and it must change its behavior at run-time depending on that state * operations have large, multipart conditional statements that depend on the object's state. This state is usually represented by one or more enumerated constants. Often, several operations will contain this same conditional structure. The State pattern puts each branch of the conditional in a separate class. This lets you treat the object's state as an object in its own right that can vary independently from other objects. +## Real world applications + +* [javax.faces.lifecycle.Lifecycle#execute()](http://docs.oracle.com/javaee/7/api/javax/faces/lifecycle/Lifecycle.html#execute-javax.faces.context.FacesContext-) controlled by [FacesServlet](http://docs.oracle.com/javaee/7/api/javax/faces/webapp/FacesServlet.html), the behavior is dependent on current phase of lifecycle. +* [JDiameter - Diameter State Machine](https://github.com/npathai/jdiameter/blob/master/core/jdiameter/api/src/main/java/org/jdiameter/api/app/State.java) + ## Credits * [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) diff --git a/visitor/README.md b/visitor/README.md index c1e24a624..bda789a18 100644 --- a/visitor/README.md +++ b/visitor/README.md @@ -27,6 +27,9 @@ Use the Visitor pattern when ## Real world examples * [Apache Wicket](https://github.com/apache/wicket) component tree, see [MarkupContainer](https://github.com/apache/wicket/blob/b60ec64d0b50a611a9549809c9ab216f0ffa3ae3/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java) +* [javax.lang.model.element.AnnotationValue](http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/AnnotationValue.html) and [AnnotationValueVisitor](http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/AnnotationValueVisitor.html) +* [javax.lang.model.element.Element](http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/Element.html) and [Element Visitor](http://docs.oracle.com/javase/8/docs/api/javax/lang/model/element/ElementVisitor.html) +* [java.nio.file.FileVisitor](http://docs.oracle.com/javase/8/docs/api/java/nio/file/FileVisitor.html) ## Credits From 28647cdf482e878bb28ae535ae9c23cc1992f8a5 Mon Sep 17 00:00:00 2001 From: Narendra Pathai Date: Sat, 20 Aug 2016 20:57:48 +0530 Subject: [PATCH 03/14] #211, consistent use of real world examples section in all readme files. --- decorator/README.md | 4 ++-- interpreter/README.md | 2 +- mediator/README.md | 2 +- state/README.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/decorator/README.md b/decorator/README.md index 9acf417ad..08f869645 100644 --- a/decorator/README.md +++ b/decorator/README.md @@ -27,13 +27,13 @@ Use Decorator * for responsibilities that can be withdrawn * when extension by subclassing is impractical. Sometimes a large number of independent extensions are possible and would produce an explosion of subclasses to support every combination. Or a class definition may be hidden or otherwise unavailable for subclassing -## Real World examples +## Real world examples * [java.io.InputStream](http://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html), [java.io.OutputStream](http://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html), [java.io.Reader](http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html) and [java.io.Writer](http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html) * [java.util.Collections#synchronizedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedCollection-java.util.Collection-) * [java.util.Collections#unmodifiableXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableCollection-java.util.Collection-) * [java.util.Collections#checkedXXX()](http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#checkedCollection-java.util.Collection-java.lang.Class-) - + ## Credits diff --git a/interpreter/README.md b/interpreter/README.md index 4fcc5e6ff..be6517962 100644 --- a/interpreter/README.md +++ b/interpreter/README.md @@ -25,7 +25,7 @@ trees. The Interpreter pattern works best when * the grammar is simple. For complex grammars, the class hierarchy for the grammar becomes large and unmanageable. Tools such as parser generators are a better alternative in such cases. They can interpret expressions without building abstract syntax trees, which can save space and possibly time * efficiency is not a critical concern. The most efficient interpreters are usually not implemented by interpreting parse trees directly but by first translating them into another form. For example, regular expressions are often transformed into state machines. But even then, the translator can be implemented by the Interpreter pattern, so the pattern is still applicable -## Real World Applications +## Real world examples * [java.util.Pattern](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html) * [java.text.Normalizer](http://docs.oracle.com/javase/8/docs/api/java/text/Normalizer.html) * All subclasses of [java.text.Format](http://docs.oracle.com/javase/8/docs/api/java/text/Format.html) diff --git a/mediator/README.md b/mediator/README.md index 5a784bbcb..3452082ef 100644 --- a/mediator/README.md +++ b/mediator/README.md @@ -24,7 +24,7 @@ Use the Mediator pattern when * reusing an object is difficult because it refers to and communicates with many other objects * a behavior that's distributed between several classes should be customizable without a lot of subclassing -## Real World Applications +## Real world examples * All scheduleXXX() methods of [java.util.Timer](http://docs.oracle.com/javase/8/docs/api/java/util/Timer.html) * [java.util.concurrent.Executor#execute()](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html#execute-java.lang.Runnable-) diff --git a/state/README.md b/state/README.md index 948c62a08..549afa61f 100644 --- a/state/README.md +++ b/state/README.md @@ -25,7 +25,7 @@ Use the State pattern in either of the following cases * an object's behavior depends on its state, and it must change its behavior at run-time depending on that state * operations have large, multipart conditional statements that depend on the object's state. This state is usually represented by one or more enumerated constants. Often, several operations will contain this same conditional structure. The State pattern puts each branch of the conditional in a separate class. This lets you treat the object's state as an object in its own right that can vary independently from other objects. -## Real world applications +## Real world examples * [javax.faces.lifecycle.Lifecycle#execute()](http://docs.oracle.com/javaee/7/api/javax/faces/lifecycle/Lifecycle.html#execute-javax.faces.context.FacesContext-) controlled by [FacesServlet](http://docs.oracle.com/javaee/7/api/javax/faces/webapp/FacesServlet.html), the behavior is dependent on current phase of lifecycle. * [JDiameter - Diameter State Machine](https://github.com/npathai/jdiameter/blob/master/core/jdiameter/api/src/main/java/org/jdiameter/api/app/State.java) From ab68129829b227cf6ac5637538775219a8463ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 3 Sep 2016 22:02:08 +0300 Subject: [PATCH 04/14] Hexagonal pattern: move business logic to core --- .../administration/LotteryAdministration.java | 4 +- .../LotteryAdministrationImpl.java | 47 ++------ .../hexagonal/domain/LotterySystem.java | 58 ++++++++++ .../hexagonal/domain/LotterySystemImpl.java | 107 ++++++++++++++++++ .../hexagonal/service/LotteryService.java | 4 +- .../hexagonal/service/LotteryServiceImpl.java | 45 ++------ .../{lottery => domain}/LotteryTest.java | 38 +++---- 7 files changed, 202 insertions(+), 101 deletions(-) create mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java create mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java rename hexagonal/src/test/java/com/iluwatar/hexagonal/{lottery => domain}/LotteryTest.java (67%) diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java index bc625b230..c6c034ac9 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java @@ -22,12 +22,12 @@ */ package com.iluwatar.hexagonal.administration; -import java.util.Map; - import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketId; +import java.util.Map; + /** * * Administrator interface for lottery service. diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministrationImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministrationImpl.java index a452600aa..2003849c2 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministrationImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministrationImpl.java @@ -22,22 +22,13 @@ */ package com.iluwatar.hexagonal.administration; -import java.util.Map; - -import com.iluwatar.hexagonal.banking.WireTransfers; -import com.iluwatar.hexagonal.banking.WireTransfersImpl; -import com.iluwatar.hexagonal.database.LotteryTicketRepository; -import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; -import com.iluwatar.hexagonal.domain.LotteryConstants; import com.iluwatar.hexagonal.domain.LotteryNumbers; +import com.iluwatar.hexagonal.domain.LotterySystem; +import com.iluwatar.hexagonal.domain.LotterySystemImpl; import com.iluwatar.hexagonal.domain.LotteryTicket; -import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; -import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; import com.iluwatar.hexagonal.domain.LotteryTicketId; -import com.iluwatar.hexagonal.notifications.LotteryNotifications; -import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; -import com.iluwatar.hexagonal.service.LotteryService; -import com.iluwatar.hexagonal.service.LotteryServiceImpl; + +import java.util.Map; /** * @@ -46,42 +37,24 @@ import com.iluwatar.hexagonal.service.LotteryServiceImpl; */ public class LotteryAdministrationImpl implements LotteryAdministration { - private final LotteryTicketRepository repository; - private final LotteryService service = new LotteryServiceImpl(); - private final LotteryNotifications notifications = new LotteryNotificationsImpl(); - private final WireTransfers bank = new WireTransfersImpl(); + private final LotterySystem lotterySystem; + public LotteryAdministrationImpl() { - repository = new LotteryTicketInMemoryRepository(); + lotterySystem = new LotterySystemImpl(); } @Override public Map getAllSubmittedTickets() { - return repository.findAll(); + return lotterySystem.getAllSubmittedTickets(); } @Override public LotteryNumbers performLottery() { - LotteryNumbers numbers = LotteryNumbers.createRandom(); - Map tickets = getAllSubmittedTickets(); - for (LotteryTicketId id: tickets.keySet()) { - LotteryTicketCheckResult result = service.checkTicketForPrize(id, numbers); - if (result.getResult().equals(CheckResult.WIN_PRIZE)) { - boolean transferred = bank.transferFunds(LotteryConstants.PRIZE_AMOUNT, LotteryConstants.SERVICE_BANK_ACCOUNT, - tickets.get(id).getPlayerDetails().getBankAccount()); - if (transferred) { - notifications.notifyPrize(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); - } else { - notifications.notifyPrizeError(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); - } - } else if (result.getResult().equals(CheckResult.NO_PRIZE)) { - notifications.notifyNoWin(tickets.get(id).getPlayerDetails()); - } - } - return numbers; + return lotterySystem.performLottery(); } @Override public void resetLottery() { - repository.deleteAll(); + lotterySystem.resetLottery(); } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java new file mode 100644 index 000000000..2ee114556 --- /dev/null +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java @@ -0,0 +1,58 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.hexagonal.domain; + +import java.util.Map; +import java.util.Optional; + +/** + * Lottery system interface + */ +public interface LotterySystem { + + /** + * Get all the lottery tickets submitted for lottery + */ + Map getAllSubmittedTickets(); + + /** + * Draw lottery numbers + */ + LotteryNumbers performLottery(); + + /** + * Begin new lottery round + */ + void resetLottery(); + + /** + * Submit lottery ticket to participate in the lottery + */ + Optional submitTicket(LotteryTicket ticket); + + /** + * Check if lottery ticket has won + */ + LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers); + +} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java new file mode 100644 index 000000000..a9290520c --- /dev/null +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java @@ -0,0 +1,107 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.hexagonal.domain; + +import com.iluwatar.hexagonal.banking.WireTransfers; +import com.iluwatar.hexagonal.banking.WireTransfersImpl; +import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; +import com.iluwatar.hexagonal.database.LotteryTicketRepository; +import com.iluwatar.hexagonal.notifications.LotteryNotifications; +import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; + +import java.util.Map; +import java.util.Optional; + +/** + * Lottery system implementation + */ +public class LotterySystemImpl implements LotterySystem { + + private final LotteryTicketRepository repository; + private final LotteryNotifications notifications = new LotteryNotificationsImpl(); + private final WireTransfers bank = new WireTransfersImpl(); + + public LotterySystemImpl() { + repository = new LotteryTicketInMemoryRepository(); + } + + @Override + public Map getAllSubmittedTickets() { + return repository.findAll(); + } + + @Override + public LotteryNumbers performLottery() { + LotteryNumbers numbers = LotteryNumbers.createRandom(); + Map tickets = getAllSubmittedTickets(); + for (LotteryTicketId id : tickets.keySet()) { + LotteryTicketCheckResult result = checkTicketForPrize(id, numbers); + if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { + boolean transferred = bank.transferFunds(LotteryConstants.PRIZE_AMOUNT, LotteryConstants.SERVICE_BANK_ACCOUNT, + tickets.get(id).getPlayerDetails().getBankAccount()); + if (transferred) { + notifications.notifyPrize(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); + } else { + notifications.notifyPrizeError(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); + } + } else if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.NO_PRIZE)) { + notifications.notifyNoWin(tickets.get(id).getPlayerDetails()); + } + } + return numbers; + } + + @Override + public void resetLottery() { + repository.deleteAll(); + } + + @Override + public Optional submitTicket(LotteryTicket ticket) { + boolean result = bank.transferFunds(LotteryConstants.TICKET_PRIZE, ticket.getPlayerDetails().getBankAccount(), + LotteryConstants.SERVICE_BANK_ACCOUNT); + if (result == false) { + notifications.notifyTicketSubmitError(ticket.getPlayerDetails()); + return Optional.empty(); + } + Optional optional = repository.save(ticket); + if (optional.isPresent()) { + notifications.notifyTicketSubmitted(ticket.getPlayerDetails()); + } + return optional; + } + + @Override + public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { + Optional optional = repository.findById(id); + if (optional.isPresent()) { + if (optional.get().getNumbers().equals(winningNumbers)) { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.WIN_PRIZE, 1000); + } else { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.NO_PRIZE); + } + } else { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.TICKET_NOT_SUBMITTED); + } + } +} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java index 0056e794b..ef2202968 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java @@ -22,13 +22,13 @@ */ package com.iluwatar.hexagonal.service; -import java.util.Optional; - import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; import com.iluwatar.hexagonal.domain.LotteryTicketId; +import java.util.Optional; + /** * * Interface for submitting and checking lottery tickets. diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java index 58df1c7c8..5bce62054 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java @@ -22,20 +22,14 @@ */ package com.iluwatar.hexagonal.service; -import java.util.Optional; - -import com.iluwatar.hexagonal.banking.WireTransfers; -import com.iluwatar.hexagonal.banking.WireTransfersImpl; -import com.iluwatar.hexagonal.database.LotteryTicketRepository; -import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; -import com.iluwatar.hexagonal.domain.LotteryConstants; import com.iluwatar.hexagonal.domain.LotteryNumbers; +import com.iluwatar.hexagonal.domain.LotterySystem; +import com.iluwatar.hexagonal.domain.LotterySystemImpl; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; import com.iluwatar.hexagonal.domain.LotteryTicketId; -import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; -import com.iluwatar.hexagonal.notifications.LotteryNotifications; -import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; + +import java.util.Optional; /** * @@ -44,45 +38,22 @@ import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; */ public class LotteryServiceImpl implements LotteryService { - private final LotteryTicketRepository repository; - - private final WireTransfers bank = new WireTransfersImpl(); - - private final LotteryNotifications notifications = new LotteryNotificationsImpl(); + private final LotterySystem lotterySystem; /** * Constructor */ public LotteryServiceImpl() { - repository = new LotteryTicketInMemoryRepository(); + lotterySystem = new LotterySystemImpl(); } @Override public Optional submitTicket(LotteryTicket ticket) { - boolean result = bank.transferFunds(LotteryConstants.TICKET_PRIZE, ticket.getPlayerDetails().getBankAccount(), - LotteryConstants.SERVICE_BANK_ACCOUNT); - if (result == false) { - notifications.notifyTicketSubmitError(ticket.getPlayerDetails()); - return Optional.empty(); - } - Optional optional = repository.save(ticket); - if (optional.isPresent()) { - notifications.notifyTicketSubmitted(ticket.getPlayerDetails()); - } - return optional; + return lotterySystem.submitTicket(ticket); } @Override public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { - Optional optional = repository.findById(id); - if (optional.isPresent()) { - if (optional.get().getNumbers().equals(winningNumbers)) { - return new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 1000); - } else { - return new LotteryTicketCheckResult(CheckResult.NO_PRIZE); - } - } else { - return new LotteryTicketCheckResult(CheckResult.TICKET_NOT_SUBMITTED); - } + return lotterySystem.checkTicketForPrize(id, winningNumbers); } } diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/lottery/LotteryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java similarity index 67% rename from hexagonal/src/test/java/com/iluwatar/hexagonal/lottery/LotteryTest.java rename to hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java index 27e5bb6e4..59c8c1930 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/lottery/LotteryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.hexagonal.lottery; +package com.iluwatar.hexagonal.domain; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -30,22 +30,15 @@ import java.util.HashSet; import java.util.Map; import java.util.Optional; +import com.iluwatar.hexagonal.domain.*; import org.junit.Before; import org.junit.Test; -import com.iluwatar.hexagonal.administration.LotteryAdministration; -import com.iluwatar.hexagonal.administration.LotteryAdministrationImpl; import com.iluwatar.hexagonal.banking.WireTransfers; import com.iluwatar.hexagonal.banking.WireTransfersImpl; import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; -import com.iluwatar.hexagonal.domain.LotteryNumbers; -import com.iluwatar.hexagonal.domain.LotteryTicket; -import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; -import com.iluwatar.hexagonal.domain.LotteryTicketId; -import com.iluwatar.hexagonal.service.LotteryService; -import com.iluwatar.hexagonal.service.LotteryServiceImpl; import com.iluwatar.hexagonal.test.LotteryTestUtils; /** @@ -55,8 +48,7 @@ import com.iluwatar.hexagonal.test.LotteryTestUtils; */ public class LotteryTest { - private final LotteryAdministration admin = new LotteryAdministrationImpl(); - private final LotteryService service = new LotteryServiceImpl(); + private final LotterySystem lotterySystem = new LotterySystemImpl(); private final LotteryTicketRepository repository = new LotteryTicketInMemoryRepository(); private final WireTransfers wireTransfers = new WireTransfersImpl(); @@ -72,34 +64,34 @@ public class LotteryTest { wireTransfers.setFunds("123-12312", 100); // admin resets the lottery - admin.resetLottery(); - assertEquals(admin.getAllSubmittedTickets().size(), 0); + lotterySystem.resetLottery(); + assertEquals(lotterySystem.getAllSubmittedTickets().size(), 0); // players submit the lottery tickets - Optional ticket1 = service.submitTicket(LotteryTestUtils.createLotteryTicket("cvt@bbb.com", + Optional ticket1 = lotterySystem.submitTicket(LotteryTestUtils.createLotteryTicket("cvt@bbb.com", "123-12312", "+32425255", new HashSet<>(Arrays.asList(1, 2, 3, 4)))); assertTrue(ticket1.isPresent()); - Optional ticket2 = service.submitTicket(LotteryTestUtils.createLotteryTicket("ant@bac.com", + Optional ticket2 = lotterySystem.submitTicket(LotteryTestUtils.createLotteryTicket("ant@bac.com", "123-12312", "+32423455", new HashSet<>(Arrays.asList(11, 12, 13, 14)))); assertTrue(ticket2.isPresent()); - Optional ticket3 = service.submitTicket(LotteryTestUtils.createLotteryTicket("arg@boo.com", + Optional ticket3 = lotterySystem.submitTicket(LotteryTestUtils.createLotteryTicket("arg@boo.com", "123-12312", "+32421255", new HashSet<>(Arrays.asList(6, 8, 13, 19)))); assertTrue(ticket3.isPresent()); - assertEquals(admin.getAllSubmittedTickets().size(), 3); + assertEquals(lotterySystem.getAllSubmittedTickets().size(), 3); // perform lottery - LotteryNumbers winningNumbers = admin.performLottery(); + LotteryNumbers winningNumbers = lotterySystem.performLottery(); // cheat a bit for testing sake, use winning numbers to submit another ticket - Optional ticket4 = service.submitTicket(LotteryTestUtils.createLotteryTicket("lucky@orb.com", + Optional ticket4 = lotterySystem.submitTicket(LotteryTestUtils.createLotteryTicket("lucky@orb.com", "123-12312", "+12421255", winningNumbers.getNumbers())); assertTrue(ticket4.isPresent()); - assertEquals(admin.getAllSubmittedTickets().size(), 4); + assertEquals(lotterySystem.getAllSubmittedTickets().size(), 4); // check winners - Map tickets = admin.getAllSubmittedTickets(); + Map tickets = lotterySystem.getAllSubmittedTickets(); for (LotteryTicketId id: tickets.keySet()) { - LotteryTicketCheckResult checkResult = service.checkTicketForPrize(id, winningNumbers); + LotteryTicketCheckResult checkResult = lotterySystem.checkTicketForPrize(id, winningNumbers); assertTrue(checkResult.getResult() != CheckResult.TICKET_NOT_SUBMITTED); if (checkResult.getResult().equals(CheckResult.WIN_PRIZE)) { assertTrue(checkResult.getPrizeAmount() > 0); @@ -109,7 +101,7 @@ public class LotteryTest { } // check another ticket that has not been submitted - LotteryTicketCheckResult checkResult = service.checkTicketForPrize(new LotteryTicketId(), winningNumbers); + LotteryTicketCheckResult checkResult = lotterySystem.checkTicketForPrize(new LotteryTicketId(), winningNumbers); assertTrue(checkResult.getResult() == CheckResult.TICKET_NOT_SUBMITTED); assertEquals(checkResult.getPrizeAmount(), 0); } From 3cb872807eee1173ef4724f51aab10a12e963dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 4 Sep 2016 10:33:26 +0300 Subject: [PATCH 05/14] Hexagonal pattern: remove unnecessary repository usage from a unit test --- .../java/com/iluwatar/hexagonal/domain/LotteryTest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java index 59c8c1930..3e114ddc4 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java @@ -49,20 +49,16 @@ import com.iluwatar.hexagonal.test.LotteryTestUtils; public class LotteryTest { private final LotterySystem lotterySystem = new LotterySystemImpl(); - private final LotteryTicketRepository repository = new LotteryTicketInMemoryRepository(); private final WireTransfers wireTransfers = new WireTransfersImpl(); @Before public void clear() { - repository.deleteAll(); + // add funds to the test player's bank account + wireTransfers.setFunds("123-12312", 100); } @Test public void testLottery() { - - // setup bank account with funds - wireTransfers.setFunds("123-12312", 100); - // admin resets the lottery lotterySystem.resetLottery(); assertEquals(lotterySystem.getAllSubmittedTickets().size(), 0); From 4493341ba6e122c605b05e0d1249631b8bada248 Mon Sep 17 00:00:00 2001 From: Markus Moser Date: Sun, 4 Sep 2016 11:00:24 +0200 Subject: [PATCH 06/14] add documentation to 'use latest java 8' change --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 19d4614f4..613f737d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,7 @@ after_success: - mvn clean test jacoco:report coveralls:report - bash update-ghpages.sh +# use latest java version available instead of travis default addons: apt: packages: From 22821ba8cc677172e802315a4c85592123286d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 6 Sep 2016 21:35:36 +0300 Subject: [PATCH 07/14] Move Guice to parent pom dependency management section --- dependency-injection/pom.xml | 9 +- pom.xml | 819 ++++++++++++++++++----------------- 2 files changed, 416 insertions(+), 412 deletions(-) diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 3472da240..88ccdd2d4 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -43,10 +43,9 @@ mockito-core test - - com.google.inject - guice - 4.0 - + + com.google.inject + guice + diff --git a/pom.xml b/pom.xml index 302346993..023579e97 100644 --- a/pom.xml +++ b/pom.xml @@ -17,413 +17,418 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---> - 4.0.0 - - com.iluwatar - java-design-patterns - 1.13.0-SNAPSHOT - pom - - 2014 - - - UTF-8 - 5.0.1.Final - 4.2.4.RELEASE - 1.3.3.RELEASE - 1.9.2.RELEASE - 1.4.190 - 4.12 - 3.0 - 4.0.0 - 0.7.2.201409121644 - 1.4 - 2.16.1 - 1.2.17 - 19.0 - 1.15.1 - 1.10.19 - 4.12.1 +--> + + 4.0.0 + com.iluwatar + java-design-patterns + 1.13.0-SNAPSHOT + pom + 2014 + + UTF-8 + 5.0.1.Final + 4.2.4.RELEASE + 1.3.3.RELEASE + 1.9.2.RELEASE + 1.4.190 + 4.12 + 3.0 + 4.0.0 + 0.7.2.201409121644 + 1.4 + 2.16.1 + 1.2.17 + 19.0 + 1.15.1 + 1.10.19 + 4.12.1 4.5.2 2.22 1.4.1 - - - abstract-factory - builder - factory-method - prototype - singleton - adapter - bridge - composite - dao - data-mapper - decorator - facade - flyweight - proxy - chain - command - interpreter - iterator - mediator - memento - model-view-presenter - observer - state - strategy - template-method - visitor - double-checked-locking - servant - service-locator - null-object - event-aggregator - callback - execute-around - property - intercepting-filter - producer-consumer - poison-pill - reader-writer-lock - lazy-loading - service-layer - specification - tolerant-reader - model-view-controller - flux - double-dispatch - multiton - resource-acquisition-is-initialization - thread-pool - twin - private-class-data - object-pool - dependency-injection - naked-objects - front-controller - repository - async-method-invocation - monostate - step-builder - business-delegate - half-sync-half-async - layers - message-channel - fluentinterface - reactor - caching - publish-subscribe - delegation - event-driven-architecture - api-gateway - factory-kit - feature-toggle - value-object - monad - mute-idiom - mutex - semaphore - hexagonal - abstract-document - aggregator-microservices - promise + 4.0 + + + abstract-factory + builder + factory-method + prototype + singleton + adapter + bridge + composite + dao + data-mapper + decorator + facade + flyweight + proxy + chain + command + interpreter + iterator + mediator + memento + model-view-presenter + observer + state + strategy + template-method + visitor + double-checked-locking + servant + service-locator + null-object + event-aggregator + callback + execute-around + property + intercepting-filter + producer-consumer + poison-pill + reader-writer-lock + lazy-loading + service-layer + specification + tolerant-reader + model-view-controller + flux + double-dispatch + multiton + resource-acquisition-is-initialization + thread-pool + twin + private-class-data + object-pool + dependency-injection + naked-objects + front-controller + repository + async-method-invocation + monostate + step-builder + business-delegate + half-sync-half-async + layers + message-channel + fluentinterface + reactor + caching + publish-subscribe + delegation + event-driven-architecture + api-gateway + factory-kit + feature-toggle + value-object + monad + mute-idiom + mutex + semaphore + hexagonal + abstract-document + aggregator-microservices + promise page-object - + - - - - org.hibernate - hibernate-core - ${hibernate.version} - - - org.hibernate - hibernate-entitymanager - ${hibernate.version} - - - org.springframework - spring-test - ${spring.version} - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - org.springframework.data - spring-data-jpa - ${spring-data.version} - - - org.springframework - spring-webmvc - ${spring.version} - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot.version} - - - org.apache.httpcomponents - httpclient - ${apache-httpcomponents.version} - - - com.h2database - h2 - ${h2.version} - - - commons-dbcp - commons-dbcp - ${commons-dbcp.version} - - - org.apache.camel - camel-core - ${camel.version} - - - org.apache.camel - camel-stream - ${camel.version} - - - junit - junit - ${junit.version} - test - - - org.mockito - mockito-core - ${mockito.version} - test - - - log4j - log4j - ${log4j.version} - - - com.google.guava - guava - ${guava.version} - - - com.github.stefanbirkner - system-rules - ${systemrules.version} - test - - - de.bechte.junit - junit-hierarchicalcontextrunner - ${hierarchical-junit-runner-version} - test - - - net.sourceforge.htmlunit - htmlunit - ${htmlunit.version} - test - - - + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} + + + org.springframework + spring-test + ${spring.version} + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + org.springframework.data + spring-data-jpa + ${spring-data.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + org.apache.httpcomponents + httpclient + ${apache-httpcomponents.version} + + + com.h2database + h2 + ${h2.version} + + + commons-dbcp + commons-dbcp + ${commons-dbcp.version} + + + org.apache.camel + camel-core + ${camel.version} + + + org.apache.camel + camel-stream + ${camel.version} + + + junit + junit + ${junit.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + log4j + log4j + ${log4j.version} + + + com.google.guava + guava + ${guava.version} + + + com.github.stefanbirkner + system-rules + ${systemrules.version} + test + + + de.bechte.junit + junit-hierarchicalcontextrunner + ${hierarchical-junit-runner-version} + test + + + net.sourceforge.htmlunit + htmlunit + ${htmlunit.version} + test + + + com.google.inject + guice + ${guice.version} + + + - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - org.jacoco - - jacoco-maven-plugin - - - [0.6.2,) - - - prepare-agent - - - - - - - - - - - - + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.jacoco + + jacoco-maven-plugin + + + [0.6.2,) + + + prepare-agent + + + + + + + + + + + + - - - - org.apache.maven.plugins - maven-compiler-plugin - ${compiler.version} - - 1.8 - 1.8 - - - - org.eluder.coveralls - coveralls-maven-plugin - ${coveralls.version} - - jb6wYzxkVvjolD6qOWpzWdcWBzYk2fAmF - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - - - domainapp/dom/modules/simple/QSimpleObject.class - **com.steadystate* - - - - - prepare-agent - - prepare-agent - - - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 2.17 - - - validate - - check - - validate - - checkstyle.xml - checkstyle-suppressions.xml - UTF-8 - true - true - true - - - - - - - org.jacoco - jacoco-maven-plugin - 0.7.5.201505241946 - - - - prepare-agent - - - - report - prepare-package - - report - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - - org.apache.maven.surefire - surefire-junit47 - 2.18.1 - - - - -Xmx1024M ${argLine} - - + + - org.apache.maven.plugins - maven-pmd-plugin - 3.6 - - true - 5 - true - - - - - check - - - exclude-pmd.properties - - - + org.apache.maven.plugins + maven-compiler-plugin + ${compiler.version} + + 1.8 + 1.8 + + + + org.eluder.coveralls + coveralls-maven-plugin + ${coveralls.version} + + jb6wYzxkVvjolD6qOWpzWdcWBzYk2fAmF + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + + + domainapp/dom/modules/simple/QSimpleObject.class + **com.steadystate* + + + + + prepare-agent + + prepare-agent + + + - - com.mycila - license-maven-plugin - 2.11 - -
com/mycila/maven/plugin/license/templates/MIT.txt
- - Ilkka Seppälä - - true -
- - - install-format - install - - format - - - -
+ + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.17 + + + validate + + check + + validate + + checkstyle.xml + checkstyle-suppressions.xml + UTF-8 + true + true + true + + + + + + + org.jacoco + jacoco-maven-plugin + 0.7.5.201505241946 + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + + org.apache.maven.surefire + surefire-junit47 + 2.18.1 + + + + -Xmx1024M ${argLine} + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.6 + + true + 5 + true + + + + + check + + + exclude-pmd.properties + + + + + + + com.mycila + license-maven-plugin + 2.11 + +
com/mycila/maven/plugin/license/templates/MIT.txt
+ + Ilkka Seppälä + + true +
+ + + install-format + install + + format + + + +
com.github.markusmo3.urm @@ -448,17 +453,17 @@ -
-
+ +
- - - - org.apache.maven.plugins - maven-pmd-plugin - 3.6 - - - + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.6 + + +
From 348e577e8ed80b3cf7642b40d5b5378e6965fea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 6 Sep 2016 21:39:08 +0300 Subject: [PATCH 08/14] Hexagonal pattern: Add Guice dependency --- hexagonal/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hexagonal/pom.xml b/hexagonal/pom.xml index e9e2a502d..a73fea48d 100644 --- a/hexagonal/pom.xml +++ b/hexagonal/pom.xml @@ -39,5 +39,9 @@ junit test + + com.google.inject + guice + From 1b10ddbb73ff167e6a411b73442cfeb4b8ed754d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Tue, 6 Sep 2016 22:39:39 +0300 Subject: [PATCH 09/14] Hexagonal pattern: Use Guice dependency injection --- .../main/java/com/iluwatar/hexagonal/App.java | 11 ++-- .../com/iluwatar/hexagonal/LotteryModule.java | 52 +++++++++++++++++++ .../LotteryAdministrationImpl.java | 7 +-- .../hexagonal/domain/LotterySystemImpl.java | 27 ++++++---- .../hexagonal/service/LotteryServiceImpl.java | 7 +-- .../hexagonal/LotteryTestingModule.java | 52 +++++++++++++++++++ .../hexagonal/domain/LotteryTest.java | 21 ++++++-- 7 files changed, 152 insertions(+), 25 deletions(-) create mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java create mode 100644 hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java index 92ebf3572..8f99fb15a 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java @@ -26,15 +26,15 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import com.google.inject.Guice; +import com.google.inject.Injector; import com.iluwatar.hexagonal.administration.LotteryAdministration; -import com.iluwatar.hexagonal.administration.LotteryAdministrationImpl; import com.iluwatar.hexagonal.banking.WireTransfersImpl; import com.iluwatar.hexagonal.domain.LotteryConstants; import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.service.LotteryService; -import com.iluwatar.hexagonal.service.LotteryServiceImpl; /** * @@ -124,12 +124,15 @@ public class App { * Program entry point */ public static void main(String[] args) { + + Injector injector = Guice.createInjector(new LotteryModule()); + // start new lottery round - LotteryAdministration administartion = new LotteryAdministrationImpl(); + LotteryAdministration administartion = injector.getInstance(LotteryAdministration.class); administartion.resetLottery(); // submit some lottery tickets - LotteryServiceImpl service = new LotteryServiceImpl(); + LotteryService service = injector.getInstance(LotteryService.class); submitTickets(service, 20); // perform lottery diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java new file mode 100644 index 000000000..b51bff9f4 --- /dev/null +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java @@ -0,0 +1,52 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.hexagonal; + +import com.google.inject.AbstractModule; +import com.iluwatar.hexagonal.administration.LotteryAdministration; +import com.iluwatar.hexagonal.administration.LotteryAdministrationImpl; +import com.iluwatar.hexagonal.banking.WireTransfers; +import com.iluwatar.hexagonal.banking.WireTransfersImpl; +import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; +import com.iluwatar.hexagonal.database.LotteryTicketRepository; +import com.iluwatar.hexagonal.domain.LotterySystem; +import com.iluwatar.hexagonal.domain.LotterySystemImpl; +import com.iluwatar.hexagonal.notifications.LotteryNotifications; +import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; +import com.iluwatar.hexagonal.service.LotteryService; +import com.iluwatar.hexagonal.service.LotteryServiceImpl; + +/** + * Guice module for binding production dependencies + */ +public class LotteryModule extends AbstractModule { + @Override + protected void configure() { + bind(LotteryTicketRepository.class).to(LotteryTicketInMemoryRepository.class); + bind(LotterySystem.class).to(LotterySystemImpl.class); + bind(LotteryNotifications.class).to(LotteryNotificationsImpl.class); + bind(WireTransfers.class).to(WireTransfersImpl.class); + bind(LotteryAdministration.class).to(LotteryAdministrationImpl.class); + bind(LotteryService.class).to(LotteryServiceImpl.class); + } +} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministrationImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministrationImpl.java index 2003849c2..bef2f07c3 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministrationImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministrationImpl.java @@ -22,9 +22,9 @@ */ package com.iluwatar.hexagonal.administration; +import com.google.inject.Inject; import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotterySystem; -import com.iluwatar.hexagonal.domain.LotterySystemImpl; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketId; @@ -39,8 +39,9 @@ public class LotteryAdministrationImpl implements LotteryAdministration { private final LotterySystem lotterySystem; - public LotteryAdministrationImpl() { - lotterySystem = new LotterySystemImpl(); + @Inject + public LotteryAdministrationImpl(LotterySystem lotterySystem) { + this.lotterySystem = lotterySystem; } @Override diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java index a9290520c..e37185143 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java @@ -22,12 +22,10 @@ */ package com.iluwatar.hexagonal.domain; +import com.google.inject.Inject; import com.iluwatar.hexagonal.banking.WireTransfers; -import com.iluwatar.hexagonal.banking.WireTransfersImpl; -import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.notifications.LotteryNotifications; -import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; import java.util.Map; import java.util.Optional; @@ -38,11 +36,18 @@ import java.util.Optional; public class LotterySystemImpl implements LotterySystem { private final LotteryTicketRepository repository; - private final LotteryNotifications notifications = new LotteryNotificationsImpl(); - private final WireTransfers bank = new WireTransfersImpl(); + private final LotteryNotifications notifications; + private final WireTransfers wireTransfers; - public LotterySystemImpl() { - repository = new LotteryTicketInMemoryRepository(); + /** + * Constructor + */ + @Inject + public LotterySystemImpl(LotteryTicketRepository repository, LotteryNotifications notifications, + WireTransfers wireTransfers) { + this.repository = repository; + this.notifications = notifications; + this.wireTransfers = wireTransfers; } @Override @@ -57,8 +62,8 @@ public class LotterySystemImpl implements LotterySystem { for (LotteryTicketId id : tickets.keySet()) { LotteryTicketCheckResult result = checkTicketForPrize(id, numbers); if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { - boolean transferred = bank.transferFunds(LotteryConstants.PRIZE_AMOUNT, LotteryConstants.SERVICE_BANK_ACCOUNT, - tickets.get(id).getPlayerDetails().getBankAccount()); + boolean transferred = wireTransfers.transferFunds(LotteryConstants.PRIZE_AMOUNT, + LotteryConstants.SERVICE_BANK_ACCOUNT, tickets.get(id).getPlayerDetails().getBankAccount()); if (transferred) { notifications.notifyPrize(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); } else { @@ -78,8 +83,8 @@ public class LotterySystemImpl implements LotterySystem { @Override public Optional submitTicket(LotteryTicket ticket) { - boolean result = bank.transferFunds(LotteryConstants.TICKET_PRIZE, ticket.getPlayerDetails().getBankAccount(), - LotteryConstants.SERVICE_BANK_ACCOUNT); + boolean result = wireTransfers.transferFunds(LotteryConstants.TICKET_PRIZE, + ticket.getPlayerDetails().getBankAccount(), LotteryConstants.SERVICE_BANK_ACCOUNT); if (result == false) { notifications.notifyTicketSubmitError(ticket.getPlayerDetails()); return Optional.empty(); diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java index 5bce62054..c912bb0b4 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java @@ -22,9 +22,9 @@ */ package com.iluwatar.hexagonal.service; +import com.google.inject.Inject; import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotterySystem; -import com.iluwatar.hexagonal.domain.LotterySystemImpl; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; import com.iluwatar.hexagonal.domain.LotteryTicketId; @@ -43,8 +43,9 @@ public class LotteryServiceImpl implements LotteryService { /** * Constructor */ - public LotteryServiceImpl() { - lotterySystem = new LotterySystemImpl(); + @Inject + public LotteryServiceImpl(LotterySystem lotterySystem) { + this.lotterySystem = lotterySystem; } @Override diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java new file mode 100644 index 000000000..5fbeb8240 --- /dev/null +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java @@ -0,0 +1,52 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.hexagonal; + +import com.google.inject.AbstractModule; +import com.iluwatar.hexagonal.administration.LotteryAdministration; +import com.iluwatar.hexagonal.administration.LotteryAdministrationImpl; +import com.iluwatar.hexagonal.banking.WireTransfers; +import com.iluwatar.hexagonal.banking.WireTransfersImpl; +import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; +import com.iluwatar.hexagonal.database.LotteryTicketRepository; +import com.iluwatar.hexagonal.domain.LotterySystem; +import com.iluwatar.hexagonal.domain.LotterySystemImpl; +import com.iluwatar.hexagonal.notifications.LotteryNotifications; +import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; +import com.iluwatar.hexagonal.service.LotteryService; +import com.iluwatar.hexagonal.service.LotteryServiceImpl; + +/** + * Guice module for testing dependencies + */ +public class LotteryTestingModule extends AbstractModule { + @Override + protected void configure() { + bind(LotteryTicketRepository.class).to(LotteryTicketInMemoryRepository.class); + bind(LotterySystem.class).to(LotterySystemImpl.class); + bind(LotteryNotifications.class).to(LotteryNotificationsImpl.class); + bind(WireTransfers.class).to(WireTransfersImpl.class); + bind(LotteryAdministration.class).to(LotteryAdministrationImpl.class); + bind(LotteryService.class).to(LotteryServiceImpl.class); + } +} diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java index 3e114ddc4..331cc0d66 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java @@ -30,6 +30,11 @@ import java.util.HashSet; import java.util.Map; import java.util.Optional; +import com.google.inject.Guice; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.iluwatar.hexagonal.LotteryModule; +import com.iluwatar.hexagonal.LotteryTestingModule; import com.iluwatar.hexagonal.domain.*; import org.junit.Before; import org.junit.Test; @@ -48,11 +53,19 @@ import com.iluwatar.hexagonal.test.LotteryTestUtils; */ public class LotteryTest { - private final LotterySystem lotterySystem = new LotterySystemImpl(); - private final WireTransfers wireTransfers = new WireTransfersImpl(); - + private Injector injector; + @Inject + private LotterySystem lotterySystem; + @Inject + private WireTransfers wireTransfers; + + public LotteryTest() { + this.injector = Guice.createInjector(new LotteryTestingModule()); + } + @Before - public void clear() { + public void setup() { + injector.injectMembers(this); // add funds to the test player's bank account wireTransfers.setFunds("123-12312", 100); } From 0f2807b9cfd2863d6486e968bd32fca2d99c42d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Fri, 9 Sep 2016 21:36:17 +0300 Subject: [PATCH 10/14] Hexagonal pattern: More descriptive class names --- hexagonal/etc/hexagonal.png | Bin 165940 -> 148602 bytes hexagonal/etc/hexagonal.ucls | 357 ++++++++---------- .../main/java/com/iluwatar/hexagonal/App.java | 4 +- .../com/iluwatar/hexagonal/LotteryModule.java | 20 +- ...onImpl.java => ConsoleAdministration.java} | 4 +- ...reTransfersImpl.java => InMemoryBank.java} | 2 +- ...ory.java => InMemoryTicketRepository.java} | 2 +- ...ionsImpl.java => StdOutNotifications.java} | 2 +- ...ryServiceImpl.java => ConsoleService.java} | 4 +- .../hexagonal/LotteryTestingModule.java | 20 +- .../hexagonal/banking/WireTransfersTest.java | 2 +- .../database/LotteryTicketRepositoryTest.java | 6 +- .../hexagonal/domain/LotteryTest.java | 5 - 13 files changed, 188 insertions(+), 240 deletions(-) rename hexagonal/src/main/java/com/iluwatar/hexagonal/administration/{LotteryAdministrationImpl.java => ConsoleAdministration.java} (93%) rename hexagonal/src/main/java/com/iluwatar/hexagonal/banking/{WireTransfersImpl.java => InMemoryBank.java} (97%) rename hexagonal/src/main/java/com/iluwatar/hexagonal/database/{LotteryTicketInMemoryRepository.java => InMemoryTicketRepository.java} (96%) rename hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/{LotteryNotificationsImpl.java => StdOutNotifications.java} (97%) rename hexagonal/src/main/java/com/iluwatar/hexagonal/service/{LotteryServiceImpl.java => ConsoleService.java} (94%) diff --git a/hexagonal/etc/hexagonal.png b/hexagonal/etc/hexagonal.png index 8c03d375f998e2cd843e7a1dbc3726dc3720c8a0..1ad077fd4fd0e9874c2f85f3f488ead2e3fe7ffc 100644 GIT binary patch literal 148602 zcmd43bySw?+AU5fNQ-nM2!f>2ElQ`9fOJU5OLt3`ba!`my)>wVfOMxcNcZn%t+lsn zf9Ko#jBotT80U=PA8WXf=Y8*IKG!v`Ip_5RzLOC}LncIqfq_927ZZ|)fk8Hcfq~b3 z1PA_RG4pL844jalxR9WtWAaW4k|Vb8bg#y12TZxw4_5skNJ!5?^6_UJJUao!aV0B0!N>1lF*DlYqN7_hexxMy+vd8g z-+8#prlzLu6>e=gFE}rh_J7kuejxbxzxi`fPI_buPyWdJzxmS_)zQKA-~1cF$E&0F z|3~~7|G|_hGjU(wyf=B>BX(55Cm*FP zE#b9AdGV9mA)Yv%NH8#-1<(OFZCdR}7#QsrkSZ7$!*=jnr!>lS9z{N?pe<(-+wu&D z#{x&D;Fa_cDi3`I3jz=e^7je79sFNfho!5w_sx95%a z_OnocG@I=XzGkyy1Ud;}Q%<$%1Ud%sWU1|@Zp@1qboA0%(+TzIgw)n-^BF(VHhCr( zaScZJ?Q%k9SZ%9CR?j)Fq#9ZX|2(qP6BS}kGHnO&iQ(r_InjS#fge9=P-p2 zUlPX$-*=g?6r=MCLe8MvuLwT_@hdVs`#b3p3&u_2FJWhUSuJE)f{p)VnT%{9^mMG?=#9bp3wxC+13L_26>`$fjMwG5-STZW_KEu!>q%}H zq{%wpGaQ%Kz9Ons=i_0@C7FoJkUpQY*_(APtaCXtARwSqNmwRbfE7<6^0J%6jE6ZO zhY&*XJdk2}nUOK4oBJTZ zZjVdfuEn8llA?#BgR9?l_#&AZYHP`(*GD=bI=b>q0!#_MeI=K+e0A}skJX3 zY5Ha=sW$iK{9%jg{cSb|`?+lVs(OCz9y)&>Yj~*Q@8*RB6AqIH>xx*fDhay*uN?`c zgkHcbz*>wqd2zrSc>WXS5#e3AXZvaMO%Cq*`bLV1lS`e!IWDcY&I>~VWO<jT@Vd`-1hE9o{H?ng%SN8S9nzuzkp2cV~`r<>`1 zxmh2163nyqB_7>EFwlkFGF5PCv(~(9wkfW^@bTF> zy4cn%N^z$>^ns_L*C>o8#%wX0*U_OWIMXU{re%m0k#SA>NSX|}f6&QsUR z&7_kpr84yfDSiE)C)=CVM@K^r2oIGqCQVoSNNqO4@-OGeT zU+SK3y}|WOrIO&?-cWu)UpyX&)&C`HpYn+;uhXj>K_Ab91M*8AOHE!9r=<>q0aD|y zeDi6kaN;QhP;RpaQZOp80E*oJiUgcwWDls3ieZv54s;g{+>jkv7IDiV=z{imX87LE z-k2fpphR*nu0TPx`lA4rV>64xz%b*~tHO9z{eGH0O=3^tJ+p)M0$BY&TU}3sq=#A^ za`&e{)dnMeY8|N<=y0!=cHy0Wu}J%Qj0=Un@2e-0Cox5 zn+}c&!SR_kx zv4S2GX{v1I`_&RFgr*(6S)y@%zCWBVH{oRYV%jX`wv3HYrfxg^@%9()5_4C>`KRBc zFyCW+p(&2b#y}mE0a6cMtqNUVM0B&WlZh+T58WuP8!2{*VqS0;Oj`VX^IIc1foWQ_ zqJtmN;$P~~m=C4h)fuKb6+)K0@6J3tHh4%xKjh;1WDi;q*O9Zw_lED&G5EJgX14d7 z67$rC>~eYVv&At5ari|)mraeN3Z{N06otd16i^cSkQzq4M}uF`$2m1-uwgKhBZEf< zJ!xrdEqHRe6Xv1CsmI|L74MFd-UsHhoC8qnluA?SN~lt`QHD$k1*69F#}T^%qD@>& zGfeOpp(Zh1kuG z=gFE*qazo-vNuaR-6i^NfAMQbt1Y#3f?1Q?1DD-IQTFtGEy~8VdXQ$Q6E`Snc zqlc7M&122%V8v8cVeW6FrZzy@rGyZt%Kc{}3!Q4xr~rTc&&lf+vYpIbrc$lMm{_5G zbP19nbbdGI818r%&??kwpUJ)NzsvZfD>2>XdQtzz7de(*^*BcP_RBK+sq8!^X3d31 zu}l)KqzfPzVPsk|L`CnV-zi$9HoiWkr)Mtzl6H4}9;dY@ck8fpy)#u~x7B>mg%z$~ zceLIu;0O_MV+`k~eYbMw_p8jqd|6qr2K1qt*Iw6(eFX}1stKm!QpN8wR-;}5D&D=!VpRBWb#a8Dr`iZ-HOF3CZ{_~14$EZTLsq+`v$}9&t;yCs+F~{%O9zy zqIzkflgmK0IqGg2?)L%HB_XUDA#S`FwzdD^d!nW16O0qbVA*kRWA7DcsEeE)4>bls|M zeZgJH?eP*B#47Vc^#aKV&0LBj_vQ#fj`%3eN;qcmMf+rH3+$j_F>;m$k2}_xx9`Ub z6dqjVyP+Rh9NN~@VYYnIjDNYHDjyESln){&f8p#53nuD^j1vgd2 z9Q3fjq}HMrZ?H^VJS(NfM2X)KvJ`+h_p=<0C^vs-O=rrVto88vNO)81Md<$ZUK6}6 z!`K+8&baKd%fwpc zQr8QzJ4eUMZwXe0gT-MXs2?#V=+Ps&S?B`SGV2m^-;=$nxlfeUxPhmFiC8{MCq3!5wvKm@l-=;7KY8M;6G>@>_cf`nW%#}^}${05+PIh8w7`QsuuCL<4MkQiZVFw`)a$=Pj=jsLwTf>Lr!N#UuWpi=gqa4H{2 zGL%YqMWfZ)oaS1Y!j!ClEo^DNz#m+@KR=M(7c!m8uY9A}qTcWXjc8nPKU=~{LEy@) zcfRF__HAx)JRJY&%aO%J6Q!cqEHvYUk?EGzLVaT+g<#!iYC!$ zb^RRkc4I{5^g{P^MlO^Hk?+n`PPkWOQuXCaxnd;_3*w8fTB!ly`#n9bVgYRw*XlF{ z8cpRq4l*NZ@wq))l5G*v%W#wK`QvdiK*Dg)jC`$~re}EqIG4Bb@DfYmZ!9O2aH`(x2ZA zQ*8{UL}3fEn}67-D88dq7JVZwZdL8J{>_AHTR=f|Ha3|zjD5T$>6>J|{Vwxv#$?~2 z?-3D47&h%M+cM1(8Yz90jh(A`+IYQ>v9t=jBtIbc#h~H z%c}~HyvnI5GSxRkBbgTOzpRV&ewdaW7ws~$Oe^r`{b$8!Vq5uyaRTO7ArU|O9eh%f zxk$}Q|2c(R)XdQ9i#v62{B753fxVTt;er~2kyKe^F2_S?<}>WBr&EU5Bt$xfRMhC} z%7P8=e37Zz?)XD{uEA5jD!n`3GS%*bf^>SKg+};*hMS$Dg`zf!&&*`1vbEPTRsoDh zruFMsV^sP)H3fBOygn77Hmq2U^X<#@>)I@+#L;6^65(U&a{ZAQZEp}zHtZ2CVpmEk zKIOLW_#~ZYnlzb0EjWipkFlgTC zM{A}UkXCvT!x496u`-&Y>0Kv?Ma_lpAa?0cPY7Uer_ z(b9boE(Oog|=NhtsPyai?h>w%8a$IWTg@Nvt0hQ7$hIM zmf3NkzJ3VTm)o@Vj8|mG6PiQ`2@P8nqHPBb$3I7UkMRbLUB-)boPMnqsMT=?L*JLV zpF8cE&uGe3T7N*MqojOGqQxmIP9RIfWB=`aWvg~5+!v;{*|%0pdg1&kAF@P*ecs7_ zXwu9-o3YH>oL+EuLFkRXf**?$matl{P<$^dKW=8~JFC zuxnA~r87`uvIo!noNf2v8D=MWTcH@oC~b7*i}&U3`sna$9LD-U(sRyw!W7AjCp?-O z>CQ{n<0V+#!FU;Q^l(kiC&Mg5yh=syKNgzyeGaSk_!|4{q@f38L(8Kje7WlL<2yh_ z{C$7CP_JJETEpRC+g+;+m}~OV7+>=U+#E~acafZo`JT|x{LHpHH*O6{DXB5g+1yup zFvAy|zakjcG80eG_qF@aO_Y*QXOX*~KTQ$XxdnxjHE6m9g$Jk)T5arLD7XN3)Qlz5 zOqA9qD6=!)^;E;Vxj;V>&~);?7e^a+HU;uSb4_uyHJB?Q!PXhCJ_af5b&bkw1JSi~ z$y?TFv6(4n1V5t{XRO9!?ajY{qX|YufW-=}<}7x-rP;mTw3Rii zGbh5QdP=tvS~OW>x~Hcq;3PAH5LawPJMuN!Szunwj>!6Vy$B_z%xQmZq0{jR7F2)A ztDu1Vo5l77;`OWQzA+1+A02~7|(21e#CQ1b9-KDU86 zVaLIg=8Iw_fByLwI*$^?f@8n|>E0JZ%*?KU_Bz>M>l#5J8^@sLjhweKh4|dbYs=S0 z_j@MZMF*D^=siKu{BQC(saXNIQ(b>C(T8O50Wt05?CdKTO~9nH zH^q|1m~FH1sO42RKnSUDqm@-kFfM~o%6m{-PGN0=|I!FR4H+F2357$NUc_iJzJhu^ zG=oHL=HxMb58*HtiQc7Idq*L}voR2?%n=hT)e0W?of&90d*rTY%tUF5&`h+T)3rO- zBPp2rkScybhD7ST+6u!(BQy2yX~W$=#PriV+^ssQcK z{R0DqKvj4%s(m`bi9Qib++{%brZWBZG_29CXya>KoCHg~e(3%1GImu!RABGJwfP5Y zFjySR@^d+Rg@uKvkSlATRBIM^er~~GN&3-pjd`D)Ut>$>xZ@e(O6d!wFC#Ly!Kgj| zBoCbICt@o-eAlU`D0u8gwH0ODhC_y3h~;}9IEUB~#~cM%QgfYMzc~{B7I@9DljJ>B zOs&5Tenqs`BA9U#roYKCpUy%e_Sy$(F>N!{n}*9UY7Jtgap z%SHBLpaUl5=?f6tq6Tz6-femM8A)bw?I)UxvoH`8NY#57Qlv?g-`Co~NlJCwmzs#y z!L)H^Pnih5JylIfzm23=GzB6R?$w83Foy#9UANs^)_x0n>99uyF&?Jx>G&a%%v3!a z2^{WV%aeLl%^^Q}usQr;KpZ8=Y&~z`U<)QYA)njs23bA%iz4 zw!0%Lb+gS*)qrfy)V6eJa@$$#X%&10#}2E-LY!BsXj6W|07ngDji_}*v~|u7gk!H72??Y}LLm{@b_e z+p8$}8nF!8pW!$Bt-c7{aO|A8qrD~~KcI1+mX;HWZK?M-pgw<&vM~-ED{HKULvUF} zreyeiAe$*bm+-a1b}4WjfHTz)h`~((vuI%cz%{xlvc`<3t5sIo2Jttnc=3}oo9ycq z@&X1^C=t+1Ky@N;p30HLn$As$VS(e?J5o)r@&Cjh1Ti2??L%;#<*~6woyAF&;e^R) znI>NbFno}ZzBf~Fx2V+_R8;I1R1XO(I32CanLKaVnc?`=OBOzmOi*XFQmy6Q{|E!4 z(Vb62VcO%asmbZ65zIye%;^j@(#<`ZEgz)8-1X|!aWIp;@!$`kphO=w;lr;whG?X- z8O|rj*Od8*rQ_Sk?&X4%vMC>?GT!QOJNz7$X(a|0;*KsSn5bj@OofEN$XShO8l=0S z2_(T9kFz=0Q+b<^Tyx;Zp)7JF{~{{R$E0km0mJ@>=<25Ik0x6u=VCB}a2(rk;09Z9 zqHBg(Ic6bEu*Iz(Vn$*CrBiS*AlX`|N5+Sv3CQ?h1Q>?Z>ph)nyJOqTLa?;vY(<(i z+k+uniw=*B{igT4WiK*U&n&NJ^ALTB?{idME-9Ht1IBM%nKVS2wr9H83BlZKD)P7! zW3$QtZKhlYxg{G)M@t*FTvec;xA_rxCE@oX8qk20(<~m-0{=>*vD)-o{QURt47BlC zG`mG*r|#E>u^}Niw%>rX7)GpGX|q9m>Lobf&YdEos4V0n622!)r18{i4{s%PL$bV6zI}w*Ak~ASI<%? zwfcm5Vy~!}3{XB1y(q26F$p-)=65cR?oKba1B;vT%|}Gh=2s!ESoKr0u>4}tEl|GQo}F|(7r%3j$VEjpJB%6Y{?*2-&VLS?S7 z+K!uZd1iU_T~y5|3&^Wmqi7V}K+RB4$UEH}z1;Umb3a&o6SVr1A&5jzZ$@GG?bm$`u=EMEkSK8f#7cD35vtz%w%oN7-TLBQC9+>erUU$Sch zC-NCpZA$AQrTi)i(T5!kxkV?9-XvzTecKbGv|*?yMKST5lW{&Q_+c8T{Ta53=MsoDBg~gjBKjh|W zhKD~`q=!^7!uUsF`L8Ul;rnwWLNuCLui&B{pu>r-MpM4BCv2Y5a&PcIZ9W=o1kV92 zcQ|2l|I#@%q^belHClmR;;59`eq@``n7hZ`BstZ2Df#5TKh+%OU|srYl_vWUj)k2h z7DG;7hvUfG!BoE40x_$#FL4U;J)?t2SO~*`3vLeShC{gEVZYe-a5&qW3(_T_+P3j_ zIsIn%aBrT^a-y_>{>{h^9z2OOs?e_MN@&9IuU~6EfX?1tY^*S-ji>QAJTUdltp+2` z&g9D^&D)c*luhd{Q^mMqt_jB_bp`A;;?2LEYu$n-@K?p1r)tgLhI=4JSW??D6X$`m z1!jpPks?oxdf60jVCGnGq2q2%M378ojxmuG%p}}7THbZfYCrsxz{_Esk<9ElDh8}@ zxgGTXjMOif1UzVVRbb%5dXhO68FMV>!@)(o@W6uI!86?Yi>UGZk1iQT`ef5&(*4Ko zkpBjwr+JAy4q@5?s7HY0lDUiRgRvcu%SJm>ks0TVp|;zaKpDAP4*BbyDiUBiC$ZA{ zEqAb)QjavXxBr-&2)MY2nFi%(Iz8ZiRuMM)LpQ(>aLodB(;tIrd}qT8y-W-XzQP_I ze>fJd`0jdR0I;deP076lfw^MUIUv&+OJu<(vX{JN+Qdet>i*+s<1`YjSRCc9t${f9 zNA0yQx1yxgH=E=BWPyAFwQO4|n%3cb&q2(cGDz|=Q|)NouI<`7T(jzjICf3YNZZ-` z42^U(tGN#nj2cYaQuM+(kQJAf1b5W82oM2esY$aYN$OScJUjaXJFO0^Lpq71>q{G0 z!^1x(1L5eOkln)fyDSk24Kh=^%x_O34zq;gNaBHta;;^t?wja7$HN_DlL>ctB*6Jx zR+^8$(VFacS9E>BKH%1RX|j(`^@IEIkD8K&}=3cOM9l_Hq-HM|35Q2MLrv z=u_Z8hN?MM&_%0;%o^(Hr5qiur~{H*riKKwx1>Cf$Dey9zKJuJ|3z=!=ml&kq4e0|-h zY?%hD)o%&Bun)}jQ+6*(;pe@i@1r|A_q_Ap92}_+InP%gzZJ;ig5-WI=%91;(nUS4 zBVsBWEQmO1JqD>HRS9Ns@ZSm#IZy;YSN)1!@FeeJ_#^idzVtQ)TIBnL}JHVUjpl$k74(|&KK z1W^|OjR`PhpQmCyk2IEbzI+mAx=>~4Ze;Wth`McUT0nig&qP#)7@$VZV{Uz$E>L3|6n+XaM|o`WG4p-Okeo=Uu3tAEO$>lk69V z+ZUP}Q{9w!fXfPIKtwc?g?u?}u>cQOR}T9xU4ii4-h~ekmDPZp-@*rq9Wd_<0P}nL zmV3S>$?9OS14Ol|>hhtXM0q5@Z~6H3l2XJrILt!a|K@n~kl*bC9{ss~o4Yxq7XM_X zFyFLl-XIDf`;Lf(c&Xt0J+!rPOeO{H5(@Ph1e8nFb4@35L9Og!C*!Wp2LYP+`24-O zBw=CSxn`$m9P2fS5AyQr_rlS=IfabfSElN?E}c0pBI3tx{G{1nK&UVigu`^NJg#bd zn11V1SvrKZq{MpX(*O^nt@ZEmw`yiq$o=EUhULJDK55Ktwz@NJCGWe=F^B2ywa5I; z>C6oZ9(DOH6#4=L%Sic~>*cbbfXm&TuT%hm-{bb8zJ6n};v=A)ce{0?w(kMLl*>}d z8Iuk5i)r2$AC#y)H9p((^T#jb zwRwP9IiqYiE2qSB)&pA#v{xYrgl$W{;`JfET_>l*UUD*vp<{PY4lneNJzTl(c9VSGcp?YEt!Brrvv8X<#Os& zm46Z5;L0+0Ud~MgWWLQqtrjw0JhflTWvw5+x@zT$lu+-&v2w7~4d&2(8l!-q0RWil z?+rFxl^^wrl*`ifZyb1P-kGtq#}xrTHv!B8XL~7R1O$XQI3hT-s$`h;?l<9gGr11^ z8u@sGPNo-tQ{Dsy`sB%kespm@v&gA~lsfzvGtLq{lTV|-r6J8?{Cs}7?S}On{Sj*M z8x9arWBm(dR(t6Yr#n?c`Yse{w&R_(@ILWroQQYauXA^v@6rw9eMdJon`oS(D3H9e-4+obk9R6kd&v^BiSBa}Nrv4y|B&rI@k;w7!DcYT8n+ToL)qcg;`-V8r zAXYuh(AwIIaqJNmLMzN{G4@K|YLext9L+1>M;|iW(ko){k(n;Kkl1Q5>LVU3LD_y2 zrdMIoy`<{rj=K5-AK{IB&`WEoqR6Z5z-=G+PPC_G+y^Dx3_)e(ab~9eBPG+oB zLrDQ01DA*m8GP&gvbNOBT_EBq2)Qgm;f#MY69-Mccu%hcn$zt-zjJsho62xJ>S()n`sa{RxX7YKrp*B`aytK3yJCpp?haks*jK>I2 zXnJir*`G_uUMxh|c5BIVDF$y&|zF(TwG zv#oC9GnQpKhxyQk`(B`vwk=jpXb&$a# zPCJv2H708o3+}+!i~T?7*T5J}kT(kxNa zPHYZ9+Ve(rJsI4=i{c2Ll+N>?Sq!Xc-1B0hiP^??2`oivE~TH3qqw=A`s1bYq?q;o z^nGceu65gA0-{neOn2A7J2JikI?VSu+h!efbmm^G3`2Y_q#m;^1DsA@8^YKvSS&0o zVTY+5Uzn)rS^ct<>U&`fuK_e)S$olVy-wo^qI1-6*yA&O#8U_cX45&5=6J zhcBM_;NhY{4!$TgkUdZy9Ta`2Nj|@iVht{*Us(@)ZTE+t_*-O|oZY<6%J!~A@6@fF zdhPhlbb4Ij5h*F;WGe&i;V;vUu;0zx{c6{Cp*7;^)7uno;c8Pnk@n^9S&~Icbb0Q} z4K8QRz?QFm>b?nX2n9QG;5wLC%vA8~VLXm`KYmFE&XS1G7%5N+0Hwdi#vMZ^o@4}1 zWyuHM=8JVR+!dK*PI8)j@RcGn7Ws#pw-WFrBKr1-X;V zEVU6Clb%20(V{aT=JXjj$u;F>Q%~s6DP!pg2JYnW>+!x)+x58KUdRyoM^A(jPx&C& zpKRguMH@lJinl6?2VL10kkD;%}^U0f72WWLI1C(FP zlZ@k^_y&*K*8T(Ff`}7kT5tO=(__-K3V`}Obep5MJ1ySgT%)U$U#77`unD7(Mxp6V z$*{`zHmiG4Q;ca~?T_-g8^KB#D4pxw8I?a50drihIzVN z5~aN?4P-m*pS&jEIljs`3=dTL&_;7x>x+Z#8h?kK=1a(lOZvg|L-#3BJ=4nYwC~Pq zFAT)e-y07Rnr4ZR#UFb~qUJnp%b2vsk@hC&NqjDj8E+nDWp?1w;{!jHk!m{-U(IEv z$${TjRAT�!Rtasw4xy9lJhXHgA#&Ob{SXjthDom)Xm3H}=nbD|+Fn7j3IAR83uq zlw}w5%7+g?USf#%2;0Ny{6IH|vY?dAgI5IY>SDt`9378QN;?Jt;XTNnDk*rY2#fRt z>2@P8G}?KezH@D`GadPpBK9*z#hfnrTfQ^CCKR|m58wZSu-Ba^o)W&eIFY~p*c#KU z-7iw}OZx3$culpm>Su1MK_{=%Zg1+vzS*biO9;2gmdz*cUws_hIj^rDq*HE{LT>=E z*qsF@4zu_-v=xyjfsBb(lXrwcEYXhfKRZKB=~XLf21Lgczx)86zK|sv!AQgn5$xSF z|M{2tY{Egj1Ns^Dfk;V3N1iCn zfXDP=Bl)~0n2(Y~drP595|ZuPY#6fddpx3!eqT_3kcy91nCa(chZqhi{l%4c-df9W z@l6yDAmyL$a#ImYcv_wkEz@?Ti9+qsuQ&^O>^uhbkEz|`rrXAffLN(Z~4R_6VjcXFLn zn|(l>z|+M$3r#z^*LYU10e1`l^?r4z|0(d+bqyo(7!-0jrO~1piZogb{GMQ7xz$^R z4kUr9^Wb>gVS(gbbV-ge0qP_0Na)-B?pgaqc_!HOtrwXt~U9c z5s>w);?uR;qD{K=stsK34rVpMJ_n!{lf`s-+bn;$XY{^2`yZ93>8CInTAxPKx;(jP z-u?5i$G;28ekN<`#VDWquI`W+V*Dlc;S*xxr~3peE>Bxn<9uEwHLBK#j@Z%@B?w#} z9Gpqyd;DYsdM$S?WG{NuX5i9wc$b_B!o<$j4 zoR!h;8+#ZsboHLUMXNTub3d*-kk#8McI;WHhUByXSQLh5Ebd&M*xp+2&tGI@!18*_ z8BXxI)TV2{WU;~V<=G-5nQd_)y^2_`t`@)@ygIX_)8Ks0?GUB{@C+i^3fOEQ8D=+& zi#IWK{=JIZ@#DKF8b*DxgluL>RL1TXT};03D{ncr|K#+hU~Ng+A5p)-?_m@-aLZ5< zJt=Mca8AMg$W&ES8#OE;p~SQJpAgIINo$HyQx1T%(V3a2qAC%*+7~M>PE+?U-_^9*FE^(8h2 zOO%gy73rU!tt8B1{B^7Cz6{I*w-bb@nVR3Fx_O4z_Fn`Hy$NLz+6*5*v^*cR(dx;l zL79Se<%AIY)*Fv?M<+?dmuPPc$t03fVmY5PM6h>6Ar8x&yu3PX`2g}hUxN&af})}d1+y3oDrbTp`G%ACA-}13EA~LF*3d*OWe$xdt1`r z`Jd}T=;w<*(m)ZI1&a4Q_0okjxLp+k$-nc1X0eKn34Uwj%ZYMrdBoQix`J2`{k_LW z5O|M44w;k>swE#9X6hC)cb$%whf>ta`a7A_CyAdd4;|@m{)3d*)I&7$-?amqk4E** zwOqg7NVK(ZE@V(gOu4+PAyS}bb2#I0xjQT8M?s#M-PL9nSObVor8xC-%vqjWx^rnS z1o47y6p#IuP({T(+sfTcym^7@!?e3*@%7GF#X#Whf$F5`T#!bg#);=5!VMkE3y513 zLvb3yUqIQ+aT-;w;aN7oLBt&dv-{f=0k_M?Yu`H>6l8`}w~tioe43#xlM~Nos*N9G zVRiF92^D$u$zfq`F|i4ENHC;1Taf zCiX|$mMRq3Vxxx2?KUuGw zw#3Iu*3=XVx8q`cVaezN5JgsNymqi{hXvS`k*p}XL4feeaVNgcK43A_so@Q z8)doAe^e)0?(UbQA2r7Ft?`mprz6x``Q(hQP9ZW2bv<;v!GcNmo9TB|Gj*0-9=*zP z1B4CZTtS1#u@v88T>mTSSH=UR@Q_H_4!}R&xBD%eN zkD44<`aayJ#O@JNB{M{OkB}_T9OzEj`T^2G340GR-|p@?9UUfzX-^@4GEz!sJ!5)( z-V~r;9)pZGc(5wsob6wfFoNpwH}a6PVbK4Bn6uoo&dZw)_mffTzrf@nKXEIY_Q?qNYXr7 zqkb9wYP8_`hI+1tg2`{{SZhN+LbR^o2z1_4vLE~-{e!wDcaEQvALs#FQ%^AXAYeug zs1`W!+1(Xlyn2y$UP$ow8%A;Wq}c19`;nOAci$FoZ$^Re^wFSHLM%YD#o4=eW~Bt^ zdhp~9o=A}UCD`#|+pRH)I%0z-2&U|=;|JOsDtR2=njp7)9DiI{^Ug8$k1LnzNdL=~ z-|*_C{<|yRFCgQ@CH~F5+y0-FQoDn ztR&`+O%q7>Sr?@zyY80@OaC_;*|lO@6zD=#R7VfBiu2II9S9Go&2;Ylk^i7i|FM;* z_RP*~N!_k+;|k3Yt@hs5DrfrNm?R95-1N!tN9Dfv4u{)+J<;FukQ`%IZW24y$ilyh zk0NMt9;v_Np^WzrhlLvUy)bpzITw!{_*)o?(yS7@{KA$ZJVw$zvY3xM5 zlWyH5ha-ymNz|BN^e*Mg@finjTW8v8A1v+uI)FjfMZtm))F@nn4Qy5+utnRWS?Sg5 zpO(YhTws$BP|?sZm-EhRi2o{N1DH-GWP zWFjd_wNPs6f$cekCS@z~F1T7~@LaL?1BE;~R`PZsZ(8<#{NDs3L~pbL5syC=U)5#` zW*VY1O>Hs9E!SkPbo*;>E(GW{_xoP^=U_QfzEnNXEZ9yzY(r_G!KTva`x|WBQFbM1 z%x@sqpdLn)tz^WgfI-SD2j3I2S#oW8Ewr@x`6-EU8xa^)mp~ejgf-voX#Lm1qqWRPBLRaHALkX4~g=wjzgXeYcFu+r+SjS2HuO~=c@4J}mqS`oLkL5O>N5X5DZfURd^lO@^U zz;ra6Asn`PJ$RZ#N_~={mTIbUL3qEv<*31-tH6)KXE_eWR~^0s;5`ET5N*NQn)(n&uKA^$suOK?Ht~r)<65J=bn)6nHhZ)c zwi*{4x4OW-E=|XZBw_D@2^_-D+7#_$to>h>2>uayeia}+V@^Ehu^sP5RxHld@)@-1 zbx*zC*cvlckFEd0ako zS0no2BqY?jz!K6)J5Th)f zB~F~LJhkDarP-pq5WIk`k=#m;psi`6gC#BwPEQ-Y--noJY*8+jo0#=$=c87^HUgJt zN0;xMR^8DI$eOfP8f>!Sqz6&9ZJ2xzIFqU% z34L$yC`*4!28RLW|87bZ4tjDCRGW>6}pj4Nr-%vnnM6S9H+HD#;MZ9h)W3ve>b`^ z2C5Z#1(Q)uq3L+B5bZJuE9LkInw1*`ZY`A%kV1DS#~#=NgVay9b$Pm`lQq+*i;xH6 z9Eb3NL_nv*6Y%Yz18L{jUk5uHEbFhn!xP059rYkE3UBQOV>=~&5Wasm!y64DG$Iho zTwAr(P%NNGdXKv9=Ht$CDz<)-@vHBK@EgA-B(%$A-#jER5E0Ud)7@b+u{}EE;NLnXjBvRFMQTfL(mk;R&~LY8p;t3e@tpB8U=^Ff+o$OJVItRUPbeh_ z4H57+(}A7Al`S{*=-vB0!l2YmxC@6Qg(VPgd)1kdQ({0ciSiWD{Nmm;*Jz8+BpQ z>uh_%4?P|2%XX@JBNTZ4tV3+rbWV=7<~{1v&WmOP1JE3?7QX$*5_1I$eHfqo5Z<+H z!Lf}7wKrQ1TlSFlH}fl!HfZ@w^`ewUD03SQLfA>*;{ZZ%@CMmN>x|$=#9njTo`i^D zElkgap}PA1G>eMrJ=rBHn709OidI)AGG0!~#`n_J&qAkI&m@`n&m@=z=wh6ilM=Hz zeVRDlz1$CTOwj0b1S@W4Z|Q}oYoWOoxJbFq0#BrhoCE;v(Jc7U!Scv^mg4@+GTC@Z zu?Y)qi{o-gO}!sq#@>!dP8aa|t?w8NxQBbuuw+-;fZV}Wg8*Y`)qDpR57lo0>5#ZA zOyJxdnP+*W>F{${At_&D+$H{r?g7}=alN}={Cp=Vc}2OkyU@lE?3~12(s}wWmd6o- z*a&@J;(iAusR?p}XBTe4-r5vy(PbHfMGjsJC3}5PluNnEe2OH5tUglJTC6r|3?#** zOxkOZu@1sxvIg%6@o9ZR_hS_Un}CeJIbPm-x~8ZyoK-?ugqD-v#oiqB10ebs?vA0N zzI4`0p(F`)R$(r%>4ISY=xFHiR(bM<31kXYYR$~Rd>maolqT;WzF#wcj?JU45y$zN z_3g*2Q`Hen8g`XxA^PMEYIZhQiT+$*bkES|utFpNw_?}4) z;7u9lcb7nexfF@QEK*+iz}6pO^{r&}xLzH0J2Oq^~( zu)vB43@tCXr%3bR4-_gw&Q?+k&P=P#91;GJXZyGERts0sM?awM0;9<1W2#0IyGEP) zukK(q)3N;gKHR~-q@qp+)lKw`{K`uEh*M{bwZ;Ef76l7R&($R{deYW0vmb*3}{jYeCkS~;dN zZ_9vz$qGI8tAI7|Djz0=T*q3ikNsube|p!)zkD#*f-miw3PK z(!_laY?nwUJ}A10{K3mhHyqL+bqqy!k4mMmp_RAP${*g>7;ADUqLREl-+gTYPxZrm zn)UGpy^qsE`a%d_q?6nKN8MXSWz}}?-j^bRfD#f?f+*eHDcxNX(%mWDDk24&2!G*Jm#_TxNKX8aL?ylar5;-1+&)2 zxG_{?;kpWDtqQkcVedgXz1vp*N9qWF3eFaWP^(=7k;k$58-6WdyA7MUfb`mm+EgBB zCc^O4+NLsXiW644*$nld>0@1GmsyMB9kQW9B)XCH`D2Q;Syb9eP{-uY7Ou0P#!nyu z=>8^7l#Y7i7ClvruKaJm9WV{~Y*;8#rN+#5xv{f(ojdfnc?6HpFrbRwLfsrZh3HPt zaL4@negekY0!G3%i%EH4A5`k=Wd9-6Se6M7Tiq0xevMp%Z3#uN!+1XLsrloo1eYVg zG&k)GNWGj#PcS)2=XnEzxDIu{_$~$)uh|6L2~-lWv#QR+#8y43ZUzZBSO2=th%j2x%D=^DvD5y*D|YU zHOIQasu!lOML-cYQ+m=l_ztYZmtQki5FkFr5R|JXnENq)_O6lls$KTQkj>(YWD zUO4E*s?yFC+(^EC|Hp5QkcC)yFXj4A`AhpQDm$za6Wl%6D6Wk)cPG2jPyJrynky#( z@E8d9+lMJtw3bY) zeXV?}B$)A2;9x2*#XMOud(;nl&TZi&oCcb%T0^GJH%SgPFYSx9#*UHV^!JvbeI)Ex z)IYv%1L~VN%kLs+lK<}76^=#40}ItEhk)Y>H_ta$KOhXOHN%RDum8E19P=Au$c$P} zX7w+{aeuiuINLcmfHgOL7&UdeH%q}*rw;U~Yq>REm34zNT&EiC916Jiq>QvJ!V6R& z-S4$crf;jenaS%(wy7Cy!wjBJZu^R57VMGVrLcw1WQy2L8IRKxIqnvK z<9-wmlpfdl^x(-`aQzugc{nW7)$!15w7~5zrP+fA9yi55qkDii4y$r__w99V{uvN7 zD60I6gN5ENemprjAqL(Ay_cs2h`BY*7rG~)TVn*ul`%~hsoykKpoV&oQn}d(EN}sz zKNeS{I6o&+2XpfQ>z|RNVZi>X|3@TwKc<0oY`xsTSqk^@+qWq)uY&63i=mRmS&}qit0ilcicF(acarJ$3*+(Q-pRJ7;v89ax!9pHIgjhi1Rj0e zy9iAjeT&bv?gN*3;46>}vgHccK=tPaBj?i$csTB8o2)~C9)RpQTLOzx`|d;FbVy>c zn5hO|X`kc1md_ADpN5{W=o&Lge0X_=T4e(}0q@$Z0+ua`NnkP0SMupYob^n$_xL;* zL@soqET=TujgHO>Umcke2NsZjTSa!b$CR)@msaJ~?Qbq@W33+0YEOk|EgM$CKFLwQ zGK1ZJK=m)9rq1%s31374nc$*&bBIM9i~AgyA^XVv8>DeX2$Tc!L1>3eI^mK&QD@^$ zD*57T4VY0V0-^_Y|FU+$9O4wXtz`K#f-xl{P{^%%`br?Y1y*~a*Ryrj{fN0_ZUbp& zeThAh#8T^@Hkdbohu~*pnx^HSuwOH%e0W~6!$-LK4lt!6$+t*qHrZ_uu&4G7A z3)lOtdohr(MP`!Cl2xYTy?jLWPfQ(-ms+kN$8s}O)_csaGT?mmJ9-(?s6Xo4&I*S;(E_ncjp z(7jfN-WKGstRyW_+!J}bujP6@>NQ2Yx`MUfzy{V=Y7(B{0z9ZUxD&8OSrX}3Us zKJ}|~q=)w0C^bQ&(NP}A{Z)mAYJg1Crx?-Hr-yYuNh-JO`TlGV9)O>KBm%`7SmxZA z1-tG{QrRJYD#;7M3fe&rEpj4I7fxk~9V9S6XZBaHmw2@{S!vc$>Ae0ax}vkJ6@-WR zV8%;Lp=1u)H>6>D9W-hTE;kn~T*B#ySx%GpPoGDnl;?URl<2|Aw}J*u%;7hPi*r}O zE{-2DFk>6SEnsEI`aA%9MmX(_duvQq%xBo7@D7$VW5#+ymH-Hh;xHYen?pK-G>aNJ^q|r?Hf<4p-ssMV+fRSd%0xUoYfh6Ps2}5GadTW6m2fcLd;S_BJk3EMtY?i#z z(kQ?}m2#1@SaWKd`IP6Xc!FxOO_mMt`v8t}`KgKfbKGG+RrD32N%B!?wS(&@UXz>d zFLf3KE2ha?dSp-k((!Y0G^~yli=nTM0L>vW5}4a+H@iH{CI%*2$}ffP|AWGL$XCQ{ zQz(*sxW6+&=-3cFd-c=vj#23Ydf;aR`4tg=**FKNeL(}6V9tf=kE^ZXk&*l&qH+rY zj|*Y2PBCWdVEtiVi^PBdxa{l*x|l7tJvzh0_q=l}m>8*@6VEva$A6AB9v|UZPy$tS z4ae%Ph_5PC{tnavtbP!utiZL;C1^?1W1@@T-h<}wa-EZ$@?F_`MFD}Th|{Vn{T~@4 zdb;D~4}qv#CY+4&OG$T2VeoIPb{K#Y_EZGub05&o8I)^P%b`>nA?G3`9ZBLy#M11_ zSG=SwGt3jIOZmJDZn0@ry7TUoj*A3$$%*vhs-Ea|)RO^CO8J$|R8Jo1=_uFX5EjP* zw4Y>&N0hg2`Xd{!GRs3=e=_d zCUH*?oVWvXWa$unn;?F^?CzN(0Mr1cE56ETx#yt<3O>akHYJk?oXx1L&(Od$WgMMO z!cwf(I}}M5e$MM`Q|#){duhEZl6|IQh@W{BV2q18{7VTi-@1&0*f( zDmh|zI%3DVxwd+jPX&PZ2>EQjo`X?+{!gI^8t|rJbs1g`_qFo)Ry#M6Kf-ci-DvU* z>@myBcm7IX4)(kY&qx9r6`Rya!@}_l9ppn96UIYXFNi6z-;2nv4S>JQ--`a+ zN2oDqFBpwF2UCEA96F41wwpDvcBc%cifDfz|`T(8fn5`@ka;TzQDeA z5^&6rpAzc;pMMF`V>vcsfHdH6yPK1h{`QL+c7Yt4U0=@dpQkl;dVcj`_<+;iDIFd5 z)CQ7=oN1v&72Ww#PAZAbYsh?%8n;*3?e(;>Ne+lOv5)pNOmD3iqOYDdztp=&`8uaw zzLY&NVZIk`pYrf4A|NCfQu0X59b(E%c2WmPh%bX*X^y7Ry>&;LCO}(~QTqzqYt6&{ zh%>0mW{dmlQCHvs3=T5d57IUTLvNUe$i<$oZwOudxvet&efxL*d;AK!+6ah%%||X1 z!~$m}oC1GUnpb_A-R_p6-%k;@Ls=G;OwbJydj!@jE@cm0)+37@F4RA5KS90!4>pQVRcmQNB>MX{;yJ9$#X261=M6UC))00z`jF-B;0 zzoz~P@c#r=N(ZM%kz%uTiT>@w=R$etYGYvM#a&rFI4-(~V2tD6$j&}F4$~BqZPy>@ z*hG*-n$jQZz2#6I9=hw60XykEN6-7bV&@E`noTp)7M*TgI7)$a15{oIykfLkQa;N~ zF#=23>C6u=vYY}Bm(2=PAOp(IlyW4Z*R@v~1 z6Ievy&yM6RiDCfW8zCWR5^q9oP=W=ECW5sw5US>%3ND zMQZtA<9g@fAB|T=tDw=1ztzq6tgO0nz3YJl6tZ9Cqe>>CX z6q6%h^=DE-eBt`Uq%U!?yX`WDS}Z&~{p9HC^aMBuSJ<3FX>hf-`8dcnluek3-82 zkI^EhePv*&^4A&I^NShDkg`Q*hC(O~N8^Ho`>%-lX7@B9c!GOtytEI@^Mey#CI1;v zLXlCOwF%JVv%D~ggxvY1#Pp!_WwuzlPJ04+`GHU!Sm319;!;=FtO*zXQ%b1JnKuXe zrkCs$g5gq130a-a;<`4WT7JK1Lw*K_{b4aqyP;LXL>8bAT=dhpfy0aKzE;k!gsh3? zC1cdae}&cDH-9^Zk6sYoGpVLPD>ee|ZP}Nr;w_ke1l1`G=s-Vz*2NOFlEVP%OK2+E zBye#8CQaE=Xq*~Ntv9YuKP->_F_k(&-G5N@8?pAn~6E5$lldF8qI+6y%TJ}_iWWU%z%{(`i*9@i|DW-@%DBY zS#!Gb>E>{PJ6!Tr_=D9>^spg+1#vE2LDn<9k4tJzcHhOpIZvX^mK#_77w;QUKF*;o16F&s?-n- zV#fX&SjQ{SL;;8Wze<0fv?{RtDy|=J!U_sapbu}t2K!D5m7I=9x!*r;5tEt8SEM|b zGtF{Bpe1-al`HABhcjz$yTJ5v3drj`g8IMa7mz;dgIM3x2V89nPhuV4@w!^U%nDZT z-Om%J%&mIMYf&u*5{rKpGIlQXdr0gR1sTFTjZ(~FCVZqSdgt}xz$+x9%F7l({HYZ) zQB`eA^pj#cgk|U$Uf1_(ruMyrw?0lgFf(!Lf!Z5vkd)xk~t;``i2qvM(!$O z`V5nmM!)8Md3-S3f1>#Aurgb)DDI}7D9iX-8PvlVcJucZTq0dxt{yrwyA?kU^!eHSV!^&-VL#Vw zbG-Cd7l8_b%($V1?-pU8TPn{F`_A;YR<66%@_ShxO3~W6!p@g%j?!tEE%Ub-&YgTm z4C85KVx0`~Nmyb!M}cQb{;+g$iD>Dr6jN~F{b&3f{bKp~?h{i@Z))KA&2dxtvfG`C zOVO>Q1nY5rpf>lc|7ta>?Aw@aBsJJCDtcvZPN6|OTWWp#>%J*{@C4X2jQgiQd9LB? zS)a~Mb435%aPV93^X&)Z3f4(5X^yf14^a3sEX381)`nZv7#$9dD@|VSFmGdNkH}~4 z4rM==E9}XS{*mKO##=Cy5to&l>v1~DGpR>Z8a0`JEL6APr}7F5Aw5q)QK>qBr9{g; z^@_#wt}>{`q6T}Wod!)H=9v@)^+S*2-4RNi(XSYJ#)c-@qp~RI67u=+Pcz#lq*0Vc zs8n71Y|Ryw%2oK&L_5QDJ1;~jyIUd(N(W_(-%x5$Fjtn#nOzTj^BW;&>wh52N!AYe zL^#V5k|ZvU3H+JwzkkLb9EOgit%k$g`hx z5Tf_+5cyKYseIow>nB1GA40MWpLl;lp(jFUfBieJ*=HFKQtiutD6oaW;UJrY z`2X<#6`LahdcH%iU_<3I^~XMGC~q=nArL>@9(-!!^>=|H~kk_OpB;7oyv(M$D+ zT>M2mEJAvIetun@>YnO%hV1O@)zwwou7`pcRc?f$*#gH%|Gqu}mFa9)fsjZ1vVyRT zi2Q+Q!iL@g-90^aY+mJiZ8n&yqQ`G#@>p7feU_A~<=Z8VG|bh=xu9tqn@f9RNv0xid>!UF!)6-A!^p_Z%?*^s zq^aDlBcw4_zO&x;lKIQT}*u#Tm=! zj)n51+q;pOrd0Ks?J;UyZME$vvrO@K0u0^gV9h(m*0peA!CyBTm+9Ci*?Fh3E3i6QYB`>LdOyUU_a*bY zzuV@}XMW!+_tVjqQ0-WC_31$T{%3mMo>WX@9z9(Z4;;Uq3t@FMvz(KeRutHzJyA%! zR94^p8HvxO;zkh=Cb8PQc2f%Y*5(`QKyWDvAni}Z^cU?3;t;%=&*5aWJo zmm~qbP_=U|&*yvl<0I{QsP9pImT!($uik!42}$rLb-&uARJYh?K}O7}?++7G#akC| z=?vp7L6Y!)(e%fKQdduy-i_hJJQPq+i2U}xYRVr3iv+8KQn@8 zm6Y8%Rc+H%_nnN^#8_E8%SPe+1CdZJD~1paV8z)RpL4kUvC{k1N4>o`df(0Mn@cC{ zCg-LyYjNErD+1>Q8Wx1(1>gE{?Rk@0{y^^()h6AOUBHOpR#7Id5#I0ZRo2N^)Q;~VBpWJt3`yOQ7@c*!CVW%^R z@Rr{X<+KEAP_Vq!lMmXM)&+9(YRuJIYzTV4_TiJ&z``6Ps zJ5@%%p0@?RYD&+j527T`mB!zixqRF@hlBN0M+}`i^Ps`+14A5mSjeL>A9y$(Jz;1y z7Pe4%@I>+H;c=Xw4puRIUBprluLL6hAyssOT1j&sbMCbHn=;-ldvd^#SJx6<=@Zx1 z*Dr3E4W*p>_3pQb z2>5w>EBb2pmqs3_Nj)T>* z#=No2MCY4}vpCua2%WfuM2K+aO!+6;rs9Fe%9ddk1K(Cy3&BaJ_=f2hU&wC+jZBQ$5|x zEk(l4IM&4VKXjRw5Z@Be)^_=!Q!aU2-LP%he40b4f^*R~+!MQP)R&+kU-3nHu-TR9 zU1c)w1D|JUow^pgkEcA&XNyNp^sljKnw&s1xpL7W{- zXWLYtz^sdiO=RU9Y!>+6FAecK%ipDC4cF^#4qb1Mni|=Cq%Vi@GwJu2ytdw;!P=1ycD;`^H9ae* z@%Z-qTAKAeG21`QIYzvXYJBdQ;(Fi| zQAJ3V6pO`Z!Q}DU>g8SOa+8#V=;Qb^^XZz1`c6v9aVjk} zpRP8pvBj3%&|8OOwcc9%N@8b^kKb%`;(ggJga*;xu2>Wk6MGpZviIpbxq2}RDJfjg zN*Be(`=dl9kXBQl%e3!Q=H{o7Sqx zdOuwg4Ni!qmyuaDn?A7Tk8A;p6AxV5namtXbK5CrZ!z0P%=L}W3lZ((;Sf?DL%}4R zw~=lIuSiL>C{@!NHFXUG*&`~P-b;Yfeq(ZGhU%=)xNOEZzM}(KIzc~ zIGWDdBg#)|D=Dc+voY}RU|2CqZ7vwj?v0N;{z*v;cGcHE_C9sL%4YZ62$ay0MsN4H zy&C8|{x!Ynti4T?vm+TdHdlI{pS4Q>)6(&ZoKu3V(q_iztFeK_#VA ztzK>jROHQb0RfMvj7?0!IcW%Q(tJ0^iv-}F%Lff`!SL;-A;Ay|q}7=G6h8JXrO`ZF z3sj!mjQsP~C$SyI($kv$u$XPoy}kN)L0#{Uxc_v8&B$}I`PwGZL|OC!QS3R97COR`2P_}&~skWS?eDU|8@GI3*C3Dl}NWc0( zTZ02$W~&y7qqKcz_oxrjmM4>`scPy= z)}3z&$rRqa47F>GAmaj=U+`F;jvX689yAy?jkLWtJp9niAD$Ob_td0)@44b5i%_!* z-Kik~SuTleL*)%NtIBZeHA&6&e%2X}Yw8^_g((uo7e32LEPKsPHz4-lo;8h*bG#0` zqnWx|b-Uzryh%agQFAqQl}zTK0NJGgqFqJB6`7|H&x_W#n@cun&Iq>D^3vVLp&6d{ zamgXU{Y0zF=?>`lGSem+_E0fEl^V>%#AM8bQ)eFSHECX>UR;Mo|Cl4r!$$bO@8f1u zGx2hb+8BX)<=sNUQ@HVg&bs1CknLYA(#@3Xy%Pz=`##frdFiw_by_M`;`{jY_%nOI zOiEFIuVgCMW$bFOkA0Hokyx}=>d!GwT@D-FF0Thu$LsUiyGAMHa)}HB^1Df@vc$xQ zyJrGd;yOTG+&#y*f<>vb;ElI#AKbyPo8sCTbQdH6wO`H!hB2C{DJ~rT)U#cS88U6sJ9oS~wzfdQrnXXtJkByEfu9-BPaTwp&P<1Ae z%Vnq~p~zkb6JvUkT@?t)1ZM*%;DtEj|IYBlKW@ zffTT{Wm>QI;Ld-1yLx)pI;rc$A6XmPCZ7IN6h1Odj37~_YB9@oFq^$1oedj)?0(A0 z$A%<=E5k+q%NUPEN1!u9s8uhMu6Ev|XQKSAf2iHiCsdfi!c^Vqzt8}J=o^+w9Z=am zZs+5$(pf}5Q~%!L?yBJB?PI_%=W0JuHl6obEZp;IvjYZh&Sh)lRVz5J&+U?&w(Rkl zqc(B!{TrMQkQBqD;W5;cMBSzw0a;wXX3#E=s8S)R3OQ(8}4h)cDG3=7l zdiuFOir%9-ZUn{qcy`ZI5K;A%M~xr?KskYkP?7)2W50R1Z|yV9xL!qVbJPsmw&=I? z8|(8~@Gi$81)s>Xoeu&;?Vk+aH<&5phGuXwTWP&?hjkV ztvJwRY`h&?bO?hyBZS)1gWIF!*pH>QmZ#>d4asG&DAM9i{D=3@ylwSx=eetscjoYr zj9bW2BUYoMMqcWFLz!wIw-qpq-1$ z7I5c_W-7lU!J1Pn%^lL@Il>ye$NO&n<^6{wC^B~($ZiDBz; ze3r!ND&71C(QM}?HzZz3-4Z6A7qoPW!oRNM!&FySZ*bh5nwTJS67=HLDy=OmD{E@f z0Btp0+SeGF7yi#k(A)p%&4(<8yYsX37Z<+W$|OyorXQ4Qn1KGepmaVzPt`wXT#NGQ zTG{XJID)%oFiQ7hWwy{Q5ZsU$=_7UbN}jux>Yre!i#<7NSfY~=Rs*>lA=X&vYc%?b zDSRO1x85TRVF|L>WexWK{F*zCjiaW~oS11(!E7cdf4xB1n>y9{3BDv*jsF@p#1zip z1q4;M&H|yMi7x4BN4@ML@FH9yia0fR`6$r3WrTGti;0W3ZC7DDn@wwLYuni|uYdhe z0FIgfUOxZtJM(ZV=ZlN~qB&W=KM{l<1zql2ufUfKzi>4a_h4Z?HMRJeatQyo6srSg zt~i$x;ejJ>!f1rQd%iRagnX43{Q>_2d&uSF{Nd!SH68sMi)>51fx8 z#ou+mR}FcVmJSu z1Vc<8bmHJ%pS;15k*K7k8Bhm;U%cVmtd%=FIWRy7evrMvh458(Tkt|4_z$6X;qGas z?H5yGy=5d=IC-D{z7YXG^eL#R!JQ=JVq#@oUs-v-Rj&@Nr(xyfqIEYuDkK9zi30-z z16(TzN?2MDtQY)?Xy5|g$#e9swD!N%tZw|RCp^2 zoAdBl-G=3;AJ=EQ?zgAOssZyg76xgq_$#05dfQ7;UCtyC?!wZeuevoQ2s!V8Y+$|j zNB!lRR_)9Yfg-k;$aJX(@^Xl>>rq6Wv{B4Q1wl$dGJ(JcjJRaWV)`bV4@UuWsyJ_O z2)bCbPPY-3rw$Pl)dWOS@MBdKQ|&ah6BVCeUS8hU5xZ=Dr|*l_#?|VPKNOXeh@I>q zU*gx+3?;eYAcD{B%ONQIE{gpg?~kpTwmQ zJk3c(y7ZAs{dLu4*E7RbQ4MhUcpY~JqA7zmRHk@7R5WX22Qx2OWD@H z46UKXBBTwdkj71WN9XWIV-pMgasH-)L3~&wWjV+?*hwGUo_=$tUBTM z2#PRAZ@-WgWMGJ_lnBLTZ*TpCLmD_r?f7uqXGG>U#b&>umTB`M8nN<&uCz4fBwp*4 zCYUrK;pI)~u4ll! z7$spe*g)8l;cVbj6q9HLT)q4~LhbrRuM~&k{6>gDn$0q?w3L>X4uGMpF)=YYte!KQ zF|L0fv|gz+sY!#Cq6hhkY(?2J_EBOb6cIvr#*c*vL46qVliGC~d2K7Z)V=C9p=MBJ z>Id)I#o=zVivus{r~&*iaXB50crB8``r`53jUCMY;8@DX|IM-L{^D4fE3vfWKx za8hvg^*fKEl-=#qi?B^h8mDa6eaejkzdp#JG*21OAYkrQ=>n#*$Mz17){$xYDJUZZa^ho*>8`d8PJ z4RND%@Y0YUR|X4wqnI7>{hTgUDSIS#{T*Q1+4Ug};n2!+n$bvF+R*T7 zZ#FCllUVdsL`N?RGqW01OlX{%PUmyOalYtqL2q47ay|yELgl^`R@z_Zp7`r-uQwIM z^w8vE7uev!bIQsFpfv&_%F`riBk+>hLykqVaX>0;W@@?;`V1m2QaHM{ zzP`MO2H_L@D;gbKbbm%V$dqtboMGW>O8f;?!w7hjENIo_%Rukwu#IWMD3R2UfrvTt zyxT?^mz+ESoVj}whu2*%6PFv$BCI&#OeQPhv1sse74!|B>O45YUq9I{P^z3fOJG(m zt~sx>X%__#G#S&~bzA&1e3uvkbkBD$jP6QLxx z5rJ0rh0NV&KWU%85n6;I;HeX<|AElVrzlDL)i#{2FJ9lxBrgfl?~IosTX5YsC5K{3 zabO++kG1+nMzgV%-|=?wQiBEten02n@soXWr^KmVO%LLX-`s5fUqN@l;eM4oHT4vk zJ8C{tL?zJ6_~#=8@bXYhHaxq@l#xZ$U~qE?bZx3jsfa;A-O@tyA-QdZt%L;GqoSf>R5{6^Yv_+H6ZdC! zbL2Vrs#%rF!gGIfTB6Ab-boQWf3boqmMV@D`K94e7yBo&)6-L&kbrny6l72^IyTx2 zXYwg2MNgXN5DACi^`62JiZ*GLPVXAx+IGQ0P%8hZOTC3xs-4tg^N71o79=)Pg>jRAsMP>}|KWL+jF@9LY4g@uG5`y9=(GE-O)P z0q-D={{5!oXEn_h)8d5=4P~;AC`j7gVd}s9w+1*~F zCv_CCSJ?rh%g6g{>#n+Ww~8F*HP{*~F=Y)y%szroyDdbqlv2}{KFw5rGTgkn0=WmF zwZ$16fq55YU)gCdLh)O3UDs7wB~)^#VBiXBHi8wU!O$o=GExZpHA_S+d%sZe2Jc;Y zYQ^3_dhMXvM8y6VT?{EkGnPaL4o%hGBD&=#m1b!_MKk!40o(x9Cm=6~u6|K9`Fzzq zHhT(Me`X(4q0(^>TRkBASm5B|R;yDR@`}Khj=xh@7ABVrNh&CysLzD)Qcq9u88z)t z;DLCFdeLA)h#uiYC)U>L&#?4dy)_#HFLPR4z?phc>%g+RLhu^zIj^JnHkgJ@#JPgu zQ={Xpna5Td|E-&D=y4=zA$V@sMMS@Z9?S6L4{a+MT?L5W{V6X=I=*^0J+*${WTC!yyULDx2s**j#c)m!DNP_%b7!_rWNXHUA$09M*&V%I`_8`F4?4iOWHlrb( z0otBeCaCIuao1{8G17q=Cais>sp#$#_}X@yC?VTqxu0`iwc&)P1`U#YUNe2w za@>#UIAl5NQUAKqP-?EipdOrLn(-CTGHNMNB+;T%(d&MBsE*+z|#3S&m=}did zwdXX$AAp67_lAW91qq3XChb<;Ew2rg;|~2MnPm;$$fea-yaS_;LhYsk(>}i^*t_Zl zv$;*3Z?b5<**qiqIK0V(69PKi?zdp{-m@CPiCG@dwM?Jb_xbZ@%pm`oRd9-Jb#9-w z**pX7>W1zEfc@pzhrS1PIPF$h7QegCy0)20EA@c;#Nm+QteY~(X5Qu(EEMF?C7fi{ zdK&|3Z3O)FEY#PJl~s5WNp{Fuu-@!#g>7rR?8KG1o+Vu5Ud1BYoFVRQ zux|xziO{(*m_gj!a5_O*BC%hsJd?JK!JD|E4u)42T<0@K-+Zr;u`@D%#WPAN#t12p z$i~@+IL&igj*xM8e1XoI!=HiE4SG`F8JA0D${>8ic-|_2nimIerAGIGkR{NI4(o|s zCY{B!ebRAdJgpaN)UAI6_iH_`;d-Ce)L_RyiD28-)tyzy*HYsNgmrIIJ`Z>_p;6L2 z?AI>T8IE_rj!J&z`a~>;5&WWQv(ji=(riy|a3-NoH#L>p$AOq@a?|;NplETqilW0^ z()l~y3}|gWj%0`?swMX23~z#@({5%c^iJ2~&k)PIXgVDu*`or(wQ*w?@WP3}))`cz zH|`WBk^)<3c1U|>!GNutb=kroWC28o7f&^-S68G zqiV&Oaxrmnsf>6Tvr zMzuz7qSdSfOtGMU)`U4r;V6X@mDf$(>>dDl&RGJPzjZ~0qc}*9i+(=i^CN^&QdL#e z(xQQ4pK=%|_95h^z+#UEeGymP{paVL`UIXP3MwT`D{F?M64f%#L^_kF`L;6cY5{q+V3fS4@cC9_kSovc!f|b3@<-e#5R?f zt@qWYq}K&ozOK#8aFUPfU42#GhY%n|NeWjqY<`ljX`SRN%J-O^oczi5{6n7V>S_lE z2iql);&3nUFqGX^&dqam4BAu(SrwTDxbZm6sz;|08DigA|FRs&|VLO0)BB7?HHmqdl z)|EGF52ufj`BBf#AmHcQ8vyjC@9F!e*(xK2NC$>iTsihmKR7MS&^aE zzLFS1pZ=)1-^zg85u<6 zmPRL_RIYNFty-ev`N+=p65>KzFh$#MPSvfg%DhMLf7DO*D z(&Hw(M-UVoXoNl#UL`z5(0cnfr}Z~9#KpmxfOnOUkm&A-X#?0+7F_QG-P&nH1ca4P zSXmA!DXEZzoMd}O{&$CrB#%a{FNpj$f7I0nVdo@T=A+N!+u#Rk8k!hRqQTDP!??aR8qEe( zD$KJpY>1aGu%Oj*bYxNXg+Qthq2%TPV5Ba@rQ;|NVnRLCFS8G!$XESaq8ebAqo$L= zRo3xp5U(%R81xWHlILUdk9RZj^T|Dqg2%Uui;A*z1^RG5wtI_6LS$hTZIh*q-oEvn zL45$pdjkFN#rcIBFGb4WZ9pIb-Y#T}hP?pt zLHOvtwm$TNxAx%M!oXWEcw8$pnzrXfNcQrLrV=xB{F(6LB}Xh`<{*3*JGg%!>l7=$ zQ&AxWGX`}a-6M%4KO3XAGB;;R?0fR$iE<(HS;;f6Iv-OGQ)w&=41lH~UIAoOtmc_KP?fud4w3Ssn zi-qKuT$2AFs6(H@8}4vy<0Lh{Pmlu{p!=-Dc)2m-A2gTT5vc#N<=tqtdAW{(B|=qvM8+lxnRri3Us0YahQN&9x%)RCS1q^l ziG4a}Ev2W1NredqWB7oyq_Wuvy5194afKI(_zB-NpVz=z>9NDmSZuucUWx^UvJ6u# zU&r35qZWsgtKFFD@FEfwU$w;@U;j7F)+EnYP@PDEm9aa zY2R;zPE;Tp2DdK)AtkuogqUfDeBfnBGvym(<`zbplr*tHEkE&JL-^QUG5Yf$LiiqD zr~qO+b*b}j)gKGqhrO9{=-|H;oIU$9mjOWBgKU43o7$2wdiG2QU1@3LUx;-$AB(Ck zx9KMQ3!J}@4C=}Yr!N^B+(+G1t?$9`D315ua*9B>iyiACp3%W>ea*lq2-)a*_WMHQ z9?&C$q4)Jxp*wyUHQqXeED&7RMcZ6@p^TSLzI6xT9DK1zGj1L*teUQx8wwN@ziL}y z+rMBQQoB0cw%aadwLxa;USh*4CevG>Q3%on$=%+e>UL11(e-@q5(qe6fZxmOKIhp= z#9ogZT`?f<0TPuqWnr`6X(Gj`<+1QPDMgA{L5hr*|t7Oc;N1NZ}_ zlc0bf#mv%@ZiuiROJX?%C!`$VRHI707?4~D8P*>cukA9t(WriPROHO_sI4ZTuZmy$ z_8FV)%7;jkm8A|w!+xd^z#yKoa^l%_1!GHU1A+JTQpd8tzXIBG&+D%+PUSW~;0St~ z@2;dHNsYiPz;@UdXgBN|dj#RE>j#HM3yqL*9p8bYX?L1nb^m?=2I~)wSk(;FCD5j^ z@*PwHcyT)NmzYj&69$e&Ce>1Z8eHz($>T@gu3;5k1z=0gfK{Nd38OKpGhLw?Y!tedSjtOad``5|5j^j=ZG~qhTO?f z$yZ0KE`euYeofAU{`Sh@#JHJG>~_cx+PKncatxMg6Nt-vjzUj~5(;qlIPUWni$t=Q zi}HF`Tk`&!Q5relX!+Fx9Zxhk-PD1Hs8S@7mWlS@nAg_H!v_~sD7{B$j#Cc z6K|dVG4y#09l;lf^ticjq__ih{7ZUWLTm!%#0%^ULP{U_(bwL1@o1eIBVNbI?@=ep zm(S53nt=LM|7P-An;Ehq?I&U1AQsRl;D1skKouAJL!sjz)(_$+09nQr%+aBcYu6~$ zPUo1ffqr4!_DiVn7mVzw{UhzWBcf`u4NSXl@_V3@y|s?E*SWIaj_F4Dq;1^x2+QK` z@SVN4I*$3FJeZQ?u7}yLs+BBBEhnJXXtAm1@{{8IW$M8kSW?)E;tvu(;kC ziZ9-EbFmx_B&Farb!5}`m+PfK0XPjbcKjlsiW>v+)5%uM-|9fST#|o?Wg-i;L03>{ z5($_pBw9TiNC5-i;c$Cz)>->yFx1`%+{gtY+w9ae5ZoPDL28fc6h4L849_<@$>=Lg zUQD+sEV=;9J2i&yzt*od|?s5J5UgraBIvc# z$uThjf{!7Bp$!cj#mb1a58yc!KWv^}B_-k2zaDyw{tFz@6tEo0B?Sct4m1!OArlkw z=-bXtVKCB$$YQ=ogX8n#>kpHbk^E4x_oG^5>@FkIY?E^L1Q&w;UjjixDfVPaOsYE4 zFF+P0FVAH3>*XwXK*G3LJ|ZfBumC9VAWY|91kW5`cjc?)KSAe)b1VJ8aPEA5@$A9C z+e_d_Ia|5@nUAr5G6iI#WLDZRnlJB~lO7tqZ7x*#1jA^9AD(&Zz7$QvCo zB(ky&vfR2Z{{xeP1Ib9o)+y=vJN#Id6wf*7Nns{_RWGw~8jWhxn*9U?g3#j^FpT|5 zQX*T=(#1%JzsGAUC&E9Kqr>1|*+NYZw=$igwCELj%61QFSx)j;?Mjr~lPo6hvhT0*-m}`1?w9H_#(g3~RpfMA)9}od0ZqLT) z)zp+anAYop(SOg3oVj7{5EzkT1`*TKhx075zz|xdce13sgn?W-t1A1 zWE$(E6-mpY8|YN4{0Iv1*q4(e2<~d=qAyy-IYsN3J{)%Fas*59;Idl2*hMGFr<1xM zJwm(zLtW;Cm!vYvf8N6S(o_7ikI1~NR$6lhizenQi30=+X6~n(a0GS1ojL>_brMYc zelX|fv#elR3eoS{KCLjg<&bxRmufJ!STg$LlMhd%681@5&qQy|u=%T6|DXCsLkME# zD@|I_k*1jddk4ZI9-`QY7PC+=H34pp%fcs8kPZ{UO^C%C@+@zhQQ3)B71 z?)O*nV54g$@_{+Bred8q2d_Iw5Y)`1VDU+tN&Juee#zdy8LFsQq>HP+jrUAMOY0?G zLwKiY^^`daxPg#Q21(MngT_&y*g8u$d<*Wkz|4BlwXocfY4u3fH_-3_-S4|Rdk%aK zHVEYL|3}zcM|IgYZKFS0X=yF`u9zjvBLZJ3vL z>lUBFwvB5M&_1jbLNHk2O;g7HKRPZ)xl71B)Je_00${TVhLtoa+&%phISk*$N znXMa`Jp#m9vcQ=aszB{k;R4u2B(+50II_9-z>J zlir>`u#Nc!5^H7o;TA_KGvm(s&>hbvkgGuU%FWHq$yo|v@~`K{vLVc*!OXi8tbgy0 zbwqB2M|7m~-F#1P7Cj}A==FpWQaWoxC@=^ITSRPu?3%QC$MzmH6XcK3H|D*%hLRH#(|uQ=SaBQbhX#>Qy%uBMfnr$Ay5On`jsE9JbMl+rjvPw# z%|@U(QAWZHdVOs5`+rG8^^1R`AuE0074+*EdN1h+bEIz@JWvR=*!_NU%k_YOnOStb zkF#|7uiZvb72gIg@sBdRqL&2ZBkxjBNQyh>l_(}sfQg|i;FBx>^@;}5XJm1+X3hCk zUFxa!6fp${HF50ISsWVYz(|;xcJPArzM+GMC2B^pqMSSESgZ z24Zw@*mv9?iFK*EIJCPW6ki=W{e z$H$dH&NV=!H+@TW0TiW&Q@wX->c#Zs*;#r+I1JJzVlx!J+JiRZC_qp z=lIyHU%Amq(KzRGTI_=D`}R(AVQ7EGu%&rrby>ev9oV;SaY7-*Rqzge@@_De=M(h@76Gp=Xws(4mDu2(@12$Z~?>7knR%|F@%4 z@_X5refSnvB2qwKZB!LAe+j#(;zPRJ|1@=ex)z8xR8-g+?o1CQ)C9K2S>x7F5wWs* z@1QJxb2IXfM)$#kXmz;*6JYqBp@b~j>_5t3RanmV+cLHP4e}|iO_z&1he`l$4NE7D zxpH!Hq~@u*#M~O2GBPB9h(egY1u1)k4DBhlG5#|(o6Ld&ChN+kbr+6A#mUgob*a}F z2vn4}VL;&BrM`-L)D%}J_hr={trMU>!RHQ_;HtXCj0+_U>PMoJlQltX^;5pVc3SB$ z;mftFK+qP}wPb>IvhE^06P=Vntvz?67PHv!ntJbhF;M67KA>S;B|j%x4^=;Arq2F2 zf7HJcB5V-a!9Bu`Q*%w$%*;$dK>-vEevBP2u-SFyL{80o#XLrM{Ozo0g*Z9(9G3Ur0FvaJO* zpuD6$C@gn$SL~aGYPvpdoBK7q-L?~BV}EoR`OvMTk<36A_`K;3f;vk>TN^ko zh#B9>p{k^#la!u*`!M?bajVvo+G*RJ=ST=)02yP8s~mRs@}`TPf=miWBdR}(}oQN(T41G@mdL!sso9-!eA*V!#SizmGTD6sLc;aYpKd_{_6Wp+je%ql zh@(D`q9B4X7L1T2PzA+-2n17j8Fbt?t?onVdrG;1d+nu0PD6uJfJw%z!Nk0{TUl=F zao={`5^ikItLtko{zu9QDcBZLYV^H0gj6sG}#vF2J56;>0^uc#QYqr^vL zHhS_z(WQZCy*5daRi7Q_?#Hh=5s~5zL?}SSd~_m1;9Ds%Jc8Q>nV`fiYwR@_;ixWJ zZyjf6XZVU*MdOfEWw^igxW4uDy|zi3(U| zN=l0D-M0`K+eBt%er4ey5D)K!CyY*7r}Xvq0-P#!WfB!jl*qx#Z+Ne)4RaV>Q16z3 zqZGmjoUnm_O+emISq$@Es{2X+N6+ zRE6B*!w2lmKORknKtmqOJOrNPW~w!{i1`r#0f7cLebJ{+^Tu3diQApy3T+IrA^jEq zQr@vM5Nz7sw?z=)9!wV8YdM&i!m4p8RwG5<_CP`~`2&{%QbB4hf9RIRw`&u72u;RP zz!myE$*e1&%5WVBfjJGwq*$*WaFe4PM|sd~Vo5`MTN=Cnj&-)H_YzK(vwbQnz9 z85b9K1*5YG9Se(!g0OGixeBt}k^g1C5U6OIl~7BtZdaSg9mJa7fZT~3?u~G&iorP> zLL$1w8|{DJz3pY!5;F&f1rNb3Tnv)kC5Se<#V}@|^$8UpHabe48`9$pQamRf>-MrxZzjCYN$C1O4s-w@2KWMD z7M&rj@J8|gx-VHUu3>4SP&{+r=d);>wSa}xROk-)_Eq2AgE8c9-%bT zstHm>1r`43=#bj@I5sx6<7-MxUyF+aL>W$@xsW2gyFLP8f`GgH@1K|G%CryZTQ==G z0+mpbJ5eCQbruXXH>!QHMeRKsbl8Od@@H}YZw%D(-$GAT1cJi6%>#^+L7~OM-F!V;agoLK8tJ@q|NdcP5WIz0+ z@A*`UN;RhtxHZjgnR1TnuL}`sd@!*AY(N2NlNzviU-h?fpmBud)ma8j7jPr>gxH3&wlnkyQ5-W}(v5>-(WFGxL7-a0UkoLMm=$ zWd%&K&btniiKI7ntWr@)sY-{9=Eu;CHsN*O5*MS>=p`fkqNkU(!ZR3F=6$R5_ogiwKf%hl zRZ#oD_4X6F!-`_A*S5UmyI;5v5HMY$6xGc9UC8Hmj~Ksd(mT?QDE~Mac-@NVuvHS-~&jl1V=_GAjM&8qlV8Fo_-5 z7;cahIGHfZ%d?mnm~oMHd-ge5BP7liT!jBNB_npRTs4^pD=t8g5ZZ?F$%W)F0Ukh& zydQn!=~a=y5eb1Ror3!X1!0crY>jkH>SH`^RM#V2-9l)3(k&jau(7p`6Ok!wU3XE> zddxR6MZ%U54(f2fjp5pt^lr3Bk5yRmZ4ZUUrG|NP;AtJ6K;*|6r-Z&&OI?)5 z8KLpQ%%Fh)2lI}H4FG{kemmh50`Ym|>sKX8r2pJcJCv)U(oDxsa8ii&&4UJgjtwq4 zIy$Jfeb5=_*x1~JSq81fEeZ>vu@z8!M|;sC4<=&HP2RxxBc@4t=h zS46z5&Jr2|aSgwtaeSW-PRBW-v z4pIhOi9&N?EGs`LUp{4^w0Vd?+=*ykWMX2vnzg}iG9<%DM^~_)X&CC}=vWRP5#i^j zcJ#%f(j@aff(RL^U+{m_)s{T5$LgMr;!Y`eJD|DZD@erlNQLywyQ67Hfs_a$F%)r! zHMF$U*E{tkG)E!MPED=Z7?`x#*VaDXtgfnpxcSuuY@TKl`gy{0(>8SZ zG3d05*FdZRspo*%QfaAmebKc?)dk;MZ~0}gFNLqia9d^UYwSQsNB z!;P$Wrj|Wiu>Zv0ZwZh=1~MQ}zn2+VsYyw}Xbnp^6&v8KWwPJc*;MOZHPPfiaaL7V zm;3|H8nuQUT$geIhllQ*uhZKXIB;^&5g9sDh#TIWWqjxoJ^yhFXt~8*5;!jWi_|nU z{$gfc2>KH>PwT7h8`MM(Y-27mu6^_u#iL16PI)*uI7~CU*EQp8g%V&6bF=&Qe0kMJ zc7()R_>k&e>JaFNC5uTnHt87{blDOlo>7I|gYzpuN>5M!+dV~14auT#DlY3R625mF z-&JOSK_mj9c>1B-`oh^VIBviuJBdN5fOfNo<<4){>6)QzbXoI~6A>=#J_k>=Q|KiD zZ7u2+u&>G;LSLyX@smQOati>7TWYj)LP9sAto`wg!$QjqL)sUECA+Y55ngK4xTTbc z43ciOY(gZ7{eKW3jvxNv7KnNFwaHCi293F(+sFi!W((}_AtszBoBM4=5Hrv#CV*g^ zngU*4qeM?vcZy;F#C2+@8W9jRe%aXB75A8%;%T-tqk;HIT3Q-6ND|H={yyK0Clnho z5X$!zu4NA=#l{8jnIUtH zAkJMF3jnGjotRySz!4(jZkmyztg1zMl#0YB4|3(I;(k?h%*g6ERZ+hd! zPNM9!iFN?O(0iWLh3{1++q?`30zU@sE$XFu$EB+(5fO%Fo*hTBQgcNRNIX zyk+~f!@kz6@V=CzaO&TjDASCv2!e4#ANXFW>rlebBFz|j_l_I{vT?z~me?2fjx^9J z1K@KM$aKySBm5RJSAsgelOVVXvNBJk;k*YdcnxM=dE|Vxuf4)O2*;@awa1UIVu2qS z#=jInWDqGD?Z5cLRXBCPqJ8Z}j+Lb)7a4Zk0+~mM2?#R*m6b_Zr$`9sW)DZ7$BEpL zs25Bf{F0DCZKkfTudk!CW;0;*JP!v!jdL?JCx@~ZY3e?rQ)7{MTH3+(ltv7LTV~**yvp**+dEFZCv6UkuI_UV5BQ_YoJmP{U zH`!TP&7Lh4e)!N)xRrT-U27`z>Ja?=qN`O^RAfkr{p1jUfFN-rYOA9{aXo-8oMdw# zT^3p+a3Ns>ISoWt8~3j3=mD7}C4gZ4x?|GQpH)tCQ6bHAnBNt;6oQa)2khSrz0-~lRVY6c0D+BP0*;;S3Avk|L6EA+lPP=7D)_kI=e ziuC`mgf2x4*Y$eoDH<&S2DVIb7lG_cf& z{hpp6U8DUQ190XYaV4g9|8J#%DDr`|DOtk&QTZmKu+K033+vh}DqG9Ry~>V0kL33) zzYHQkz3w&bkh2Ro_Y;^*m*H zd7w5Te*?W)VO%@=k58$%A3<`}NE@ij`TPaTiCRVWCJsXFu6=D|Rh0(#q72W!K#Zba z5Q7@uE&)=3_JpO;b(bptb+n2v|AnSIZavRC&F|8nbfEWNM{>q|0C-(J7rMEhgrkfr z*pA17Tj(9??niX6XiUY%#+HB5c+uA24*{B-T_@haZOu*1_ZF24!Y>9+Imr`OqWjA0 z1@l913F2p<=L&F%w)XyW_ECcyFiDk?72uTE%EjrnsqlPCku%w8qX-hHcN{Z^7h`-px-t!lb(YYfRhUrPuG!Rk0!gv1MV z7%KMWjsF`~!~>N7HL*o);s2A`)h!M+ko+^MDn4#qZGyc6bCy$K?i#GtAZs_bov8{L zao$;I1-1;^MakKDuS4sP$h7I8%Uc&(F4J6&!Bi0e7*DkGS{`lGwER^{s$Y27Z^d+` zKI{B}EXweukFNn3I1I?wlA13LN}Z~`!otGpNomYJVs~))D+p^hNOG)< z9X9TEQcUmLTgP$elw|;JOcIyLTD;$%E`Is#^8DNQ$VPDbDM9@N_2lW7br(Q0&kY}y zPyKY`Wkv!&GERw8+)YV}&_MqWv^C!3E_0s*){6crlS_~ril|#o(3^@r2?ufiP?|D@ zk?;9I#{GaPzsWbWvUw`0!X|C6NDZI+`^=P?wATUO7k<;MT9;G5uI0gwbIRVO6KKlo zK^H?Q!VirU7M0~j$_%4$UNGWX2&6(FpatoXKrDlD)=!aNb!M9r#V-8;cw*3eG^v^< zdffk($LHw}434vG-pd1{OFrWkgfQ*r&^G8Ej9xP#GJgE{rmrnI zZ{Q~xz2Cw%fW>D%d&%dgM@6~gHyDrTe+&ll0;6~53v66D(b$R|^@GU>Yoqy5|AH0N zGal9E=HLv+3IDg1cnLT~8*R7_8@TSUH|`2frxTN7VQ z9!r96>(B1elOb0kB>sbs_4RLAJS%*DcVhT)wcT4=*Z%CBn>-tBuNlgZGEr*utyr%X z^g`Cpxp?k~Dp}sk8G1gdEC9>uLbBc^C3T;D*jpX)-Th3O%NffjJ6*$~OX=uj)HX{_ zr>9KW0+)G1hnSRfNl2WymBllvE1(e_p~hgInv`p*SOa_*>i=M{h4$BS{T9xqrluf$ zu#@$8b-tWvR5SbYw(r?4*gZ4(WaEO;IHf#%F=M>7)Vz?9=M3 zEK@K!xa>;_9Z<6ef(pJOOuyRUJd0H?QIwY#@;clCpHcUb9rL^#Iw%aL<*!RlIVyU1 z2tmxkz=atV_!eikR#opE#2NMEp1*zj7VZQL1t6QHtzy@w{#mR>^Dji&9jFQr*txR~AYtY?-SU@Ba=dUo}1N z?!^~Lyo0r2v!S$mZSAinBu~Qiyj}cN4tjVqKH>W?$al6r}rkHAo3eC;;C9&sl_8n?peJ!~B=Ka6yUXTXm}q zl#k-#%dEaJDQoa=!fz6I~MSc^!f-39QCB(%C-lDX0oy zr2y$`1{mt;3pyWCa5&RavEYWeyM&H5W9Sv9WTLp1wa zLF~8Nxux&KYpUJ14HaGtx36vSJRRH`dmr1r814Pe*tUHr=<18%9)0`_pJFX?l>01m z3hwa<>T&CkBga{oky{paz1NXFOVmiLG?O#GfB?qZ)EA*Q+ag(~us8u=z4$m@cptk( zfZQi?uNp`|-Re+ZuAdN!^9L-lt%HBwm?7c7HxgluOMdq0c;0LK$?OOTlmXzIRFSgj zEZ7`OXXGG=TLsYik*^g!&kU#;(8@L9@q1T##;AA*3+$}Nm=;aM{12kVmVWfaPV@7n zO)D%EX_wAdS;cl7kPs1lc_066Be?eTJ63};%}1sycr-x)LxHN;y@fMg)FlTCr2?pY zV1YRlhk}p&570f#EiWH7EeDDQ8WXg%I^BnRs;Sxw9%eJBrkzFko-Hj!iC+a4n<41# zVpK^X<1%hJ-dnXgefu=+c&8n2+UI(ghrE2qoPBEX@zsZ*z1)VoW3-Z|oUHXhr?rN88JxUHGs=|625?tS&d#z?RC5=vP%~*$ zN0|iNHYa}Wua8zeg<1J}HMT--TT|U{Xx}=sii`V#7P{@M<@XNk@Zz`pLOsKI7WR#L zr6-n=hli*B&7+4fkBoF58KbB2*N#1!KIQ5!!#s>>|bnZ5E6~J=Ep(Yb| zD0U9rJ4#XQuW|6NDteH42PA0UsM-BkG8EWB#|FR2n6ocO8=&z2LT;D%;xH0un;>e18<2 z$BU&10q`A+su!1AsTj|R#%H?T#ITw&VWQs0{`>{ym7FEbb@qL=R}wj|NF=C{t%H$6 zq~r?FbLrynLpu;7H0lo!IMPFf{nM%EIc8mvnVFgU4KC~IDmw*kRv~QxitZXULt>}lDtj~4HUjov zuVG`G<88wwXKPHAjZl5s>XUC8?G;J&r1xHgC(O=D1!GX2m6DPw6Bo%>l%a50A9>On z$6RYa7juX)5%gY!&u%8pE%Dc#rZ0B0H3Nf#S_Og zVAy%E^H{;d^78Ve&;D;eKhF(&AX;i~LY@(=d6zI3iB;=^C5#3s(kfo#V`15V;4m^^ zzNZsNK$)6xaCGzygiGrcxP3;X7ApFrz3P^9a_b7_=5!2N?6xkMKm_lXpkbp2O!GQD zird>Xz#{9fdmZ9ThP`6n?wiss+B-FHR9tW@JY0XrQd>r%o0UtP(BMfQCgvL_)G* zKugxIY$1T-V9ArH16j13+%>(!sSoXblhT$OrF~6D^Ln`o@lMOVpF2D680_L_8*i+x z27PmBGv=bDpr>$n#FaG0<&755`qdCqlpX(`n$qEaPivzV z6xn&9^<{FBRQwNDUA@V7Q6V7+unCYAs879?8o0nCv$)mQ)3f{gw<+OUuD)4t@V3%Q zlkbW#TFfmheqV;zdo(&NV={-OS3T-BH|D}hddDkqZo$DlVjRz+DSD<@i~f-#lKhmF z>2R$4!w0sD(?l-3a-f@Gk=8n#KQ?-$Rh$(s+%C`(ZHKlPci#OP7u0I}t1LJ;7>9yC zSj)oPyv#Q=u$9dWAeOwcG7cstDCTz9RTo*ELf9xJ#(NEmR;pXAxs*SB|cG}%Z}CeFshbWMd|#ezcE zrGQb@^x?kw5DCNj8^rEpF;`Na77$cROU@8Dn^=*Zr@Hk^I7m!CCB1 ze^8p3Ncsz{Magcf=2|jmzV<5BCk)rR(WzL1b<;&ElKzLuyjC%m*w>va%eOfe^me!m z*ccgu+AtpQXvdtX*_1KX#%ja+NmRBNa|pZ$nF#MpyC>6%ypE~VYFReqdmR2cm(ERG zTwF>WP7HPF_G;%h?tuS&k{+p{?7SzUA>G0<^$&55z*8;o^Y*7E#Kg3bbff$^Il1#f zjvbzIgy!&%r}gcxY5}bZW*>)o1_$##XnyN$xph}TW6J%#nW^bcrD#&c!@B*wJzz|- z(GHD6>gwu#%{6WsaDwHXwp$`p>_hL6eLB$AQ5T0F!Z9G9my>WZUG zdHc{%6nj@^XJ<#pn%?aty=I^DKdZ}3qJBa5wz+9(+aojsT9u4H4$<5={`2SGg-`M} z^PODQHib61KdFGua3ZZ@Jzj0jaI+)_0jTgo{d`~ISP*PG_?v3A-Mon@i zAs}e;F;k%Jgv_C-$c!($rr5BlVavecw|`#(d$#t)>I(eqh!aK+1nwp8R&cpi)+CE& zA=F;G?Imy2d!HW0sVz=WU^DQ}uSWCkC{r#?L8XE7RP|n53LOK3x{EQq%SC8wzy0*| zG=z!eZ|Z9~-F2YOrz}DZXf=L7c<&P39&^R&pZgVCN|%jbeAupJvi17PPSKPvi77Ui zn!vmLZoUrfi7N8)yN8F7At9}{82wgZk&%Yg*5m&?>=Yi8)qb$AuzLtl3a}3|;43Aw z_K6jwlr)A(pJW!3L=o4U0j>U-56_liCbX%7`FJCOr;;ufTjG!8=4fbWa$J;SS;_jP zI$z*Mi2Zps+U6o~C{CFr|FW&^!J&qmll_h{*J}7Zod^4*Ttuw$7k}EAu+e#5wko$8 z|MLqx7an8J3HbWEJ6HOqd5*vNgJ54Q36_B1nQW{u>TsrcW0WcfriE__zu{X zTifNZ$kqGB3#sNvr-1vEx!i|Orcwy@4i3NpvoJAzX;kN8B|AMPJt(;%%)s);s&}^I za|L`RQkv*}MXW~XN`5fv^NIzbyt>(Ohn5y7zaowI54;J!bvcDRv9JJe3FBwd2uc9X z93CEa8l|-x|8TbGPa1{}THJ3)e6JsV7jRiqD>09jo2K?)X^?p?#okXZBk4onrLTX> z3pH$qR(BeTOHC|L=r-KbO(DzB{T!G;aLfXG2ou55>_JS74 zf*0%hbx2lwDu=`)>*FTIdscU zpFZhcT9NjThIbOh5p;ERJ*rq-UY0IB+amIYtxnnUO3ZAIn)7*xRoXVAcQ$?jj zmR94M4+s3&ffgnZS2e`qn!IL+8sIVI7*HT-GAb(Fl^Ip?8! zp4zS7(HD~@GjK^^Ui=<45?TMXPE=Eyi4@l3m&li@tI>4W7WmG^R6SYQ*~Fi|cV7Jd z2uz-5x&Yv>`X2pX7MkzoS8*!Mpzd6%Ute(*W z_jf@|hCzQJiB~8s*QsyGJRGk1^XK8GPt|8?e*lR>L-j9G+~f%SM*NI15r}ul0$Bg~-GN9c1;yF#8ipU? z^E!vn&>DJ%$ftYDRT9r!O9>o!s5p=i;pp&iH~pQU{_tqQ;=jK~z6^2ZM!|S}@<)`* zSRz<4((U;7u;bDR44E5{z3nZ?Rn{}#q-goX{#WlOZ;^GMycOgdgXeWxSP*BL+jU2;!gNz%AiixxiCkLm&2ss1Gp|ZuUWnjbSx*tc&fG&X`?;NLp_3np|y)aTd zMn=`Vd8N{t2?ykdZ>BnJ<5KCiN}o8LInJ+}~gC z!aV(=zL)ca8R4oUPnkxI)Q-&jSYDw7js^{m=7t)F1Bx8QLZ0Z&y2lIX3l@tO_ux-q zNI~d9E9jz6zMu7Rx<}p|tu>RqjG!PasO>3PT$Da&zFhuz_FJi@!gW*T>5%>7PcLA9 z%0vAgoOd(TMc*1UndV-L59TRfZx1?()_OgM9`h?Hf#0Sxd~rWvqg^bf#02=bBD1bT zT7SFg-!F^#NKkGJYOZCW{Tf0@&cmWJ>&epe96lm5w=KDg{n4Mry2rz_0^gLj$BXXG zKL7orb#vmLDus5@%K1`My?)OR%XpTfzKI`e!^A|-?7wlG9j`7CMfe;qzuH%`z1dbC z<4~Yz{)E2#*vWIQfiGkt?st+}(7~9A$#t@uay_2vPQ=kUt*yb=yOEcXmG93W1ke^N z{PS7{+6Iv89`_-xj)EVKBBkR?X29iY`nH-*dwWVl?GjIwe)axx@w3Q z)H^9fU!<{8s9RnIR-4#Zmh#zrKSspH5iM=%vGVfzUBkA$>;6k;Mo_Shcs2=-Yeaoz zC|!yIt1pHs^zvF8cca6a=g*mHrn?oh=SSM%!E0MF$4*oQ?VcNDX{bs_Ip+76>oMg< z7K}Sk&HbJH^Qi6ol93%MuRO@21=80KPy8eUB%LYJ?mGIMx-I&n^m!ir`ci7NGn~z8 zK6!T3i~-$QsO+|L?>g+i*?vs|H^JrQM17#ako0SAHccq@CIP|Duf}9syY}bXO#`kQ zWBBu*GWqBf-6-VTWM`6CcuXEhfnRz5y27R)4Xo8_u3`8kS}bspY>l0s)NS>c230NB zk(Fxg?WV~wxz^V!{~#(YhsU0#c|52Kb1)NYkyFgH7xy|OTZ|l$bi|MB36!LyW@O~M zTS4I(kda|A2JNYWYrj`s3V+DQ?UQTKmr$69jVbb@!@-qNk|1FswZt4juVY3CVDX~a zlh~8M)khcP738g5WF}k{P51po%kO5HE=HMa^BQOKlfxpBF3*$RCC-mr{vL+4S=YZ2GUCFfZ<<*HHwr4@t*P>JIc@zOU%Wpj6P|DYTl~>3U8y3Z zpUw}_OMWym^4Vx*H|5w=RIbJr8u{K^UKv2vdgT&9fB%)Ukp0BVVuWNM|Fe0&dDvlD zB2W0u$k#hIA(113zNs6X%!;`ysuUN~T82E+PT1Aj11|hJ-0!_B*G%C`?34z+`H^~> zs5|HeW^gvj!iCwWkshHiKbHA>$Fbm!)4(0a`+LVp;Eq%Mz2oqw&8s_}$44dLIEa6~ zh@=PgnZ|I*YG@Z?fs$ z9O6!jOr0`T4KlWLV4m`(>#wixCe$>tog^P1%S3KTk4NKhRluGSp4V>J*tRhV{9$&S z!bGpkgcpg3?ZTpNe_rV$B@CSkGnys>GZ*Brf5wK2BRmnCKgk|3c2gSrUrw96qkelr1-sN~nA{D)y zLh{S>qeJ4NRpUS)EHS?Vr26}N%R??l+sbJE=z+H% z?(OL40E9R^8$!r94>`b(?l<%E^H7-^92mH&@I&FZH<1$0WHk}?M1WSBoBWJ$!;`X z0s9}f#Xkv)ew?eax>|W_wOnn(`04UOEsE-X)!CGp^62POn0eg7M(u_$W}=oy^k0kn zFP!=Zt*$_oNdH?rm8jm7Y4^`bxXdW0A4T6KSVjD*t`H4&uzp^$x@^IWjFy!5jWW9Bg(|IHc_lsWieG|a`Wa*C`eje z@to|*f}9*2CF;4DmxpV^*;gU}?^Ax_xm?8s&gK+BUmrM`b6VQQIbUCCi1IP9>9FUP zN3Z&K_Qvu`$<}P`=yw}`l}-N3u?5+iYWo2;xh_boXU#biFS zP6yA^*=NU`&7z|?${2i)Q95uBGKNqD5c1?V!yWzDGxQhGqk|Bt==LOaNO0wQS_a5* zp3@n>;Bx#$#!00!O!H*nNAc*AyLeZ|atrC{sOQ|Kg&qFlR)xnwBatmZ9;Kn!Haj}| zD7kK_*PNfBAh#nG2}x%H6v95iX+S#P+0|9a2klBwt5;7GOc(dP_*(D$)&Uc1QuZ$Z zU+~9Z5wPBe#d$xWwwRFI_;f)`2OGiD*$LGe<$sYG&ap|_s7Y=GKT(frc#hUDen|$W|J)#CN-!zr}Sk+D> z=bwR0u9_(6QT`m1NQOvH#<9)()XnRN@@OynmISGF_PkCv! z7OUEZ_rSW)sF}Ytf#&>_lE3!XJCG(O^^YuDxzEx zCoh<~0@>qW+yj%qxw~hN&wRC8?_fg{0|!&Y*QZn_g7bsz^N{Yz4W%dsSZ=XT1k=({_|bGu#5-NYU(X6d)zRz7oE z2s@V^;&}m1b}YuAQEVb7r1aOp)n~&z+Z`WntBJ{Uol& zghGVK6&WQNmIg^RY~4DuMfFshmuZL%0fm^Tp{; zoc+Uz;f`FVLIvJXjRvPNoScKzvaf+fvvsX8D_V8&rpwX=D2M~Sbfr+v!_*=}$h8lC#_ zM%H@Ht90^nSP-S~wKME8w6APmaHE_mABZkS-d4l=`r$rTn5^kk>dYf?$C9l#TPLit zL*3acVpS-FtJWT-=i%ka40fVTk$ew-Jqt%KPO?!}2G({;r@*4r?*X8wCx?Kj72StV^@Hxf2>CBFA)|3|)K+F7!Srp&F??Sakw*xq+?XN-umlgR2jVo^L)u3UuEgBHo|OU7W9^rJ@iXI_`*#M89ZZ&B4BqhM}Lz)S$Fh8an%K;MdknF|mdD5mmEmk(#jM1%NS1 zk&{tZpcp049}-5at?^DDWk4vR#ZY-BkF{T8t+}0cZ+6dHi4Onq4S8agImMaWad(YO zHwfQlMW&+%Zi#X&ffi>|twQswuHn=b#P|)4Rz&zd!lqKH5ZtNsq55z3SS5l+-|D%fL!Ue zZ-4c2Y0iyr_Ix^8m*2w(*Y#Pn&blgxA~Wo)$31rzgKS0?2_o+2ow1I-{0umuXyC8-!rOSq;-%t0?3)|(OpM-fv}}} zF{3nQ7a)KkBTjYIn`-3>Ne(`{wZ%&nV%_Q z)&c>Vr`_|MQ?u`B-3Y31W_9>CVE^dU?CB@1;xiaW>M>K5S=9>3;}2CU8c1*sR2P3Y zUsM-82>k7R>UQU7rook#zxA<3RRsUeu7~l#MjhB>Z~w>BfF)X4!_25OU$K)kuV2SQ zzK7*m%nfRffj|(1SDC}yiA=-vT+7_3qNj{7I-YZXriKn-dlSZtt6@K1@b7ItbNXI6 zRFlZA=QdU_A14rdlwVO7Lrrrp&vtz)oT-gc>c$0gePG+~4T z3~eHsnA_v`LTU57QEWBn!|YIMe|uHtw%5D16|dE6|6zYBoTw&k;xs&D2Oyy z8jJ*4uUis5-tlgiK1<+P|NeUW;kJ?6fi)GYft%TMaA^fOfM+qE7p}84?#)q((?0gU z6ckR|+h*2$a{Yh`0NZR#)^u(O#LAC5-t+xsF+eU2o4>a;2MLIO^&k|H|6^T`!Md() ze+^Bd)5cf>)xDQfaPn*_F1|W0q=}bf_PFm?WE`1S#ay=OI+4IzUVl;UyVmE^ZB` zV%5j^#xQ8lRz5wonN<0raA=OV`1|)V&!6C{lq>5qj5aj&e!ey3v*ic-ir!(HpO?71SBwEzQ`r&7miJ>e3t6WwjiLg<*C4KL5_NyD-}SwGz18;_GoCcpp~CJ?5%UGntN*t>QKR*u&6s3~{z$*<&!N3s zx=n0p##xF$LqGV_!ZGW#J*%8zJH2BL!IixQ@NZ|6$W?{SIJ z)~xV0-jF%v2bIU1N_qI0eSF>_TM^RZ!m0UqIxWe{7O zx8nsdvo-CHxTtVBs&KDECLq2mrHUzP`~9muS{&ox^sju?r?9hfB$xL51P#OjAq4h? zD6DdaNfo(RisoL*?|6e*j}PD09(nI4RCvT+zI#twLV%mh85JJB|ND2AcHprS;q@y! zkisUzSI<|8c+!`a#i9JHD|}sXsS0@Nu}z=z1LcRN9avIYQYliISxx4RRg#qPlaUI< z$wjq&FQ-gME2Z$KF_~nM4w)N&5>U-Y7RMC>&Q4(|dpcxVNKncdAODm&#WvZ&>0L~! zp!WaMrTjC2646&o96p;<d=0SQ?uI}KeU7L3i8=|e~gLeN{PM@ z)jiIjv~aIv!IRSjA>Z=xo|n}*qzsOS6;gp-cUxj0Nkb*{pwoNg)zcH}k@$Q1sqb0W z|M(8=I(4BS4d?8-edpVL577x%S#CDdi(-I`8^^2?<3&BvewmK}t$My1To(TN+8}ZjkPh z?hud$>2B$gkgn%<>dbY|bv;={};kcv`$i(YEsoC)UGFIJ3g1G1}BfQ?Ti&nECOrbDUh`rBvA4@(1& z$%ai`Ry!yGwF3IguTFQIs53y_VGc7Lhm6Sd3Q6aND1)>-MO042GOp*Z&~1;P)# z@mACy78(^VZ+_-4dAh+0lBrz*?Rk3%8iOL&28@vdd=>O8Ay^0zkx9~&iV#~RTMn5| zfPq8a>goYd$iK(Af2;tZ6XZM2+biE^MMBwd{@pJq6wPS-yI(kJgVSzgj>lU1px;pX zLwc3^saWfOO?$Z$ld zFc0h(<0EA_`4LNLCmLm6HsM^hOoj#-Znnq0JY0h;2RV#E=RrK7o3S8UtI;7xEba!9 zEJpCyuDzcF$F>dZ#xEA^rGdnIdOH0if$|&4#ax@$k-By1E3QWA>9UBsbM;o{-4QVk zGRwZt(Oq{QYq!^DG2Gm!BkG&u2TJc<)^6J#xJ2M;te4k7x&8HPX_4Y-s~sup+w%yo zeG%z&#RfZ4wJV@d8bna4H-hCmpkP%PF)wcs*gR!^sP$G zxybK$UH$?17R-al2<7nm`2rdg1Oh-Lc#2WW!9OALGmh!|9QKbJ@i#qLj1chyW;CQFec#Qo8y$E-6sFtbA%-mz%Q-qQH z+xRM@MUTWz@^ph!^O@6U+}9K#XT9K_fDFw;4-eH-yt&f)OWN7E#`N;c_kQw5KZ2b> zMsdB+4f*B(}!OtsAck90gXB`#25#Zu&)X5u(4mO zdHx970CiW1$}s`0I=9#?EqT(aeq=~~9L9{FU{#R)TAcFdP4eO2MgV%!PDO2Aoi~R~ z32i%9S6iGaq{3mlU>P3dyF|gqHQGxY8#DAp@E-$Gh;q4B9Cj&)q5IUuLPAuj&COto ziGq4dOF@ANXz2pB5mZf-l$4-1UR7&jAPc_!F|=Jrhe`z0Rsm}etTX78H@|x|Rj}9& z_XT}I?-g)b)2J2aoRD=n0QrGJ>W*s@%_lswH-eAQl-_d~clQZGujVHu*_$SHKZhiu zGS|7AwU#My^x!?ulW{S9LJqNj$JCS-q#Fe}3t~d>(adDKJrJkh(1r^S#M@-O_;&`N ztO3o$-2)E-OtBlQrBoAheRb99>%V#iGljPL^4MKmeq7E23}x$qXzl%k2*NFYxtn`+=t+j6QE$pdxg)nXB)0 zL?@b-%1~CzW9i@&>+cPgcOre}gJ}HX2`$K)!cxBQSar1W%u1UJoVp+Sbw~hqb5=gu zo9>feOhSS(n4JQMjVw7m6;*IV#06N407xwf37R4Ih8;iR5a`KAsjwCNr11NvMnSKy z^K6VvNr52$CDt?ahn>W93++=NGj#8}Al_n9kV0g;!9ycx$iD@^;6F};`AeQfRb?Wz zI6f*9PtTZ+dc|~=|Dp&a$ip8I^8=ib+B93f=*)f61WAfexp{nQ9!ulI`a;7Z=!PDj zw_1;6yje{77K8Rgn8REP6d{R;+sb;jwzj{fnEZ)DY$qOx!RiINhK_FyVepYV*jG|&Xf zF@`ltyI@6OSpNE~4;Uy7uP>=ro&%js82bC;1=IzaFL3Xke}VfKVvuMvQ*s4h|M9Ug zA0HoJ*?`V)KA3}Bg&OevZ%Fs=TP{X2`GG7C)Fs2y4d4Qwp&a4>*uy@boh#l7f8qf`GZC(J0!!!b`wd+SpyI$ie z>poj$bI8jI3oA$LLb>>1`s8_;GzcaAzAC^vP2PWzVokpJE+`D-a{QI3R4e9-bR-*E z00?k>C`ob5id)cjflwxSP~5@G5`;{#XR^5t8b@xGI%~JqY^8(J+0)~BrYj= z<`-liu!We04I>12K6Jbn*Y zk%f{V?+80ZBa=GbLC)n>{1PTxPk?*y`gXvhqTujwuMMY-|2jYJX&PZHy}iHThY$k{ zSzF+y=gkGG7HH&I?2iB)6zg!9gU&aW|2i{nLfAADsAARbEA5pic()DDO%08PTYwaa zM+Ml5HqWnZ_t%@fQ7r)fblQ~2Gw}dIWN)t(ld;e-+~^^Hpi{~lLZ5JeRlAjG4Q0EI z&C6!HKHQ!j!y%EiUGFx7rH7yoSZ_zF>`?u1Ypi{7XqhkJ;y#$zs=&I#&V4NKy{qdO zhzOS#Z5P4kEPx|TLPKep%haNsQ*ofUcbL%v5(ZGVzI#PUPE6D$`z)(uM(0bF;=Fn7 zcb>*<8cFGQIwnpJ=plOxc3N6Xfb3PK+<|-YS65egfc&$;eU3saACY^AjWxA->vG(k z#b4n8n$HrsULc#>FEzoDT@0m%4jT+D#K2hh^O?!alf=PB8%;vVJ#mP2Bo8Lek{@pg zjD;5&+j##a7pLIWPO_NF&d!m-y@Xx95l71a^Afay`e9>K$P8G@a2V!Z*B4#W* zXqudEU4W6SPXz@w&ru84=B-iP&u7nXZ)>WDfZP#|r``Zcn{zniQP;UNCk!kB^Up4u zkJU2drb^vBcg9r4*e|w}HG#ed1_p@__`=`2R=b>%?axF>SQlQ%FXn9Z{^BQy!WX#F zTU#(4mqpp0L^(4X1&{JLzw_J`z%VqyU+S{*Y9}!)^f$!DUR8`gv^}^ToFDN0Kq9B3 zvjXCeg$oE)U^K9%CRdegm=HJ6kAHy1BWE+qT|~`tHB%);CK+5gDnGR(jr0Cu)t%ri zWYnz??CXQ8{LHHWob1UuQ2ZQTc_?5j;9%Bx5jh4W+K7u-%j}~#t5Mm55m)RcJpyv? zf=Bp|@gK7xEYQe2UMR`7QqooUrtCIbnO|!qsW&9(7}FwZl8csP48yvIzmko6B3m0i z$jGlgM4EC_5l58Y!-}{JlbiH&q{X>`U{4|yAWUDr*l<0>Ut95hU91CUmu=WMwtw#7 z-~iU*E=nOC%(1*UEXx=KM?h%RwO+DUPJ^`c!}iEP4(|1*Y7Sk#M~;jfD21PX8fTqV z-vncNAr-iPGDM0YM+HO=?4((5WZ49#=^dbDK*;ZSi-ku^X4DQ;HI1O6LaQ-*41CpU zda~iPw|E=gS_d-aSe7&#u_s*(1%;L@aPuk+(aL4(a?DRqtm0xZ^q;IEk`IG5B6zP} znVO4NNu=_#p*#+ZA0In>i^zh_l2$#}!9Uu4w#zjEWFJmvDSICW$@;K@e}C32FE}TP z6u*yUD*W}dUClP(q8-?uS(rX5u517qIF<6n=L||2IvL=Y-aWTL0j2Hpdey*%l9Phq z@^c_j<+FhHnJo}9Q^QjHl(3^*$ZV<(p}G4B2}rLMV*g?It6l8oAIAorx0jk0A{@zv z3)SV*^ZWs~1P);VRg|hPXlZN@=<|4Tn?Q6dS4Eem1`E;oIX%IP3*e$e#*Jg(QI(na^ zu#3I7O#qGp=v1^8h=}XJ@jpNBcqRT1zy}$S4+~0K7E{i2_s2onH{ZTlkIq9_x_c6I z7D)WLDp9SPu`@H<1(V>G|9JL4eh81k#7VK#DOz%4Wq*at^5~D8=fF) zfPvVfl{e?F?|~&eTX?MK>)qRYC2wKVX&!{Yl8e^Zm23Anj@%R|kI+uH}kL9|4c>NqgYtCo&(- z$~7x0`0eeLms&MvO4a9qvkDFeLrVwOFI#doMH>I{;5{CSUbW0wl`ECOd;Q0g&uJeo zR(5Non1HFXN?MUUNcT8b1<5H0u1-I?!`j>1W5}h)`XN1&RuA?1_9Wvq+zwk2wrb7; zPRqFw04sq3b5He2tUNshYB3_7%N5002T29iAL8$cne?gP;Mg-WfUb;=jop5p8!zj^ z(cg&v4Q;e=XNg}7mSo57^~@NelA(Pc{&@Bw@&DTMXLjZ|nJ+a%tH=MRo5_+EOv*$@ z-}>!h+H6fXIURm#9`sxOJgTmr7PH&ok-CTS)lESZ%#Vf_qcuoL;Y z_t&R}5UyFs*G~7%O9^@36#uU}ZzPeeu;6{!&Ac9~QkX90|AKxd2d|9`+iv?BcV+cG z*kAQTFYh3(;8#?W_CwF_%zddz-N|K;aWGEtuOz@=M&_nR=zn-Y= zP*+1c&bF6Wd-Q+v|M&+s{?~V)`$SaF0oEH)9#Yv1BK?Dhs&-Yl0WFGwIBIaN0VB}N z{>Dl7;r=Te+@A4pXn${FsoNgZ51j+Vgt#~XfOh4f;!LGsiNIOTF}J$1NLSCIOaB6> z`7m+B1QpQwXrGx+b)C8e0c3Qx&YC<<5dG$YesAP!o5u|nq&@8e&f%{9VtD2L?ULvc z4vtI`yV_PChWrTr;YJ&UJq9#Sf&kE+7=8uFSCmNs=+&=xcR1X44in#b2}~I^#O}3Z#CwDl*B##{O4K0rJyvi=W@3yL?dXxmod5+*cYSyr2^t&oJ6!wiMk7 zBtQW-z{Ri^Gk@3(rssl|)uuNPGB?v`#w!2}bzcHG|eW791z@YMX9lk#E zVn^0qR;v`PgvqtmS`6&YlPMcVyb0JQgKu)W#blna=^Og2aV3N--w!%be)&S?1sYp) z!EnuGe2s=l_K)bgI;?7$wMH!qqYA%$8V$=E8Yn#4YR6ES8M5m&vSjv0G^pw|%2kx> zP6|4$=ciW|*SF7X1Mk6wb;3ZkEl(g0^9w8|@ZDIl{P~Uq745d~=&;&E11)YLIPJ7ezm%EeicChF6 z0iwci_MBRoo1bB6XX+7FXCfL{>FG7Ua(O%nlz&J8hlz;~F#LuTP+X>Q)a29wXt&vx z*lWF4Yia2s41Y1u)NP^u9<)RDW~)3xu#iDLrQfqNS?nPtMWv4A@??n^K&WJ|Gh}si zVn9OaZgMT4932Ya^Kn2u~4p2Y&Pj zH(&3*;~+b@zx<(z?^Z&YHVv+5WTS&-ho!~7j4P*+gf@pKC?bHEbbHjPs|4MO=*g=V zre601NS=~z$k-SV0?htvGwU;#Rm~=>W5RSkG{w+v*lPO8kK6|{quO&OS!)Hupm5$E zBem%aV9)ZE-?tdaK&eUOQx`?TG$LH~@+ts?dSm^B0BE_-==v{(HljPiUdLVu0l=l! z0*ZL|<-T`in7+$u@7wHBY9gHc+!kdjA=CN(_yK1@)uf}zXXn&T2L|Ff1wg^Dr?R>{ z!UqDVAYc3;5k`18USD&f0*w1>9eioYpO{ZRUYm6WI1Z=H)9yW2J=}}@VL0&c;J z0n%*0&D7_!z5YbroI#s+V$Gpfi=#Mg%Ya-DsGTSCK;u)f|GTR&br zt9}nAC!*-HYAerLkoCn*B)&gG^SN894InCsRcbiRlA+8QA{Eb*Ogdpx|4ue+IR4Z> zRwb5)TDjATamO>XP^0Oq!rPy6k&nq6f(ZA+;Bo0p*BN3@b*1P+qvg~9-NWYzuriIl zMGCV%LjFd%2Dz|-CB(H7Ol0ljAz6w9&FSz7aX4sJk*{|XG_287LS@`(&A}4m!29?SEHQUA7UK` z$(kgZ>-jzdI+?&1F`lFM8`_@iyaV!i??CDBbSD|4&J(;>zL1g~U?5^YUwveGqvIz} zjPP6wq}09hV~n|poK7S$^oW23mkOMEiZcan-oB+wcXYhJ(N-*4khW&Emdau4ij(*l znQ<9-*zXz)z>Y|Sd`r*!D>im)IV|;ujRa0nB|t4~i1~@)2Oh8hjKXp6^HvBM7HzUx zO%ZE@+jHW1t+!6m#+gU_=0c&{qUvLh!6et+#j^D1t5IPL_HE*m&~+hII7o0ZWkJDJ z5pv9{TW{W$FxAdvedekgtf)ZePvB&8y}glOTp3|<17>_ga3s}mCmYmQtj`As3q$gM zj0?(|P@86U(2xKOH1t*HY{OB?NZeplXE^ytFCYKtq1Fn>^I*}h#v9PpUr)C%A`lC$~Ar&-TlFv}sSN=d7Jj)DB( zwAf~WUid6+<^Nb9?dpR zdpV6+$Y&B}16!s2A|zMwu$e;P$w9AYZ2Mv6Ofs9YRFL3Rl^x4ISq`QMJ#SJeL`4Lh$FU)aPsWu!?Y&VeHjB( zDj{(yHhbg=z+k=@+SRXn0VS%#D?jM=60o}#lBwf-i;djtnIdDLHr$Ay+@l0jDI^O4 zrQ}0A*V~;S6{=#%5u0Q9Gr+<(AM)-S@PGg~IR-aydT-=&s?TznYK_3m5(WJD;}gC- zUx*y1(U;&sku?*XHfBbn@+OIhgA>u;!0s!bb^CXC2BYCnBI%)rPj3lzH9$?OAT9RV zB)57r=bLPrudn(s!i$Cv{rGP!#bo~2*ZS#q=gX@}(!eGUw-Yc!wx1|x-TnDi6scIb zN4950>~rpK2RPP!{Ag7qMRqk9@j*7u_He;!mUE7XL2O=0t&HN0s3B1*+tv*x&nzWX zltXeN+vn0(+|7aeT@5BLGDRHsMK-_XJdc!0oj+*F60QOKbM}Jf+wd<7(`7#}uY~+p za#xo88*S`msvN-z_Sms;<1p+=_4>`VZ=E3YWUt0BYhwypnhuDRCzQ7HP8aYac%8g+ zZvaVD>&Ul|d`1LA8`0;+d>r?UL}%9v4WUiwTZDN2IEi=QmTjrsmY^=HjLFCDb)YxK zNXsO$DU19uH3eX5UH@)s&6B;aOzU&fdcLHf4jAQB{{+-0c)8P@2nE|thlQMqWtDzp zwVU;s6hsE9Y~o(=84`2bAjUMR7B<NsSZp3a>CW6NuY7+Z-ASEXvU z3lCB%v39}Yjq*A9@E%MjphuP1r)*_lZ~pTdEy>D-a^JwTN5wotb+h3Bl7cCB z|CnjadX71mH^BJg>f}7@th_$R_0vr#DybE3Z4ic%MnTy2UyN&qUpPveV zSv{r?-d+K@S6;+-*mU>k(h;RGK0#H)Z_^OhDs4WV$8e(;Tf&70)+3o zQ*kC^k^>IBLRqp7)ld^gV^(R(OLuGLIh&yJHmuJYgaq*iVa;+PWZ)eGgHP$yS8p|69$Ri*XS?m>Z9(B^EIcVSceWrbzVV(BvDLRZ6uU&X^FW2A z(}XD;Q!I9^@^T{PyZt5>#ZsnJ%upj);ypOPt|>Y!8c(twq~)onrlfR_>!4IqM3{X27?B(M5;>pZ``B+?2CMpfIS$v{{7P&uu>Dh??*CRj}@PWP*b*&6<7fLXt$ zEqNtZnb~pVvZ7WY!8;+UPz)&7cKb78N(8d4RKas&@ljgz>K}c1%sI#m&poaknB4}9 zjlbu^gSA(&DXd6?M51d4dC&=4-yfC}86I$$;xjhtQfjdPxwxlSQ62nE@nXmR2-iw5uVb7(bLL<;7#_9iLO{`#W2JU{QFa!bYJ@kV2TSm~SW&;n zwHna?Ngq*);9K+eKYLsx-tNtGv5(T~tEHbY?6`zz4Z3{9+AcNm1+D*<<8HfqS~ydJ zbcCt$^hJPNKgX%z6A&;y?{XQ%p1TB9ifl*~o@o3nD+UyBaz7M$d6TurI+|V3K}|#9 z3dvr_odCNif-)9lUnU?!qQ44U9Gvp=ieA-6@NY%MQ%E(ucE+OMk#|8gq*S&Z^r{*; zPAc=bZu#UYYlrxR41-%e?v}?&LE#eM`h`{)p8-P&X~(55#?#W{vY$LjlX7s-cFpyT zxv0kBydv^53@YM14B|s$SE8b3tW-DJ)R0<1#yC8Zvp_;L5#SD=bLxvW#aP)f$PFW- zl5z-4=zwYvFT!zoFdYx5e6W;*gx2|5+Lfwjc84J91O~v5P&ep1QDm}aA9h)JYqcah z1CpNd`UK(#o!-xOS2Wugq>N5sMja52Em31;S6dnmV8W9XN?e*1B(de2q2j(2qoj-z zm*MV@BO!{ln4J@(z{P{e5`P&Z#m}KnLSgus_gAOiduHi~5_;{lo5GbZQ4#lfy=r|D zeB55-wvF}MB*U@zkH^M6C(Uxu0vKvW|A=?6oN+66mb)TGO)f2Qi&ia6;CACUWn#<5 zY@17xRJ8T9<#Ah_xc>yNhXWjuCZIy25hGo z(F=WvjXC7JN|%JvGLt>BfTJq}Ask3uvA@|l_NJfOe=h9ZptAPC+I{mRMX~Kp*y~aM zD(`8LdC9>#Z$;5B3m+YuBtoDC0yQ40429M?FC!#ItW%&F^REsg&#m1H9 zD&>aDD-g*7yz{p}vY?7UrHNo5#@&j=o!~D^ij}Y%X}McO{fRudWOD7w^c^GI+_sTg zEOVU^Oc+vM@xC#%20arpu=WPU5cO6TUU!uJHFTgx7LuFW4s|wKxR~f$Z5BKs6PEx6 z(yMd+p&XU{MisKsHH99@AKDma+n-@y$~UC8=uo9NLvPuvhGFBu7V|zj{3!Kw=39={ z)P#!BiZ2lA%-$4&S7?tfa;WhcYM)VB5}Pwj9QszB^^5bL1R645JU0gmLPKX8>rmdH z0KsK0D)k*$X(cS3rk3yaV-M!=(bgk(<44FG*DOFddqIuOmudYT<9RJ5}ov6@I>GHw`<;7CLDD@X?;T8Pt zE^keVT_edbLwN3&i%=QxAlWgfqI)!3f^-~dF(rw<1r_@|Mu-jS7u^59qW1q2#Wg)V zjazdnJ;Oh`<&1|~hwHzow+17T4NE7S8N1yzWIU)s?|p=9o%ol)OBO{U#0qtb9P?Wa z{pWb72D|Nj{*ISYJDA)4hbHbX`dgj#>Lh`Ts8;=Rr^UM>y#MG7ya^&B<0tob0~`)V*2}G6at=BDL)I1; z1vN1QNX~V35Ss@FXap7c!uyBe&K5fz>^3w||Iud;1dzm#03|Te9rn0UTP;NQ0I`RI zX*r=_tIl*BA}5U+OaA*y^3&wb*a3>W4z{DtMVRWK?6AOzbc zTFQBp+M=AAEl8EoGzF+g+g~zIJk`f_Namq2oa!crylG2lp;-`HHhfW)Dw?>Kds4w| z*>9BUODF#>va*|Pn1y7OqR$jn&88$|d?0^vr$$mu7PYRu*&$p*t>G|Wz|v82 z^I=D^7s17{*}@bEoVG+mJL2sG1dt;1jNJUuPw1y1Oz2y-fm&se6HObt4At$X=k(qn z8@d6hg-Iq@QUOSQt$LftcrdLcshh~%=y^xt0-cZQdF>zs#z$uvn{G}4{hQ2ceFO%Z z#I)@tQq4c=5-%)otPBQ1s*wVJ5Lu{%qs3l@aBP_5qi z9(}=ZAeX`w+0*ODOXS<^ zuH@=K^?Mxc52omDiG;Kx^I#oGjB;2Q9yb1x6=>RqypRqHKLkDQ5CTs&_fw;Tu{Q7T}k3IW)+K0;#@(4(%U5exW$z-2s~=BQAVe^LG<5C~kXF-ODf502+Z1)z1VB$XMuE-#Q{Y4W|r4hl!2YnyT1?f{C#<@#t; zR2DWb|GQq`BwfKrudwjA-`|InE`!d-dB-Y*qOOB`T;JjX>6dcj+IfI z(N>1@k)RLP))~wM3wI3Xt&kX|QRPdfuB~@PC)5>*qHC{yu>t6ugS#4=-FjSPB$S*6 zXy<$0`G93U=z{7yJK}=I1G!a|1s!0zz|>Eu9Lq$@X-jDCHF`ED3dhOmYCo*1By6q!GZ#a+*Y>-q0j0wtZ16pIg)>4Si z$hkcyDIyv1n<@H=g=9BHy$A3(9Jktahb|m2qs=a`Cu0`+<`Kgd$OM-@?`ZK==?UEd zXvD0QAwEbD?@Axms+sFxdZSRfJM@T%Bf0vkp|vW~Pd@cdki4Hg`w1Nyq>sMEwETgR z(XD&Wc>2B%`?nYoc~PR-bPYBT5%q|*#A8TN7xK&R=Nw+13^2_am8!FHxH%!&n^lYd zHF>`Wwhn;FdpfE)A)KQgjcOCB1}VE|0}0>3NI$*ub5ymO6a8CmY$n&?W&VjOc8kVnB>dH@D%DH` z6q;-z6Vjke&%3!qHfMJDP#da^*Sle3e+)Y~WVuLg!_&11fM71VWd@Dm9GDMjoU;bo z0GEfnmA_S9$8Xx6SNewsU}sNsY@*qcJ5w4A?7TTxm=im7Drj#<6*I&qGC_i%#{cTM zWnqRhq~|c3NIp?+qdF(nA?<(9`(XyuX9Y^YMpQ@T0*Ni8xMAfyz zTk>*;k{R^bl-DROhnUaakzs~Um{Qj@BnR0SzRWEpZ+WkVKs<}0WA2=(^HEHK3ffdT z_8O}&JF>qkzRrN6i`bKQRU3$l5*uUnAqs<5PgF8oX4B}^bwQZa%3b9Mds=7V@)eep(o$A{JHKfA1`@qFgBR}e=9gOIR6(;Jh<6N*= z6r3&8TKvui^QavLRDS(rBI_U8ZVr*J9ah@G?p!Pp!BR3lhH6BcTF=qUm2<;!rk$ho z<<~SNL!Y@q42yLuMw3pCzFKaXq<%1H@v|Av^8>C;sa0-u?oZi}p+JJYhr68?pIQl~VcBBJrC~}}sQ>nLk@__krcRPj*S+wdD%Ec9Ek)8AZm&#k-*9iua<9YHd7zNTa>XFr#L0|x#=*#s!hgveA zB|AMuMt%*3?nlnE-1%}C)!W#N&4Ht}>hME^YY`_OzG^GejU4p<<1{Y|M|i$;%AtiO zF=bO69kq31vE!P?h|LSAL^4ZV?7ff(%H|WFJF(k8`=j9Ean^!9Ssz#iQl)RU>mosg zTR5&{VsARl0ruWl#1lWyu0G3oA+iU_s4Nb`gY3!Q6h6w)l-*U&3Fo6ikE+99XZHWl zMNh#g%GyI&sPZ2wtiJa9)lT%V!d}!*S)~>kXhFmA;`tRafhhM5NtbrCBhCB634AJ< z*I+4E+!=>-Ois0nzp~iem$A>;HlwuhllAgw`%(zXc0XG6g}t7)cBG;ByDP>nP$~0! z&>1_W>p*Xa!G2uCGMbikA;}s^Td@D1Ev~shm4gAieG*P z$V{V2fh!$hyeO<(9`Q0f)pua)!0jpGQ!;uO=uGc)2p>gB+eI6*O88?qo1&{@MDPL z8U@Byg%qAV97#k(1G5nn4JpvgL)iF9CxY|mY}?=V0|0f6d@1DB1^m*?7`wPJ z|AQ*ac^{B6oYPy3WsBlyoX6KRkPSx-oum_`z;$<31f4!^is7FYpy!CL-nJQA>lCei zmdqWX^rTL9TNH$f-wQ_mwI6G8>X-LX5Hc9DnW)^z23%P-)+}SyMSMsdN z6&`MO08-sP00ssYY$`t#IF+pjjCKXVf*qf|Q-3YZn92ucE*7lke+bb_kJta`rM^M- z3Ht4b`En>(OB4ru?#A&_sQ`L#0)h9kwLela;F3IklOH@7L{UhyWmmNd#7mX*2j1Rz@AjrmS zOJ_;Cn%^H$w>B@ZYm*~MWr?m1OEMSWvys88+fQpcFiP@GH&}V;gy1fwrh;K5qE_@bo31>*&*T5iU`?i@B zS=MOq7*bl_kK-r1wUKb0hx<6FgC7R8_A*o3zUq=^5AIo4YPv54N#5H zWN4Vama)?H#K^-1{Lo~L&e!i)%mKLm;PL`V6@-RTqp~$1lp>%!&Bf=jP;vHY zY})T)KeMW!2yAHl{RO`K+gEF13PPfy02ZmPR_!=Tpu+>} zI)(!YtTx2(E%@eTc8G<~i8PNOX;^mS+2P{H#$SGq(J*3aEdYHHrM&F`=GVul@lu)f zoWZ6VzH5P!qa&wUvfK3d0a)FI{#OV@yaShzH;dVym&GjdlQAcq+=s{XVdbRe5Ul+buyO3L>%Kr zStit69);T$4GyDcS+0MZq5)oCCnPZ&je8EMBmglDt^OjdN=b=d@D_|kTu|_R$oHjo z(V;ng3QCDmcg18#v^1nMhW;yB+94qc>pp?zyHd(_D{FegIaz%3O4u7p1qw)XQVhIn zKfOhn2w2d9$I06JHq}zI=9SrPrI;;L0=ZHWbfiry&$kDsjz049nPmDMfo@G`7@k`3 zlKs_~!Vn(~xX>bK# zRTsZ94Y=#d{3T;O+%J~p51?uJe8>u~T=cEB2hSqGkN~h?`Td1Bi~*=je=x^)LV$*8 z=`{I^b5?Ar8-#3@!l}&Gg(hS^wJ2K;?T&dN=OwLC z9KMJg7SM7804Q{B;!OKy<;reu%TCAyI)-W*`{Vob##5!TOiX&>kEXpTmSHy;ue_zwvND*nmk)*WC$@MVw{t z1;As2wXeKiU8`7kz!FbTjnr_qiu&`54uU!j7B;2YdYSK6xyWHp!*Je7bM+xqd(Lwk zLc0BSxrH4CJj@U{p+xvl)!d#O2-&$QONQ4M&ya6N`wWo{r@|Zc&}x8$_Ej|08x+vc zYky3`#33Kx^)%7{yX+&P%C8I%iMZI21xh9(bbx#qdIaYGBenHDy@mB-cv0`oJ^QZB z@VjW))Q=g@lD`?DR*IS1oii!r3(5Q#Df%n-;fr5|Wv$=_N8?#> z(ej<+vXG-jA{3u4sl@Y45sdhdXMDVvoiu!iaEec>5HpK{+u4JkGISDRc)!6_=<$F2 z8bhgr1T9!Vw*iq5LxEwC$WKP*+nbPQ;9Ls(G6>UiFlZ0&24OYx@hA3u)yrK&2aXdEbXTo7DTw$PZ1_< zbzu~H_+au|@<$J9ynybior}lO z*Gy20TP`*CA+u`GKOWs23JJA@;f$o3EiTife#KJsGYEZNDxL27?x*!h8$}3X>6zF4 z_m~#99&oCvP(FXku5#-;L7~~>RyE=;niE0b3LYVkmn~F&cEUURO%F~dno=|NQI9qu zmda73v5iJYbGJi{iXNk}$GMF2wRf(B7PVwrZoPQUGvH8?P;R>GZp86%X;{Smc|Cdh z?Q$z!T|*~0fahpAKPOPPyd+WkFx`ft*k?y;K&P>L-oqnxdDzrB751ap{HjQ<*Uci4 z!VZ~yg-{`Z-j`AQdfjnaGk+5!7bGGYld!4|n4OhWcost^9C+I)aBnsdvTe$RUd&|3 z%JYYDMoYdwQ*V%nt8Hue5tqgbuSht}z@MUkV0aM4)aW!JED*GXVSNAJZy25z@~4n>mtnB21dk>zG%pa*R9gUod)w+&Jt zr5ZQatg;RSI(r%wkrd7Lih(!@&K55BPfpjxO3f50j>pql-+)J1h^zha)E|i)%;_oS z#>CvznAn1jc`ND8!~IWX9G1pe^Hnh|&gMZECZh%FE0zz+6BM@#4Qo5&F$k!KtI|KV zPZV<_FJ|7z`e948^B2$|`7#cC$IPjrX$;m?ZOuuqoZiXEQzLun@5aIbv(;)~3FCRL zUN?2DRGN%Ou-s^=p3*=XcFugAIUPc(^!hZU0aYU9tz2FN6wH=#St^^&O5vO;8zr2n zstWPPQycD{wuie0>?DdiWxwPc9>)K8+!f$)7i%gv+ByokneQPZgFdFKlq$CD+ zrW`g0Jsqd@$8vNT7#3i5MzKf3U z*w}VnoMfl9{PiuQCp7vjIRq&2S$s%ZJqd$@J96RsjQZUz33PXAu?@BOfiX;Y+|3v5 z9~bMawa4ZQy9Ru$j6wP8uwe0$>q za|Q77fx#>mYf&Kom@ z<$}kl5p#DU{Y!Ax?#&+deej~a>JiAl$ZEFV7M0?=noI!S!Q)_34tBJ;IiT+NFN8nFsE|9BHjiV%@w~9u%=c91?Xdh^x4xS7 zRu0z=*vqIeoM?iiCHzCH8p{(UnYeJwC{Le)qF|W; z7H8TPB$opm&$$}8HxM%}_HBL2=P2;EOYfHGF~bs!FT!Udn79bcw;zngJ%x91LE0K} zd;eTd984iQ-yo)jTotCbOQo_o++DkX4{SK7<u9Ea6ifAWv_$ z>A`dQL80{%AOGE@Lz|~2aQaukqw2K-s99jc>v~6Av$6W>_Egz$z{7Y|8x5ft#MQDD3Q5P$<~X4@FK_G=hMKjmN7(Ha2PmmE0H{C=I>-c2xDCYt^`zo*lsx6P_WroLf#Ij_c2>%vla^0$y#pMwYZH-A~!n$+pNsJ?v8(AQPAF?l_$X@*9%_cyCt`) zi)9{}r)G22QHQ}jEr)Yw_2mNx#hqZm8s9!MwR!xUEVmpyQS<@NwMl}O;+|BodQ2?+ zWbGU2yNu1Itj6Pj=D)4-aMbeMwf9os*=L=X3W_&5^YiPu1hPM=ra;@$x0KL><7ket zwcq`q#!-%S=W5yAUWWT*yZbAJ1}le0<8;_?!mHhc!F29tcw{=i)U^+OI)+AL#Z)uj zfNd1uOzz?XJ{RK!fB6e>Nrn_wdbz0lth;Tsk7(;|rQ)%oncU9r>B1@&snb-Az&C4hLFDfVK``qu=G&U?|PfX0rDpk^sUvsCF_VGMi z$gF{veJ*+tdYS!qA zC;f3%q2z&JLK$LY)ATs!0>|josO7h+!b<)Bva(~u)V)Q1K^79*qm^-w>#hO!Y?v+A zq{HBc9*?uhnz55;aK1pc0;Ug)2=RQfy=q**#{+j<%VRnz`%1{rDU8j7jb3N`i7008fSfF1rXU%b1g4tm|BFB``7r^ut%M7lnSpx)Mye`HUh{ z9mI5}7g5E%$tPvhHs(I;I>R~9fpzvCox_r2o{L$ z5`Pvf7P@}YpI$+fCH)L81F=TKetN7aa*4I%pb<;R&8wum?1~X_5)F+F0qT>I%1|^FD;M`=#%qR(J;1(JoBVcT%rB@h!M5;B@Fzk%)^(U>`Ed%>*@Rkm z0(%$N&Igm9%~$2LB{Bicz?6PD<|@RfIp9RJH!N|5wl|mzCPITfww9x7N=fOz7#A@g zD2bXvG7H}b0Z$zqY}e>ysc+j*%Gq3zt-(Dj;qgL(Y?vR@%WF>-xTrnZOH`g_bR4&V zz8E)}L3y5n9^y}2q5m8EDViXU`_(7TlQmtY$MA2_)9~ZX<&Q$D9{spiIUOzV!(4f8 zi`(u=nVx;O`>?V)Fs>`jW8q*__Bf37z7~wvQN@y){{oT7i_`$(~5eJ)$~~cA1m~H!fc&3l~Yg z+ilgV)to{4tAjONukXvvMd|_``{8wctaQ@578od4S)XDyQ<*ZFK`yWQiZ zqpf7jmR^XX&ZI~$EN;Q6EGAG!9+LnYmmO`@}Y>o;|z6NaGRnqp#T z)M27Mo^zCrS;ZW@U*_kXpTyBab78cvGqh?q9maQJUkaG9#+R}0GjENJ)p9TQb$eDJ zrPxScRjz*caB+V*u*ewK=2YfUtb#I$YNgZh8uNaXMB?$sw6NzR!shaUW=R*@ zxJ&)mEsl0)atfbW8s{4XB`3}6i;o}gA8(22$cJKfOoXItEst(?h@=#|is)v7ggsU6 z&3yGrY;9{I1ikKckIq{M#h%ix81yJpd3oU>`%x6*^=?d~O6qh1^OG=)|7v~l(zIF9 z_L&OI1@12oD3A9)+;Ls&3`w=eT}bP1y8#HpQpU29A?|4jACV& z5q8&9@T3nv{kJ`oeLkkS>;Q)vpM6c`_`@fQUGRWW9TdyT0qSJ#ESKS8s6CWGswLpZ{@*fZr3Eb3^-P$e;`%Mwowabiy zs88%5%}HdTI@es3Pl?)Sh9tz3Uw!m_;EWc z-!zAg`k`&{=21_Cv?(M-<*SZz>7dus_=T%(u@TJ8rOX>vL%6IyRfk)qIz`j16wp$w zdgsFH4J_M<#);D~L6e=q?cnjPi^&9RgkET9#2L~uS^6|BPh^kcoC}jpsk9FTJ0>8! zA|`OSI=?f|;xsmtN#wp?m=rqxqm+NGa0e)AsuOVkcx z{ruZDYT8>Db?jGXlk*%j-3I<(Pz1X%HOhLL5Yo5(2UTia`YVwN~=(#M% zzdC3AwCN)m>KZC_F^)HN_J^v@wN(UHcPi-xga(jNY%93inMG>msB5s5c;(aB9AmR> zbC6Oh1Z-F zE{hsjr92v5zbSFs>6W9KnyIjz)%tC{TZf2aHLUKM+OF9LXYyaUsU8OE3mO{hJYgK} zeskYvo&AEqHKQp?L)#>6$g;tJs{44iI7}`I7K8K)AO_(?Hs18kOjLYR?Yz$*E z;0KQ>`K3A+Eb!~1$}ZFgtZ*Swn$#)Zl5%yCtH`H(fl~wU9Lft=V(+_(n?_s~!Lkp& z9^!kS#q#xwyGH!&J^oNi8oWE+FR1=(2mI~1HaWfjFGTKATv7wpwlNkO-%X74 ziJEg*Xw*-_E(s-m()7kcOaB88T?>%C#wHSaXQ}V@|AsC9_(*qg-lw~b4IM5HE?3xV zm5XBII{TeqiT|JI;L(Wfs!@&(_6gKE?sk>`4CQBER4fed@8|e=&fdl``v+9&WAXMp zipM+broksDvfOUWdii4e6*c?J7Dwpsb!-x66}aJX6>WXKTcFIdwGdsJ(`EPj17V^S z5uu=<+&1|sw@B$yce0|yY<#JYm-s~Sn%Vz?E{hl8uTY*ycz9ZSQE{hNe6lDhPvFtA zfuv%AsqyuK=UwGcQ!5fYdHz#V9Q%4D5oe_GbG-HU5VZI2ta?EQ6li^9O2{ytJ)h&$ z>Qi4|bTmOi0sTauEPVWKyD>|i79kYzH?#@0bgvOrYOr9et|lirPoM zSDG`FTUnx>zA>oy{Br5c^_~~=HCEEfJXV>egKo?u5bx}+i=-A)TQIt^W7n4ZH-|z10T^6J1b-HCr#g&Pw>VxZewEGQ(66CT>l!=i?E`X zG>n#c+hBgvK$eC^(R6D0wzgZ6Fl%6xYLAk^V^8ae?^a)LF)ab!sC)GSdQeS!JaqyO zx8uqfaj(=*i5p4)Mc%fJ{Q5V}DAIp92DfnAm~muaC3dQolb1;e+mrdD$aNSk{_7io z`~F18vKnidr4(xAOW|Yxylh>$JQaz{lA%_-XE6zHD|UAe$@Nq_CO@5n7;a)hqsY{l z>A#l_3?9rbW0@EXdXI*?zkFZONj?IDrV@uI%QHQRvTz8+Daw!C1u)aj4C6_@>97hX zqll%OpVBTYYr4=<>}@XOJ?qfhRqUjYSt>c)GC<;BhzmJs=&n;u{t!n7Y)sqkW5gXF zF1PnIP+{~0TMWWbbd;JKRcB{Nu1GzUV4*u+m)=aZ6KfdEP=PvV0%#mlFPF5(vr_%~ z#fy49m?1{IG+MQwWp67jLEySNo+}paTle*#{>}aE+2E#D*7`SqC7VGj^u}>1n4Nx~ z+cj>Igy%p~UcQ~(`kU0-*AE}_v94a7b*s4yQjn)sIMw!z~%9)zfYmKYhSlp?(M*?U)h zR$RpR1(R{GLu%^onDnI2T_nL#edyyRyI%2&zRJb8;q^K892f~$^}LH;$pkv&e#laE zn)oL2b^T%QP$!R^#fvB7qN;CeQ-?!7{L)(aRzJuZW%Am)eDeq2a*-1~GaQsU0nDJ% zpS}xz7>kezFb)YE-;9aL38Z?m(90{fn+UDY#3i|3>3x0gcn3 zr%iOO7A$yoNvln%r)&=5zJUU31MqMbv-#`HD+-=$%nC-3F2oI&MXBxF*AG#TEb zSiQAWT)WhJP#vYC4Ku&HjQhmzx!3ycQsqlTv5>famWbS!AMimJArs+BtZ>fPc0Uwj ze_f8-{$9U%aFTC4``$epEW{(m`Vf*hM3w4R>2JW0v917%Rgwq$ScHXzM4c-GeCmLS z59K(Av+X>w_c8Lz55Xz5qDg!2CU2FA43^sO+gy}virQ0U^{IcG8Ue2u+=hY83f)=6O2o=alCOckbCTY$H zWGc)G=l(&Yh8u-QXiI2ZV~t*2L)#R|TYD*v+(6=ckt_UL@u_5Fhtn>L?%Vuii?fa2Ace+j^4Vq!|k z*g(a+5=yqeHuZe`4$M$f>aK7ut0#^%s4TdL?kX0j`_%jz;!(MveH|ueB%SLs&?u`W zb?DeLk2FKipq8fT&a@F#Ij$#0P#e-ha%t*i6!k^*0;9rJErZo?!?tpnEye_NTHBo& z-ccJBmt>U#%Jug`>oYPB+^UjEhNqlZ>FAURu~+3k9Lc{#N>`=pvTS`P(I+@kOGD3l zaQ2YmC3Au?`nRvwpsPW8WOBkElh>#_M@Q{JVwUgS!*jMGiJ6%+q@+o5Ny0ElOFAWg z>q@O3yJnTikLz_ZnOx;-hD2)j&B?mTgGS6ZwdbiVvUPBB`np}TT0E_HyB}a3mcHGW z>9)ZowOHzyp5{c?rcGAL_=rRfuk?>-tr9*BG5#RlTOVgsT3>LR%fdreF1|#7#B_r} zAxPrJ)3l>dJpd0vCMCvUi}!|?&B`r)raF3T8a}^Phf1D)-sj0qD@k}}x_uJ%MNFPy z$mN9aRvKQT+L}s9)%lVh0<4vX%*_2xCAe=>#&Y@dRg=`O&`cXSXqEX27{4GAkfms7pFueDVE$)dkRF1(U}SxlRZmVNrFp4u@IGRlhlm7&6W&_IeA zQ?$AlxITl>iGKS-iTjhp7PgL@YrD!2DlQwz!&yU2@u54b1uZt;E*UogC$Gyo`|C1pRO5m|$(!v&5-lQ|zU=z&FsI0f3L5jxaK^sxNh>674iqd~ zk>M2ECuS}rB_*K99iZ6p7JC>bJ5UgYV&*5*dwI|5o+h1&ot+&_|A7&D;^N{)wGUk0 z3Jiq@`)#$w9uL%@={ID6+R+L6xR*5|;R-7H#IRvLc{mMN0Zfe3f0*Q^m1$lt_)LZ2 z>Ww`z;l<3uyIETNEe4>QvL+ zZT`l~=8fgUBEOW2d#=wCKaiuPyi#j^^j1%)g5YTngF%Z&JZBVOGz;K3ZY>`(>qdn! z^7{n1?t*Otj5FU4imDSof9~jQrnQ%HKs!}IN%(sM%!KNslia+WxbGt~w$D{e%vCg( zQt#bjV-;Zta>*^;*s%0{qJD+6H$nY@B(uZJ_!i4i99wRySqRhMv~f<>0tCajW`Zzp z=P+E86VtGNftv(#xjl;Wz6fL(Df}>(xvlhc=5BU$lv7zO*$!{=9`S`C2(wRbU(iJYwMgi})dIuSU&0qa;?2n(;k5pLCbXK38+3O&4U7JjRl)|m#If^N2Rm#Da8g8Sm zsO3xgzdfQTZS~Eg{lQ^e-fyO0U5ka!aCtD~Nq-**wJ6babaZ5irM-VYEj5+0*!O2G zp}bDpd=1d&#{$^BAh=Y10k2jBWWO|BdRBdZAS&3p!dtl2LW;`)z$a zpWRR%f3=OMIy5aR-^68O72h(tzZ4*Q`0CcS-F&w?O!N?q$P8iE<`h=FjC76_4VS)) z5V-yk7w8e27)t7X^#kq=I%vM&96{VeJp3>H@$_cf45Dfvu`UaOfygOwu|^i$8)3K- zei*dWS8++e+dnoK?u`I1X z(MsZ&ZDl=n5h9l+goFkuaa&%WGY|0yg5JK9jrl$kx9br1_J;q9X(dl<*Wm)gcC<#v z)w*BQD$?CY?>y6~{-~I$YDdkKE`q*jGEgjZ+FW+a6^C`CM7(aFM2F<;>rivPl8Bz* zU=RBF%3na2r;UZax>~v2qJnDrsO2Ld4kGH|9;%$?DsxEQc$f@GFjet3mkA^UxJ`D+9yL2M} zm9*_u+{YbS=xC~NT%z9rh6v&AmTXC{p_v1w7siZI<&4v$B|-xK?nU|MmTN)g!p&3H zNAIIaf07sB_i10WbB0;vPo6yabfvb4{Yn$Uy1nqTR9yyw(n%A0t@kPFa8Mu8-vP92 zB5~&y8(x9gup)Ph)Q3u~B}=WALkhIg077UyJi7IlAn80|dA0&g8PvYra?~VM%IjmG zXz{s-fklZ?#bMz%OeE~mgu}w)t)JO4B?=NwCmoz*;Jz`I=hae zx7%HqB_+nq(%*;Qqx*RE5?)C`f$`hV7t$foZMB*3&Yr8nUJ0L#HP#E9AjQSITAv}G z2YKt(-EqkRqn?drclS0^cCT3O0`&(y?-Bz0roO^#q|hc-(*e=oAITE2cseaC7*x(u zU{1SP*h>&5(|>!_A;fn#U;P%PWKB1m`+s8I19T)l7UhV#N{fyjB{5!4GJ2f^lvV!i zN#pPMp$-B8O*w{Va#bL(qqj=)Cc8*lMx>?>QN*UE}5_qJ!1KZV^b?=9ssQha+B}p9V{mJL~ ziP73uV#^rAU&$_$-dnh?N`HC(xPXsI zMDZwMzH_3{h*Vb+shP6E#lK1Fc12U7_H4x)PClB2dpnU!KJ>;{*qQ?}t2-r?vNs zJI6%+ot>SNlas~8#Y00w&=|JYnS94R- z*@stJ&In~9A(`{m7x_ysRo(f+(EB3?fVr(G*%Dq(>57hwym9?HY0eq%c7}^MB`2`} z5~;d-;QOCQ)g6oA8kHXVdri&F`T6+-%tjBPsYyzg+WFdQLfNlqNIm_){`QB!6@tI; zz~5SHY7~IMpTa>KR#D9n;o;Zu@F2TX92SOMb;WC+nNn9t0roZ~!-|MTzhEK4+fe0;c_Ha-n5YS+#bSX6yPVs6CTrOyv` zzJ%RmPB({v;Q$A1{rI&pm$;Bql?|+|*{#9Y#&5@aeRtL`2w#p64=7zKU4VXXMzf(J z#8--s`m!TL<7MK0Oc(h6f#Zt8N>+Audfg8uyq7CEO@=>|DqdGoCku>JBy0c88Z>eg=We?VrA zve1MZm!!qPd9E`Ts9TE=0i>8e-!cL4JDOo)1iJfQu#@GD*W-aSgyllv`u>78LxbGb*q(( z;NBf`ZWcC|o#+oAkdy48)5`N|53?qLww5@zKCSqvMR1&8M3Twh9J{6nn7Js&I%IM9 z{e1oPgE*DBr#mxO<2D_7N@M zO5@QJug~9$4P;E&4pHC@DHcMlUBxDLAn7$- z(>ZKq?OTva5wCPA&|91QDW7plzSBXb7*HN1bDW%l1}+}U@$bak91Tta1}?6i@9C*F zDvs8oi1KVgnLXt4Xb|1@WZcT=+I^RaGlYv>q`7E^vIp2j*u_CV^kv5*Sw~bl=i5e4nUho^3#YT{EWgYJ38{yeE z`B>Z(wgY$;NVMIex_`fQnbnkc@e44qlUNXMq|$$its16sfw|DJ%yW}ju^=pj#pG=c&nb1x?S&I}>&4CmnkfnW zjfz*~J(xxqaWhl2NY{B+)J5wlQ$9tG4o{L^2k+6U@g9I=*YI3{tOBrzg~||j6@*Hn zfpZ`vFnNyx0N!j2+8Jq}x1!umRkUWeZ>Fu<2RP-;2Bb4#I&#F`SpglzS?9%}k`2#` zzO%O9RnYf19_cK;#e1wBMRr7EfVC#_669Qxe=We^-g34 zzGg8!-ug{aL-72?(G$cBbw)n8_;p^g;%)M2Ucg7id14qQwA1qA$|hfi%w=16)-8O_ z_Eq6kL6F})q}q>BGH&YR9+;VmQUQ*C_ktFB#TN*~|1ARU0zU0^equ5tD#}}Ve&*JP zc~4|;cyrfQnh>^n$q>O~B1}PNP;uKY?XA^mNiWULkhEj4Az07si0{7$WL}+X;_I&zyK_0t( zNb?PQR$u=?+AlUEMV*NyFKvMd)?RSe9_op{V0#Uc_eS#YL@|8e+ya^luDRN1^D}v1 z3s&!@DZspr;^$q$l`H(c$rAM~WCYtW+;oWk4(9APyVDXG%2H&jEljuaD*8SukmYEy zHy3k2dXo$oEht!uETM$rsVM(laFgO|Oeyuefmbuz$G5vBUMDC4ZJ{E?7kF zAr8#;=9(a8?B0>MrNi?%|2XZqZ1yTH;Yl)x9bjR$-?cD1xE^hiG+rqYDLMSU5K|oOuVmHpROwW#D8mz3eIz_A=8nzgiE1R?2T;g!%zKq@yy1r za;i%P^iQFn^ohN_=wi!D6NL@GQ5u&j4U9d&p42%TiG`xOoZ?#%>Z4B>j0&FC%L7-+ zS&K`uv0FwqCuNt9*ynhqmUFx^fvZI1&o-5mjgw5lvEX24E`fyObQLwz60@@=&q6hP zqSN~~(Q9MCW{>;DMdF*_&>|1w4qDau!npO)^i@?jdxx7j?J(fH;XsSKF?1^E&kh{} zKTh|;9d{gGPiuFYK0*eiwfPuF)yT@Iw_!WC=jJ9_Zp>_5yR>0wk3LhE!KA+!*z?Zs z*wWQBUu;8gj1C|VZsUc9UX8QJb%q(=;kE8 z8%Cx8)4nNYfNo)*9>QX-{U(y7w9{zTEt}VKy`i+J(g5kwSnqQkABeB6_EcreCeK~X z);TpoDA&-?nNjFd_nD`r%=HY9VQjrw0`SD0zNybQs~xhYWb%A+**uyu-lC5ZJeE=* z>x#lmb1D1{$?RqWBtx694&o1$3R7D**mxbSWFTRG<+#6n@GgnF=1nA8LM1i#Hxwk6 zqY-uV(~mO)hplhHbSZo138c2J_8<_4i{@ohSvk(F!i{F;m}S-~-t&en#YGVFRmMn19IQ2G z^Z=ZCd?c!=Nps>py&I=KxbeeETIca>Aet+^7>r*;z{yP~^UG8P2g&_#A%D;4kq*Ud z2GKD|k6G^9M-3!CPsWBwnwg0?XqS2*EqDYjYbpC|Wb(59xdf3AX_vh@onx`#6IDtZ zhnLg#rhs1Ai#V}B!|>-f{L9AXZCQ@)UyQ}J>A|Bii(1<;njviUTn7bQ0DBwDY)peo zeZRlA%)Y!#w|DmYd;Mfj>uBR{omiO@mfG0`BZp1vLq|pDuUbf7OiHa(WWOOrhI>;a zN2!xQv#Ro&z;e0tKa42~{oCcfml_e_Onqh{65{jsE5E-xVBa>87*s6Z^G~cNyJJqf zq;_*#GKyA03ZRx#ghVA<9cqCg!J2rnO^Dmc=10DvP=s0FONar|iHXSf<}(nQOG+6A zfrgaz&=%?k)HQ6>qcq*xMT=Xo-P%D;J(7QygP*PrEfWfiW50Mgi*jaaaf+1J1LiVj z35Jq;2~8}%uKmq43?Pk1vVCf$PdzIh5KdAHIyzSb&uXXO8WnMlrQZ}153$YZr&P1D zvc|hPS|25yIJ9X!6F~5A#}pE7I!MpTYU(Rc1e~{iu^F_W_&t?<^yO*kx+W>afG8*y z`xsUJXI0zg&|g8d(68LomC{QGK;i4`st0%3SuK5Y(b;d6OEskDMW5}9`u|e0gP6^> zD(8smj7sgzqoTIM&o~u`59e`hG1fdEFaLZBa7agtF=NfnELEOt`(WpZZ*{nA7T>QC z2j@upkB6nOwsQ2MJ8TJ#owlFC)M`%~dkm5_<&GsQ@EL~(5ScV3BcnAWix8OVLSqMj z$V_5E@yVnT{v-B;8$B!YGxL9(aS#AM%foH=Dtw@VrXVUmM15o}c5@9X79l6;-zUqS1C<=G$2s`A9NKe%u64Yx}S2 zW^B}ti`ry-{I_RP>hU^eX5SCQk=Nv(uhIP5!$YCpDb<;-BC zW96B)A`;$8=1FbMh08io!=!KWD>1 zh_SGu;oYR_A=H$2PAIj8#Uj{9)3e0Zjmo8*mzTTpC65SZ&%ncLg|t}HfA9j;)H4oW z_S}M+HKIv&?rU&&ViP*=1@B-x!$q@v@k@;)tHRsb*41hwwjNeS@Vz-`d zDK2L7tIahZDNQ73D`jK2bqK+>;1*n5f|%<&83L>)0)Ew zZ=Av0ry2B>4#VvM=j}Ksn~+Sslj~&F3WA!asHmvsVNRyfar$-m;5OBLT3TB+!p(&~ z83_sWF<9>0OaEOW<_gB@Kgcn_p@CT|y}+SyUS4!RK13}t)i~(YAP^3bRwR%?B$PXE z=RpcUG!Y&ez)0Zj&K!|-9!y1-DBA`y zaWzsAKcF>#+b^655`=F1i-W?m14&L{`Ff4r$SgoGRNhgUCl~&%%nKVSUJVrrBquo2 zu|5+rOV%tB9o?18mo{^XFG#kp+S(j`MV6)pfC(D%zATnkM#wN3`dE<+$-hHh9;KI$ z9`H3#-oGy{^f?AqQnS<+JpWB_fGKXz0jr?m zHtv0!rE$D5V7zeQ$}G9LR<^xHVYz92aI(|b0bp-e38pjRAjjsi(Lsm%yscRS+9{xh zIj)W~6nG-p74Hgx33Ut%_e<*?5Mx6h;6AM~<-29|z(+zBbw)!Np;hIUKqZ?q^2JML zd!bLr4q5GmdeIJMsgfdG)@q;-w}<6;r#@${oyU0!;PNgB9)MvWa#qQS6m0|ZxxS9K zz+M@gjo1Og3jV)pv@&0dypW6dxAffkhE&19KYsjp_3BE^3@n%|-s?>nP=A^3dbl_r zj&oLV*{a<7KT!lAR2?0r+Bx#%N5nrm#zNT-cvyhS;My*aEaldJ%+h2xUL8-H?*bBv z)73bg3iUjjIROFRd!laO-9deG>fKi0=NAl408MKb2m$j^Ll-f)m?1zbSpF!5P9Z~V z#>Go<6(<@cneeGhmeWT#9QRghqfwP`77fWCaim;Drnq+d$tK6xEA;w9M?& z*62feiFeCgk=}j_1i{J4LCWXndzk7sBdD&%IlrONkExvm0Hed&g-DBc^%Q0maOHr4 zvWYXBr*f4avG5yFp8 zPbB5!f&(7@cI~qZfeiH%a^o!_MtEY4>(kut++H0uQqX^X-gN-f@>1%WLHXc4)V2Ex zOO35s@6ft447rqnT(W(d()^;3vSkMywIh}{@a_fQ>0#?QSK?GMx3WVfPq1?1kYCD&H0HAjq zkJg7yDC5+FLflvuQ@woVxz6O)Kzf6W17ro=!&DLRrb~_yR>&gY1MlHeC8^jLia$Md zh?8trGGYoXU;*sB7msBAFBU%xe3KMK1LMUbsm@~%{?MXIa^qPFomiON^M~=X>St%J z(f)gt6#j#0!GF3+RJW<4XA+$0*xCCH^7Rc2dXJK9Xdr+s$;mowUHci2h^F#S|Aqq; zA#>1tJy#^Br|D#?IC*$no=+HYDk99-Y*l~xkL&JHRY#lsET%Dd zI9$rfsI8~@hz8VL%DjK8vuhq`h{46J?;{=;;Kx5zpC~u*!2D`QThGx0S-d;2njQHt zC@9@hD}HD0UVsb`0zpDTVqP?O837N<_x85L8*sFo&qqf`Pfbm|&+d@HViTc!{BMKe z{nM%>ARqu68(VQlbHuk)7=BS!1Yl2zD7v7aAh5nax3YN7&RjYVYj<+LQ`vl}C@vup z9uD22#;vTa0bD0IQ9*n}{JnR+DfC0S47P#(f80zKZ^ezP! z|LJw|eVarxyZX910Oqn`!sCe(m{h%na%ph5U zOn;m|@EL`^j)sCz@uj}j7kKpOk*;pyuvz=5^Jg1$TfV>2)fvwJfBph5m5W)?;Kam) zV>cB%l7p(|xtXVTmA^qXNS9nQS^pGQ`_3VUjM9()H?)wl3Ryb*9$ z4F@8LT)PMk z?he3w*RR*c+rXPq)=pXd!+{rNyZ$1Gh9)`R=O4T13+L)U5+Wycb#>@LJsE+NQoaup zHXJZO9rkUq;PYqjjy+5H|7#!hVIQlj{v|=y;h?c^k3&2GPJClyBQSiJn8N96AJK** z5D3WB{$qh|!Dft|-&9p88%_YlA}^19dZeb_L`4}I7z~&c?(FQ;)YO1T&Qrp0bm*=o z_YWCB-rYk6bRkGEgnXi+r{@Bxvqt_(V*oiZ48zv;oiwRd=(6eWh2p!1#1yH%z~aoz z3{sD=P{JGU+_tuP^vE+N$=b>aGSdQDq$u|A`tZ{Kc~6~GUP&oY(c3PtA6Qm#((tSX zCMGmhOFkB)badH3jO;G>vn8pFAU^MmaDZSyK>-SGXh<`v8TaHpyJ?}3!25)zgoFfX z2ke^Hko?LOgy0Q%d5C($ww&XC{yeSr=gYvr=C(E-=PeUBhH%TN)3`FW^&{~i|6}Z$ z>nUCLwI2R`&r9cEVX@exQxpzoX+iBAD}hv9y1+R2@xzC&U%xiQl|d77Sk&qO$P~hV z$o3%>I`X=W1#8M@3#$ilV6eZxn1sYcbS`|r`~qSX8X8IP#QRM^zqWh|ZFn!>C;aN> z&rQ+^#2o5=;9ggX40J4p=4PhC!5iW0Gwpqfn`aI7w-)c;zt61k=REN(^1<30`GU)~ zv9Tc>grA(8%>G;L+?EFffSsKk^eI^WON2V1bLe<*=0-k4<1*)y2V7NRr>IG=e?39g^!X9 z*m*z!Gv3=?rjLd1Yn3~!uKcX6^}{5AZYo=ggZmqE){_m_l%_vDsRaWgjo=y1(kKF= zds_mx##Bc2u7-I9v(v`22qxFPjo~tT2}s~!O3TQ|h>OQ?*rpQ-IjQ7mSG2{kllFv@ zLO+y4`w_>D&lSKBz3uMn_EE;1YUX2PoxbJ}G-sr8+| zI0a)UGo6lhp=rc0s9a-kpm?aEztt?Gk`dQ@;B$CMm5XjUdw_y!H+Ep>Ji))xH3 zJ3ZlX^i>D)R^-xg#cqdA3r3SuQ!vR=1{;rFd+5^>uRaB7Nl6+YEYCqhgZ2=fy;Sk$ zO6!@n&C+K3QCA9)JAbSu${j!Cc|kuht%mvi;}a9xi-UM4=gb>w-}FId8C77LR~5Hr z1O9`ed=jlj;fIeOVdJ{f z6zs}e2R=WiFJGximWV1($m>=B2-8qc4_s`yWF5z;2+N6YyGE3MybTmA3@o;b9%IM= zV0|5|+isFFoItP6PIli=ST?a-T>)9DNoKzM(HnXx3 zVC+HqCbBQZ<>*vtr`tntlL4uW5gM)BP9x1yn>l#%w6rv+f+(|FjB(q8s+;fvgm^6K z4D4Z^je|~*@LytAa|T{VmH-r0Vq&7V_c>f1)}>U?GTryPCsex?`q9zQ-eM&Y;Ii?; zi2!Fx>8<0hAGw_NOI)_|im?2{xK%%u{U_=}ij4b~{7BqhZ)Ibju8ozZm9nhRagAUYw&`By4pLNe57Y}G zGwPT74M2fizI-{a|ASaKopyO@eVFscY%Y*>BUmoB`QTD3cW0<9!`8^}fNH6Kbt^n3 zh6BzC9C5XCZJ2~?xBW!L#6nflQqa6L6elJd!$A_~MysmIvo(sOc}D@w?C)^chf0tn zXb&R)3*@cTe%WnfR<7}2HYudr{?aS&SU4xAm-j_@&D-bx!4rG5gTxzS!NG{$G%KC^ zxUpfA(1hW++HZ&`Fdscyn`(Za{StSu$XrHDjA3SSdU{0e3;d^2Fxm>i<=mIS(B~NX zkbEOBeEKp_33KsxF?#y? zwo601JF64#vqi~hGzwdGSnYrRgvU$pR#ChG3;jbhJHWt%heg?JeGokWitQc|9QJPP z&P9atQprCo8XwZ4se)@585-IFUM`#--78>3{XsUtw}7Jo{$g}=W3A%5?9l)8;m%zG z?Rkmxf5ux?l+@JCEiIq>O;%S|!Px@(WsDypa%axLM6TiFz}!db8~Ys{Ji`xzXJmH zojZ@P>+0(K{r!PHUHU^bb>WXEDvR{9_|A=4m2{h`;quJ*xq|1r4}Pl*cLX;#cRa7v z1=)sl8Wxtq&!25htv&qETCalxlFNv^_|75s|L#AzjG9Z0XHocQ-yLy$HOOC`qD9Hk z11CyP4>lcX(cz3hHtDi$(CH7Lpq%xDr4%HVPU-q-@%7s`_)9DvK>Tmt>5_uLKvMEm z`Hj=1eG;H5uBjQ9**e`4okV<6@rC>iEPv!eio!xdSmmHc2b$7Towh`~z}@bth(M&1m25L~o*i>+V%adCvPtv60sfj2<_1+M^% z4vLY0L02%9`j1@37Y-=;?PVIn`8!v4LhFG~9^^yd?=`AeXZUxDCK(`_z zzj0v`c{|B^a)_jsas7S*MZ6(rl$XROr$zd&3JVB0SETFWr?#)5QD0k0&2RWB_iu}i z?=^R!=i^(E-@lTGg8UVhzdUAfaTrDfktAvYRwLgN%Cp3_Sa7_eqi+!qELgBPP&q5s z*mxN!w2=P(z8uODH;N#|Nz}EA7_jgXy?`bFH&y_!246;>o|+on*7mmQgW-1rIO~^A zzr=^*;f#sW@#@rl6cq(Bq<4Gmxx2S0uLxBq(LHu~FHT8G`MT(R_O)|(9|;s=b%}q6 zi7(GuET4HNEvu;b=FJ(azxWa3_hhO~ z44RwwLM@ew4iNl)lOtavo`3cC5V83ynjyrv=>AjAK9#fUYPba3OUK{-_HDH4ii;i` z-cDTRnwpw+b}*5|P(Ul5L)=D$5l|${v1)}I$P=2H_TwAWj6wmN#qOG=nEOUYHo27B zaa7f>RB4k5;94&MdQ#NpuY7Igr7{{iy8e%lprF=<27vNygPz5hz16JI`S*Huv&TuN z?AZ@OKnQrBtV&ATHL1`m`IUP{?$8;;YuJO1?NF! zY7RTHYg+Jv#T5=alRzqk_LB!@{7W0VbIdb#FbqE^5e)dZ^rR-Gt~f$Y$H|FZ{FXTQS+RncOjy|BOP5_$cu=~FH@olb42%4s;L?ip0%_eCr^tB_Ch-G)@Ee1{9 zi=7GtN54@T&a@>XJ16D5LO$j6DPhZzdQ*;Mj$Pb+e{cyn0bBDu&w-2LIwgp>u)A{*zVM5EkYSai3niPrb}DNglqlQ8DDw}&-Gi_%2%kAjrDmo;;DZRGP1Z@- z)egXt>XSDabqN4;r_tK`4!sH23ZW|$NDG&1X)3TT*E*Qm^;+UNM;2Iw*`XGb9S}>W zU8=(O%ajqhe<9#d5{F~fVSS}Ub2(dW{Zsm@oH)wsXF^2lfl7{pbB~;SU~#LZMKXc> z>{0^)HvO)|zc<~Z3``&=XBkw_{grS_j1vvfn}yu#s z-JW{<^&i2B<~&@1TBvK;#EBWq7OtiOejlpFP!G)8mpAJvn{L*hJ4R`Rny~|v((sEVRu-2+T z?YAI;CT%B(rl>DqF0GCS_CqTlS-9Uk`UAATl+T zMnb=I0=)S1Cz6N#lpsFl%&1xndNA4 zrU>{&>bSd({ngGzVsX}%An6CPNRHc8Gn~8%S}{H!t+XfPE^Rz)?y}h=f&n$wz^6d6 zVEb$rI`x~OlFnh$AyH|bma@-VW>dZRZx?S7%Q=24^xkgEwQTVyAd+(U(!b;~&rc zj?2o*$`^yk$kdeR)-AEm3gqJAj68>o&d-|8RZZ1$Pj4^e+q_l1L27`&RSLel@}LZA zI3SB3AwD%b`!*)VXlah`GEMpL_eVI&|9Yt^h;W5OMEcScC?FX^K~WDcMM%TdNa^y8A71Xb>@Jv)z^touW$dGN%y8jDuP1Ow`u!v?Ps2|5aqoETERGsWc> zJpwwPJp@FisG#5~I{HMJ14(08_^Zyo!TqSRmZe)&yj!*OygNI`!G`h8IJ~U-Ifx2( zI{=jm!b9ATtS6Y<9hOScX*E~|N}07^x$iI9F)$jo&DL`=EY?;W|gxtZ&mDlv3ktfDzgf`5KGiC9Bt+ zpNn&Rj!@ccj=~ftMZMs_`dq$hh*Qz-`u)U^6TSZKlI93%^~C#*X8_v&T3mE>b(KNz zm@dt!(gjK}it8ZUq8AyeMn4ZLgdB1T%=8fL^0z{*TaOuCJj?e*)!pGGf!BqaLq=1a*|TuGL=+tqREzwz?s(vi^RSmZSxw-d70>e)RV^uh!vlaStA?c)-!g2p-hG>frf@{gdN3} zhd$`_^Mp(8$J-?ByvK3j3JP=YkEW$!x}y?9F^CASw0#|;Xal-_ihKq6*2Mh4cz2qu z!SVGphieXRg&~l#QQ4ZEodqF{cIJ>}Yc^rUox5%2y7yeX%#Jog$+=RyVn8BN5buV8 zF`~s*`d5ev;RViMn_0*L0Z*{~c%!TGZr0er&g#9@?!C>fDPjg=<*#@;2ZilLqr_z7 z$`yN~{uj}jqKycj{$zu z3D*+PBKys#Iv;%~wVHZeuo>9awsjGcj)>Llwd&7`?eWht(*w=P&rg^6!-xChs-dB- zfyB6R68oR?Gwgr;NQe4Ocx*S}Z)hD-<>i`_%nQ9)yGQ%hFk?$_o)nf-|36k!9#&Ib zJtj6b76%cID@McANU2a#N%Wn(jdk^hIRdZc;HN^$58_}ZS3&>teLEv&*84VEKl+$Q zWH`582B2}cyU9qm6&@W{e697m7}dnSk);j8xi8i}PoXg{zjj;LZRbhUm)7;Q;J`<7 z!Ic*b6G`F>^|SEMA3f5Ba@+_W`c#j*D-Qf{R%>c&v$C>!jF?$}dibjul-(D(*m1e7 zFDsV(g8h=_?a1ZPcHp()Ic?eW@kATbM}4%s`HQXdJvdp?nnMjU2^mgXzoaL=lzd(} zK0>HpX+s>_=hC<~I`w6n>bO@FmQSb39e!Q&x|ou#avWP!Wc>W2idqbY>uE4?er$~x zC80PoGqbvy&)IoDf?8$d#4<53HA^x!DOUQ|a?s9l+HRj+wF2c@l@R!%lx~*7Xg#Hj zcSrYlY;rci-^&)>Mk?UyB;nqCkB$3r8-10DQr5sa5@|iSng?%eXSWGn{p*`hSTMTO zMU2NPZz2yTCo?m>YK8y*u=dwsRc>1!FpS%+7$_noBA}vlNF%8tEg;>Xga}A3Iu%43 z1PN(_PLY-p0cns$$)aOecayD$ePXmIVm%p4F35R503;r_jOWdx$QTAi5(n@*{9Z+#Jk@9I@j^wTz~2h z@kXfNkW&O+Pqb~h%$SbCI5R9R%|Z9OmBz|z?bv~FQmXBRiTp(c1^%6Z27D_s%QJG+ z#1Y(XgT-4{bH39uG@5rLio0&IZI590eYx382)a^z0)1#D)%N5=6zMyqe?7;MO_`zR2&x*yW5!p)|8_1s$_DsiURBmwY}ra(agt93~umu zbac2Zjds%~Jz3gZWI4{RE5o%*BXbP4s7>c%Zr~|abo=3?5$a(n7>aoB{o`MBQ&U&{ zC_YUqdCSGN2HXkkXcZdnwTk2pxhh5_dA7ZN#p{@1rb-5~%AGlbJzivgK=L#3d5@O9 zP-c=R6u&%Nc?hqXJPz{qDC-r(QdaM1mD zZKsV-tZq0{Eys54M{_tY41?%~<8XEyDa3`ysfqc4j|S$BYhZ+GBg=cBiI}uD0JktZ&8C(F*y5i(oE!Sv9ej;E2)x z?>*UinVudxs+E*zz4M|;#c>z3;nnp9jFfbnrsi4QSz40wOe(Wls1RH9OES3WWbu3; zzG__4xlQsodc?E(JrvZQEUd+kZ^OGAm4?Qu!VHbFTDTJ`zdihV=ZYGQdjvzy++;U5 zt)b6`Mq>MgQq8u_wqh+Q|%lwHm5#M3FEzPD?^~^6cXX0t%SzL#x(TNSh6^y zh@$aLR{N0kGcqn>m27t^dGG9zv>4nKTupx<7sFX76Uju*=Jt4lJZtOf5(B=?ad>>? z43(;?s=-Jqvc~X%;FAJUnt>t8HUHDt9UK5Lrrfd6ybqvIXD{(Dt<7{zC$sxh_`M@nQ1h%Dz3b2D*J7i2WB(2lsbfWA=?j&WMjH(wVf!hgI2* zGgg=!XCgXn#ix+#9Z~dyKQ!g{e*Xax)HNlg@U{LnAc7GJ=#w9puGQXQ;^C=+RXQ{T zCc!R|0)=T)hJQklFXfeyy8WPn*NGuIPTY9mpxpd!LMZBwr#}{kV3d?>068qyRY2ii z>Ep)F#77_M$ji6?=zMQsVbNo@o~v8lDopi8V%kzMZ1N+AT`Huell=oonnLlB4O4tLG&uh3Uu6 z=*uz&einljotnC{vy-Wkc@SpTfj63-F4JfEm~9G^5`!uFLH>LBWFp?KeG|F4`+`|F zTu~`faA0dXZWG-~p&QE+8DXK}B;5AQm;V(E<;_rG`p@hCY^W?faHcIKytixc7fvGp zeEDVt=ym^~Am9?B>pEn}leF)I+svcJpgHmKs*ngFU}0$`Bg7|IB5N^NTAA_&*6PHW zd9YmjJ$>2^Ltq0#sJSh)N-^44r5p_o5bHEJN?q1T^1o%gdZjU3jin+aYEt>k%xEu+%D&Dzqvg`d-b3C;r65v z#B8r3hr+To94jSOG;uJ9yCte0&SMvs;z}D@F%v5gKJ{plHVnTKTo4&lXqChAoTWf= zu~`~Hw+Q^++xB9C{uhN=HWSB>9e3a;W%jOS^WN>gncI)06PkL~00LFFnLSK`sEc`C z{!z^N-Uz&M1q8xbVE5OCuZ0b-q6XCj0AikUTKl)RV$6y^j8E2V50)uHVo{Ri$%x3} z&U(BSdg^aSFhJzL-FQ~lSm!TR=f&R)6V{?w z{N<%%G}jt@kI{$-!RRK*{3gu);*Uj(jX6Im!D)YAxR{w7(d8Me^v{(<8TrKAf*kqc zD~ms&EDfPs z=}5_lCHZMMOCvZ3q~wCZxvHk2kq1fqd1!h!X1WxG?8m z@l&RjYypdhw2sgj;5+c9UXCMNU0o$5B?I^QGvN32TlC?^?#?KwOS$gn z0~g}DIG641FWv@BUVjHbj#|##SsJ}uF1G3+b{Z-AlP{-lx|Jp+>8D|Lt91d~aB`}V zkQjm48uP`6(0+qX?MH7;f)fL;X2GM(U%wV9`zp-_vq!DaQH(4e=TmOhkFIgox>LNY za*TS#GlMAYn2r2s?wnKR>nXu@Q#J()greCYy)&Be1-36kFpvy#a`p&BK}iYuX=n@C zWKXmwz4+v0gH_k}7u{DFpP=2G(=^)H)^K8E$E}r3ZUHHSVIwlHCkL;3Z#4a@BHBAfX`;h&F!W zaDwK4vXtJ3<$|x^f!DO;Od_{QYaYewk9ISyLzsHfAgB!!zdI`Fx`q8Ys zs?2JfqX5SXne}7>?FNAoRt5$s4>PbKP*YRGxu}|{V*1W_yv`rx`?xnd2HaT76AdXj z;Q661wsmv_%6I+c6){k6sBb*)E9%nYyz~`lPB5ESTTYJ&v4a0i*w`f%z5K| zaOME2o8Mm~^Ge83-N7hH#gA6=&(&_6Go? zzN=l5ecuVW3+;ee;C3ZLsVi-#nkD78C_Z0}+#Pu{1D-#qjs4%h1F~9ZJ{wUtNKYzc z-@30(eZZ)xkl?7#vYBKQsGVRkVP@nnDJc=Pos4 z`JR!u8nF{RX5HuF^ebI@nwx))*9RKME^)d2`|@K&Cd)yknJoX9Ba*mZ>EB91Oq zjr#TRf^e9aiEmzIcdXVI{+p}QZCtNClZ2d+?d`cAK3Ic|fry9*ISK+jPLl)}23DLT z5%*8rHQVsN;NIcvVXgd8`1SvJRGG~b-e<_H4_~rS@&4nR&0zyh&7Rdjw#DlA23ZfhkKhUUh zUVQ|Hk`k*Ca3v-yWx#S#PLYY6)`F=xMT8Fx4ZFZs0lKeqi2)&~)D)1qh3CaN9~w`- zGP+NuK}PB1=V=bF4csQ-S~(EIgj4pY3LS1a8|VLOb0Vm5-(dUNwQJmr8;hRU@(4cl zYWvx!$Vi;UEoD!e#cH@h(8jG5y%^4s%Am62-7q#4ua8c;1di~(9mFr z0&&!8u=Gk^u_xApkT6tIzKTU!LNSmp{CF#hNrr{Q$^zr~l~FwE*m3IdkvCd7#rgSg z6BVbUF@Ezi++Jb%aEQsDejLYrs1l{)XfSy#Z*E4@00-sb>MGk}Yt3e%k)_7EoDHPV zrKH)pwvG;~{*T56V^A@{iv;ZEtFK@P2E{nJv#k>Ay=zc0o%go`){bmri#hY`0T7ZSOGT-ZamI?*d8L)jx=|Q)) z3npstVzDDnw@;m+X#{=;;kEsFE! zVQ)lA%9mD1zt|ojP9xDFB@_Z)eQ$4%>7y@v$098YW8?L?f(}%FzrUw9>_98HMG3|N z$)fJ=wx2_ROOxo*C7or)BasJ-nkfD#ZWq15p%=U$=o5qBeHIlZhd?xOmex83th0oPi4~z*D|*E%jf9qqr6O z`+xq{6b%2EGhqpT{hgK`8?-I*kJEVF&(Q}-K|!QIt|W&I4jxs_QqzRS0n-d^(MTyr z?^dH>w)^hz@{+Y3?r5@qbw$i&dWwo1yj#o1^}YHhj!gA%850P>YKGk}U{H6WNNav^ z(Q~$!l`+Kwj7N=Ov~X6AFDy_~QL*-dEohpxuLXQVam(!9wn5=L&83KNEh5GK}qp7V8+wC6q4bmt%DVkk> zq4T|ObhJ7=gj$}SZff*N6|+ZA_)x*q98op$Z}oR7#n?Jmn)69jW0}l1A&0ZUem7B zHgXtTHtf3S#Ff=4T{;^Gqb4a0Kh^EGAg z=1=U+>T82166>Vzn!@09n4&z8z;5-&1L+|k@JT*FAS^5l zK%DW=pi}s=Zb=o4H5(Buae6PRu2J|nJI!Q3J|X@p?e1`SG??v}08>D7;^r<$K(j!f zc!qEj;b^tr!tP5gA_OxiAAmYsCzgMwlScZ5L*hd#E7!@!fa7O=CW=(*3AJ`~TofoQ z(Wv(H%ma)BxbJ7EAMM7%{Mh{br-!u!``bEIZXYBG`PkW`;eg836Bf^YBYL&6GM7qM zr!v;kSXGza^u*~|V~hRq4-ef7LmA}sg8cdfEeGGcJg1*;lF!W1K}5SJXlH%y)g_@) z$kW^_kUSBY)l3xM;&@*{UY;5@PlOU0jc)k*6{ZNj2R}2sT~hCh!C!lOdD+=<>)xtz zT}?>|31xF<5YYjbcvQd#&CSgP#jv%t6-GJ~6!Ptl4vvg?LXiav7gJ<&!Rx}vOYyTb zDuVow+gk)dQZnd5K19sGDjB^_!*btQHF@Yq(j!7@9jH?3Gn$<`#ZO`^l8^W!iXNZA zi3D8LP8-v0v^)EEb_ewq;6rMcIZActmDxTXu3#XKo*p;pq^T*xWOWV8nD`#w4GimB z*+$1fv^`JFv7=STd;?K_eeC@$VT`|yoV5L6#x^!WgYQ1m3Pk2#2D>yub1pr z1}4=%{HmWQ>}+eFr?-H#RZ;l{0E&~VuQyA5x5is}dt0-&mt7_)osuVWjsGiNzjjzDF~NoH!~N>5Ig;+3JTKF*0!|B zUeqtK)V+K6d4v*FHIB=dFN=!m2Z3B2a6A7TF>!(Q*cUL4_dx%Xqvq@5BNxvP=m?BU z;Hr*}viDjohy4Ec?{HfUp8=tOb`!kt+eO|84ks*TAN<;Z(w|C8Nk~W{F#62*GY-G# zx;KLMj8uG9edAOMe!bM=#|kzEeBY}l5w2x|J{ZfXVVjM)c0jTM4t6A~MCFmaVP1%R zb$Y9mYO#Hc!CsNn`c$;GM9>m+gO$#!ECoqptZ9c874LKdG#+no>J;G1%F4>TJS#9q zn({gug%>uEcx~=@z<_&SeVm6 zx>aF4d@C#G{fIEYsFr(TOWxe^Oiupfyb4oY0zm`S$m(qY*0%R-`xI?+O<8nwAUB+Y z6_47wZz3cb>VqRBz;kiiTCbO>fxg|mJKY8vxOd~)8F?D{cVsfq;Ms=bkYlSyT_22C zT&%3DJUm5kRDxXb1T4`h?EL)T>kTAhT^O!pj*4c{gjJsuO%fky4@wPeE-UM-#cJ$u zP0ekgZqalH9AV$CAVQS4Ttb-I2lwbg$oF0zNqPkn(sE6q;JEi{_{EoN{)m~3BJ+^| zzZ2ZQf2pw7{KK`iigTK-h@1R<&h{&6JA&Pd>|gZ*b%2l$BnyT~v{n5bOHuuYu=wdQ zT+4G`@vwnRQMxH0uz)I(MfU?KX+F|f89{TTqR=|SBRn5gIz(h2hZ;S~od-RyofRj* zL}*{53xT@Jd-)B*!z1d#^4gOu;&?EOcQv$!~I=-O((e1R4_jW`}m@jW#)Fu6Vou$h4<#3?vR zBexvsdx^SU5?+LT=d?VomZN1cP%L-0y?T2(4h+9wAqhy5jbdSJ5Vd|2o+(w{DcVLY zux4USO}#*W41JyFvP~{rBbTt&9m}IkOS^kQu<3!aavmhb48Vs9ghwl#UHk}HFKFqJ)9W>+U()OO5B$77Mpm7Jcfon zH#;;SCRAZV`yRycf6>M{@ZFHQ-`1g%dG710t*srHge%GNnza_k#xzviIIVh`7s6`Feh4Dfv(E^s2Tbtj`LK)=?Y09 zxTfJh>%L`ov4hBc)thiy)XfPshjx%%IBd8-|6>CN1z=(RSLzM)6|biefR?nN@QF~9 zlM$=NjjwGvs-Sz;esLl7R4S<(gy?{<#Q^W>vMCLm5Khabz<(55#4+Qep=I9r@&2xJ z32*|a@7)5f4kp$g6nxK~1-a79elsE>hL9$)m!fl9C!yU9TI~H0Dk@>&0o?kz8%Vk) znOxGBqH{NQs)b(QCXc;CF}bMN9XFWMmE7qz_|f=11oR{5_{n`2`Z~H`W3;MuN3j;P zQD0HX&2+M6!?*-iFFkwqj46_dmsbswbQMl0NOB3-|LmUF#y|e1`|#|5l33~L>Zf-O z?n1PFPy+js!t~b6OiSG~(6-}g{HC(>Zu^+)H17rz?s%5iE`D=GLrPdg~wJ_)c`hNK$~8wlinVO!AJT4r4RUud(WWDfQUmrJ0vGx0{EZA%;Pceq0Sip^*BTj zV)RJ;_mQV#+&eoN`XzqE^gXC*n313H@$q17qNJoO(rVM~KXO_UXVv-_eLy!HIIZw- zjWrb&RYH7xDr`!m0CrUri$ga`3omhYFXUMv80Gp_DFbeDPTAk&WoDKIFmGqK21-=( zX5PuCjGdMY%4EN9|2KDW$QY^$j(QPs`!O>UlbD!W-44_cq_P$!CWztWgV2iP!YkZg z2tNuCbYgCf#dA_#rBY_W`_41?=zi5pDQOsu ztyMdg@GZ zvK_mGRxYH>^b$V|Tpe1Q7!)Ds62YjPJoWtfbG{L`g7ICJh8$F&RlGT7vySmt^p-h{ zi(pp)00apZvmzJF-Zmxg6Ml&N0AEm#Z9jS=&~`90!9gst{KUb?I=llzAl~&I7<&#` zyQt`BM=Zu&UA>Q(Uf!>Uy=v>-n>V*y-`-|r-&^u< zfdhQYc}6MLX&dIKL^r5r_N}ahh(<*#r=m(0L9LMlvk5d66r9Ov-1w&9DEk9UO+&or z(W*DzA^yG-5Y+;p3V7DnF!9vM$qA|?XnFN3hP&j)K0jacM#OY#7h!p?Cgc(mH<%|8 z*8A}v4K(f)tTQcGOIr)?-P;(LH@NNErmpWUp8aI<$2g456Lc*b}48P9y;X}Yq`{1Izrm!-Tt#q6k(jQPt;oC?c*TAc|P~W_x0M5Jh#zp>3 zXRGjZC!>r}cz*L%Z`gZR~-ty$aJ zT7>dO;rCFtw#(-#r%Bwttu~_&q~NU2VE#MHfp@Rj$r|$;U>!+nYt$H<>38^yw+Q%g zXUCxwI@Ma=G|3QxIk+*r+;#THkJ|k>;HEMc_>QO~jk=*CW`93Ps)90gM^v6(j65PlIj*M~{1^<{Q{hZpK z|3C@P&e6Zbo86HjYs$vf28K937;k1u%qYlFN(|_EoYY_U49!Bx@XdLz%iPe!hWc>jTY7=rX19hWxth;ktmkh?|H<2t}LcELvaT%1S#ggm;?VKG!{I z^NT0jWd%MtTw;^Q8UI8bEgen05Q;oz8nRepnKZ@-yUgfauYQHj$ajD2OuF^P(Y>^c zf_k%Y6B`FivN5FI_}&aoFs^+melzf0<~}mD*3P|D?TDN4vzbP0&%^ zFYM*H5fJdC!#?*H2-cqhvj9Vm+sdSwV7ZHrPd_M2p?)VwXnhIU7m+D)w{Q2(4>VL% z>Ox0bifM#FN`r%1Q)ujle^5jf~@+OK_OI9e& zk4%2?F*NV~umN5l-e?c{m1{*MkskItd5;0Mj+0;AaE1nNIpTF>Kk;eef2kL%b{8Pk zd!3aYxc<7j3p(?l2>=fL7yY!K!jx~m_paP`K}{_=77`P*r{-+|-8@Y$)g5+C5R@9~ z{tfJ^lDD>8ipcdW4e#YXA0KUJH*jzg@p1_{vmK;fHMgca}&d)<%x zYA=!ZJDf-7W*{s92VM*rwk=L_V@{LXVeYe5ksg_3H$YB{DQ zRzaabg=X9vrHKzbb!r6#`mf^qK5#iw4oY_wA<}?gdfQLcN)VMVt+{ zf4mb`n7{cWddq&OH0+A#;DHfAa(+~2SWRBpPEXOzZ8BSv2nk$9N7{{FwVusX&I|GR z`~_3Kd`Ui;{<4VJKzN0XY34S$dPQcoS!xdA^?VmOF2v8qBi9Mlk+E=2k)M&mER{&C zE+aZrD-r1DVee<%Lfp{p$HrOq8x`WM26!Q(TP#pQ9hQ}>EL`Ip^JmdgO2LL8ylb3+ zMM9Ri{6Z~o>!MuZB|2)4b=6EKCRWy(2i9!v4bH%9M6)MpsKoQ_?m9*}#>HL)4vuN$ zg)S5=@G+bBot+JZ+jKsO;p5M!m4ISCP{_#3Y+mW>Yp7^*aVRq~p=NY%chQlbpPOyR z+`$&K_uz|_!{D|6&+u_agKPYK+t=d-igLwI_Y9TO*EfQ1E6KA;nx4O}jCt|d(M7-= zr0kL|{9wn`&|r5CPdV9MVwKcaUgGQIH1XAn#?MX0YZas?M&(qg7BK&TQ1Iy2!gMP4 z7ygt#_U^KGM%l)U3m6i|BX&0i-UkF7N2Aj0XkEMXmE-qd@)Zl&U6UAIRw0JQmaWdB z32PgJ(4aX%Q>DkImOXG9w?tK%emFdT|51(oqi1^^v3#x8DJ6{^Ovdg`rAb>e=srgF z#jWjCSGaLxdZJ5&jt(HYO^#N-`_|Yvm=3elyI?R2HqX-nW)Ag8(p+yYuk;iJXL8i{ z9#~96gIZ;uilt;?uL`G#a=JR)1)Nt|sSCm5mq|(2Gr_p{=5n5&ALu*f7T^XDb^Z2O z#IpaRB5=cn1+RersRpIWv9($B%-Gn4OLMe1$IGv32bpu|gIZczfTOC)%9`~jrmq_X z{vCpiZz}KKwLYuyBA}3R+m7{O9T2-KU|#&~{jR1ZZLBXY_Pq0viGMcYL^}#P|Ab_; z<>v(`3n~SV&eWgW+n6`pDKXnzpN9hsF4OXT*Oee#u3Y{9yWpvY0d{!#3&x4pCxM%~ zbGe{HsZ}K9lp5pFP;mDOkOzi_Mq@?LQ&UZ+K>Ep-qrvZezdSRpRE{OjZ z9(r}P>HaNYCu=6|!n7>&({LIK=pWUW4*Y!dequmjTz>&=;%$!QtQ)(GpOm_}ep%g_ zL_y2OqgyAaxoPYyK6-?K@b6R#9-TOd=?{pU@S4T`j>|li4#Vk_|586)`Gx~izdNoT zC>?sp@ZSji?fSxdt)dwo^p4Ex+L_lysu3Ct!>GN*Amsqa*xYhnL&z@Z>j zj9Y+%nCge$J$HDon3SzW9`yEBTOO*AWY6G_?9?~|4w}gjCHues6)S7Y0}w%u`-dgG zRz>%=N#gGZ+tqFqEj!r!;I=&yW=4fj0FHdzjUb{2kj>EYe`x$H3x_EZb# z#+Wf4o6w^e7~sHxq{;y}h&H9CpkUtH6Hv9L19RuZ*w~MSVVF2TC-!13V)|w5#k>NP zKXI0~w|groAw%8?A-t(h!ggZ`s~*gNUpL8l90;%n5YQn@h(Hjkz;KBgFAiiaWM>S! zQqNe9h|mdN;zr-@JV-nRB#}l zDWdEoxhwfiWHaQ#*hqTkEcmDYqp3}jKI#a8t4s71Z4AwZKKb(}%_f=2{N#ZT6ps5D zvr^t5W1<%nFRcrZV4&`(t$jNzk7{dfqb?*M|&04mcg}ab&d@o&h!eo3%F+6<#9mE&VAS}@IVB<@gg%NCsukU*YYc?z921)^TRuK`~-s}^m*SHJm zYn;K{411Y&o^IoZ1fyWI5@Pwj$+0p>zd`a4M?RN@Upr-92c z`@U2J*z{t*MW?=NuoHs|%=&y)@AX3;l0NvyoGFrC0F|*L1?Wur)g4(xmP4mt6sxPU z7Tb*4yukmp0h^t|A69@f({2X&==%o|0C9u_b1SoX4eKK#HtHR)tPDH# zz_hGc^(@Q|+@|NpE;kU?KTpxoPs5Mw)|})u+CUUt|HGXBK#7!~9e!5Kew&SKuD-|3 zh}etzDtkxjK+h4~WvQQ2&itRJJ|iAk^k=2H%J2E^|B^3Qe*Mn2xqhOK(Y(6Fx;eC& zY_7?#e_O=^=eD}{lS1SlDNViqZ@XKP!_>zA|7QAqpJjk0byIupI0N|U@>bBwtiw_l zZ7T?Y$~FoLRXgGCwU!s~DO8_lr)$rAdD4 zR2y+^?v=Zu+LX7II<;XY8A<> zPG`dE0kY@<-0^h#cGQJzr4*T0bn8>G{5F0Ssp&9Z_){sjsK?$W_WB2_5kUw&Ei8b? z&yv$fN`ZrT|7IZVas1s2LY}FqU*q;KS)Tm!U8!h#tzJb7yU(STm|yA>nLwEqRMX2d zmi||3x=#_0ty+O!5lqbSgP0-~(*uaS!2e<@4%tCowvUXA6v1RMdw@!*c`GM&wv(oAPhZM>E(Mxj^l27Nj78u& zsNol(B_;r)BFMa#F3l+`Sz}5a*oL0!3e8S-Q*qz%l%6^-r}P4^2-QHJTHk2LxgRjW)#BO!W*Z%vyq>4uk*=P% zvA-Jwp~?N#B+6hg%^9NwO3c)=%E6b^hY>(zAiJWQh{_o#_wpkAIH{O_b9j~bofs<5faaw(k z)oMOLP=MEYwe96VNoZuDEhtbm%f$3*vJWMsm6;eCPo4PTwzKAvU-9?mm`N?&agEy0 z?2T3~bAWV^lV%vFeljxdn(Z`mbDdW?f7qzvX{llYucKM;fyTsQ+87VJsVn@^e+1QTWFYa;2F8b5^wl^bVRQfVsgDxD zKVeqG4}hFg2>{dVCL3?j(A4T@|I(f$9E^=*;Ld^b2sS49yJmg4VR5dvSYRpuT+g5{ zwB9Hj{gG*?Jw=;r*0U+M=>QQ;;JT=90V{N;Qj) zoV4VvY1bETuZqIHkpdHt&3bX|L%Lm!^D)QVp|ZM@H#tA%J?2OO%J;DnuxX5Ba4}k6 zQ^rh@xo^sH8RGpHa56-?WjQ1qaD{#aC1vtMWU9Z<5_l?2A;fhSj@Flh0WDH zjjQ5|I0J>tWaDRWB9xYwL{%LthQ@oM;Z-t^>$)x6*l_MNAkX!+Cj%L;l%W-YJ^?^d z53q;eCwXy(%gzAQMD!-iV2I6cQCRuRDQ-$qoPfBS1(!NPFElwIZpx zbQMzAUJqbwt#sdgjRCkSt&!HS58N5F?Cps|j8VYZ{+R4m*?DJ| z@5`)yR@y||R7NQhEEC)`ff)fJk8=x3rbzzen!b9iE+j0nDSTt&ct_0JxVQ^%R)D(@ z4Ws{&<=f*KV0e>Kfcrn^0@-=1H}!O!N`Z0sW^SUM_vZ5KWK&P2OPTEKUGZZer3i? zp;w4DE^j!nvb0t~hwEepxxe`)^-l?&n+Z1;H)RjHGA~2`llh;FlrancB5HYI<+&i2 ziOjmT^>ESqjZ?_9A8^8^#NN0v3C2ps1hCEr1iQbNBrE~R5wvJ!0yAzJNWe}`QGxRj z)fz)vH@&~sbkt3eld3Z2m0Y;g1e$PK@4jFwQT2addLL4_eHdbuIBp{0i=ez)n zasfgG*$9KA>^{!RlpvPT>&?vUP%WHvn9j#{BvLIC$jI$|YPH`ej(2%+*tOi6!uc9M zCnqxAY}!heD;HFLG;-=hIn_Bjj{swica>f>ix!c{{zI_@jW+Qo!iAfLYye&JStU-* z4uDN+2>8@jiO@rA6r&sydiuA4l(%?d1|!{e;TvAb$JsVl-;EFaq!y_Vx_b3neTp-5 z9{|LPKS4Bd7!9#NCntWhhK`jwnNPPZ4-}7T6VkVDg^LR2n@bU(=7dIvIfyBSR{q%= zagxQCJaL6WEL-cVe^KO4ga#&gO23M?N6K2nO0Rpe>EZa8x_(M;wkfOo`)$6FibbFU zO*%%b3O#;ye}Y~JNG_5Vur0xDkg4Hbhd+`AFve=Vy)y@v(a44jTUv8ah(^lm1s|kdUZ!DN5PeZecI+t5yA) z0B{B`lpGk}=08h&vxc?hzz#CtI_kPaq56&U@kyf9X`p?Jh|I%V2EDp3Gja$bspI`X zoK<2mmz<{{!U-|WpQs{>|KaFYAyEQb9BBQpoSe2&8}H=2sooKp_uCrTkaMBj_qH71 zRX?!%{chKiEeAx#V{_Tm`4G+MvsizT;WgqbDk3%yrSC=IY=}0Di73txw%eosc^I)S3C2pQtZGmFsIWwJ9|)2MDV%Z91Ny@cLYM zywFgPCmXIwKNqi@`d4TEYw*-9=forTS_VC*4hJxa<6L$(GEAUvZ(+vu?f(@7zrl#J zVI4F)IM3CeUpe4#7#29e|4xAeu`U~~_?x51e6^ZOp7A5DZ)Q|3w;AqguyiT^YBSH3 zo4~tE;h!1wSKl2I9yG@kf>iTld5ul5kqJA1U^4^3zxTRa=T#~GY6e!0p*?RL#Ci_I zijT+9T5+-1EQRUfU}t_)oYjlLD);Pc&o{`^EK?DW1iK=Ld1#hRN--ArBBF580-Daa_o&ZKM2mgL#&9zrT<3NGdZ-Ad5D zlZg<=(6+l=PG8bwl>e)Z`KS0E!3f99XLZV6BUaMW22+EMe9|RmEv2&`Td5Nkj`JBk!=X1z~hzMnNBPW3&57sxWbYh4O19uU#xfP zYX)&Y*@`8(dB}(B(%*bp(j$@{q2WjLA8LMm#kQ$MFfl2K$Kbgq*g}sSNx&yu2n**_ z9#(*ZA%K)PO`eL$^4wY0o2i~6pX0)jvz zMkO|AZ587CfB^i-zvt?<^kk)-bHY8~yAQQ2_>zU{oWJfm76^Dtrf2saAxF%b(UE?ha^K6-d{kR6eX;)%R;KSMjDt##KbA5=kOT8JZOloNoy4 zHYhK*smO8OyF+F$Xs!R$9S%j*e}4{KkRhq zj4DF+uPW{+*q4^E4|ajwsm*aTj+4w+YxIRbo(Jam5E{=={3Bw zl@mluvH6ZgOiw1wp%t0397tCG*p-QC#m#Mpd46q;UwdG~!-MU-rKP*Ek%fh-+0Qsg zN?hW4^Z_oRF`W@8s(4GIqqJiA_y?9LUZ--Wv&y{%g42+9^c*Z^mDBc6bIgoN+TYiW zOuUKs0(WyZzJ+U*8XyFErl}IuKSFXD!y&asGj@i zjBd|UQ;)V7+%lQczwfzU)R4-q8GLa{S>tu)h>S4LzI>6-Dwm1F=Fgs+bdMlt9K&a& zc7F*k@!#oFXm5zHxT8_;#AOB<;|Vu-HOKF%L1^GnddEYn?>9t6JmRaYEj^68@}A3# zRg5j<`8c}@_Vy*+Q07<18u$dk*fB!N1&?Dbu{_ev#OP*iXJ^lVU@D9Md8h1KcM)Fy z^-dGiQz|S%kc9#^BL)llmcsdtXG)Lrw7Zd9*?jxNS!&e zu1I}uZ57c;*1qmt6nV6NvN=*|J?ALCnzQpwvzCsZ@;xgBC@vFu4f*!HwYAdgvIdcf zettwK)W!tA^Lrn}{^kW{#838e&h6eD*%ySHFo2{oSkH4l?DajE<=zR-&gHcks-2u} z<*r2)ZT{%?I6h_=13*bBi0Ua)(A6b9M)-NDm84zNhT7V~1Lb*#*7HhfRb>t4+?UVKm-7i|?CKWb6IRVnb}LV->pe2Mc30wf#sF{HUWK{( zBkK>*6&1EAg<`(Zkt<;DE|WWpv56ntQ!mOoSa(PfcNgEZG;gh~PJL|ZDKsY?6O+*( zKUShdNkOh!*<#GCBhfg??PJ;40y`O8kE5<0t+<3o(4jL{k<>DkBHJM;nG_ll_Hu)M zKfdVbnyikqGbl5aE9QJ~0UsmFJ=H!Mu9*5{1B;L6%}%37Ja%vQ<>uM{G@?DNqS`~p z&Ms-(^s!*pVdP60i%WA7Z<2t$k%Pm>?b>g7zHX|!v?o^%C!!qxJP*j`U8@S`i|LMw zWsGd-iR_YqC@C?$pA9TJ7lf_fB*bZtz@>qFKN8=8$n~N^(CLG$kWh35H>SZ z7k-GC$bSzYEts481UD|c(XY;}s%qbY03NNt6RWqvCFHhMA6U=B z(-2`1r|c1RvLR%Bb;TA==ZNpH)rZac7EDu$m%q!wMNQcvW{g;`o*v^zr_ehsm|DW? zE4k(6Lm^bMaXSs1jPWfq-v=C{YhjFjk7j|MI_6Zl2lIOOn&40wml$h&l1OFkz(8k5 zhqwn!wT|<`U%GZfoquu8+G9w@LMqhZ>Bm#+Glp4p5sWp+m?$#lK!saR2ZAVwBlO3V zdTELtdKfF;DaXCrGmh9x{vSU#PuA4vO*HH_d<_8@*9bcWR=ljtaHQ^Cai2y7&4mbk z0#3w*;9OtSTAJ>X|1|!eYxEHl#d*X=o)ew$cT@L5ZWe5YBYcpRZrhd#WXkybKv#;Q zzUP;Lf#oiR5-BhO_C+q9_pG3UoP4RbSSSL0w$KPwV6q9L98^<3PKrKW_4dMlAOvSr zUjIz(KeBRhx+iZi*uElnQnB>;s%2g-q+R3GpTQ}RbfL)$L;jz^jyk5_NZSQ zxB2TIXNV_0{KvcY>?W`eOO-hF_eFh>kJm~4oi6?LNT<-h9!co&m`;J|EW1pdA^GHC z9F^edfGgfpaYcT5)B~slLB3yZK5Y8)T{QpW1F~P&6ncAATtRf-E|i+8=e6KwFn(-W zg%CXp%ZEZcU8%;)&YJ4#q!)iGYnH*?BS2n>i(>LTbzv$q1UN=VzfA=5NvNntXW+k2 zD((>-r!Tx+bM!`Hl$&a~(aUH(7fcmpCUb>HhLwDy-sELIiyfY~-%-Wtwvwx2a!RZx zd1`pL!&+M7%SBK{t~*zX%^q?`#gO(^eTT|TRluZdwU8R9~f1`wm)(Nq)v7fx(Mo%1?!C;E0H;yRliOMC0Rmx!>WGu0&R>!$6kK4$VBeTnr@ zrEWWUYDHyOPU-?ovPl9sppL~<#=_MJDwFm-C4t)JUB{TGshFI zmsM?09USH&-tgHyMsEo=Q6bNsKHb`(ps4Ot^j1L{RgbOQB$E{P;T~j_2W#`&++3NB ztCUQkGS~?kZOT}-_&903aOGt57auVsF%id|^Dnn+;f_!bga3!P?~aNpZ?<*DF{3yp zBpV1K0!q$p1jzydl2vlfAfdqojFKcv7Rg!3xfK*7XOP(BCbwj0pn26a`VBhod-vXT z@4NovTD^ci=XdHUPT6Q}A^$%T8gz8!raLsTFT9TcPa1IE_dwtk@d34{ z(OR{{(P6u3i&8!I4Hg4RJ~4jW20sb%=)X0bitG2vS5l^400_9n(AQ|>}I}+YG|(c z%utIadCaN$zX9v9hV&fa4VT})$CjV)Z~Ku(vie|_uxR1B;s@pHD=QYbvI1dx12Pve zst5s;in=;%7>F8S(P680b0^JMT(V8gKs<;y@4GuE7s;#CS6#CvZ#<)D&nMervmm=JL+LS4V%NY0ImsPf9(KApi9J}K{Kn`D+>)CI#Dv{%f1%t|}E z-!O$sc+z4u@4fEInKS~F^Z7ICR6V$=fHHgeDhbQ#9k{omF6<o(qC@@BQuTxAP2melA36){L`2Fyd)Tq=cO}l! zXuM7g=SkusQ+<-Cp2SqYh19`?km7 zjieP|xh$hJna!vVglOVZP-c$^u8|0i^zjy^r9OXlS_a2wv~P^#_7>hns`o}{rbFrd z_Jaq>g=Hy+k>c!0i!hj@yrt!u)QzsP)jYIwBb;9ZePP!Ot!r(7FC#sxxZ}8k(8?;Weq5$v%+Yq^8TzmV8zyOAjS%IUKQXIqYJ1SizmT zDs0yQSnxq{dJK zzryR~d##P)Vyg18-|2HrB#iRc77KRo>pDy`b&Q;xZnvSKHvqV{jt=Ebh3Rs4$Ja?h z;X*|XpX2QAzgY|CdjNZz0k!8^>A9)!20wt>Z7^S;3CK#@L`g?HlT&J9-`h^BF(yQA ztS$RR4GfgCXk%&F%7FaeGoBnMt(Wc=IFr=r6y*T)GTDKRX>VS=qC5@_rtE zKDAV^@I;`vgnDCLZJ1yVfzl>VTQKY!&%5N?-RAV_|8|OPsD$*xzl0n}H)fo2OI<#5 zjDM7#jEReOS^fnB-<#u@otn}f@m+xa5&_-?Ub~qOF%c-6hM5DT1SkpqAElc>dgu}t zj+T}_)$A5(BN3Xd>AfvT+}EXP zqwXxdgioKU;I!*Hi;3tMxoL-{4mbb-<-wB%bfEmJS6W97FD9k-1O%J_>hvw`Y6mJE zUTE0OW^O(b0GI-L{d=nn$T=7Aek5bX5+wY=SFXn(2*udoF`M>NA@vcX`u$(J0|u)S^3f zg6Z}@fNJG`0M$l3jG^R&+{gZv_59doML|g1*H~WU;7vSpMsZ`U=5%vK`N{gaguu}g z^=L1MDy&uzEP_BGQLAw1*4`gs;qx=; zZeG~;Ci1B#tQRklBMZKlXFBtAk9;fXm`-eX2LX)7PDPuta_rmZxaW_2lfL3Rd`ugq z6eY1TTM1gi>bS^Wmu1`NIfd!w{Gyz3hjew>#U#-vwQS~ss{2R_oGV$XHsn!mezzRK zA(CG<4M(MRix2eBHGNTh@??hnnK30b^*KjqRP&W0BnoCK2HEDO>?j9A-FjKa0&sS1 zq7%=a3VOWk^DW6QT!LZL?F6#GInKOK|E2MS8eK*e4Ws1#)0f{w6~oF#(NWSNK$Jjp z24uaO<>Q;*MuS&9;!e<+ig02!;x!!PCdWb)^cLC#|kAQg_Ivx%VH2C$4>REwI-#V zJZaC~mSZ&1d>jS^EYC>BRje;|IBI`@Ncn~&h#I)@Yqk-7$EYa3ZUc-x+ad3?Es*o#N=~t%8H<5TH&ECmiUPs#~ zDo@VLOx@CNPumh@g;SImFN&tXLxK?>Obzo)jB)5-ydVCQ&Uh{@!Nv{53Y#)8T_+Wy z92Tl>slTM8PGynC_J*~^h>CV9S+Tc1*_|@{Xc$H{pY#jVZfa+w=u8H7&8(N7H3F|xOe#uPaW9%DZR`*Rx7sGpVddRbv)Je80kDZ;27fG!D$6oHGkWgJ8Up`5CwjcB zAjHbIm_Y~zyZR9rPrpCvXe-UTuq`ZnyczR?gFQC(xzst&kBZi(J21JyTQi4eA% zRwPHrHtvf@dHlglf02)hJ=5 zNQ`76OZeK#f>K4ItCc@;oNfGk2EE{^EjNBDp3;9&t?2E9ypM1}qQraWcQ{A&V<3fm zn~^b3ra5Jtzm|4!x$X`*`2i-TCUKdYpY|(fFTN1TJxF4$aWtep~nrXFB+)Ii#;S#co{ZQBecZ20LfM^cS$plwQ{kppF8Z7IiT-E5t7!6zH@4LXp9Ui8Qn zZhFncjrgRLGl@}>sjKA+y_+f%)i*Fc{)Q$HhzQ^rtfz4*3DVq>h;~8o^@a=%(mU7zwuBXpXwVnXenIpkfQ&Bb2zT*F(uE%iobK& zX#+EPUye}e^K9|uuSgP;_}ak+A()O7nL~X+VqvD29@uah1T`PHQV$92hpWrrB@|O% z>*#e%KOCQ3Fduc^hhELz#_(jTkMHFX6y%Ud!(me_k_49JDmOoVsrk5bI7+> zeH?iFz}#H(KJ#Ud*}xK>&~tTyLTp8_P{%jQuRkDMfAq36JhJI&NXpM4U~-4l_O?ui zt?acL=q2d~_cveaH9w1J7nQiNITI)GxjQd`rw948he)H}OMTa+;tPcY!N-p#+b#CF z(_reUA7#%Yo&;w%5wcGiiDs`SLwVB7UKO2LFe-cUqNDL*%jWdXn%sr?K$3Zj$@W=@ zAW*^-5~7yG<5Fc~($g<;wkBj+!q$XG&d$~6qc#r|$9ipX;3|Hm&CL&^o<>(8u58oY zuZg89nVdI%*N&oOw|Hgi8~50ELe95-*RnqnE{$~D?Va{du$=xG5th?5AO4w-eks1U zY3~*o{&&tzI|6O9)oV*YIk zFmLWUubKUC6ONT++n);t0ecR@u&{)h1}G5$e_bd;tNJ2RNWj%~4}L|<;MT3a#^@Oq zw5ud5W2S-p%PuXW?$W}-sV59fEb3&(*vFo5C#9qu+>tGO`#D<(xFN^-7dOP(;iv2E zn@4@N4juF4ASPLKMPVA3qjcEjikbeyUgtNRbe%$<6j?k)T3*pr0`p$Fsx&%qBqK-e z-RjO1uiA-Tt1p_XA$FfYnom$gInojdaXZC`*53y^IguPMLmL)OHM{>1XpHTq+SAH? z5J4()@@tUD@*OhhDYWV7D_twF+Lw)OZ>4fv9U+6M8gH^ECuKfW`uNXI>^WQe2cd)l z&q)x6vM_a?Rv?=f>6q57w_UT<5vwXXEJapNJAi{O_l-QU3Ioo=TnXmsG;KF%HH_l! z&+kn40z$+^#&Qc}i~LEQOZoB)y|&yGK$O?7W#LVQVh@mx-I+SR*3f>~($Js-MbiBI zD?Fxmq0XtSEF@qvaU1Sx6TMk;@BsN;SzinmOY!HGvff_lTsdJqO~CTTtQ#!}J|*Cg zzW6QzolzUQ=#17|P-WO=xAhS@2y1`#nEsnAE`{ z*6+*#4(4IfN+i1}5GZ%KG0GrDX+>;5fhFKX^nU5b_OaeAO;)F{%fo9Alz<#WQ2}=@E*;grHOq;gi|-+NRqN&9{fBA`M=nWxvYWUvI1u@ z9xIZ%s)R0iVf#$;u{+CR{%+zF3Z!yTZV=4E=#&=|YpEh_JNo*(b#y2LV0|?qV=xFj z;WSVd{h)krwepvh@bJ~|C7KuiEy(~D(`SlK_x$U$Z%D`;S>I)lO{|0PAkJ#)9x6hB zgOIbCzk#7nfeX)F_l#l^zMKwO@5-?pKR`-b>S!15%*I|Yb<4hQhIaF-;i$Z0NE)DS zo!F_e>IvnM@efeLsQw6~vVY_uvLj+XRDHnD;;5@e+uIeZZ`iT?{&wh zUtct``JuuIIB{P~i^V9l5X?U8(kRZRThdUqgukh#X0|q@cXQIynJGN%(zvd7G~eo7 z$Lg-uET`34fF#_ZZVRqfNWV6+`Z}!2Qggw4ise&E9=!6_!CvYp1|Hzbl^EOU>SFt> z@A35Pe}S#1Kn|*@uHMgs`>2aYUJa8+Z#uB(d-2YR%>JB$PLpx}PyR~#PUSo68y(X2G9 zkulp0z+l0F!W`c|H%0M}$3TPhh0AA)?H9$L{f-ex|Jwk5Ns|wjl7cxr zI2iNj(O2fE$1>r(vF|P`AVg4P(+Nxe(v!%8LPsH|3Qi`;^=qe15jJ6o@aCfxB8Z9- zXVI=_1z4pVTEUfEfB6PrE>c{hzI-{e_>>bu)6O%DasK#7s_s3MZMD_gSYP9E_&GQp z^cCN>UtPs?>pWn)=pd@@2)UGpeavKTNNc>?LT%&*?u&09A?(#r-LRTVvMr+)2->^1 z5VeWd1gFR8@3s)4wEd1VoSbY)u!A^~Se30H_bpPWMtD^_i@m_hD`(1kTV*x-qZoJW z#=IUhng-8Xw5#5dh&{_DwHL~LS8P+Gf`hg0-Fx#X*Tmqk9cr&_|J5SM>&~5jrhOGI z-g%=ChvVnTGH3P5&c4?v_yccyd0*-DSdw3JE7F``#we((GZ5mI7cG{SQov#G(^=I# z)+_T#NO*fQV-gdOu96>PzrA{*Pg|7X^D}6&sYwsC1w9DvbX2CDL8`g{bnzrmg{_m2 z(mKyReD82ARG!yt;UMC`_iRWfI;ibyT^bhH3`%QK+OX8NA95U4qwybVoU6)kpi-x- zHVV_wH`S}8j>v_iC6yJ}GW#D0^Owmvp6nu{PKo1;UH1(TMj8jcW~a};7EE-R3`(jH z>rE@YLICoP1-&4+G--{vn^U9m}liRq+4c{vf{4&o>CRhZyalp*1QU=l6Jh4aV zkSIa&a%Tui#ne;|FnX}Rsebd5#sfm6&Zg^KZ;xgj1@>NZ+9igwRUd*$28f9=D;0|$ zE+5{>Ki4X;&#YZR0#U(}R~i|4guw;5bl^o{VRGZ0DBvB%#0FMZnS7k^j7taQi9|jF z3(FGI8-qE`{o8o`FOPNN+WF3jxsh_S zQu3}Oe<>iMAZ|H-`}lIL{x~fn{mq%2ro4%X0L3HgxAHYTWtH+F*iW# zc{sg|o4Wy`{skPrQu{Z+?%J9J7JUU6j*N6x$2Uph5*@D3Nel;OU(1LbbJ>`@2wF55 znSGFanH67ooAiv+Ka40>aX9upED+_SkY;(>ySEGa(@bRxt5D$VXdes+UTzd(Vp<1n zN;7B(jMkReHa4(;VXnyYHq^uLM({Tz*6xPwxKsQ8cQ52301jKY^eayX4fe^$Ydxv zzlc@9v|E_4e~_F*NBo_nuxYr9exi>YuV$%JeC_#iqVnae5EKcO#Q!`t*M zmBJ}$CU=4u0_w~}tqSYBgp0QJtH8D_*t282=(BcU`+fT|NDFAGyj(*O4`XCaIx`cm z<*lR`!H}(6P(J}80^}%v=vc*>JC8Mng1UfN$S)a+n*KMBo*rZE6mPx;P)zdl$&=@p zMxl~kb%Gt*6@K$89_|G|(u|emCOxuraKCwXv3;~~Csz*}`L?h|L(|`MqBy_~ikAe% z%JG0L#Y&wXC-@|*D>(_abJ_!t{P{B+4qWJ+=zKzS-5-v-{@>9u=we}2G{PBnqBheA zw3`7J2d3E$@{>Lr+Zp6UYdc6785yL5f+4-RU^bq2@seZ&sE6^ViRd^&?hfgeYJ|`H zzQWbVVeHV*O$~LUZOuysBb_HYf3^Y8uDorU^jw=#5pEe9m)#KAs{{`Wq=*kd!U@G8 z)(t4i+F|S0=V~-XkEKy=lZC+S$6dl_K88nkFK9-D%*Ez#uq55#k+WErbuA;%MOlgc zLCs%$={$YYJ!PR3!E)G9a4$rY-E~1N-~6`2xpN|*j!8tv7=uDJPOu|g#&%gsxK`w=OV8t50)EcmYLF9e@$@i)Rf5$ztSstwKZ!YBisU(9 zOFn~6wTZSoQ-`A!GY`{cX=xFx=g*&|r&k$&LDXYJ(&!m=YcK?uTTK?}%YMhTblaMh zE(1_Apin7GmoJ3pMQpP*bp&zwwqC}_dX@(?6hi>DAl-sj81$ICcVjokkCMl%i*#%w zXqj;49|+oqh@d@%J9~M^nJl16v$n(%#b-6>!G@PTQdMi8rV%kVGIBuxr>TSu1{ubW zlgmzcM})n(4&K{@z_;f=w8#HIS&OW7RAaWpBARzzQ4qu>=Vve&Imm7)0NTME8*YH~ zDMnF+g%>vzVIh}BrFX`Kz`gXbnDy1Ssi`4bn(37|i6JtUmrc$+Y+9rB$QzD#>)67> zsP?+f=N{j-EHN1$)l51?17;LgoaXwXtJN=XxXk|U-M{2`X|D|S`L{#1!lr)FG+&ih zvxHxk{qw7{y94q-Q2*((R})q?Oq9a9YNoX6w&h45GfKD_+5dsyy*V)SR@JZj?`O!y zIBAO#U~O@dXMEH%Pfq#>HQiBip!5?(Dnw?@brxkp`YrmYr`EN)}~74 z=BP+X*9r>-bXH&n&WTg;GXw^hdWFaUtK4}7v&AY(ktP|Mh>H=-O7%e|VW7BRAPA34 z9oJ^k@XCm$t01;~8x$M1Q|-c22re*x2TAOwnVifGT6*rDIsh=eGa!M#6u)jTpCm7; ztH(IGoCsS`wC&K^*5CTOrKN?SxjEIEC>IamW8;d|11TcC88@douToyK%-3*_qzH3B zRettRR$~uftu|r83UF2Mrri6jMfQsdu<>!~ma53K0H6XKs zYOZe-+@`5Dvw<4Q*&4pFJI^Ia6ht+`8#Ogn0l$F&_}RXqKmN!E7A873cLGAwyLVUN z3?Y4D+@fsXx)q_vghB94;^9dmho3SEW}Su=RC2ms>ZKKFRfGMZ*lUz*t|4!gN|bn~ z;Vlr~;iz&qQOF%|;>>#!Rh4I^vq~N2pk5o8=_qFQK+*X^-9e1@{reb3X{t<{$zvR@ z^H9&C7v0iMi;-7jZ9=BN{($j);5S7v6YTk2>0+5p(2VELUAB|Q#Gx1nnLv(eh~(BO z-q~=R_*uK46Ypn%nP1*ujua!cRiS0^QrtXRyt+jKuRzn;HVLf1c;g(+h3(YNYFuu1 zX?nalF#`c~^U8RFstPj1P&&I#d*QW4?Y>`;CrwM@PVTXJqVk5I{&!9T(8`~Go(E** z;J_andovG5(N?P;RyB5|F6L2^8heFQE^*gs|AS& zz7FxuU4Z&+$d;MqzA~MmG}OKF;%|&`Ur7;Egtn>j5CGw4wc8BFSH>jm= zbZ&!EF&eRlavYX1t4fUiJ*Ft{+$U9ZiD=fktrPzHqsF74v{VCqv(P97bDH9+9 z!k$wBhoz|nD8#7VBL!({Pg{-;r?v{X6eum|k3JFV89!RLrBBV?C@Tp4bHM`d)Fi)R38MJ2%lKa1AGmUIZiTA>WM~Cj*Y(TYf z1Cx_e}jdTS;f52HKMdGT_iy6!8Jn3x;dSP-yfRzZ;{(+KLOptJ)>`!v%i&OBWvLzlsT zGa{sbca&fx@*)>CNzY%gPAr-WGw~X&6k+?GGLHS=uf%9eg$zUo*AnKOU#M;A1VnvC z|JY-HaT-d>K!e%C$wA$JE;D`CJ zQO^9wj`lA>eo=&&jA5^DU@(=A+UmYi~pUDNFV`OBJ_4F2uV$=y9|Of zft$O%BRx<;=F!Tx-XabckHL>aTfG=plz3?;tdP?JU9V`ScZsoP>epmCt$tb^vTN)#L8IMdvJsl9`&@(!e7zI4FO^1!U!2>ZzRVer1K)~UQKwXuCl0ueZGCv0 z{G2opAam^t<61iJrmlO7+kaUD+PSOIdZ4G44ri^4AAH^L<*=8IWC#ZnlbS}g#_;9g z)1lQqxI@>s%YR;j-<1MgaeGP@XI05X*=KGkyA=n3aCJwoAwZ|9FSkMEr`YH9*Xbtx zfnv}?aV^#X4=;`)b{>xSFYIXjtM>1qr^mXv^`%4%57$Pq)88vv_8{}voJ4gojhOK5 zisN9z%0LtgJh14VXKhft-YWf;CA6?3*{L@_e5dd1Jh;Gb^S8?VM} zwe;MT5A>{0VJImOxMHxmUUWsqc}u2LRUOJ_H$%yg4W#k<@q8<@TgNDdk8~kd-=8J=v zC|=ThZp1Vq+85y}QY~X3;bVK%!J)^G{=K*=Q_cjzVhx==ouw2xo;u%{J`TewbV+EY z-mZ_o8oe~th3=F~#uLoc3mOnt&AvAvrrARSV&bWtnhbWN0~d!_%y@0>XM@XOzLXR- zua5y7b6M*?Rlv(AbLwL7`=<3o)S2x#-+1ABW_8}yEMC*}uA-QOq6Kbl(Ar>S|d0njz(tPkQ z|K~nMp!;D(x?e>ga~vU`t-6J(m{7VqueD&539*ne6grzO&A}=G7s`m6E~g!rb(u(? zO6X4YtSaz5LJsQd4y<>ZA;!8Exx_O3&Ml6&Ie|hiA_T>|T=xa%*=fGqu^%d|ll_f1 z#?3AwCVu#3&X-%MMo5x2NnI3|rMy~wrLx&c7NBKXeUx*JVIPDofL|zU_U6l4KqVFE zT~KemdUY*EbnVoMSRl0b{6y9MgCxTQQ%^$ff?GIZW+sY2kgbAX##jdr)GfI6*lc)Q z#vr_)7ASpa)ZN!vu)K!dyfx0oWN!ymLIU5*G*9UC@_83V6)AW96%Ak6Val1iNk-d( z@MURN1_1$OB)2rHM{P`$a-TRzwh!$7y=VA-Kmv)BLugkK{u5&5{+_MlKVG&&<(>K5 zn|cx^a$jH)dDxxHxk1rAmT@kGJVw)>(9Wg%hyP)zgBaLBL|crT@X&NAN#HwF z_*b`KBWewl5a1mF%x|IRBzaXxOUJP;Y?l!}A!YWqww9Kb&pEZPZ{z3sC+b@Q>x4Fm znu;R_i7T~;ZLGU?c~(dc2wHddB=%PAL!iS|b3`cSnzgUqx)q5+89^by&Q1V&0zowg zU^hXEa{33{Wgp#E;y&2DcLCaW&|``)i}o5&!qBhQ8iHDzxerwegG(BMCXHtp$q__# zvUV+W2D7i`Ti_v@i4Oq!31Rmk@$jIu8WM3`0JN;3dnX>Yjcn0f<&WpA~ zcixo_lx`FouIec$$f0$el8%d%eANWecg{68&4Z;a7sf zAq-&duJSkLrcd5%Z|~ZwE$rI$K|l0jxSa;qcwO%cu{8|Z%YIItFs;IKDI<_@o&Fp! z(~*myBo*la?mpW(f^&z=5)=x!G+`i~ys0&1t0%;7HvmbltjqzkBLMIdG{R8*Ux5Bp zNn6I9T%FaSKeqd>w%Ur}brfm2J0SSaXuz{{DLf?PvYAF~@%sAwGz6wwx3Jr7OA<05 z;Q-ibV-w=c{2wO8PM&_G*A23YN$8RX3mB^8fnE&94V>(_T7hM*arb(LArGG?fZ*=BRDIA@20joJH>F}-vr*Dw$P?z(M zbWp%A7E=patAAp85`X!U(?H{7cmDDRph+f(d7MNQ=EYdB2WMaEw z+FWX##LJ+27c{Xjmt%D7tJd1mLOkr3Za8r0knw0=pgnOeK&Z=oQak=%Oj@hdTo~IJ zx-G^W%43cXP2$wsYAwHD0+|XlSA+UZtt&wWJJy-i;!c~+jao&*=qO9b#hYIlfFL#s zW=DkVTQX0$@r#p$0T4eohU2dM+{6N!SC9^avQ4WJC-wU1I|KRZ=o>~bk2aMglG|hf zkTYm~ zRa3``Z*OOWF)xUkXXIb*AL)81MqSOJ#tjC$_yt>LZ+FpjZCB$|(7>6tG+Z)c zfer$OfT3_01cYx-hh5>{XT zj)T!a4|da!1h|t}9up##$BY-txVN36xh6r*yKC3wP#BW(>og%rqR$7seEr8-$wG-fnIH3Eg>F7 zi4)@y?~fETa?Ww@F=9nb|Nn9`|J0DY-GVGc2pDRQGR*&#JiE?=I1SpMVmSyw=w>$r zP?qo-n4Z65(hi8%HIxgIKwH(EG-CuD6Nu@>e@&g+7sHf!c|w#&TZ5{OAFG&j+)5vq zFV49gu`yc##>@Fy$&-I_^fdq6I54_0>xEqF(m*-i?Sd);LHmd<9TAU%&DJ&iHknKp zZl@)8#RlX7o`NATFuWj$7{nHw@T<1);oG-%0phTWfGEgmh9^~6D7mIEeT`?2(fcfFL7UAL^EbWyA6db100jqgD#%Zr8XIlrq0??0Ybu3T z37pE$I(nD`iy3SdfDse*;qOi|>vne906@D@v2);zY6uFH_Lv4TrfG=2VOO-SLxm5f zci7p^Y(P)3EDlr#)cmbNF!;#1S`fI>iStto?u>GOUY!+}|EU8&gx?+|wKoB!Cgwx+Lv&M-y9j$#oqZV-SeSVMVT<3qpj5_pi zRzu%pZ&6JUiwBLqD3P;I(@^4e`o)E#)Ca=PEc_BV{}ZXpf8s|4_uNx7+GHdp9KtRY z0yzNx9?5~aj>n%t%3*aR*k!p0Z8Otjzckg^+|spg58(%PHR3LW6MWH!;}2lEY)0{% zxRcX5VI!A3befIU+V$CE>`-g!va+&9v=m#vag{lSXloVAbuc=0u9`V8FwoFvZqE=* z(_8DsI#*f|lbHSkqQq3plTBDyn2SpRX+KhZl9`z~j%5Sp9~i|AZB16&rGK1w36E#t z>Xg^+737+y3wrj6S8iV+!}h@rIZh-c;OBx-gzwx$l?eFwW#%vMgT+)5e+@pp`Ek$h z=Psl?{=z+V=E(koe?5MjdTsyF+`mZJ4`ymyyS5}1kn%S3k3WwpTc7@mQRKMQZU--k zV^59V?)_7HBd}Bqjjtmq_mtgN6oqkW2zN+HnMiXcb!l^-NtcZgfg3Bb!#Xc@>anR8 za&mCM`uYghLu9ODhY5FZf{w7Y`0Aj*=K4G=RWEQ{o~f;^jgtuWrr=7x?RyUPWYb*gVpKY(eA<1Gn~mk2j+e*Gxn z;n0o-$JXzVey~?8GN{l@gVV2|y@u#aL=QZz#Z~E!Z;P@Ln$vJ-h6h>A& z-E-)tPl-YiTgVjWW_ z+-CTNt%oQky7ev|l_C81%DOs$DGMy=X&=FQKD@Y2{8T*X(rUY^*~y&;WQAYFV4;@y z#*Xl?&EFDDE#lm*mrm=mmH+l02FhHQr@NK@eh-gt&hP$$dWzR0Jk%3(qF}aH->zQ# zVgrm)GY#d_cO|Y4CKz}iG*<8!Y>kU$Qd-Hu1KKo{l;fP{-_z8Z%e6WRQ z`gfOvJ*r#VK5tukgVDp~Z5*s8rKyEEuy{2G8stKx*+pKno_t*YM`}{4uM}Mw#hI~> zX02T2!)|Sgnd8^ch)ko7i5|yNvYi)#4(?xnM%qqTQDN9tQ;ybJr1CmM_{*?-O`*3i zFr#3!`nTO(u92|7@EnJg1}Ah)O*9B{aIL+*w=v4&As$#b));N_KC-tcO4w4{@kF>@ z)CzvhD2y}7*H4bCN2fh?fN!aIp?T08y);d!qh0%=y|!<@ubxU+zp-wBeTvb6$x-GmYOS}tw@A~aj!TJE*|OukgY-Ap z&I(V|&x#YC23_cJ1TRe2yOXA(RD#E4syRG72}eNP6%=Hv>d(Mcrt|*cEqD-wD}md+ zP`uFptbFg0saHer&7?w{xcD#%T}{Nn`YaieFxa)Jy*$%_z^~-P0&w=4hQ8w|$Tf}E zyt7OC9F-G%zB?^LdcA-B+kgq|gfeJ)+r9{8>ZQ(omQ$@#R&!b@wm^G6vx}lT-F+IkwwtbK5~z=L#rR(gW;1V zc~-9Luw<-|GcoeOop0$mvd>;GuR5^Co4R`$9{I>utHIzMh8w=}(LPnf1=;!dx9Rkv znXV}zYJN_b8>2Zk-hr(snwcP{fEl*b+^JUjKtngbz2%XrY=v&h@SE!^G0UH;Zf;tj zs{C~EQg_MPqT`aWFs{wVSJP5#7L8wuzQEfcJX^(BxrysIj_Kb7nw)fLJ6@{4V(((J*=>a5DnCt~V&qLM+u6v9rgnw_{fTS<8x(`}ZKC>Liu zRMEEY$kb&6xy`u|wzaXC#VF^(Sy2Q(66Ov!eS)hB+E|~*>?6@vDqbmwlhA}DISy79 zQEx0O<$%GK!DQKzrDWV<%5xO7RP8^%xl$>bwJ@AN|GP`1X3UmvdNoXS7_8;Rs3Tc; z%J2UjPT;9kAbO`E7VpEb;Y}TbU7x86H>S0h@TkFB=EfsJduRrev86jMgTd$HYHtc{ zq7C*il9rtJ;VN6q!D&Og1ULNe4Hj*7YCF7zKfL8LZKQXpTP`7Ox~kDavt?1-W{%9~ z*VT)WeXrZJocW72oNV!7=u5b3;q&zZMN(k_c74jLIUHRP0<@%)JvK@W89YK=4Iz4w zFi^)RCX&+3_)g)%t<3>v7(Cn1@!GNfL;E)o@Yu@v-;&7G%bjQ3Yy!Olxp2%y? zBo`l=v@)FyoC3c54Guw4|Loc`Q*VcZmwC-P(q&((7Fc#ZDCbAps!kXroD^Q}$$Iz# zpQqlI99Xom6jtgRx8v|e^FOY#%T2x|H-%Uop+Z@>-lg0JM<^ph%M?47$?2>iJC93k9W(ARO`5`l*_{lqxpFs2KIE3u+@d}%;~EMy7cUc@r8ZD z`zenYaho~UMGA%8a5-%|5*Sx5kfvTVsA|SSD#V6bACZd@v0+n~czfWu>E;HO_CWB1 z_K(j(np(bQkAH;aJ=netYws4HMQv}#7^*0%M>S0@XA+gOu6xU{ubtbnpZHlP2| zz9lIyH^P3h%!JhSqYJLT&h(I@C|5sf-=cCe+ucgO-tyNg{jf16*9=v1uC*(t#d#s7 zB}IXmOv7P1r&30Eb(mFMMR0RHm7|__x`LAOc|ElN&7mQQfD5^%z1f=UZ?*IrA{;Bj z%!F;4#TeVtRP86*3t*+_U+1Pth3_fFejyLM7^DBS%M+O zJr^o5>+m4UUqdK!-N4MzX?bknw#RC`glytioyD_xcn1|}daWno*$@_yv!fm-TSC>i zk}VP&6NCERR(zeDkkVIYDbaBczJpgx zKHo4uFxslWKWu`a7CsH!I%c?=jN2kG87}+(z=RRpVvpR1XgR zh}PQ-!-f&Dic>_~SYS>Jr^QZ##Y-#g=YxDmpKZ>~q9ufI@IL<_oH z%}V0YTm59;oy)|mC@Cp}J-KPs4>M=*xXH=&l}f!+tWFbRj1ec|I%W~%G_FNRTsAo@ ziq$tp3nOsh4krwJ$Xhr#VHiAFnqubg9wl`JerMdm_>JoV#%Hosb5oHs1$yw(L^;j% z@L|?hf>c9uj5@}^h*=Mb>@HLF$h83Qppbl5cVUbsdVZnB<@PDoGc%q3M3omwC5}d?}?LnWR1Tk3vt=Cf$!rP_k4u?c-f+HWW;IbyFLipgy{6B#@=LS=l`FY<`TV-iNAF)}1G`OzL-Y7*mPne?4DDZVSr} zZ(~_+%5c<5(KLcu0~@d0i@g_#N6{9Ohvl!eEXND-Y>e^=m8U$ATDeVeia!~*iUuGk4`Wwo68xYIcqqFR=5ZQ-( zd}@@;OYN{hfRY*2M3m>&uo*0O$A%5tssTmFs_s0FJ&a6SDVOCoVuuHOBW}}BRSQ|>IIH$Co|)AWvnTR8*u z`T$s72xIPZPF>8t? z8J=+;#BsSe)`MmP>+=mqj6_h1&OPI^GNbuC)w6u=c#RSjGFB%;2(sR5bbAQA$JH5P z1YltMXde)vByQAYJ8CkGSu#c>=&ew8MKcO>DT&GL1RIt8>tjmjPUn^>XQtz3ro5{` z-}2_yKfX89R}xd$`J>DIYDtMZLbHf@`rOV`=RB{{D$9;^;XjgdNq^{fYD=z)9<8G! zpHMAnf}8?YRoJmWFK{B4p@is`!Zh`@rdNOe8C99v<)?76$5T zh%mq=IrW_ho)hKARrDs_IEj|2wque@p=$7 zkSP&-YI7YE|6XfNc>UXJuzUhc0i>Lnx)h8`HSEcEKsoc+PPVg8v8*{3j|Az$z7Ks! zJ>ZRCuj#q;(LVd`CVpBaCpm0Lj!!t9s-xCYbL;HCnQVJ^v-7;P0=d{2pT6T1J_un# z&-rC=LGCmZ)U345k81NRkYp_4MU&}~1DQA6D+s{Fi_lMdg%|J!4nQTJwSIy(br?ue z!U}DS3Lq_ooKNt)mh@>3^ZV|Y$gt9fpFfQq$0*~<7cO7Hi$ufl9M$XRdvs=c1Q=v! z-kA?1#%$v0Z~$dG)a^`OXF4nfOr>~{w^(&%S`1{$L~%bb>qKjvFmn$cZJ-U&F%9Y$ z%xz_JZn{z#XX&KImmV@wN<=r^{Y2-D7BTNDT0Y#JTj!w;`d|i*`I?$ERgBvb7)=wI zpWSqqC8oaeMvQLVL3@(=U{)#3%;EIecVGzT)gb<`QBH z;!?xqnFL1ZVq}$HQJKz)z=N{s)r0i_6||P7{)~p9V5ScS9kD`I^L0|V#iCg@7v(mv z(kHtGs5U0fcc5@>0s0?dXC16uXA&w=TEb5$TL!)6o0@-LS>aZ*jMiLRMj_TZ^}@oq z)A%6M(%-GDSTtX6S`#d@KNzv5-2Kfq6IHnqm{nT`8)f5qPay{dNop*TsA!eEjSdoC zv&Y!SM2f^o0%g&cYa+gIqgT}1c(W404J*!JCt^D+e?K^_MgI|yZ}Vk(33GhAY7I~c zR}AkiOGkvV+%wmEl%tYk=_BYzLjh@Awr(9V`n}UCNDPt*SI`vW_`JfK+9#0Br8BER z_*EPth`!P^fL_;osWVL#IBuiOaT%GzryEVn-NxNX&5T+TaRS)X+Dw(xjqe892G}J- zgdA@!EuThN1{E}^dYBAN=P9*jXwrvLMoQBB!+lVGv}cEf6DgWV8w35=gk_cY4;&}d6ll5i}|oT|C3|+k1$8SCXKXL@h2A$s^F~OoY{6` zq)vlsBU%3=e)U%_>(?uKda!x_JH z>@#c00^=5Ti-3R)p&37(K&jQewioO8`%fO1_St-iW8U2~Sn{4f-Vu2^*|fL%yofdQ z`WfkO&ieS^7ZT_rA>Qe`%-*Vi92Mm0OEDG&c%Db-(`l?R7sB}S-%Pq< zW8>R_YyyLW$A5){fT!6?zwFPV;7O-Z+;3H6W5j1MI1TG7N#ups&DAf30F!R-drq&% zVbUg=kt9(QC4Mg&44%MqmBy{S=)_Wnoz^Lz{d1+li=#TQh)%pR2AF3{AOf!s<#x-- z@WtK9((U*pY!SKPRf*>LO?(H#2&in+=F{uTm)7fO!u7OknN+gBzyQ6o+0YzYmu>JY z1`nA|DI`4K41vsAp6Na2z;A0@Xxy0((T7w24vX3hI?AF`hm2JvAQzG?4@o!W>T*EUj}stMMrCUVu}~+m#V7`D3PaT!!AS zF^Fst=0CzQK%cK)sGiO9+g!XgeZxIBF0QvdR?MqCZ4$}`*6wSkkZ4dq&obi{d5vd`&TJiV>vvxC{ie_#N3q+WNG8?b}~ ze56`^ZWYtu4r=z@8V&{)GpaA8YG+Gl;cGJtN!!3@KHJ;7{+WzCy2J`I1hH(r$Esx> z)>h4go!&__7wp3nC^=nUU+QK~zRT2|Z?OnxA{p9>a$2ncsyl!lA^hla761k=BSrmg z?l|O{$RRTCgKQAjvouOB9;UcE2_z)gzz97r8Zsc}^!#ja0-`8f^CG|t_mli~rll?} zA~UM6%*@94;nG^gKFq-T=aipOoejd>R3aMIO{))-0-1x6gD)Io@NlEEl+urP@^71T zyh>HdJ0R+R4SoIxyd=fPf@-s!=1zKM^B^vY1w8qkSKGwPK4FXWx&QnX4Kwm0R17}b z1bY=1wvJ6u;v<#&XVWew?z~+{ADJ4gJhm{;Q@X&}NJU>~)O22@kFE|X$%l#pY|mWfdioW(130qiUY?6; zKnx2xa$}5q4^zhH87m8D$_wN4kwEf^2NjInvq*gOYBlw zMT(N5kzA8;nQM(*{|>;+*iPm~Rc?&*`b>gthJ}LVkDm=dApUawO&0JE6 zd~uNf@iOUEXNl<~VCx(&Wk1>!ZV4PF&a9^E^r9C^zE)}g^2{Hhn zJeC8Z2U9cFv^$}58$PlW&ee}op`iAK4|haJC0E>ev6`9T;8k}V1xpceyl|s{-CMCQ zvcY`nVcwn{?m+}TKXLiwugIE)Vj*VK9<8K;F`dTBi4RzdQ=^Hl~QlV$9F=Ai=Hd?Y7?W@j2^rXl__ zm^xO;JObV(>>ogU8=C^HM_Sm@=CR%lElEOC@DuX$9P_*rG;YvzU+K@x5B5VxAHd-@7Uu*ds|Ly|I|cBhe%x~8-a zR3UJ0@RU`b2%Z+Kp{-2!2kYHG&fOEZT=w%n7XY2&&Y$xyee%~<^%Hx}`n70NghNs*R@^a7`YRBTVTnCa<>oGyfuFm@`Y zIXVhIm>?4eOlv&(zzK}7He9^AW0NYLwxW-JmTFX?iOZ{FxlrzmV_;J*EjIj<7CazU(dO+i#({Q7ygEar26hzosD**ZuJr`xOV;F>W=khX}t`q zfomq4Z{gEB>nS;4hQy|}B#s$Yc{(ZPPg{YA@YZSZ+ouf&I-xyU@GkWZIcsp zGQuDRWnRkx6Fw35(Cefqg{Ygn$PhlO5XW!El(tv3Y_j7yf4Gc`4B4f%f56Ao(Z>wJjouJwLT)Xzo|J9PP7Y z~=b-wKQ;|3`d7T>s51r zlHDw~8)3qDxVf{h!D666diq3rW{KqzVk4l*lW;F!0o2XzczQ7GB%Q_ZpiD}}oB>n= zoXnn=W4b@f-1FWqn45Fk5?_?MM{-gsh;Bbo%H`=2Tal|^G36%I)e+s>Oq3okZ}u8a z)J?u(kmr0en>-t^QV1ZAaoILL&-XD2q}qx6WEu)iM!|;)ocgLm1Avb}U>z%kIF<#F zV7w9L4OnX0FdyRqoR;=-vZ7lWI1WxAk}R&F^UGqyE%LJle+e>^9)^ZP*RLO8uyJcAnx>l0_uJkB;8g z)J#E>gTYsQ?6v%h>aByQ#p+MD(& zb2aan7jcj=4*#<1_{m9p8oBtj8THHQNAixx+tu`FlqKt0h+kwvylR*dEhheyPutob z{GIt7*q{>vn1tyAopV-?Z6m)p$>bpFzn=CtKX-5xczScSWeiy<%0k{SfWZ^j3}5*w z{e;wiUXS=>atf9drff`>K_B^OW4GMx;M0!|3(?nm+|@*e+@$5N?B2hNX?Y^%zw8OC A!2kdN literal 165940 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

A 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 nubE?DSO9EB!|HX0hPM9 - - + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + - + - - + - - + - - + - - - - - - - - - + - + - - - - - - - - - - - - - - - - + - - + - - + - - - - - - - - - + @@ -146,174 +145,130 @@ - + - - - - - - - - - + - - - - - - - - - + - + + + + + + + + + - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + + + + + - - - - - - - - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + accounts = new HashMap<>(); diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/database/LotteryTicketInMemoryRepository.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/database/InMemoryTicketRepository.java similarity index 96% rename from hexagonal/src/main/java/com/iluwatar/hexagonal/database/LotteryTicketInMemoryRepository.java rename to hexagonal/src/main/java/com/iluwatar/hexagonal/database/InMemoryTicketRepository.java index fe17d8cdf..0d510b411 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/database/LotteryTicketInMemoryRepository.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/database/InMemoryTicketRepository.java @@ -34,7 +34,7 @@ import com.iluwatar.hexagonal.domain.LotteryTicketId; * Mock database for lottery tickets. * */ -public class LotteryTicketInMemoryRepository implements LotteryTicketRepository { +public class InMemoryTicketRepository implements LotteryTicketRepository { private static Map tickets = new HashMap<>(); diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotificationsImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/StdOutNotifications.java similarity index 97% rename from hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotificationsImpl.java rename to hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/StdOutNotifications.java index c59a47970..f6bd3b546 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotificationsImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/StdOutNotifications.java @@ -24,7 +24,7 @@ package com.iluwatar.hexagonal.notifications; import com.iluwatar.hexagonal.domain.PlayerDetails; -public class LotteryNotificationsImpl implements LotteryNotifications { +public class StdOutNotifications implements LotteryNotifications { @Override public void notifyTicketSubmitted(PlayerDetails details) { diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleService.java similarity index 94% rename from hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java rename to hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleService.java index c912bb0b4..6804f21c5 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleService.java @@ -36,7 +36,7 @@ import java.util.Optional; * Implementation for lottery service * */ -public class LotteryServiceImpl implements LotteryService { +public class ConsoleService implements LotteryService { private final LotterySystem lotterySystem; @@ -44,7 +44,7 @@ public class LotteryServiceImpl implements LotteryService { * Constructor */ @Inject - public LotteryServiceImpl(LotterySystem lotterySystem) { + public ConsoleService(LotterySystem lotterySystem) { this.lotterySystem = lotterySystem; } diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java index 5fbeb8240..c401467b5 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java @@ -23,18 +23,18 @@ package com.iluwatar.hexagonal; import com.google.inject.AbstractModule; +import com.iluwatar.hexagonal.administration.ConsoleAdministration; import com.iluwatar.hexagonal.administration.LotteryAdministration; -import com.iluwatar.hexagonal.administration.LotteryAdministrationImpl; +import com.iluwatar.hexagonal.banking.InMemoryBank; import com.iluwatar.hexagonal.banking.WireTransfers; -import com.iluwatar.hexagonal.banking.WireTransfersImpl; -import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; +import com.iluwatar.hexagonal.database.InMemoryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.domain.LotterySystem; import com.iluwatar.hexagonal.domain.LotterySystemImpl; import com.iluwatar.hexagonal.notifications.LotteryNotifications; -import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; +import com.iluwatar.hexagonal.notifications.StdOutNotifications; +import com.iluwatar.hexagonal.service.ConsoleService; import com.iluwatar.hexagonal.service.LotteryService; -import com.iluwatar.hexagonal.service.LotteryServiceImpl; /** * Guice module for testing dependencies @@ -42,11 +42,11 @@ import com.iluwatar.hexagonal.service.LotteryServiceImpl; public class LotteryTestingModule extends AbstractModule { @Override protected void configure() { - bind(LotteryTicketRepository.class).to(LotteryTicketInMemoryRepository.class); + bind(LotteryTicketRepository.class).to(InMemoryTicketRepository.class); bind(LotterySystem.class).to(LotterySystemImpl.class); - bind(LotteryNotifications.class).to(LotteryNotificationsImpl.class); - bind(WireTransfers.class).to(WireTransfersImpl.class); - bind(LotteryAdministration.class).to(LotteryAdministrationImpl.class); - bind(LotteryService.class).to(LotteryServiceImpl.class); + bind(LotteryNotifications.class).to(StdOutNotifications.class); + bind(WireTransfers.class).to(InMemoryBank.class); + bind(LotteryAdministration.class).to(ConsoleAdministration.class); + bind(LotteryService.class).to(ConsoleService.class); } } diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/WireTransfersTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/WireTransfersTest.java index 0274feca3..25fbf460c 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/WireTransfersTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/banking/WireTransfersTest.java @@ -34,7 +34,7 @@ import org.junit.Test; */ public class WireTransfersTest { - private final WireTransfers bank = new WireTransfersImpl(); + private final WireTransfers bank = new InMemoryBank(); @Test public void testInit() { diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/database/LotteryTicketRepositoryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/database/LotteryTicketRepositoryTest.java index b20e928c8..31cb8f5f0 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/database/LotteryTicketRepositoryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/database/LotteryTicketRepositoryTest.java @@ -30,8 +30,6 @@ import java.util.Optional; import org.junit.Before; import org.junit.Test; -import com.iluwatar.hexagonal.database.LotteryTicketRepository; -import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.test.LotteryTestUtils; @@ -43,7 +41,7 @@ import com.iluwatar.hexagonal.test.LotteryTestUtils; */ public class LotteryTicketRepositoryTest { - private final LotteryTicketRepository repository = new LotteryTicketInMemoryRepository(); + private final LotteryTicketRepository repository = new InMemoryTicketRepository(); @Before public void clear() { @@ -52,7 +50,7 @@ public class LotteryTicketRepositoryTest { @Test public void testCrudOperations() { - LotteryTicketRepository repository = new LotteryTicketInMemoryRepository(); + LotteryTicketRepository repository = new InMemoryTicketRepository(); assertEquals(repository.findAll().size(), 0); LotteryTicket ticket = LotteryTestUtils.createLotteryTicket(); Optional id = repository.save(ticket); diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java index 331cc0d66..732f98305 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java @@ -33,16 +33,11 @@ import java.util.Optional; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; -import com.iluwatar.hexagonal.LotteryModule; import com.iluwatar.hexagonal.LotteryTestingModule; -import com.iluwatar.hexagonal.domain.*; import org.junit.Before; import org.junit.Test; import com.iluwatar.hexagonal.banking.WireTransfers; -import com.iluwatar.hexagonal.banking.WireTransfersImpl; -import com.iluwatar.hexagonal.database.LotteryTicketRepository; -import com.iluwatar.hexagonal.database.LotteryTicketInMemoryRepository; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; import com.iluwatar.hexagonal.test.LotteryTestUtils; From adc6019c7e19a958fb775a073c61214f7ca01351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 10 Sep 2016 07:14:24 +0300 Subject: [PATCH 11/14] Hexagonal pattern: Remove interfaces with only one implementation --- hexagonal/etc/hexagonal.ucls | 6 +- .../com/iluwatar/hexagonal/LotteryModule.java | 8 -- .../administration/ConsoleAdministration.java | 61 ---------- .../administration/LotteryAdministration.java | 26 +++- .../hexagonal/domain/LotterySystem.java | 80 +++++++++++-- .../hexagonal/domain/LotterySystemImpl.java | 112 ------------------ .../hexagonal/service/ConsoleService.java | 60 ---------- .../hexagonal/service/LotteryService.java | 28 +++-- .../hexagonal/LotteryTestingModule.java | 8 -- 9 files changed, 115 insertions(+), 274 deletions(-) delete mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java delete mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java delete mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleService.java diff --git a/hexagonal/etc/hexagonal.ucls b/hexagonal/etc/hexagonal.ucls index 8f4481cbd..f698c0dd2 100644 --- a/hexagonal/etc/hexagonal.ucls +++ b/hexagonal/etc/hexagonal.ucls @@ -22,7 +22,7 @@ - @@ -62,7 +62,7 @@ - @@ -122,7 +122,7 @@ - diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java index 978d7ce9f..992e66357 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java @@ -23,17 +23,12 @@ package com.iluwatar.hexagonal; import com.google.inject.AbstractModule; -import com.iluwatar.hexagonal.administration.LotteryAdministration; -import com.iluwatar.hexagonal.administration.ConsoleAdministration; import com.iluwatar.hexagonal.banking.InMemoryBank; import com.iluwatar.hexagonal.banking.WireTransfers; import com.iluwatar.hexagonal.database.InMemoryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository; -import com.iluwatar.hexagonal.domain.LotterySystem; -import com.iluwatar.hexagonal.domain.LotterySystemImpl; import com.iluwatar.hexagonal.notifications.LotteryNotifications; import com.iluwatar.hexagonal.notifications.StdOutNotifications; -import com.iluwatar.hexagonal.service.ConsoleService; import com.iluwatar.hexagonal.service.LotteryService; /** @@ -43,10 +38,7 @@ public class LotteryModule extends AbstractModule { @Override protected void configure() { bind(LotteryTicketRepository.class).to(InMemoryTicketRepository.class); - bind(LotterySystem.class).to(LotterySystemImpl.class); bind(LotteryNotifications.class).to(StdOutNotifications.class); bind(WireTransfers.class).to(InMemoryBank.class); - bind(LotteryAdministration.class).to(ConsoleAdministration.class); - bind(LotteryService.class).to(ConsoleService.class); } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java deleted file mode 100644 index 1526fc8d6..000000000 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * The MIT License - * Copyright (c) 2014 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.hexagonal.administration; - -import com.google.inject.Inject; -import com.iluwatar.hexagonal.domain.LotteryNumbers; -import com.iluwatar.hexagonal.domain.LotterySystem; -import com.iluwatar.hexagonal.domain.LotteryTicket; -import com.iluwatar.hexagonal.domain.LotteryTicketId; - -import java.util.Map; - -/** - * - * Lottery administration implementation - * - */ -public class ConsoleAdministration implements LotteryAdministration { - - private final LotterySystem lotterySystem; - - @Inject - public ConsoleAdministration(LotterySystem lotterySystem) { - this.lotterySystem = lotterySystem; - } - - @Override - public Map getAllSubmittedTickets() { - return lotterySystem.getAllSubmittedTickets(); - } - - @Override - public LotteryNumbers performLottery() { - return lotterySystem.performLottery(); - } - - @Override - public void resetLottery() { - lotterySystem.resetLottery(); - } -} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java index c6c034ac9..a59461a48 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java @@ -22,7 +22,9 @@ */ package com.iluwatar.hexagonal.administration; +import com.google.inject.Inject; import com.iluwatar.hexagonal.domain.LotteryNumbers; +import com.iluwatar.hexagonal.domain.LotterySystem; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketId; @@ -30,24 +32,36 @@ import java.util.Map; /** * - * Administrator interface for lottery service. + * Lottery administration implementation * */ -public interface LotteryAdministration { +public class LotteryAdministration { + + private final LotterySystem lotterySystem; + + @Inject + public LotteryAdministration(LotterySystem lotterySystem) { + this.lotterySystem = lotterySystem; + } /** * Get all the lottery tickets submitted for lottery */ - Map getAllSubmittedTickets(); + public Map getAllSubmittedTickets() { + return lotterySystem.getAllSubmittedTickets(); + } /** * Draw lottery numbers */ - LotteryNumbers performLottery(); + public LotteryNumbers performLottery() { + return lotterySystem.performLottery(); + } /** * Begin new lottery round */ - void resetLottery(); - + public void resetLottery() { + lotterySystem.resetLottery(); + } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java index 2ee114556..ed58c82db 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java @@ -22,37 +22,101 @@ */ package com.iluwatar.hexagonal.domain; +import com.google.inject.Inject; +import com.iluwatar.hexagonal.banking.WireTransfers; +import com.iluwatar.hexagonal.database.LotteryTicketRepository; +import com.iluwatar.hexagonal.notifications.LotteryNotifications; + import java.util.Map; import java.util.Optional; /** - * Lottery system interface + * Lottery system */ -public interface LotterySystem { +public class LotterySystem { + + private final LotteryTicketRepository repository; + private final LotteryNotifications notifications; + private final WireTransfers wireTransfers; + + /** + * Constructor + */ + @Inject + public LotterySystem(LotteryTicketRepository repository, LotteryNotifications notifications, + WireTransfers wireTransfers) { + this.repository = repository; + this.notifications = notifications; + this.wireTransfers = wireTransfers; + } /** * Get all the lottery tickets submitted for lottery */ - Map getAllSubmittedTickets(); + public Map getAllSubmittedTickets() { + return repository.findAll(); + } /** * Draw lottery numbers */ - LotteryNumbers performLottery(); + public LotteryNumbers performLottery() { + LotteryNumbers numbers = LotteryNumbers.createRandom(); + Map tickets = getAllSubmittedTickets(); + for (LotteryTicketId id : tickets.keySet()) { + LotteryTicketCheckResult result = checkTicketForPrize(id, numbers); + if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { + boolean transferred = wireTransfers.transferFunds(LotteryConstants.PRIZE_AMOUNT, + LotteryConstants.SERVICE_BANK_ACCOUNT, tickets.get(id).getPlayerDetails().getBankAccount()); + if (transferred) { + notifications.notifyPrize(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); + } else { + notifications.notifyPrizeError(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); + } + } else if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.NO_PRIZE)) { + notifications.notifyNoWin(tickets.get(id).getPlayerDetails()); + } + } + return numbers; + } /** * Begin new lottery round */ - void resetLottery(); + public void resetLottery() { + repository.deleteAll(); + } /** * Submit lottery ticket to participate in the lottery */ - Optional submitTicket(LotteryTicket ticket); + public Optional submitTicket(LotteryTicket ticket) { + boolean result = wireTransfers.transferFunds(LotteryConstants.TICKET_PRIZE, + ticket.getPlayerDetails().getBankAccount(), LotteryConstants.SERVICE_BANK_ACCOUNT); + if (result == false) { + notifications.notifyTicketSubmitError(ticket.getPlayerDetails()); + return Optional.empty(); + } + Optional optional = repository.save(ticket); + if (optional.isPresent()) { + notifications.notifyTicketSubmitted(ticket.getPlayerDetails()); + } + return optional; + } /** * Check if lottery ticket has won */ - LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers); - + public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { + Optional optional = repository.findById(id); + if (optional.isPresent()) { + if (optional.get().getNumbers().equals(winningNumbers)) { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.WIN_PRIZE, 1000); + } else { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.NO_PRIZE); + } + } else { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.TICKET_NOT_SUBMITTED); + } + } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java deleted file mode 100644 index e37185143..000000000 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystemImpl.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * The MIT License - * Copyright (c) 2014 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.hexagonal.domain; - -import com.google.inject.Inject; -import com.iluwatar.hexagonal.banking.WireTransfers; -import com.iluwatar.hexagonal.database.LotteryTicketRepository; -import com.iluwatar.hexagonal.notifications.LotteryNotifications; - -import java.util.Map; -import java.util.Optional; - -/** - * Lottery system implementation - */ -public class LotterySystemImpl implements LotterySystem { - - private final LotteryTicketRepository repository; - private final LotteryNotifications notifications; - private final WireTransfers wireTransfers; - - /** - * Constructor - */ - @Inject - public LotterySystemImpl(LotteryTicketRepository repository, LotteryNotifications notifications, - WireTransfers wireTransfers) { - this.repository = repository; - this.notifications = notifications; - this.wireTransfers = wireTransfers; - } - - @Override - public Map getAllSubmittedTickets() { - return repository.findAll(); - } - - @Override - public LotteryNumbers performLottery() { - LotteryNumbers numbers = LotteryNumbers.createRandom(); - Map tickets = getAllSubmittedTickets(); - for (LotteryTicketId id : tickets.keySet()) { - LotteryTicketCheckResult result = checkTicketForPrize(id, numbers); - if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { - boolean transferred = wireTransfers.transferFunds(LotteryConstants.PRIZE_AMOUNT, - LotteryConstants.SERVICE_BANK_ACCOUNT, tickets.get(id).getPlayerDetails().getBankAccount()); - if (transferred) { - notifications.notifyPrize(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); - } else { - notifications.notifyPrizeError(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT); - } - } else if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.NO_PRIZE)) { - notifications.notifyNoWin(tickets.get(id).getPlayerDetails()); - } - } - return numbers; - } - - @Override - public void resetLottery() { - repository.deleteAll(); - } - - @Override - public Optional submitTicket(LotteryTicket ticket) { - boolean result = wireTransfers.transferFunds(LotteryConstants.TICKET_PRIZE, - ticket.getPlayerDetails().getBankAccount(), LotteryConstants.SERVICE_BANK_ACCOUNT); - if (result == false) { - notifications.notifyTicketSubmitError(ticket.getPlayerDetails()); - return Optional.empty(); - } - Optional optional = repository.save(ticket); - if (optional.isPresent()) { - notifications.notifyTicketSubmitted(ticket.getPlayerDetails()); - } - return optional; - } - - @Override - public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { - Optional optional = repository.findById(id); - if (optional.isPresent()) { - if (optional.get().getNumbers().equals(winningNumbers)) { - return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.WIN_PRIZE, 1000); - } else { - return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.NO_PRIZE); - } - } else { - return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.TICKET_NOT_SUBMITTED); - } - } -} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleService.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleService.java deleted file mode 100644 index 6804f21c5..000000000 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleService.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * The MIT License - * Copyright (c) 2014 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.hexagonal.service; - -import com.google.inject.Inject; -import com.iluwatar.hexagonal.domain.LotteryNumbers; -import com.iluwatar.hexagonal.domain.LotterySystem; -import com.iluwatar.hexagonal.domain.LotteryTicket; -import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; -import com.iluwatar.hexagonal.domain.LotteryTicketId; - -import java.util.Optional; - -/** - * - * Implementation for lottery service - * - */ -public class ConsoleService implements LotteryService { - - private final LotterySystem lotterySystem; - - /** - * Constructor - */ - @Inject - public ConsoleService(LotterySystem lotterySystem) { - this.lotterySystem = lotterySystem; - } - - @Override - public Optional submitTicket(LotteryTicket ticket) { - return lotterySystem.submitTicket(ticket); - } - - @Override - public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { - return lotterySystem.checkTicketForPrize(id, winningNumbers); - } -} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java index ef2202968..80d306b04 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java @@ -22,27 +22,39 @@ */ package com.iluwatar.hexagonal.service; -import com.iluwatar.hexagonal.domain.LotteryNumbers; -import com.iluwatar.hexagonal.domain.LotteryTicket; -import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; -import com.iluwatar.hexagonal.domain.LotteryTicketId; +import com.google.inject.Inject; +import com.iluwatar.hexagonal.domain.*; import java.util.Optional; /** * - * Interface for submitting and checking lottery tickets. + * Implementation for lottery service * */ -public interface LotteryService { +public class LotteryService { + + private final LotterySystem lotterySystem; + + /** + * Constructor + */ + @Inject + public LotteryService(LotterySystem lotterySystem) { + this.lotterySystem = lotterySystem; + } /** * Submit lottery ticket to participate in the lottery */ - Optional submitTicket(LotteryTicket ticket); + public Optional submitTicket(LotteryTicket ticket) { + return lotterySystem.submitTicket(ticket); + } /** * Check if lottery ticket has won */ - LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers); + public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { + return lotterySystem.checkTicketForPrize(id, winningNumbers); + } } diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java index c401467b5..252e3e66d 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java @@ -23,17 +23,12 @@ package com.iluwatar.hexagonal; import com.google.inject.AbstractModule; -import com.iluwatar.hexagonal.administration.ConsoleAdministration; -import com.iluwatar.hexagonal.administration.LotteryAdministration; import com.iluwatar.hexagonal.banking.InMemoryBank; import com.iluwatar.hexagonal.banking.WireTransfers; import com.iluwatar.hexagonal.database.InMemoryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository; -import com.iluwatar.hexagonal.domain.LotterySystem; -import com.iluwatar.hexagonal.domain.LotterySystemImpl; import com.iluwatar.hexagonal.notifications.LotteryNotifications; import com.iluwatar.hexagonal.notifications.StdOutNotifications; -import com.iluwatar.hexagonal.service.ConsoleService; import com.iluwatar.hexagonal.service.LotteryService; /** @@ -43,10 +38,7 @@ public class LotteryTestingModule extends AbstractModule { @Override protected void configure() { bind(LotteryTicketRepository.class).to(InMemoryTicketRepository.class); - bind(LotterySystem.class).to(LotterySystemImpl.class); bind(LotteryNotifications.class).to(StdOutNotifications.class); bind(WireTransfers.class).to(InMemoryBank.class); - bind(LotteryAdministration.class).to(ConsoleAdministration.class); - bind(LotteryService.class).to(ConsoleService.class); } } From 121ed3cca896d5870225565e50142c23f2cd4f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 10 Sep 2016 07:56:37 +0300 Subject: [PATCH 12/14] Hexagonal pattern: Move lottery administration and service to the core. Introduce console interfaces for players and administartors. --- hexagonal/etc/hexagonal.ucls | 8 +-- .../main/java/com/iluwatar/hexagonal/App.java | 4 +- .../com/iluwatar/hexagonal/LotteryModule.java | 1 - .../administration/ConsoleAdministration.java | 7 ++ .../administration/LotteryAdministration.java | 67 ------------------- ...System.java => LotteryAdministration.java} | 51 +++----------- .../{service => domain}/LotteryService.java | 33 +++++++-- .../domain/LotteryTicketChecker.java | 33 +++++++++ .../hexagonal/service/ConsoleLottery.java | 7 ++ .../hexagonal/LotteryTestingModule.java | 1 - .../hexagonal/domain/LotteryTest.java | 28 ++++---- 11 files changed, 103 insertions(+), 137 deletions(-) create mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java delete mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java rename hexagonal/src/main/java/com/iluwatar/hexagonal/domain/{LotterySystem.java => LotteryAdministration.java} (64%) rename hexagonal/src/main/java/com/iluwatar/hexagonal/{service => domain}/LotteryService.java (55%) create mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketChecker.java create mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java diff --git a/hexagonal/etc/hexagonal.ucls b/hexagonal/etc/hexagonal.ucls index f698c0dd2..0318576c2 100644 --- a/hexagonal/etc/hexagonal.ucls +++ b/hexagonal/etc/hexagonal.ucls @@ -62,7 +62,7 @@ - @@ -102,7 +102,7 @@ - @@ -122,7 +122,7 @@ - @@ -142,7 +142,7 @@ - diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java index a1bb26454..83ae15032 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java @@ -28,13 +28,13 @@ import java.util.Random; import com.google.inject.Guice; import com.google.inject.Injector; -import com.iluwatar.hexagonal.administration.LotteryAdministration; +import com.iluwatar.hexagonal.domain.LotteryAdministration; import com.iluwatar.hexagonal.banking.InMemoryBank; import com.iluwatar.hexagonal.domain.LotteryConstants; import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.PlayerDetails; -import com.iluwatar.hexagonal.service.LotteryService; +import com.iluwatar.hexagonal.domain.LotteryService; /** * diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java index 992e66357..dbaf494c2 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java @@ -29,7 +29,6 @@ import com.iluwatar.hexagonal.database.InMemoryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.notifications.LotteryNotifications; import com.iluwatar.hexagonal.notifications.StdOutNotifications; -import com.iluwatar.hexagonal.service.LotteryService; /** * Guice module for binding production dependencies diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java new file mode 100644 index 000000000..5238edd24 --- /dev/null +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java @@ -0,0 +1,7 @@ +package com.iluwatar.hexagonal.administration; + +/** + * Console interface for lottery administration + */ +public class ConsoleAdministration { +} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java deleted file mode 100644 index a59461a48..000000000 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/LotteryAdministration.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * The MIT License - * Copyright (c) 2014 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.hexagonal.administration; - -import com.google.inject.Inject; -import com.iluwatar.hexagonal.domain.LotteryNumbers; -import com.iluwatar.hexagonal.domain.LotterySystem; -import com.iluwatar.hexagonal.domain.LotteryTicket; -import com.iluwatar.hexagonal.domain.LotteryTicketId; - -import java.util.Map; - -/** - * - * Lottery administration implementation - * - */ -public class LotteryAdministration { - - private final LotterySystem lotterySystem; - - @Inject - public LotteryAdministration(LotterySystem lotterySystem) { - this.lotterySystem = lotterySystem; - } - - /** - * Get all the lottery tickets submitted for lottery - */ - public Map getAllSubmittedTickets() { - return lotterySystem.getAllSubmittedTickets(); - } - - /** - * Draw lottery numbers - */ - public LotteryNumbers performLottery() { - return lotterySystem.performLottery(); - } - - /** - * Begin new lottery round - */ - public void resetLottery() { - lotterySystem.resetLottery(); - } -} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryAdministration.java similarity index 64% rename from hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java rename to hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryAdministration.java index ed58c82db..7117397d3 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotterySystem.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryAdministration.java @@ -28,26 +28,26 @@ import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.notifications.LotteryNotifications; import java.util.Map; -import java.util.Optional; /** - * Lottery system + * + * Lottery administration implementation + * */ -public class LotterySystem { +public class LotteryAdministration { private final LotteryTicketRepository repository; private final LotteryNotifications notifications; private final WireTransfers wireTransfers; + private final LotteryTicketChecker checker; - /** - * Constructor - */ @Inject - public LotterySystem(LotteryTicketRepository repository, LotteryNotifications notifications, - WireTransfers wireTransfers) { + public LotteryAdministration(LotteryTicketRepository repository, LotteryNotifications notifications, + WireTransfers wireTransfers) { this.repository = repository; this.notifications = notifications; this.wireTransfers = wireTransfers; + this.checker = new LotteryTicketChecker(this.repository); } /** @@ -64,7 +64,7 @@ public class LotterySystem { LotteryNumbers numbers = LotteryNumbers.createRandom(); Map tickets = getAllSubmittedTickets(); for (LotteryTicketId id : tickets.keySet()) { - LotteryTicketCheckResult result = checkTicketForPrize(id, numbers); + LotteryTicketCheckResult result = checker.checkTicketForPrize(id, numbers); if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { boolean transferred = wireTransfers.transferFunds(LotteryConstants.PRIZE_AMOUNT, LotteryConstants.SERVICE_BANK_ACCOUNT, tickets.get(id).getPlayerDetails().getBankAccount()); @@ -86,37 +86,4 @@ public class LotterySystem { public void resetLottery() { repository.deleteAll(); } - - /** - * Submit lottery ticket to participate in the lottery - */ - public Optional submitTicket(LotteryTicket ticket) { - boolean result = wireTransfers.transferFunds(LotteryConstants.TICKET_PRIZE, - ticket.getPlayerDetails().getBankAccount(), LotteryConstants.SERVICE_BANK_ACCOUNT); - if (result == false) { - notifications.notifyTicketSubmitError(ticket.getPlayerDetails()); - return Optional.empty(); - } - Optional optional = repository.save(ticket); - if (optional.isPresent()) { - notifications.notifyTicketSubmitted(ticket.getPlayerDetails()); - } - return optional; - } - - /** - * Check if lottery ticket has won - */ - public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { - Optional optional = repository.findById(id); - if (optional.isPresent()) { - if (optional.get().getNumbers().equals(winningNumbers)) { - return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.WIN_PRIZE, 1000); - } else { - return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.NO_PRIZE); - } - } else { - return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.TICKET_NOT_SUBMITTED); - } - } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryService.java similarity index 55% rename from hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java rename to hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryService.java index 80d306b04..76cd47d1d 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryService.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryService.java @@ -20,10 +20,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.hexagonal.service; +package com.iluwatar.hexagonal.domain; import com.google.inject.Inject; -import com.iluwatar.hexagonal.domain.*; +import com.iluwatar.hexagonal.banking.WireTransfers; +import com.iluwatar.hexagonal.database.LotteryTicketRepository; +import com.iluwatar.hexagonal.notifications.LotteryNotifications; import java.util.Optional; @@ -34,27 +36,44 @@ import java.util.Optional; */ public class LotteryService { - private final LotterySystem lotterySystem; + private final LotteryTicketRepository repository; + private final LotteryNotifications notifications; + private final WireTransfers wireTransfers; + private final LotteryTicketChecker checker; /** * Constructor */ @Inject - public LotteryService(LotterySystem lotterySystem) { - this.lotterySystem = lotterySystem; + public LotteryService(LotteryTicketRepository repository, LotteryNotifications notifications, + WireTransfers wireTransfers) { + this.repository = repository; + this.notifications = notifications; + this.wireTransfers = wireTransfers; + this.checker = new LotteryTicketChecker(this.repository); } /** * Submit lottery ticket to participate in the lottery */ public Optional submitTicket(LotteryTicket ticket) { - return lotterySystem.submitTicket(ticket); + boolean result = wireTransfers.transferFunds(LotteryConstants.TICKET_PRIZE, + ticket.getPlayerDetails().getBankAccount(), LotteryConstants.SERVICE_BANK_ACCOUNT); + if (result == false) { + notifications.notifyTicketSubmitError(ticket.getPlayerDetails()); + return Optional.empty(); + } + Optional optional = repository.save(ticket); + if (optional.isPresent()) { + notifications.notifyTicketSubmitted(ticket.getPlayerDetails()); + } + return optional; } /** * Check if lottery ticket has won */ public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { - return lotterySystem.checkTicketForPrize(id, winningNumbers); + return checker.checkTicketForPrize(id, winningNumbers); } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketChecker.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketChecker.java new file mode 100644 index 000000000..10042528b --- /dev/null +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketChecker.java @@ -0,0 +1,33 @@ +package com.iluwatar.hexagonal.domain; + +import com.iluwatar.hexagonal.database.LotteryTicketRepository; + +import java.util.Optional; + +/** + * Lottery ticket checker + */ +public class LotteryTicketChecker { + + private final LotteryTicketRepository repository; + + public LotteryTicketChecker(LotteryTicketRepository repository) { + this.repository = repository; + } + + /** + * Check if lottery ticket has won + */ + public LotteryTicketCheckResult checkTicketForPrize(LotteryTicketId id, LotteryNumbers winningNumbers) { + Optional optional = repository.findById(id); + if (optional.isPresent()) { + if (optional.get().getNumbers().equals(winningNumbers)) { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.WIN_PRIZE, 1000); + } else { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.NO_PRIZE); + } + } else { + return new LotteryTicketCheckResult(LotteryTicketCheckResult.CheckResult.TICKET_NOT_SUBMITTED); + } + } +} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java new file mode 100644 index 000000000..e48410982 --- /dev/null +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java @@ -0,0 +1,7 @@ +package com.iluwatar.hexagonal.service; + +/** + * Console interface for lottery players + */ +public class ConsoleLottery { +} diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java index 252e3e66d..22bfa8f01 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java @@ -29,7 +29,6 @@ import com.iluwatar.hexagonal.database.InMemoryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.notifications.LotteryNotifications; import com.iluwatar.hexagonal.notifications.StdOutNotifications; -import com.iluwatar.hexagonal.service.LotteryService; /** * Guice module for testing dependencies diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java index 732f98305..ed6f8d180 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java @@ -50,7 +50,9 @@ public class LotteryTest { private Injector injector; @Inject - private LotterySystem lotterySystem; + private LotteryAdministration administration; + @Inject + private LotteryService service; @Inject private WireTransfers wireTransfers; @@ -68,34 +70,34 @@ public class LotteryTest { @Test public void testLottery() { // admin resets the lottery - lotterySystem.resetLottery(); - assertEquals(lotterySystem.getAllSubmittedTickets().size(), 0); + administration.resetLottery(); + assertEquals(administration.getAllSubmittedTickets().size(), 0); // players submit the lottery tickets - Optional ticket1 = lotterySystem.submitTicket(LotteryTestUtils.createLotteryTicket("cvt@bbb.com", + Optional ticket1 = service.submitTicket(LotteryTestUtils.createLotteryTicket("cvt@bbb.com", "123-12312", "+32425255", new HashSet<>(Arrays.asList(1, 2, 3, 4)))); assertTrue(ticket1.isPresent()); - Optional ticket2 = lotterySystem.submitTicket(LotteryTestUtils.createLotteryTicket("ant@bac.com", + Optional ticket2 = service.submitTicket(LotteryTestUtils.createLotteryTicket("ant@bac.com", "123-12312", "+32423455", new HashSet<>(Arrays.asList(11, 12, 13, 14)))); assertTrue(ticket2.isPresent()); - Optional ticket3 = lotterySystem.submitTicket(LotteryTestUtils.createLotteryTicket("arg@boo.com", + Optional ticket3 = service.submitTicket(LotteryTestUtils.createLotteryTicket("arg@boo.com", "123-12312", "+32421255", new HashSet<>(Arrays.asList(6, 8, 13, 19)))); assertTrue(ticket3.isPresent()); - assertEquals(lotterySystem.getAllSubmittedTickets().size(), 3); + assertEquals(administration.getAllSubmittedTickets().size(), 3); // perform lottery - LotteryNumbers winningNumbers = lotterySystem.performLottery(); + LotteryNumbers winningNumbers = administration.performLottery(); // cheat a bit for testing sake, use winning numbers to submit another ticket - Optional ticket4 = lotterySystem.submitTicket(LotteryTestUtils.createLotteryTicket("lucky@orb.com", + Optional ticket4 = service.submitTicket(LotteryTestUtils.createLotteryTicket("lucky@orb.com", "123-12312", "+12421255", winningNumbers.getNumbers())); assertTrue(ticket4.isPresent()); - assertEquals(lotterySystem.getAllSubmittedTickets().size(), 4); + assertEquals(administration.getAllSubmittedTickets().size(), 4); // check winners - Map tickets = lotterySystem.getAllSubmittedTickets(); + Map tickets = administration.getAllSubmittedTickets(); for (LotteryTicketId id: tickets.keySet()) { - LotteryTicketCheckResult checkResult = lotterySystem.checkTicketForPrize(id, winningNumbers); + LotteryTicketCheckResult checkResult = service.checkTicketForPrize(id, winningNumbers); assertTrue(checkResult.getResult() != CheckResult.TICKET_NOT_SUBMITTED); if (checkResult.getResult().equals(CheckResult.WIN_PRIZE)) { assertTrue(checkResult.getPrizeAmount() > 0); @@ -105,7 +107,7 @@ public class LotteryTest { } // check another ticket that has not been submitted - LotteryTicketCheckResult checkResult = lotterySystem.checkTicketForPrize(new LotteryTicketId(), winningNumbers); + LotteryTicketCheckResult checkResult = service.checkTicketForPrize(new LotteryTicketId(), winningNumbers); assertTrue(checkResult.getResult() == CheckResult.TICKET_NOT_SUBMITTED); assertEquals(checkResult.getPrizeAmount(), 0); } From e17d72bca81523ae4521cc4b198e72980aad8b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 10 Sep 2016 14:28:05 +0300 Subject: [PATCH 13/14] Hexagonal pattern: Added console interfaces for players and administration. --- .../main/java/com/iluwatar/hexagonal/App.java | 81 +---------- .../administration/ConsoleAdministration.java | 77 +++++++++++ .../domain/LotteryAdministration.java | 3 + .../hexagonal/domain/LotteryNumbers.java | 7 +- .../hexagonal/domain/LotteryTicket.java | 5 + .../domain/LotteryTicketChecker.java | 22 +++ .../hexagonal/domain/LotteryTicketId.java | 9 ++ .../hexagonal/domain/PlayerDetails.java | 7 + .../hexagonal/{ => module}/LotteryModule.java | 2 +- .../module}/LotteryTestingModule.java | 2 +- .../hexagonal/sampledata/SampleData.java | 107 ++++++++++++++ .../hexagonal/service/ConsoleLottery.java | 130 ++++++++++++++++++ .../hexagonal/domain/LotteryTest.java | 2 +- 13 files changed, 374 insertions(+), 80 deletions(-) rename hexagonal/src/main/java/com/iluwatar/hexagonal/{ => module}/LotteryModule.java (97%) rename hexagonal/src/{test/java/com/iluwatar/hexagonal => main/java/com/iluwatar/hexagonal/module}/LotteryTestingModule.java (97%) create mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/sampledata/SampleData.java diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java index 83ae15032..a7d31446b 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java @@ -22,19 +22,12 @@ */ package com.iluwatar.hexagonal; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - import com.google.inject.Guice; import com.google.inject.Injector; import com.iluwatar.hexagonal.domain.LotteryAdministration; -import com.iluwatar.hexagonal.banking.InMemoryBank; -import com.iluwatar.hexagonal.domain.LotteryConstants; -import com.iluwatar.hexagonal.domain.LotteryNumbers; -import com.iluwatar.hexagonal.domain.LotteryTicket; -import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.domain.LotteryService; +import com.iluwatar.hexagonal.module.LotteryTestingModule; +import com.iluwatar.hexagonal.sampledata.SampleData; /** * @@ -68,64 +61,13 @@ import com.iluwatar.hexagonal.domain.LotteryService; * */ public class App { - - private static final List PLAYERS; - - static { - PLAYERS = new ArrayList<>(); - PLAYERS.add(PlayerDetails.create("john@google.com", "312-342", "+3242434242")); - PLAYERS.add(PlayerDetails.create("mary@google.com", "234-987", "+23452346")); - PLAYERS.add(PlayerDetails.create("steve@google.com", "833-836", "+63457543")); - PLAYERS.add(PlayerDetails.create("wayne@google.com", "319-826", "+24626")); - PLAYERS.add(PlayerDetails.create("johnie@google.com", "983-322", "+3635635")); - PLAYERS.add(PlayerDetails.create("andy@google.com", "934-734", "+0898245")); - PLAYERS.add(PlayerDetails.create("richard@google.com", "536-738", "+09845325")); - PLAYERS.add(PlayerDetails.create("kevin@google.com", "453-936", "+2423532")); - PLAYERS.add(PlayerDetails.create("arnold@google.com", "114-988", "+5646346524")); - PLAYERS.add(PlayerDetails.create("ian@google.com", "663-765", "+928394235")); - PLAYERS.add(PlayerDetails.create("robin@google.com", "334-763", "+35448")); - PLAYERS.add(PlayerDetails.create("ted@google.com", "735-964", "+98752345")); - PLAYERS.add(PlayerDetails.create("larry@google.com", "734-853", "+043842423")); - PLAYERS.add(PlayerDetails.create("calvin@google.com", "334-746", "+73294135")); - PLAYERS.add(PlayerDetails.create("jacob@google.com", "444-766", "+358042354")); - PLAYERS.add(PlayerDetails.create("edwin@google.com", "895-345", "+9752435")); - PLAYERS.add(PlayerDetails.create("mary@google.com", "760-009", "+34203542")); - PLAYERS.add(PlayerDetails.create("lolita@google.com", "425-907", "+9872342")); - PLAYERS.add(PlayerDetails.create("bruno@google.com", "023-638", "+673824122")); - PLAYERS.add(PlayerDetails.create("peter@google.com", "335-886", "+5432503945")); - PLAYERS.add(PlayerDetails.create("warren@google.com", "225-946", "+9872341324")); - PLAYERS.add(PlayerDetails.create("monica@google.com", "265-748", "+134124")); - PLAYERS.add(PlayerDetails.create("ollie@google.com", "190-045", "+34453452")); - PLAYERS.add(PlayerDetails.create("yngwie@google.com", "241-465", "+9897641231")); - PLAYERS.add(PlayerDetails.create("lars@google.com", "746-936", "+42345298345")); - PLAYERS.add(PlayerDetails.create("bobbie@google.com", "946-384", "+79831742")); - PLAYERS.add(PlayerDetails.create("tyron@google.com", "310-992", "+0498837412")); - PLAYERS.add(PlayerDetails.create("tyrell@google.com", "032-045", "+67834134")); - PLAYERS.add(PlayerDetails.create("nadja@google.com", "000-346", "+498723")); - PLAYERS.add(PlayerDetails.create("wendy@google.com", "994-989", "+987324454")); - PLAYERS.add(PlayerDetails.create("luke@google.com", "546-634", "+987642435")); - PLAYERS.add(PlayerDetails.create("bjorn@google.com", "342-874", "+7834325")); - PLAYERS.add(PlayerDetails.create("lisa@google.com", "024-653", "+980742154")); - PLAYERS.add(PlayerDetails.create("anton@google.com", "834-935", "+876423145")); - PLAYERS.add(PlayerDetails.create("bruce@google.com", "284-936", "+09843212345")); - PLAYERS.add(PlayerDetails.create("ray@google.com", "843-073", "+678324123")); - PLAYERS.add(PlayerDetails.create("ron@google.com", "637-738", "+09842354")); - PLAYERS.add(PlayerDetails.create("xavier@google.com", "143-947", "+375245")); - PLAYERS.add(PlayerDetails.create("harriet@google.com", "842-404", "+131243252")); - InMemoryBank wireTransfers = new InMemoryBank(); - Random random = new Random(); - for (int i = 0; i < PLAYERS.size(); i++) { - wireTransfers.setFunds(PLAYERS.get(i).getBankAccount(), - random.nextInt(LotteryConstants.PLAYER_MAX_SALDO)); - } - } - + /** * Program entry point */ public static void main(String[] args) { - Injector injector = Guice.createInjector(new LotteryModule()); + Injector injector = Guice.createInjector(new LotteryTestingModule()); // start new lottery round LotteryAdministration administartion = injector.getInstance(LotteryAdministration.class); @@ -133,22 +75,9 @@ public class App { // submit some lottery tickets LotteryService service = injector.getInstance(LotteryService.class); - submitTickets(service, 20); + SampleData.submitTickets(service, 20); // perform lottery administartion.performLottery(); } - - private static void submitTickets(LotteryService lotteryService, int numTickets) { - for (int i = 0; i < numTickets; i++) { - LotteryTicket ticket = LotteryTicket.create(getRandomPlayerDetails(), LotteryNumbers.createRandom()); - lotteryService.submitTicket(ticket); - } - } - - private static PlayerDetails getRandomPlayerDetails() { - Random random = new Random(); - int idx = random.nextInt(PLAYERS.size()); - return PLAYERS.get(idx); - } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java index 5238edd24..4301c07e3 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/administration/ConsoleAdministration.java @@ -1,7 +1,84 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.hexagonal.administration; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.iluwatar.hexagonal.domain.LotteryAdministration; +import com.iluwatar.hexagonal.domain.LotteryNumbers; +import com.iluwatar.hexagonal.domain.LotteryService; +import com.iluwatar.hexagonal.module.LotteryModule; +import com.iluwatar.hexagonal.sampledata.SampleData; + +import java.util.Scanner; + /** * Console interface for lottery administration */ public class ConsoleAdministration { + + /** + * Program entry point + */ + public static void main(String[] args) { + Injector injector = Guice.createInjector(new LotteryModule()); + LotteryAdministration administartion = injector.getInstance(LotteryAdministration.class); + LotteryService service = injector.getInstance(LotteryService.class); + SampleData.submitTickets(service, 20); + Scanner scanner = new Scanner(System.in); + boolean exit = false; + while (!exit) { + printMainMenu(); + String cmd = readString(scanner); + if (cmd.equals("1")) { + administartion.getAllSubmittedTickets().forEach((k,v)->System.out.println("Key: " + k + " Value: " + v)); + } else if (cmd.equals("2")) { + LotteryNumbers numbers = administartion.performLottery(); + System.out.println("The winning numbers: " + numbers); + System.out.println("Time to reset the database for next round, eh?"); + } else if (cmd.equals("3")) { + administartion.resetLottery(); + System.out.println("The lottery ticket database was cleared."); + } else if (cmd.equals("4")) { + exit = true; + } else { + System.out.println("Unknown command: " + cmd); + } + } + } + + private static void printMainMenu() { + System.out.println(""); + System.out.println("### Lottery Administration Console ###"); + System.out.println("(1) Show all submitted tickets"); + System.out.println("(2) Perform lottery draw"); + System.out.println("(3) Reset lottery ticket database"); + System.out.println("(4) Exit"); + } + + private static String readString(Scanner scanner) { + System.out.print("> "); + String cmd = scanner.next(); + return cmd; + } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryAdministration.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryAdministration.java index 7117397d3..f73390863 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryAdministration.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryAdministration.java @@ -41,6 +41,9 @@ public class LotteryAdministration { private final WireTransfers wireTransfers; private final LotteryTicketChecker checker; + /** + * Constructor + */ @Inject public LotteryAdministration(LotteryTicketRepository repository, LotteryNotifications notifications, WireTransfers wireTransfers) { diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryNumbers.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryNumbers.java index 69d654657..9ce8d61bd 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryNumbers.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryNumbers.java @@ -92,7 +92,12 @@ public class LotteryNumbers { } } } - + + @Override + public String toString() { + return "LotteryNumbers{" + "numbers=" + numbers + '}'; + } + /** * * Helper class for generating random numbers. diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicket.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicket.java index e5828cfbf..08064f46c 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicket.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicket.java @@ -61,6 +61,11 @@ public class LotteryTicket { return lotteryNumbers; } + @Override + public String toString() { + return playerDetails.toString() + " " + lotteryNumbers.toString(); + } + @Override public int hashCode() { final int prime = 31; diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketChecker.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketChecker.java index 10042528b..ce193386b 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketChecker.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketChecker.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.hexagonal.domain; import com.iluwatar.hexagonal.database.LotteryTicketRepository; diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketId.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketId.java index 710091222..e2aa51792 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketId.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketId.java @@ -34,8 +34,17 @@ public class LotteryTicketId { public LotteryTicketId() { id = UUID.randomUUID(); } + + public LotteryTicketId(String str) { + id = UUID.fromString(str); + } public UUID getId() { return id; } + + @Override + public String toString() { + return id.toString(); + } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/PlayerDetails.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/PlayerDetails.java index 2fcdb6eb3..1061ad553 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/PlayerDetails.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/PlayerDetails.java @@ -70,6 +70,13 @@ public class PlayerDetails { return phoneNumber; } + @Override + public String toString() { + return "PlayerDetails{" + "emailAddress='" + emailAddress + '\'' + + ", bankAccountNumber='" + bankAccountNumber + '\'' + + ", phoneNumber='" + phoneNumber + '\'' + '}'; + } + @Override public int hashCode() { final int prime = 31; diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/module/LotteryModule.java similarity index 97% rename from hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java rename to hexagonal/src/main/java/com/iluwatar/hexagonal/module/LotteryModule.java index dbaf494c2..c62dbfa54 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/LotteryModule.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/module/LotteryModule.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.hexagonal; +package com.iluwatar.hexagonal.module; import com.google.inject.AbstractModule; import com.iluwatar.hexagonal.banking.InMemoryBank; diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/module/LotteryTestingModule.java similarity index 97% rename from hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java rename to hexagonal/src/main/java/com/iluwatar/hexagonal/module/LotteryTestingModule.java index 22bfa8f01..c934ed43c 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/LotteryTestingModule.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/module/LotteryTestingModule.java @@ -20,7 +20,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.iluwatar.hexagonal; +package com.iluwatar.hexagonal.module; import com.google.inject.AbstractModule; import com.iluwatar.hexagonal.banking.InMemoryBank; diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/sampledata/SampleData.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/sampledata/SampleData.java new file mode 100644 index 000000000..1af18118d --- /dev/null +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/sampledata/SampleData.java @@ -0,0 +1,107 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.hexagonal.sampledata; + +import com.iluwatar.hexagonal.banking.InMemoryBank; +import com.iluwatar.hexagonal.domain.LotteryConstants; +import com.iluwatar.hexagonal.domain.LotteryNumbers; +import com.iluwatar.hexagonal.domain.LotteryService; +import com.iluwatar.hexagonal.domain.LotteryTicket; +import com.iluwatar.hexagonal.domain.PlayerDetails; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * Utilities for creating sample lottery tickets + */ +public class SampleData { + + private static final List PLAYERS; + + static { + PLAYERS = new ArrayList<>(); + PLAYERS.add(PlayerDetails.create("john@google.com", "312-342", "+3242434242")); + PLAYERS.add(PlayerDetails.create("mary@google.com", "234-987", "+23452346")); + PLAYERS.add(PlayerDetails.create("steve@google.com", "833-836", "+63457543")); + PLAYERS.add(PlayerDetails.create("wayne@google.com", "319-826", "+24626")); + PLAYERS.add(PlayerDetails.create("johnie@google.com", "983-322", "+3635635")); + PLAYERS.add(PlayerDetails.create("andy@google.com", "934-734", "+0898245")); + PLAYERS.add(PlayerDetails.create("richard@google.com", "536-738", "+09845325")); + PLAYERS.add(PlayerDetails.create("kevin@google.com", "453-936", "+2423532")); + PLAYERS.add(PlayerDetails.create("arnold@google.com", "114-988", "+5646346524")); + PLAYERS.add(PlayerDetails.create("ian@google.com", "663-765", "+928394235")); + PLAYERS.add(PlayerDetails.create("robin@google.com", "334-763", "+35448")); + PLAYERS.add(PlayerDetails.create("ted@google.com", "735-964", "+98752345")); + PLAYERS.add(PlayerDetails.create("larry@google.com", "734-853", "+043842423")); + PLAYERS.add(PlayerDetails.create("calvin@google.com", "334-746", "+73294135")); + PLAYERS.add(PlayerDetails.create("jacob@google.com", "444-766", "+358042354")); + PLAYERS.add(PlayerDetails.create("edwin@google.com", "895-345", "+9752435")); + PLAYERS.add(PlayerDetails.create("mary@google.com", "760-009", "+34203542")); + PLAYERS.add(PlayerDetails.create("lolita@google.com", "425-907", "+9872342")); + PLAYERS.add(PlayerDetails.create("bruno@google.com", "023-638", "+673824122")); + PLAYERS.add(PlayerDetails.create("peter@google.com", "335-886", "+5432503945")); + PLAYERS.add(PlayerDetails.create("warren@google.com", "225-946", "+9872341324")); + PLAYERS.add(PlayerDetails.create("monica@google.com", "265-748", "+134124")); + PLAYERS.add(PlayerDetails.create("ollie@google.com", "190-045", "+34453452")); + PLAYERS.add(PlayerDetails.create("yngwie@google.com", "241-465", "+9897641231")); + PLAYERS.add(PlayerDetails.create("lars@google.com", "746-936", "+42345298345")); + PLAYERS.add(PlayerDetails.create("bobbie@google.com", "946-384", "+79831742")); + PLAYERS.add(PlayerDetails.create("tyron@google.com", "310-992", "+0498837412")); + PLAYERS.add(PlayerDetails.create("tyrell@google.com", "032-045", "+67834134")); + PLAYERS.add(PlayerDetails.create("nadja@google.com", "000-346", "+498723")); + PLAYERS.add(PlayerDetails.create("wendy@google.com", "994-989", "+987324454")); + PLAYERS.add(PlayerDetails.create("luke@google.com", "546-634", "+987642435")); + PLAYERS.add(PlayerDetails.create("bjorn@google.com", "342-874", "+7834325")); + PLAYERS.add(PlayerDetails.create("lisa@google.com", "024-653", "+980742154")); + PLAYERS.add(PlayerDetails.create("anton@google.com", "834-935", "+876423145")); + PLAYERS.add(PlayerDetails.create("bruce@google.com", "284-936", "+09843212345")); + PLAYERS.add(PlayerDetails.create("ray@google.com", "843-073", "+678324123")); + PLAYERS.add(PlayerDetails.create("ron@google.com", "637-738", "+09842354")); + PLAYERS.add(PlayerDetails.create("xavier@google.com", "143-947", "+375245")); + PLAYERS.add(PlayerDetails.create("harriet@google.com", "842-404", "+131243252")); + InMemoryBank wireTransfers = new InMemoryBank(); + Random random = new Random(); + for (int i = 0; i < PLAYERS.size(); i++) { + wireTransfers.setFunds(PLAYERS.get(i).getBankAccount(), + random.nextInt(LotteryConstants.PLAYER_MAX_SALDO)); + } + } + + /** + * Inserts lottery tickets into the database based on the sample data + */ + public static void submitTickets(LotteryService lotteryService, int numTickets) { + for (int i = 0; i < numTickets; i++) { + LotteryTicket ticket = LotteryTicket.create(getRandomPlayerDetails(), LotteryNumbers.createRandom()); + lotteryService.submitTicket(ticket); + } + } + + private static PlayerDetails getRandomPlayerDetails() { + Random random = new Random(); + int idx = random.nextInt(PLAYERS.size()); + return PLAYERS.get(idx); + } +} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java index e48410982..aade24a91 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java @@ -1,7 +1,137 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package com.iluwatar.hexagonal.service; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.iluwatar.hexagonal.banking.WireTransfers; +import com.iluwatar.hexagonal.domain.LotteryNumbers; +import com.iluwatar.hexagonal.domain.LotteryService; +import com.iluwatar.hexagonal.domain.LotteryTicket; +import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; +import com.iluwatar.hexagonal.domain.LotteryTicketId; +import com.iluwatar.hexagonal.domain.PlayerDetails; +import com.iluwatar.hexagonal.module.LotteryModule; +import com.iluwatar.hexagonal.sampledata.SampleData; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Scanner; +import java.util.Set; + /** * Console interface for lottery players */ public class ConsoleLottery { + + + /** + * Program entry point + */ + public static void main(String[] args) { + Injector injector = Guice.createInjector(new LotteryModule()); + LotteryService service = injector.getInstance(LotteryService.class); + WireTransfers bank = injector.getInstance(WireTransfers.class); + SampleData.submitTickets(service, 20); + Scanner scanner = new Scanner(System.in); + boolean exit = false; + while (!exit) { + printMainMenu(); + String cmd = readString(scanner); + if (cmd.equals("1")) { + System.out.println("What is the account number?"); + String account = readString(scanner); + System.out.println(String.format("The account %s has %d credits.", account, bank.getFunds(account))); + } else if (cmd.equals("2")) { + System.out.println("What is the account number?"); + String account = readString(scanner); + System.out.println("How many credits do you want to deposit?"); + String amount = readString(scanner); + bank.setFunds(account, Integer.parseInt(amount)); + System.out.println(String.format("The account %s now has %d credits.", account, bank.getFunds(account))); + } else if (cmd.equals("3")) { + System.out.println("What is your email address?"); + String email = readString(scanner); + System.out.println("What is your bank account number?"); + String account = readString(scanner); + System.out.println("What is your phone number?"); + String phone = readString(scanner); + PlayerDetails details = PlayerDetails.create(email, account, phone); + System.out.println("Give 4 comma separated lottery numbers?"); + String numbers = readString(scanner); + String[] parts = numbers.split(","); + Set chosen = new HashSet<>(); + for (int i = 0; i < 4; i++) { + chosen.add(Integer.parseInt(parts[i])); + } + LotteryNumbers lotteryNumbers = LotteryNumbers.create(chosen); + LotteryTicket lotteryTicket = LotteryTicket.create(details, lotteryNumbers); + Optional id = service.submitTicket(lotteryTicket); + if (id.isPresent()) { + System.out.println("Submitted lottery ticket with id: " + id.get()); + } else { + System.out.println("Failed submitting lottery ticket - please try again."); + } + } else if (cmd.equals("4")) { + System.out.println("What is the ID of the lottery ticket?"); + String id = readString(scanner); + System.out.println("Give the 4 comma separated winning numbers?"); + String numbers = readString(scanner); + String[] parts = numbers.split(","); + Set winningNumbers = new HashSet<>(); + for (int i = 0; i < 4; i++) { + winningNumbers.add(Integer.parseInt(parts[i])); + } + LotteryTicketCheckResult result = service.checkTicketForPrize( + new LotteryTicketId(id), LotteryNumbers.create(winningNumbers)); + if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { + System.out.println("Congratulations! The lottery ticket has won!"); + } else if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.NO_PRIZE)) { + System.out.println("Unfortunately the lottery ticket did not win."); + } else { + System.out.println("Such lottery ticket has not been submitted."); + } + } else if (cmd.equals("5")) { + exit = true; + } else { + System.out.println("Unknown command"); + } + } + } + + private static void printMainMenu() { + System.out.println(""); + System.out.println("### Lottery Service Console ###"); + System.out.println("(1) Query lottery account funds"); + System.out.println("(2) Add funds to lottery account"); + System.out.println("(3) Submit ticket"); + System.out.println("(4) Check ticket"); + System.out.println("(5) Exit"); + } + + private static String readString(Scanner scanner) { + System.out.print("> "); + String cmd = scanner.next(); + return cmd; + } } diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java index ed6f8d180..943440f07 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTest.java @@ -33,7 +33,7 @@ import java.util.Optional; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; -import com.iluwatar.hexagonal.LotteryTestingModule; +import com.iluwatar.hexagonal.module.LotteryTestingModule; import org.junit.Before; import org.junit.Test; From 4410419914ee89c7eea2382ae49b056451b420cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sun, 11 Sep 2016 10:34:12 +0300 Subject: [PATCH 14/14] Hexagonal pattern: Simplified lottery ticket ids --- .../hexagonal/domain/LotteryTicketId.java | 38 ++++++++++++---- .../hexagonal/service/ConsoleLottery.java | 4 +- .../hexagonal/domain/LotteryTicketIdTest.java | 45 +++++++++++++++++++ 3 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketIdTest.java diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketId.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketId.java index e2aa51792..2f8a59bba 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketId.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketId.java @@ -22,29 +22,49 @@ */ package com.iluwatar.hexagonal.domain; -import java.util.UUID; - /** * Lottery ticked id */ public class LotteryTicketId { - - private final UUID id; + + private static volatile int numAllocated; + private final int id; public LotteryTicketId() { - id = UUID.randomUUID(); + this.id = numAllocated + 1; + numAllocated++; } - public LotteryTicketId(String str) { - id = UUID.fromString(str); + public LotteryTicketId(int id) { + this.id = id; } - public UUID getId() { + public int getId() { return id; } @Override public String toString() { - return id.toString(); + return String.format("%d", id); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LotteryTicketId that = (LotteryTicketId) o; + + return id == that.id; + + } + + @Override + public int hashCode() { + return id; } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java index aade24a91..5463eca7c 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/ConsoleLottery.java @@ -32,7 +32,6 @@ import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.domain.PlayerDetails; import com.iluwatar.hexagonal.module.LotteryModule; -import com.iluwatar.hexagonal.sampledata.SampleData; import java.util.HashSet; import java.util.Optional; @@ -52,7 +51,6 @@ public class ConsoleLottery { Injector injector = Guice.createInjector(new LotteryModule()); LotteryService service = injector.getInstance(LotteryService.class); WireTransfers bank = injector.getInstance(WireTransfers.class); - SampleData.submitTickets(service, 20); Scanner scanner = new Scanner(System.in); boolean exit = false; while (!exit) { @@ -103,7 +101,7 @@ public class ConsoleLottery { winningNumbers.add(Integer.parseInt(parts[i])); } LotteryTicketCheckResult result = service.checkTicketForPrize( - new LotteryTicketId(id), LotteryNumbers.create(winningNumbers)); + new LotteryTicketId(Integer.parseInt(id)), LotteryNumbers.create(winningNumbers)); if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) { System.out.println("Congratulations! The lottery ticket has won!"); } else if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.NO_PRIZE)) { diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketIdTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketIdTest.java new file mode 100644 index 000000000..c5e4c1541 --- /dev/null +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/domain/LotteryTicketIdTest.java @@ -0,0 +1,45 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.hexagonal.domain; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Tests for lottery ticket id + */ +public class LotteryTicketIdTest { + + @Test + public void testEquals() { + LotteryTicketId ticketId1 = new LotteryTicketId(); + LotteryTicketId ticketId2 = new LotteryTicketId(); + LotteryTicketId ticketId3 = new LotteryTicketId(); + assertFalse(ticketId1.equals(ticketId2)); + assertFalse(ticketId2.equals(ticketId3)); + LotteryTicketId ticketId4 = new LotteryTicketId(ticketId1.getId()); + assertTrue(ticketId1.equals(ticketId4)); + } +}