From 969fb9e898671e963a6d74b09d057840987f064f Mon Sep 17 00:00:00 2001 From: madvirus Date: Sun, 6 Feb 2022 11:37:46 +0900 Subject: [PATCH] Initial Commit --- .gitignore | 33 ++ .mvn/wrapper/MavenWrapperDownloader.java | 118 +++++++ .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .mvn/wrapper/maven-wrapper.properties | 2 + docker.md | 7 + mvnw | 310 ++++++++++++++++++ mvnw.cmd | 182 ++++++++++ pom.xml | 84 +++++ src/main/java/com/myshop/ShopApplication.java | 18 + .../myshop/admin/ui/AdminOrderController.java | 72 ++++ .../java/com/myshop/board/domain/Article.java | 48 +++ .../myshop/board/domain/ArticleContent.java | 28 ++ .../board/domain/ArticleRepository.java | 11 + .../myshop/catalog/NoCategoryException.java | 4 + .../command/domain/category/Category.java | 32 ++ .../command/domain/category/CategoryId.java | 43 +++ .../domain/category/CategoryRepository.java | 12 + .../command/domain/product/ExternalImage.java | 30 ++ .../catalog/command/domain/product/Image.java | 45 +++ .../command/domain/product/InternalImage.java | 30 ++ .../command/domain/product/Option.java | 28 ++ .../command/domain/product/Product.java | 77 +++++ .../command/domain/product/ProductId.java | 43 +++ .../domain/product/ProductRepository.java | 14 + .../catalog/query/category/CategoryData.java | 34 ++ .../query/category/CategoryDataDao.java | 13 + .../query/product/CategoryProduct.java | 53 +++ .../catalog/query/product/ImageData.java | 12 + .../catalog/query/product/ProductData.java | 76 +++++ .../catalog/query/product/ProductDataDao.java | 15 + .../query/product/ProductQueryService.java | 55 ++++ .../catalog/query/product/ProductSummary.java | 31 ++ .../myshop/catalog/ui/ProductController.java | 59 ++++ .../com/myshop/common/ValidationError.java | 31 ++ .../common/ValidationErrorException.java | 15 + .../common/VersionConflictException.java | 4 + .../java/com/myshop/common/event/Event.java | 14 + .../common/event/EventStoreHandler.java | 19 ++ .../java/com/myshop/common/event/Events.java | 17 + .../common/event/EventsConfiguration.java | 18 + .../myshop/common/jpa/EmailSetConverter.java | 31 ++ .../com/myshop/common/jpa/MoneyConverter.java | 18 + .../java/com/myshop/common/jpa/Rangeable.java | 31 ++ .../myshop/common/jpa/RangeableExecutor.java | 9 + .../common/jpa/RangeableRepository.java | 11 + .../common/jpa/RangeableRepositoryImpl.java | 32 ++ .../com/myshop/common/jpa/SpecBuilder.java | 48 +++ .../java/com/myshop/common/model/Address.java | 37 +++ .../java/com/myshop/common/model/Email.java | 32 ++ .../com/myshop/common/model/EmailSet.java | 18 + .../java/com/myshop/common/model/Money.java | 38 +++ .../java/com/myshop/common/ui/Pagination.java | 65 ++++ .../com/myshop/eventstore/api/EventEntry.java | 45 +++ .../com/myshop/eventstore/api/EventStore.java | 9 + .../api/PayloadConvertException.java | 7 + .../eventstore/infra/JdbcEventStore.java | 66 ++++ .../com/myshop/eventstore/ui/EventApi.java | 26 ++ .../myshop/integration/EventForwarder.java | 60 ++++ .../com/myshop/integration/EventSender.java | 7 + .../com/myshop/integration/OffsetStore.java | 6 + .../integration/infra/MemoryOffsetStore.java | 19 ++ .../integration/infra/SysoutEventSender.java | 13 + .../myshop/lock/AlreadyLockedException.java | 4 + src/main/java/com/myshop/lock/LockData.java | 35 ++ .../java/com/myshop/lock/LockException.java | 14 + src/main/java/com/myshop/lock/LockId.java | 13 + .../java/com/myshop/lock/LockManager.java | 11 + .../com/myshop/lock/LockManagerException.java | 7 + .../com/myshop/lock/LockingFailException.java | 10 + .../java/com/myshop/lock/NoLockException.java | 4 + .../com/myshop/lock/SpringLockManager.java | 108 ++++++ .../application/BlockMemberService.java | 28 ++ .../application/NoMemberException.java | 4 + .../IdPasswordNotMatchingException.java | 4 + .../myshop/member/command/domain/Member.java | 85 +++++ .../command/domain/MemberBlockedEvent.java | 15 + .../member/command/domain/MemberId.java | 40 +++ .../command/domain/MemberRepository.java | 25 ++ .../command/domain/MemberUnblockedEvent.java | 13 + .../member/command/domain/Password.java | 21 ++ .../command/domain/PasswordChangedEvent.java | 19 ++ .../infra/PasswordChangedEventHandler.java | 13 + .../com/myshop/member/query/MemberData.java | 39 +++ .../myshop/member/query/MemberDataDao.java | 26 ++ .../myshop/member/query/MemberDataSpecs.java | 14 + .../member/query/MemberQueryService.java | 21 ++ .../com/myshop/order/NoOrderException.java | 4 + .../application/CancelOrderService.java | 29 ++ .../application/ChangeShippingRequest.java | 21 ++ .../application/ChangeShippingService.java | 27 ++ .../application/NoCancellablePermission.java | 4 + .../application/NoOrderProductException.java | 13 + .../command/application/OrderProduct.java | 22 ++ .../command/application/OrderRequest.java | 36 ++ .../application/OrderRequestValidator.java | 52 +++ .../application/PlaceOrderService.java | 53 +++ .../command/application/RefundService.java | 5 + .../application/StartShippingRequest.java | 22 ++ .../application/StartShippingService.java | 30 ++ .../domain/AlreadyShippedException.java | 4 + .../order/command/domain/CancelPolicy.java | 5 + .../order/command/domain/Canceller.java | 17 + .../myshop/order/command/domain/Order.java | 158 +++++++++ .../domain/OrderAlreadyCanceledException.java | 4 + .../command/domain/OrderCanceledEvent.java | 16 + .../order/command/domain/OrderLine.java | 57 ++++ .../myshop/order/command/domain/OrderNo.java | 40 +++ .../command/domain/OrderPlacedEvent.java | 38 +++ .../order/command/domain/OrderRepository.java | 19 ++ .../order/command/domain/OrderState.java | 5 + .../myshop/order/command/domain/Orderer.java | 51 +++ .../order/command/domain/OrdererService.java | 7 + .../myshop/order/command/domain/Receiver.java | 28 ++ .../order/command/domain/ShippingInfo.java | 41 +++ .../domain/ShippingInfoChangedEvent.java | 26 ++ .../command/domain/ShippingStartedEvent.java | 13 + .../infra/OrderCanceledEventHandler.java | 27 ++ .../order/infra/OrdererServiceImpl.java | 23 ++ .../infra/domain/SecurityCancelPolicy.java | 35 ++ .../infra/paygate/ExternalRefundService.java | 16 + .../order/query/application/ListRequest.java | 19 ++ .../order/query/application/OrderDetail.java | 63 ++++ .../query/application/OrderDetailService.java | 39 +++ .../query/application/OrderLineDetail.java | 47 +++ .../application/OrderViewListService.java | 27 ++ .../order/query/dao/OrderSummaryDao.java | 38 +++ .../order/query/dao/OrderSummarySpecs.java | 24 ++ .../myshop/order/query/dao/OrdererIdSpec.java | 26 ++ .../myshop/order/query/dto/OrderSummary.java | 96 ++++++ .../myshop/order/query/dto/OrderSummary_.java | 19 ++ .../com/myshop/order/query/dto/OrderView.java | 42 +++ .../order/ui/CancelOrderController.java | 27 ++ .../myshop/order/ui/MyOrderController.java | 48 +++ .../com/myshop/order/ui/OrderController.java | 106 ++++++ .../ui/OrderRequestValidator4Spring.java | 37 +++ .../CookieSecurityContextRepository.java | 79 +++++ .../security/CustomAuthSuccessHandler.java | 35 ++ .../security/WebSecurityConfig.java | 79 +++++ .../myshop/springconfig/web/WebMvcConfig.java | 22 ++ src/main/resources/application.properties | 15 + src/main/resources/messages.properties | 7 + src/main/resources/static/favicon.ico | Bin 0 -> 15406 bytes .../resources/static/images/original/pen.jpg | Bin 0 -> 32251 bytes .../resources/static/images/original/pen2.jpg | Bin 0 -> 132316 bytes .../resources/static/images/original/rpi3.jpg | Bin 0 -> 30398 bytes .../resources/static/images/original/wbp.png | Bin 0 -> 130308 bytes .../resources/static/images/thumbnail/pen.jpg | Bin 0 -> 7494 bytes .../static/images/thumbnail/pen2.jpg | Bin 0 -> 14265 bytes .../static/images/thumbnail/rpi3.jpg | Bin 0 -> 3216 bytes .../resources/static/images/thumbnail/wbp.png | Bin 0 -> 9480 bytes .../resources/templates/admin/adminMain.html | 22 ++ .../templates/admin/adminOrderDetail.html | 103 ++++++ .../templates/admin/adminOrderLockFail.html | 33 ++ .../templates/admin/adminOrderShipped.html | 33 ++ .../templates/admin/adminOrders.html | 64 ++++ .../templates/category/categoryList.html | 24 ++ .../templates/category/productDetail.html | 57 ++++ .../templates/category/productList.html | 38 +++ .../resources/templates/fragments/layout.html | 42 +++ src/main/resources/templates/home.html | 22 ++ src/main/resources/templates/loggedOut.html | 20 ++ src/main/resources/templates/login.html | 29 ++ src/main/resources/templates/my/myMain.html | 22 ++ src/main/resources/templates/my/noOrder.html | 21 ++ .../resources/templates/my/notYourOrder.html | 21 ++ .../resources/templates/my/orderCanceled.html | 25 ++ .../resources/templates/my/orderDetail.html | 99 ++++++ src/main/resources/templates/my/orders.html | 42 +++ .../resources/templates/order/confirm.html | 138 ++++++++ .../resources/templates/order/noProduct.html | 21 ++ .../templates/order/orderComplete.html | 24 ++ src/sql/ddl.sql | 106 ++++++ src/sql/init.sql | 46 +++ .../java/com/myshop/ShopApplicationTests.java | 13 + .../board/domain/ArticleRepositoryIT.java | 70 ++++ .../domain/product/ProductRepositoryIT.java | 72 ++++ .../domain/category/CategoryRepositoryIT.java | 45 +++ .../domain/product/ProductRepositoryIT.java | 13 + .../query/product/ProductDataDaoIT.java | 60 ++++ src/test/java/com/myshop/helper/DbHelper.java | 25 ++ .../command/domain/MemberRepositoryIT.java | 71 ++++ .../myshop/member/query/MemberDataDaoIT.java | 106 ++++++ .../myshop/member/query/SearchRequest.java | 22 ++ .../application/CancelOrderServiceIT.java | 20 ++ .../command/domain/OrderRepositoryIT.java | 80 +++++ .../order/query/dao/OrderSummaryDaoIT.java | 90 +++++ src/test/resources/shop-init-test.sql | 85 +++++ 187 files changed, 6605 insertions(+) create mode 100644 .gitignore create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 docker.md create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/com/myshop/ShopApplication.java create mode 100644 src/main/java/com/myshop/admin/ui/AdminOrderController.java create mode 100644 src/main/java/com/myshop/board/domain/Article.java create mode 100644 src/main/java/com/myshop/board/domain/ArticleContent.java create mode 100644 src/main/java/com/myshop/board/domain/ArticleRepository.java create mode 100644 src/main/java/com/myshop/catalog/NoCategoryException.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/category/Category.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/category/CategoryId.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/category/CategoryRepository.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/product/ExternalImage.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/product/Image.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/product/InternalImage.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/product/Option.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/product/Product.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/product/ProductId.java create mode 100644 src/main/java/com/myshop/catalog/command/domain/product/ProductRepository.java create mode 100644 src/main/java/com/myshop/catalog/query/category/CategoryData.java create mode 100644 src/main/java/com/myshop/catalog/query/category/CategoryDataDao.java create mode 100644 src/main/java/com/myshop/catalog/query/product/CategoryProduct.java create mode 100644 src/main/java/com/myshop/catalog/query/product/ImageData.java create mode 100644 src/main/java/com/myshop/catalog/query/product/ProductData.java create mode 100644 src/main/java/com/myshop/catalog/query/product/ProductDataDao.java create mode 100644 src/main/java/com/myshop/catalog/query/product/ProductQueryService.java create mode 100644 src/main/java/com/myshop/catalog/query/product/ProductSummary.java create mode 100644 src/main/java/com/myshop/catalog/ui/ProductController.java create mode 100644 src/main/java/com/myshop/common/ValidationError.java create mode 100644 src/main/java/com/myshop/common/ValidationErrorException.java create mode 100644 src/main/java/com/myshop/common/VersionConflictException.java create mode 100644 src/main/java/com/myshop/common/event/Event.java create mode 100644 src/main/java/com/myshop/common/event/EventStoreHandler.java create mode 100644 src/main/java/com/myshop/common/event/Events.java create mode 100644 src/main/java/com/myshop/common/event/EventsConfiguration.java create mode 100644 src/main/java/com/myshop/common/jpa/EmailSetConverter.java create mode 100644 src/main/java/com/myshop/common/jpa/MoneyConverter.java create mode 100644 src/main/java/com/myshop/common/jpa/Rangeable.java create mode 100644 src/main/java/com/myshop/common/jpa/RangeableExecutor.java create mode 100644 src/main/java/com/myshop/common/jpa/RangeableRepository.java create mode 100644 src/main/java/com/myshop/common/jpa/RangeableRepositoryImpl.java create mode 100644 src/main/java/com/myshop/common/jpa/SpecBuilder.java create mode 100644 src/main/java/com/myshop/common/model/Address.java create mode 100644 src/main/java/com/myshop/common/model/Email.java create mode 100644 src/main/java/com/myshop/common/model/EmailSet.java create mode 100644 src/main/java/com/myshop/common/model/Money.java create mode 100644 src/main/java/com/myshop/common/ui/Pagination.java create mode 100644 src/main/java/com/myshop/eventstore/api/EventEntry.java create mode 100644 src/main/java/com/myshop/eventstore/api/EventStore.java create mode 100644 src/main/java/com/myshop/eventstore/api/PayloadConvertException.java create mode 100644 src/main/java/com/myshop/eventstore/infra/JdbcEventStore.java create mode 100644 src/main/java/com/myshop/eventstore/ui/EventApi.java create mode 100644 src/main/java/com/myshop/integration/EventForwarder.java create mode 100644 src/main/java/com/myshop/integration/EventSender.java create mode 100644 src/main/java/com/myshop/integration/OffsetStore.java create mode 100644 src/main/java/com/myshop/integration/infra/MemoryOffsetStore.java create mode 100644 src/main/java/com/myshop/integration/infra/SysoutEventSender.java create mode 100644 src/main/java/com/myshop/lock/AlreadyLockedException.java create mode 100644 src/main/java/com/myshop/lock/LockData.java create mode 100644 src/main/java/com/myshop/lock/LockException.java create mode 100644 src/main/java/com/myshop/lock/LockId.java create mode 100644 src/main/java/com/myshop/lock/LockManager.java create mode 100644 src/main/java/com/myshop/lock/LockManagerException.java create mode 100644 src/main/java/com/myshop/lock/LockingFailException.java create mode 100644 src/main/java/com/myshop/lock/NoLockException.java create mode 100644 src/main/java/com/myshop/lock/SpringLockManager.java create mode 100644 src/main/java/com/myshop/member/command/application/BlockMemberService.java create mode 100644 src/main/java/com/myshop/member/command/application/NoMemberException.java create mode 100644 src/main/java/com/myshop/member/command/domain/IdPasswordNotMatchingException.java create mode 100644 src/main/java/com/myshop/member/command/domain/Member.java create mode 100644 src/main/java/com/myshop/member/command/domain/MemberBlockedEvent.java create mode 100644 src/main/java/com/myshop/member/command/domain/MemberId.java create mode 100644 src/main/java/com/myshop/member/command/domain/MemberRepository.java create mode 100644 src/main/java/com/myshop/member/command/domain/MemberUnblockedEvent.java create mode 100644 src/main/java/com/myshop/member/command/domain/Password.java create mode 100644 src/main/java/com/myshop/member/command/domain/PasswordChangedEvent.java create mode 100644 src/main/java/com/myshop/member/infra/PasswordChangedEventHandler.java create mode 100644 src/main/java/com/myshop/member/query/MemberData.java create mode 100644 src/main/java/com/myshop/member/query/MemberDataDao.java create mode 100644 src/main/java/com/myshop/member/query/MemberDataSpecs.java create mode 100644 src/main/java/com/myshop/member/query/MemberQueryService.java create mode 100644 src/main/java/com/myshop/order/NoOrderException.java create mode 100644 src/main/java/com/myshop/order/command/application/CancelOrderService.java create mode 100644 src/main/java/com/myshop/order/command/application/ChangeShippingRequest.java create mode 100644 src/main/java/com/myshop/order/command/application/ChangeShippingService.java create mode 100644 src/main/java/com/myshop/order/command/application/NoCancellablePermission.java create mode 100644 src/main/java/com/myshop/order/command/application/NoOrderProductException.java create mode 100644 src/main/java/com/myshop/order/command/application/OrderProduct.java create mode 100644 src/main/java/com/myshop/order/command/application/OrderRequest.java create mode 100644 src/main/java/com/myshop/order/command/application/OrderRequestValidator.java create mode 100644 src/main/java/com/myshop/order/command/application/PlaceOrderService.java create mode 100644 src/main/java/com/myshop/order/command/application/RefundService.java create mode 100644 src/main/java/com/myshop/order/command/application/StartShippingRequest.java create mode 100644 src/main/java/com/myshop/order/command/application/StartShippingService.java create mode 100644 src/main/java/com/myshop/order/command/domain/AlreadyShippedException.java create mode 100644 src/main/java/com/myshop/order/command/domain/CancelPolicy.java create mode 100644 src/main/java/com/myshop/order/command/domain/Canceller.java create mode 100644 src/main/java/com/myshop/order/command/domain/Order.java create mode 100644 src/main/java/com/myshop/order/command/domain/OrderAlreadyCanceledException.java create mode 100644 src/main/java/com/myshop/order/command/domain/OrderCanceledEvent.java create mode 100644 src/main/java/com/myshop/order/command/domain/OrderLine.java create mode 100644 src/main/java/com/myshop/order/command/domain/OrderNo.java create mode 100644 src/main/java/com/myshop/order/command/domain/OrderPlacedEvent.java create mode 100644 src/main/java/com/myshop/order/command/domain/OrderRepository.java create mode 100644 src/main/java/com/myshop/order/command/domain/OrderState.java create mode 100644 src/main/java/com/myshop/order/command/domain/Orderer.java create mode 100644 src/main/java/com/myshop/order/command/domain/OrdererService.java create mode 100644 src/main/java/com/myshop/order/command/domain/Receiver.java create mode 100644 src/main/java/com/myshop/order/command/domain/ShippingInfo.java create mode 100644 src/main/java/com/myshop/order/command/domain/ShippingInfoChangedEvent.java create mode 100644 src/main/java/com/myshop/order/command/domain/ShippingStartedEvent.java create mode 100644 src/main/java/com/myshop/order/infra/OrderCanceledEventHandler.java create mode 100644 src/main/java/com/myshop/order/infra/OrdererServiceImpl.java create mode 100644 src/main/java/com/myshop/order/infra/domain/SecurityCancelPolicy.java create mode 100644 src/main/java/com/myshop/order/infra/paygate/ExternalRefundService.java create mode 100644 src/main/java/com/myshop/order/query/application/ListRequest.java create mode 100644 src/main/java/com/myshop/order/query/application/OrderDetail.java create mode 100644 src/main/java/com/myshop/order/query/application/OrderDetailService.java create mode 100644 src/main/java/com/myshop/order/query/application/OrderLineDetail.java create mode 100644 src/main/java/com/myshop/order/query/application/OrderViewListService.java create mode 100644 src/main/java/com/myshop/order/query/dao/OrderSummaryDao.java create mode 100644 src/main/java/com/myshop/order/query/dao/OrderSummarySpecs.java create mode 100644 src/main/java/com/myshop/order/query/dao/OrdererIdSpec.java create mode 100644 src/main/java/com/myshop/order/query/dto/OrderSummary.java create mode 100644 src/main/java/com/myshop/order/query/dto/OrderSummary_.java create mode 100644 src/main/java/com/myshop/order/query/dto/OrderView.java create mode 100644 src/main/java/com/myshop/order/ui/CancelOrderController.java create mode 100644 src/main/java/com/myshop/order/ui/MyOrderController.java create mode 100644 src/main/java/com/myshop/order/ui/OrderController.java create mode 100644 src/main/java/com/myshop/order/ui/OrderRequestValidator4Spring.java create mode 100644 src/main/java/com/myshop/springconfig/security/CookieSecurityContextRepository.java create mode 100644 src/main/java/com/myshop/springconfig/security/CustomAuthSuccessHandler.java create mode 100644 src/main/java/com/myshop/springconfig/security/WebSecurityConfig.java create mode 100644 src/main/java/com/myshop/springconfig/web/WebMvcConfig.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/messages.properties create mode 100644 src/main/resources/static/favicon.ico create mode 100644 src/main/resources/static/images/original/pen.jpg create mode 100644 src/main/resources/static/images/original/pen2.jpg create mode 100644 src/main/resources/static/images/original/rpi3.jpg create mode 100644 src/main/resources/static/images/original/wbp.png create mode 100644 src/main/resources/static/images/thumbnail/pen.jpg create mode 100644 src/main/resources/static/images/thumbnail/pen2.jpg create mode 100644 src/main/resources/static/images/thumbnail/rpi3.jpg create mode 100644 src/main/resources/static/images/thumbnail/wbp.png create mode 100644 src/main/resources/templates/admin/adminMain.html create mode 100644 src/main/resources/templates/admin/adminOrderDetail.html create mode 100644 src/main/resources/templates/admin/adminOrderLockFail.html create mode 100644 src/main/resources/templates/admin/adminOrderShipped.html create mode 100644 src/main/resources/templates/admin/adminOrders.html create mode 100644 src/main/resources/templates/category/categoryList.html create mode 100644 src/main/resources/templates/category/productDetail.html create mode 100644 src/main/resources/templates/category/productList.html create mode 100644 src/main/resources/templates/fragments/layout.html create mode 100644 src/main/resources/templates/home.html create mode 100644 src/main/resources/templates/loggedOut.html create mode 100644 src/main/resources/templates/login.html create mode 100644 src/main/resources/templates/my/myMain.html create mode 100644 src/main/resources/templates/my/noOrder.html create mode 100644 src/main/resources/templates/my/notYourOrder.html create mode 100644 src/main/resources/templates/my/orderCanceled.html create mode 100644 src/main/resources/templates/my/orderDetail.html create mode 100644 src/main/resources/templates/my/orders.html create mode 100644 src/main/resources/templates/order/confirm.html create mode 100644 src/main/resources/templates/order/noProduct.html create mode 100644 src/main/resources/templates/order/orderComplete.html create mode 100644 src/sql/ddl.sql create mode 100644 src/sql/init.sql create mode 100644 src/test/java/com/myshop/ShopApplicationTests.java create mode 100644 src/test/java/com/myshop/board/domain/ArticleRepositoryIT.java create mode 100644 src/test/java/com/myshop/catalog/command/domain/product/ProductRepositoryIT.java create mode 100644 src/test/java/com/myshop/catalog/domain/category/CategoryRepositoryIT.java create mode 100644 src/test/java/com/myshop/catalog/domain/product/ProductRepositoryIT.java create mode 100644 src/test/java/com/myshop/catalog/query/product/ProductDataDaoIT.java create mode 100644 src/test/java/com/myshop/helper/DbHelper.java create mode 100644 src/test/java/com/myshop/member/command/domain/MemberRepositoryIT.java create mode 100644 src/test/java/com/myshop/member/query/MemberDataDaoIT.java create mode 100644 src/test/java/com/myshop/member/query/SearchRequest.java create mode 100644 src/test/java/com/myshop/order/command/application/CancelOrderServiceIT.java create mode 100644 src/test/java/com/myshop/order/command/domain/OrderRepositoryIT.java create mode 100644 src/test/java/com/myshop/order/query/dao/OrderSummaryDaoIT.java create mode 100644 src/test/resources/shop-init-test.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..a45eb6b --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 zcmbTd1CVCTmM+|7+wQV$+qP}n>auOywyU~q+qUhh+uxis_~*a##hm*_WW?9E7Pb7N%LRFiwbEGCJ0XP=%-6oeT$XZcYgtzC2~q zk(K08IQL8oTl}>>+hE5YRgXTB@fZ4TH9>7=79e`%%tw*SQUa9~$xKD5rS!;ZG@ocK zQdcH}JX?W|0_Afv?y`-NgLum62B&WSD$-w;O6G0Sm;SMX65z)l%m1e-g8Q$QTI;(Q z+x$xth4KFvH@Bs6(zn!iF#nenk^Y^ce;XIItAoCsow38eq?Y-Auh!1in#Rt-_D>H^ z=EjbclGGGa6VnaMGmMLj`x3NcwA43Jb(0gzl;RUIRAUDcR1~99l2SAPkVhoRMMtN} zXvC<tOmX83grD8GSo_Lo?%lNfhD#EBgPo z*nf@ppMC#B!T)Ae0RG$mlJWmGl7CkuU~B8-==5i;rS;8i6rJ=PoQxf446XDX9g|c> zU64ePyMlsI^V5Jq5A+BPe#e73+kpc_r1tv#B)~EZ;7^67F0*QiYfrk0uVW;Qb=NsG zN>gsuCwvb?s-KQIppEaeXtEMdc9dy6Dfduz-tMTms+i01{eD9JE&h?Kht*$eOl#&L zJdM_-vXs(V#$Ed;5wyNWJdPNh+Z$+;$|%qR(t`4W@kDhd*{(7-33BOS6L$UPDeE_53j${QfKN-0v-HG z(QfyvFNbwPK%^!eIo4ac1;b>c0vyf9}Xby@YY!lkz-UvNp zwj#Gg|4B~?n?G^{;(W;|{SNoJbHTMpQJ*Wq5b{l9c8(%?Kd^1?H1om1de0Da9M;Q=n zUfn{f87iVb^>Exl*nZ0hs(Yt>&V9$Pg`zX`AI%`+0SWQ4Zc(8lUDcTluS z5a_KerZWe}a-MF9#Cd^fi!y3%@RFmg&~YnYZ6<=L`UJ0v={zr)>$A;x#MCHZy1st7 ztT+N07NR+vOwSV2pvWuN1%lO!K#Pj0Fr>Q~R40{bwdL%u9i`DSM4RdtEH#cW)6}+I-eE< z&tZs+(Ogu(H_;$a$!7w`MH0r%h&@KM+<>gJL@O~2K2?VrSYUBbhCn#yy?P)uF3qWU z0o09mIik+kvzV6w>vEZy@&Mr)SgxPzUiDA&%07m17udz9usD82afQEps3$pe!7fUf z0eiidkJ)m3qhOjVHC_M(RYCBO%CZKZXFb8}s0-+}@CIn&EF(rRWUX2g^yZCvl0bI} zbP;1S)iXnRC&}5-Tl(hASKqdSnO?ASGJ*MIhOXIblmEudj(M|W!+I3eDc}7t`^mtg z)PKlaXe(OH+q-)qcQ8a@!llRrpGI8DsjhoKvw9T;TEH&?s=LH0w$EzI>%u;oD@x83 zJL7+ncjI9nn!TlS_KYu5vn%f*@qa5F;| zEFxY&B?g=IVlaF3XNm_03PA)=3|{n-UCgJoTr;|;1AU9|kPE_if8!Zvb}0q$5okF$ zHaJdmO&gg!9oN|M{!qGE=tb|3pVQ8PbL$}e;NgXz<6ZEggI}wO@aBP**2Wo=yN#ZC z4G$m^yaM9g=|&!^ft8jOLuzc3Psca*;7`;gnHm}tS0%f4{|VGEwu45KptfNmwxlE~ z^=r30gi@?cOm8kAz!EylA4G~7kbEiRlRIzwrb~{_2(x^$-?|#e6Bi_**(vyr_~9Of z!n>Gqf+Qwiu!xhi9f53=PM3`3tNF}pCOiPU|H4;pzjcsqbwg*{{kyrTxk<;mx~(;; z1NMrpaQ`57yn34>Jo3b|HROE(UNcQash!0p2-!Cz;{IRv#Vp5!3o$P8!%SgV~k&Hnqhp`5eLjTcy93cK!3Hm-$`@yGnaE=?;*2uSpiZTs_dDd51U%i z{|Zd9ou-;laGS_x=O}a+ zB||za<795A?_~Q=r=coQ+ZK@@ zId~hWQL<%)fI_WDIX#=(WNl!Dm$a&ROfLTd&B$vatq!M-2Jcs;N2vps$b6P1(N}=oI3<3luMTmC|0*{ zm1w8bt7vgX($!0@V0A}XIK)w!AzUn7vH=pZEp0RU0p?}ch2XC-7r#LK&vyc2=-#Q2 z^L%8)JbbcZ%g0Du;|8=q8B>X=mIQirpE=&Ox{TiuNDnOPd-FLI^KfEF729!!0x#Es z@>3ursjFSpu%C-8WL^Zw!7a0O-#cnf`HjI+AjVCFitK}GXO`ME&on|^=~Zc}^LBp9 zj=-vlN;Uc;IDjtK38l7}5xxQF&sRtfn4^TNtnzXv4M{r&ek*(eNbIu!u$>Ed%` z5x7+&)2P&4>0J`N&ZP8$vcR+@FS0126s6+Jx_{{`3ZrIMwaJo6jdrRwE$>IU_JTZ} z(||hyyQ)4Z1@wSlT94(-QKqkAatMmkT7pCycEB1U8KQbFX&?%|4$yyxCtm3=W`$4fiG0WU3yI@c zx{wfmkZAYE_5M%4{J-ygbpH|(|GD$2f$3o_Vti#&zfSGZMQ5_f3xt6~+{RX=$H8at z?GFG1Tmp}}lmm-R->ve*Iv+XJ@58p|1_jRvfEgz$XozU8#iJS})UM6VNI!3RUU!{5 zXB(+Eqd-E;cHQ>)`h0(HO_zLmzR3Tu-UGp;08YntWwMY-9i^w_u#wR?JxR2bky5j9 z3Sl-dQQU$xrO0xa&>vsiK`QN<$Yd%YXXM7*WOhnRdSFt5$aJux8QceC?lA0_if|s> ze{ad*opH_kb%M&~(~&UcX0nFGq^MqjxW?HJIP462v9XG>j(5Gat_)#SiNfahq2Mz2 zU`4uV8m$S~o9(W>mu*=h%Gs(Wz+%>h;R9Sg)jZ$q8vT1HxX3iQnh6&2rJ1u|j>^Qf`A76K%_ubL`Zu?h4`b=IyL>1!=*%!_K)=XC z6d}4R5L+sI50Q4P3upXQ3Z!~1ZXLlh!^UNcK6#QpYt-YC=^H=EPg3)z*wXo*024Q4b2sBCG4I# zlTFFY=kQ>xvR+LsuDUAk)q%5pEcqr(O_|^spjhtpb1#aC& zghXzGkGDC_XDa%t(X`E+kvKQ4zrQ*uuQoj>7@@ykWvF332)RO?%AA&Fsn&MNzmFa$ zWk&&^=NNjxLjrli_8ESU)}U|N{%j&TQmvY~lk!~Jh}*=^INA~&QB9em!in_X%Rl1&Kd~Z(u z9mra#<@vZQlOY+JYUwCrgoea4C8^(xv4ceCXcejq84TQ#sF~IU2V}LKc~Xlr_P=ry zl&Hh0exdCbVd^NPCqNNlxM3vA13EI8XvZ1H9#bT7y*U8Y{H8nwGpOR!e!!}*g;mJ#}T{ekSb}5zIPmye*If(}}_=PcuAW#yidAa^9-`<8Gr0 z)Fz=NiZ{)HAvw{Pl5uu)?)&i&Us$Cx4gE}cIJ}B4Xz~-q7)R_%owbP!z_V2=Aq%Rj z{V;7#kV1dNT9-6R+H}}(ED*_!F=~uz>&nR3gb^Ce%+0s#u|vWl<~JD3MvS0T9thdF zioIG3c#Sdsv;LdtRv3ml7%o$6LTVL>(H`^@TNg`2KPIk*8-IB}X!MT0`hN9Ddf7yN z?J=GxPL!uJ7lqwowsl?iRrh@#5C$%E&h~Z>XQcvFC*5%0RN-Opq|=IwX(dq(*sjs+ zqy99+v~m|6T#zR*e1AVxZ8djd5>eIeCi(b8sUk)OGjAsKSOg^-ugwl2WSL@d#?mdl zib0v*{u-?cq}dDGyZ%$XRY=UkQwt2oGu`zQneZh$=^! zj;!pCBWQNtvAcwcWIBM2y9!*W|8LmQy$H~5BEx)78J`4Z0(FJO2P^!YyQU{*Al+fs z){!4JvT1iLrJ8aU3k0t|P}{RN)_^v%$$r;+p0DY7N8CXzmS*HB*=?qaaF9D@#_$SN zSz{moAK<*RH->%r7xX~9gVW$l7?b|_SYI)gcjf0VAUJ%FcQP(TpBs; zg$25D!Ry_`8xpS_OJdeo$qh#7U+cepZ??TII7_%AXsT$B z=e)Bx#v%J0j``00Zk5hsvv6%T^*xGNx%KN-=pocSoqE5_R)OK%-Pbu^1MNzfds)mL zxz^F4lDKV9D&lEY;I+A)ui{TznB*CE$=9(wgE{m}`^<--OzV-5V4X2w9j(_!+jpTr zJvD*y6;39&T+==$F&tsRKM_lqa1HC}aGL0o`%c9mO=fts?36@8MGm7Vi{Y z^<7m$(EtdSr#22<(rm_(l_(`j!*Pu~Y>>xc>I9M#DJYDJNHO&4=HM%YLIp?;iR&$m z#_$ZWYLfGLt5FJZhr3jpYb`*%9S!zCG6ivNHYzNHcI%khtgHBliM^Ou}ZVD7ehU9 zS+W@AV=?Ro!=%AJ>Kcy9aU3%VX3|XM_K0A+ZaknKDyIS3S-Hw1C7&BSW5)sqj5Ye_ z4OSW7Yu-;bCyYKHFUk}<*<(@TH?YZPHr~~Iy%9@GR2Yd}J2!N9K&CN7Eq{Ka!jdu; zQNB*Y;i(7)OxZK%IHGt#Rt?z`I|A{q_BmoF!f^G}XVeTbe1Wnzh%1g>j}>DqFf;Rp zz7>xIs12@Ke0gr+4-!pmFP84vCIaTjqFNg{V`5}Rdt~xE^I;Bxp4)|cs8=f)1YwHz zqI`G~s2~qqDV+h02b`PQpUE#^^Aq8l%y2|ByQeXSADg5*qMprEAE3WFg0Q39`O+i1 z!J@iV!`Y~C$wJ!5Z+j5$i<1`+@)tBG$JL=!*uk=2k;T<@{|s1$YL079FvK%mPhyHV zP8^KGZnp`(hVMZ;s=n~3r2y;LTwcJwoBW-(ndU-$03{RD zh+Qn$ja_Z^OuMf3Ub|JTY74s&Am*(n{J3~@#OJNYuEVVJd9*H%)oFoRBkySGm`hx! zT3tG|+aAkXcx-2Apy)h^BkOyFTWQVeZ%e2@;*0DtlG9I3Et=PKaPt&K zw?WI7S;P)TWED7aSH$3hL@Qde?H#tzo^<(o_sv_2ci<7M?F$|oCFWc?7@KBj-;N$P zB;q!8@bW-WJY9do&y|6~mEruZAVe$!?{)N9rZZxD-|oltkhW9~nR8bLBGXw<632!l z*TYQn^NnUy%Ds}$f^=yQ+BM-a5X4^GHF=%PDrRfm_uqC zh{sKwIu|O0&jWb27;wzg4w5uA@TO_j(1X?8E>5Zfma|Ly7Bklq|s z9)H`zoAGY3n-+&JPrT!>u^qg9Evx4y@GI4$n-Uk_5wttU1_t?6><>}cZ-U+&+~JE) zPlDbO_j;MoxdLzMd~Ew|1o^a5q_1R*JZ=#XXMzg?6Zy!^hop}qoLQlJ{(%!KYt`MK z8umEN@Z4w!2=q_oe=;QttPCQy3Nm4F@x>@v4sz_jo{4m*0r%J(w1cSo;D_hQtJs7W z><$QrmG^+<$4{d2bgGo&3-FV}avg9zI|Rr(k{wTyl3!M1q+a zD9W{pCd%il*j&Ft z5H$nENf>>k$;SONGW`qo6`&qKs*T z2^RS)pXk9b@(_Fw1bkb)-oqK|v}r$L!W&aXA>IpcdNZ_vWE#XO8X`#Yp1+?RshVcd zknG%rPd*4ECEI0wD#@d+3NbHKxl}n^Sgkx==Iu%}HvNliOqVBqG?P2va zQ;kRJ$J6j;+wP9cS za#m;#GUT!qAV%+rdWolk+)6kkz4@Yh5LXP+LSvo9_T+MmiaP-eq6_k;)i6_@WSJ zlT@wK$zqHu<83U2V*yJ|XJU4farT#pAA&@qu)(PO^8PxEmPD4;Txpio+2)#!9 z>&=i7*#tc0`?!==vk>s7V+PL#S1;PwSY?NIXN2=Gu89x(cToFm))7L;< z+bhAbVD*bD=}iU`+PU+SBobTQ%S!=VL!>q$rfWsaaV}Smz>lO9JXT#`CcH_mRCSf4%YQAw`$^yY z3Y*^Nzk_g$xn7a_NO(2Eb*I=^;4f!Ra#Oo~LLjlcjke*k*o$~U#0ZXOQ5@HQ&T46l z7504MUgZkz2gNP1QFN8Y?nSEnEai^Rgyvl}xZfMUV6QrJcXp;jKGqB=D*tj{8(_pV zqyB*DK$2lgYGejmJUW)*s_Cv65sFf&pb(Yz8oWgDtQ0~k^0-wdF|tj}MOXaN@ydF8 zNr={U?=;&Z?wr^VC+`)S2xl}QFagy;$mG=TUs7Vi2wws5zEke4hTa2)>O0U?$WYsZ z<8bN2bB_N4AWd%+kncgknZ&}bM~eDtj#C5uRkp21hWW5gxWvc6b*4+dn<{c?w9Rmf zIVZKsPl{W2vQAlYO3yh}-{Os=YBnL8?uN5(RqfQ=-1cOiUnJu>KcLA*tQK3FU`_bM zM^T28w;nAj5EdAXFi&Kk1Nnl2)D!M{@+D-}bIEe+Lc4{s;YJc-{F#``iS2uk;2!Zp zF9#myUmO!wCeJIoi^A+T^e~20c+c2C}XltaR!|U-HfDA=^xF97ev}$l6#oY z&-&T{egB)&aV$3_aVA51XGiU07$s9vubh_kQG?F$FycvS6|IO!6q zq^>9|3U^*!X_C~SxX&pqUkUjz%!j=VlXDo$!2VLH!rKj@61mDpSr~7B2yy{>X~_nc zRI+7g2V&k zd**H++P9dg!-AOs3;GM`(g<+GRV$+&DdMVpUxY9I1@uK28$az=6oaa+PutlO9?6#? zf-OsgT>^@8KK>ggkUQRPPgC7zjKFR5spqQb3ojCHzj^(UH~v+!y*`Smv)VpVoPwa6 zWG18WJaPKMi*F6Zdk*kU^`i~NNTfn3BkJniC`yN98L-Awd)Z&mY? zprBW$!qL-OL7h@O#kvYnLsfff@kDIegt~?{-*5A7JrA;#TmTe?jICJqhub-G@e??D zqiV#g{)M!kW1-4SDel7TO{;@*h2=_76g3NUD@|c*WO#>MfYq6_YVUP+&8e4|%4T`w zXzhmVNziAHazWO2qXcaOu@R1MrPP{t)`N)}-1&~mq=ZH=w=;-E$IOk=y$dOls{6sRR`I5>|X zpq~XYW4sd;J^6OwOf**J>a7u$S>WTFPRkjY;BfVgQst)u4aMLR1|6%)CB^18XCz+r ztkYQ}G43j~Q&1em(_EkMv0|WEiKu;z2zhb(L%$F&xWwzOmk;VLBYAZ8lOCziNoPw1 zv2BOyXA`A8z^WH!nXhKXM`t0;6D*-uGds3TYGrm8SPnJJOQ^fJU#}@aIy@MYWz**H zvkp?7I5PE{$$|~{-ZaFxr6ZolP^nL##mHOErB^AqJqn^hFA=)HWj!m3WDaHW$C)i^ z9@6G$SzB=>jbe>4kqr#sF7#K}W*Cg-5y6kun3u&0L7BpXF9=#7IN8FOjWrWwUBZiU zT_se3ih-GBKx+Uw0N|CwP3D@-C=5(9T#BH@M`F2!Goiqx+Js5xC92|Sy0%WWWp={$(am!#l~f^W_oz78HX<0X#7 zp)p1u~M*o9W@O8P{0Qkg@Wa# z2{Heb&oX^CQSZWSFBXKOfE|tsAm#^U-WkDnU;IowZ`Ok4!mwHwH=s|AqZ^YD4!5!@ zPxJj+Bd-q6w_YG`z_+r;S86zwXb+EO&qogOq8h-Ect5(M2+>(O7n7)^dP*ws_3U6v zVsh)sk^@*c>)3EML|0<-YROho{lz@Nd4;R9gL{9|64xVL`n!m$-Jjrx?-Bacp!=^5 z1^T^eB{_)Y<9)y{-4Rz@9_>;_7h;5D+@QcbF4Wv7hu)s0&==&6u)33 zHRj+&Woq-vDvjwJCYES@$C4{$?f$Ibi4G()UeN11rgjF+^;YE^5nYprYoJNoudNj= zm1pXSeG64dcWHObUetodRn1Fw|1nI$D9z}dVEYT0lQnsf_E1x2vBLql7NrHH!n&Sq z6lc*mvU=WS6=v9Lrl}&zRiu_6u;6g%_DU{9b+R z#YHqX7`m9eydf?KlKu6Sb%j$%_jmydig`B*TN`cZL-g!R)iE?+Q5oOqBFKhx z%MW>BC^(F_JuG(ayE(MT{S3eI{cKiwOtPwLc0XO*{*|(JOx;uQOfq@lp_^cZo=FZj z4#}@e@dJ>Bn%2`2_WPeSN7si^{U#H=7N4o%Dq3NdGybrZgEU$oSm$hC)uNDC_M9xc zGzwh5Sg?mpBIE8lT2XsqTt3j3?We8}3bzLBTQd639vyg^$0#1epq8snlDJP2(BF)K zSx30RM+{f+b$g{9usIL8H!hCO117Xgv}ttPJm9wVRjPk;ePH@zxv%j9k5`TzdXLeT zFgFX`V7cYIcBls5WN0Pf6SMBN+;CrQ(|EsFd*xtwr#$R{Z9FP`OWtyNsq#mCgZ7+P z^Yn$haBJ)r96{ZJd8vlMl?IBxrgh=fdq_NF!1{jARCVz>jNdC)H^wfy?R94#MPdUjcYX>#wEx+LB#P-#4S-%YH>t-j+w zOFTI8gX$ard6fAh&g=u&56%3^-6E2tpk*wx3HSCQ+t7+*iOs zPk5ysqE}i*cQocFvA68xHfL|iX(C4h*67@3|5Qwle(8wT&!&{8*{f%0(5gH+m>$tq zp;AqrP7?XTEooYG1Dzfxc>W%*CyL16q|fQ0_jp%%Bk^k!i#Nbi(N9&T>#M{gez_Ws zYK=l}adalV(nH}I_!hNeb;tQFk3BHX7N}}R8%pek^E`X}%ou=cx8InPU1EE0|Hen- zyw8MoJqB5=)Z%JXlrdTXAE)eqLAdVE-=>wGHrkRet}>3Yu^lt$Kzu%$3#(ioY}@Gu zjk3BZuQH&~7H+C*uX^4}F*|P89JX;Hg2U!pt>rDi(n(Qe-c}tzb0#6_ItoR0->LSt zR~UT<-|@TO%O`M+_e_J4wx7^)5_%%u+J=yF_S#2Xd?C;Ss3N7KY^#-vx+|;bJX&8r zD?|MetfhdC;^2WG`7MCgs>TKKN=^=!x&Q~BzmQio_^l~LboTNT=I zC5pme^P@ER``p$2md9>4!K#vV-Fc1an7pl>_|&>aqP}+zqR?+~Z;f2^`a+-!Te%V? z;H2SbF>jP^GE(R1@%C==XQ@J=G9lKX+Z<@5}PO(EYkJh=GCv#)Nj{DkWJM2}F&oAZ6xu8&g7pn1ps2U5srwQ7CAK zN&*~@t{`31lUf`O;2w^)M3B@o)_mbRu{-`PrfNpF!R^q>yTR&ETS7^-b2*{-tZAZz zw@q5x9B5V8Qd7dZ!Ai$9hk%Q!wqbE1F1c96&zwBBaRW}(^axoPpN^4Aw}&a5dMe+*Gomky_l^54*rzXro$ z>LL)U5Ry>~FJi=*{JDc)_**c)-&faPz`6v`YU3HQa}pLtb5K)u%K+BOqXP0)rj5Au$zB zW1?vr?mDv7Fsxtsr+S6ucp2l#(4dnr9sD*v+@*>g#M4b|U?~s93>Pg{{a5|rm2xfI z`>E}?9S@|IoUX{Q1zjm5YJT|3S>&09D}|2~BiMo=z4YEjXlWh)V&qs;*C{`UMxp$9 zX)QB?G$fPD6z5_pNs>Jeh{^&U^)Wbr?2D6-q?)`*1k@!UvwQgl8eG$r+)NnFoT)L6 zg7lEh+E6J17krfYJCSjWzm67hEth24pomhz71|Qodn#oAILN)*Vwu2qpJirG)4Wnv}9GWOFrQg%Je+gNrPl8mw7ykE8{ z=|B4+uwC&bpp%eFcRU6{mxRV32VeH8XxX>v$du<$(DfinaaWxP<+Y97Z#n#U~V zVEu-GoPD=9$}P;xv+S~Ob#mmi$JQmE;Iz4(){y*9pFyW-jjgdk#oG$fl4o9E8bo|L zWjo4l%n51@Kz-n%zeSCD`uB?T%FVk+KBI}=ve zvlcS#wt`U6wrJo}6I6Rwb=1GzZfwE=I&Ne@p7*pH84XShXYJRgvK)UjQL%R9Zbm(m zxzTQsLTON$WO7vM)*vl%Pc0JH7WhP;$z@j=y#avW4X8iqy6mEYr@-}PW?H)xfP6fQ z&tI$F{NNct4rRMSHhaelo<5kTYq+(?pY)Ieh8*sa83EQfMrFupMM@nfEV@EmdHUv9 z35uzIrIuo4#WnF^_jcpC@uNNaYTQ~uZWOE6P@LFT^1@$o&q+9Qr8YR+ObBkpP9=F+$s5+B!mX2~T zAuQ6RenX?O{IlLMl1%)OK{S7oL}X%;!XUxU~xJN8xk z`xywS*naF(J#?vOpB(K=o~lE;m$zhgPWDB@=p#dQIW>xe_p1OLoWInJRKbEuoncf; zmS1!u-ycc1qWnDg5Nk2D)BY%jmOwCLC+Ny>`f&UxFowIsHnOXfR^S;&F(KXd{ODlm z$6#1ccqt-HIH9)|@fHnrKudu!6B$_R{fbCIkSIb#aUN|3RM>zuO>dpMbROZ`^hvS@ z$FU-;e4W}!ubzKrU@R*dW*($tFZ>}dd*4_mv)#O>X{U@zSzQt*83l9mI zI$8O<5AIDx`wo0}f2fsPC_l>ONx_`E7kdXu{YIZbp1$(^oBAH({T~&oQ&1{X951QW zmhHUxd)t%GQ9#ak5fTjk-cahWC;>^Rg7(`TVlvy0W@Y!Jc%QL3Ozu# zDPIqBCy&T2PWBj+d-JA-pxZlM=9ja2ce|3B(^VCF+a*MMp`(rH>Rt6W1$;r{n1(VK zLs>UtkT43LR2G$AOYHVailiqk7naz2yZGLo*xQs!T9VN5Q>eE(w zw$4&)&6xIV$IO^>1N-jrEUg>O8G4^@y+-hQv6@OmF@gy^nL_n1P1-Rtyy$Bl;|VcV zF=p*&41-qI5gG9UhKmmnjs932!6hceXa#-qfK;3d*a{)BrwNFeKU|ge?N!;zk+kB! zMD_uHJR#%b54c2tr~uGPLTRLg$`fupo}cRJeTwK;~}A>(Acy4k-Xk&Aa1&eWYS1ULWUj@fhBiWY$pdfy+F z@G{OG{*v*mYtH3OdUjwEr6%_ZPZ3P{@rfbNPQG!BZ7lRyC^xlMpWH`@YRar`tr}d> z#wz87t?#2FsH-jM6m{U=gp6WPrZ%*w0bFm(T#7m#v^;f%Z!kCeB5oiF`W33W5Srdt zdU?YeOdPG@98H7NpI{(uN{FJdu14r(URPH^F6tOpXuhU7T9a{3G3_#Ldfx_nT(Hec zo<1dyhsVsTw;ZkVcJ_0-h-T3G1W@q)_Q30LNv)W?FbMH+XJ* zy=$@39Op|kZv`Rt>X`zg&at(?PO^I=X8d9&myFEx#S`dYTg1W+iE?vt#b47QwoHI9 zNP+|3WjtXo{u}VG(lLUaW0&@yD|O?4TS4dfJI`HC-^q;M(b3r2;7|FONXphw-%7~* z&;2!X17|05+kZOpQ3~3!Nb>O94b&ZSs%p)TK)n3m=4eiblVtSx@KNFgBY_xV6ts;NF;GcGxMP8OKV^h6LmSb2E#Qnw ze!6Mnz7>lE9u{AgQ~8u2zM8CYD5US8dMDX-5iMlgpE9m*s+Lh~A#P1er*rF}GHV3h z=`STo?kIXw8I<`W0^*@mB1$}pj60R{aJ7>C2m=oghKyxMbFNq#EVLgP0cH3q7H z%0?L93-z6|+jiN|@v>ix?tRBU(v-4RV`}cQH*fp|)vd3)8i9hJ3hkuh^8dz{F5-~_ zUUr1T3cP%cCaTooM8dj|4*M=e6flH0&8ve32Q)0dyisl))XkZ7Wg~N}6y`+Qi2l+e zUd#F!nJp{#KIjbQdI`%oZ`?h=5G^kZ_uN`<(`3;a!~EMsWV|j-o>c?x#;zR2ktiB! z);5rrHl?GPtr6-o!tYd|uK;Vbsp4P{v_4??=^a>>U4_aUXPWQ$FPLE4PK$T^3Gkf$ zHo&9$U&G`d(Os6xt1r?sg14n)G8HNyWa^q8#nf0lbr4A-Fi;q6t-`pAx1T*$eKM*$ z|CX|gDrk#&1}>5H+`EjV$9Bm)Njw&7-ZR{1!CJTaXuP!$Pcg69`{w5BRHysB$(tWUes@@6aM69kb|Lx$%BRY^-o6bjH#0!7b;5~{6J+jKxU!Kmi# zndh@+?}WKSRY2gZ?Q`{(Uj|kb1%VWmRryOH0T)f3cKtG4oIF=F7RaRnH0Rc_&372={_3lRNsr95%ZO{IX{p@YJ^EI%+gvvKes5cY+PE@unghjdY5#9A!G z70u6}?zmd?v+{`vCu-53_v5@z)X{oPC@P)iA3jK$`r zSA2a7&!^zmUiZ82R2=1cumBQwOJUPz5Ay`RLfY(EiwKkrx%@YN^^XuET;tE zmr-6~I7j!R!KrHu5CWGSChO6deaLWa*9LLJbcAJsFd%Dy>a!>J`N)Z&oiU4OEP-!Ti^_!p}O?7`}i7Lsf$-gBkuY*`Zb z7=!nTT;5z$_5$=J=Ko+Cp|Q0J=%oFr>hBgnL3!tvFoLNhf#D0O=X^h+x08iB;@8pXdRHxX}6R4k@i6%vmsQwu^5z zk1ip`#^N)^#Lg#HOW3sPI33xqFB4#bOPVnY%d6prwxf;Y-w9{ky4{O6&94Ra8VN@K zb-lY;&`HtxW@sF!doT5T$2&lIvJpbKGMuDAFM#!QPXW87>}=Q4J3JeXlwHys?!1^#37q_k?N@+u&Ns20pEoBeZC*np;i;M{2C0Z4_br2gsh6eL z#8`#sn41+$iD?^GL%5?cbRcaa-Nx0vE(D=*WY%rXy3B%gNz0l?#noGJGP728RMY#q z=2&aJf@DcR?QbMmN)ItUe+VM_U!ryqA@1VVt$^*xYt~-qvW!J4Tp<-3>jT=7Zow5M z8mSKp0v4b%a8bxFr>3MwZHSWD73D@+$5?nZAqGM#>H@`)mIeC#->B)P8T$zh-Pxnc z8)~Zx?TWF4(YfKuF3WN_ckpCe5;x4V4AA3(i$pm|78{%!q?|~*eH0f=?j6i)n~Hso zmTo>vqEtB)`%hP55INf7HM@taH)v`Fw40Ayc*R!T?O{ziUpYmP)AH`euTK!zg9*6Z z!>M=$3pd0!&TzU=hc_@@^Yd3eUQpX4-33}b{?~5t5lgW=ldJ@dUAH%`l5US1y_`40 zs(X`Qk}vvMDYYq+@Rm+~IyCX;iD~pMgq^KY)T*aBz@DYEB={PxA>)mI6tM*sx-DmGQHEaHwRrAmNjO!ZLHO4b;;5mf@zzlPhkP($JeZGE7 z?^XN}Gf_feGoG~BjUgVa*)O`>lX=$BSR2)uD<9 z>o^|nb1^oVDhQbfW>>!;8-7<}nL6L^V*4pB=>wwW+RXAeRvKED(n1;R`A6v$6gy0I(;Vf?!4;&sgn7F%LpM}6PQ?0%2Z@b{It<(G1CZ|>913E0nR2r^Pa*Bp z@tFGi*CQ~@Yc-?{cwu1 zsilf=k^+Qs>&WZG(3WDixisHpR>`+ihiRwkL(3T|=xsoNP*@XX3BU8hr57l3k;pni zI``=3Nl4xh4oDj<%>Q1zYXHr%Xg_xrK3Nq?vKX3|^Hb(Bj+lONTz>4yhU-UdXt2>j z<>S4NB&!iE+ao{0Tx^N*^|EZU;0kJkx@zh}S^P{ieQjGl468CbC`SWnwLRYYiStXm zOxt~Rb3D{dz=nHMcY)#r^kF8|q8KZHVb9FCX2m^X*(|L9FZg!5a7((!J8%MjT$#Fs)M1Pb zq6hBGp%O1A+&%2>l0mpaIzbo&jc^!oN^3zxap3V2dNj3x<=TwZ&0eKX5PIso9j1;e zwUg+C&}FJ`k(M|%%}p=6RPUq4sT3-Y;k-<68ciZ~_j|bt>&9ZLHNVrp#+pk}XvM{8 z`?k}o-!if>hVlCP9j%&WI2V`5SW)BCeR5>MQhF)po=p~AYN%cNa_BbV6EEh_kk^@a zD>4&>uCGCUmyA-c)%DIcF4R6!>?6T~Mj_m{Hpq`*(wj>foHL;;%;?(((YOxGt)Bhx zuS+K{{CUsaC++%}S6~CJ=|vr(iIs-je)e9uJEU8ZJAz)w166q)R^2XI?@E2vUQ!R% zn@dxS!JcOimXkWJBz8Y?2JKQr>`~SmE2F2SL38$SyR1^yqj8_mkBp)o$@+3BQ~Mid z9U$XVqxX3P=XCKj0*W>}L0~Em`(vG<>srF8+*kPrw z20{z(=^w+ybdGe~Oo_i|hYJ@kZl*(9sHw#Chi&OIc?w`nBODp?ia$uF%Hs(X>xm?j zqZQ`Ybf@g#wli`!-al~3GWiE$K+LCe=Ndi!#CVjzUZ z!sD2O*;d28zkl))m)YN7HDi^z5IuNo3^w(zy8 zszJG#mp#Cj)Q@E@r-=NP2FVxxEAeOI2e=|KshybNB6HgE^(r>HD{*}S}mO>LuRGJT{*tfTzw_#+er-0${}%YPe@CMJ1Ng#j#)i)SnY@ss3gL;g zg2D~#Kpdfu#G;q1qz_TwSz1VJT(b3zby$Vk&;Y#1(A)|xj`_?i5YQ;TR%jice5E;0 zYHg;`zS5{S*9xI6o^j>rE8Ua*XhIw{_-*&@(R|C(am8__>+Ws&Q^ymy*X4~hR2b5r zm^p3sw}yv=tdyncy_Ui7{BQS732et~Z_@{-IhHDXAV`(Wlay<#hb>%H%WDi+K$862nA@BDtM#UCKMu+kM`!JHyWSi?&)A7_ z3{cyNG%a~nnH_!+;g&JxEMAmh-Z}rC!o7>OVzW&PoMyTA_g{hqXG)SLraA^OP**<7 zjWbr7z!o2n3hnx7A=2O=WL;`@9N{vQIM@&|G-ljrPvIuJHYtss0Er0fT5cMXNUf1B z7FAwBDixt0X7C3S)mPe5g`YtME23wAnbU)+AtV}z+e8G;0BP=bI;?(#|Ep!vVfDbK zvx+|CKF>yt0hWQ3drchU#XBU+HiuG*V^snFAPUp-5<#R&BUAzoB!aZ+e*KIxa26V}s6?nBK(U-7REa573wg-jqCg>H8~>O{ z*C0JL-?X-k_y%hpUFL?I>0WV{oV`Nb)nZbJG01R~AG>flIJf)3O*oB2i8~;!P?Wo_ z0|QEB*fifiL6E6%>tlAYHm2cjTFE@*<);#>689Z6S#BySQ@VTMhf9vYQyLeDg1*F} zjq>i1*x>5|CGKN{l9br3kB0EHY|k4{%^t7-uhjd#NVipUZa=EUuE5kS1_~qYX?>hJ z$}!jc9$O$>J&wnu0SgfYods^z?J4X;X7c77Me0kS-dO_VUQ39T(Kv(Y#s}Qqz-0AH z^?WRL(4RzpkD+T5FG_0NyPq-a-B7A5LHOCqwObRJi&oRi(<;OuIN7SV5PeHU$<@Zh zPozEV`dYmu0Z&Tqd>t>8JVde9#Pt+l95iHe$4Xwfy1AhI zDM4XJ;bBTTvRFtW>E+GzkN)9k!hA5z;xUOL2 zq4}zn-DP{qc^i|Y%rvi|^5k-*8;JZ~9a;>-+q_EOX+p1Wz;>i7c}M6Nv`^NY&{J-> z`(mzDJDM}QPu5i44**2Qbo(XzZ-ZDu%6vm8w@DUarqXj41VqP~ zs&4Y8F^Waik3y1fQo`bVUH;b=!^QrWb)3Gl=QVKr+6sxc=ygauUG|cm?|X=;Q)kQ8 zM(xrICifa2p``I7>g2R~?a{hmw@{!NS5`VhH8+;cV(F>B94M*S;5#O`YzZH1Z%yD? zZ61w(M`#aS-*~Fj;x|J!KM|^o;MI#Xkh0ULJcA?o4u~f%Z^16ViA27FxU5GM*rKq( z7cS~MrZ=f>_OWx8j#-Q3%!aEU2hVuTu(7`TQk-Bi6*!<}0WQi;_FpO;fhpL4`DcWp zGOw9vx0N~6#}lz(r+dxIGZM3ah-8qrqMmeRh%{z@dbUD2w15*_4P?I~UZr^anP}DB zU9CCrNiy9I3~d#&!$DX9e?A});BjBtQ7oGAyoI$8YQrkLBIH@2;lt4E^)|d6Jwj}z z&2_E}Y;H#6I4<10d_&P0{4|EUacwFHauvrjAnAm6yeR#}f}Rk27CN)vhgRqEyPMMS7zvunj2?`f;%?alsJ+-K+IzjJx>h8 zu~m_y$!J5RWAh|C<6+uiCNsOKu)E72M3xKK(a9Okw3e_*O&}7llNV!=P87VM2DkAk zci!YXS2&=P0}Hx|wwSc9JP%m8dMJA*q&VFB0yMI@5vWoAGraygwn){R+Cj6B1a2Px z5)u(K5{+;z2n*_XD!+Auv#LJEM)(~Hx{$Yb^ldQmcYF2zNH1V30*)CN_|1$v2|`LnFUT$%-tO0Eg|c5$BB~yDfzS zcOXJ$wpzVK0MfTjBJ0b$r#_OvAJ3WRt+YOLlJPYMx~qp>^$$$h#bc|`g0pF-Ao43? z>*A+8lx>}L{p(Tni2Vvk)dtzg$hUKjSjXRagj)$h#8=KV>5s)J4vGtRn5kP|AXIz! zPgbbVxW{2o4s-UM;c#We8P&mPN|DW7_uLF!a|^0S=wr6Esx9Z$2|c1?GaupU6$tb| zY_KU`(_29O_%k(;>^|6*pZURH3`@%EuKS;Ns z1lujmf;r{qAN&Q0&m{wJSZ8MeE7RM5+Sq;ul_ z`+ADrd_Um+G37js6tKsArNB}n{p*zTUxQr>3@wA;{EUbjNjlNd6$Mx zg0|MyU)v`sa~tEY5$en7^PkC=S<2@!nEdG6L=h(vT__0F=S8Y&eM=hal#7eM(o^Lu z2?^;05&|CNliYrq6gUv;|i!(W{0N)LWd*@{2q*u)}u*> z7MQgk6t9OqqXMln?zoMAJcc zMKaof_Up})q#DzdF?w^%tTI7STI^@8=Wk#enR*)&%8yje>+tKvUYbW8UAPg55xb70 zEn5&Ba~NmOJlgI#iS8W3-@N%>V!#z-ZRwfPO1)dQdQkaHsiqG|~we2ALqG7Ruup(DqSOft2RFg_X%3w?6VqvV1uzX_@F(diNVp z4{I|}35=11u$;?|JFBEE*gb;T`dy+8gWJ9~pNsecrO`t#V9jW-6mnfO@ff9od}b(3s4>p0i30gbGIv~1@a^F2kl7YO;DxmF3? zWi-RoXhzRJV0&XE@ACc?+@6?)LQ2XNm4KfalMtsc%4!Fn0rl zpHTrHwR>t>7W?t!Yc{*-^xN%9P0cs0kr=`?bQ5T*oOo&VRRu+1chM!qj%2I!@+1XF z4GWJ=7ix9;Wa@xoZ0RP`NCWw0*8247Y4jIZ>GEW7zuoCFXl6xIvz$ezsWgKdVMBH> z{o!A7f;R-@eK9Vj7R40xx)T<2$?F2E<>Jy3F;;=Yt}WE59J!1WN367 zA^6pu_zLoZIf*x031CcwotS{L8bJE(<_F%j_KJ2P_IusaZXwN$&^t716W{M6X2r_~ zaiMwdISX7Y&Qi&Uh0upS3TyEIXNDICQlT5fHXC`aji-c{U(J@qh-mWl-uMN|T&435 z5)a1dvB|oe%b2mefc=Vpm0C%IUYYh7HI*;3UdgNIz}R##(#{(_>82|zB0L*1i4B5j-xi9O4x10rs_J6*gdRBX=@VJ+==sWb&_Qc6tSOowM{BX@(zawtjl zdU!F4OYw2@Tk1L^%~JCwb|e#3CC>srRHQ*(N%!7$Mu_sKh@|*XtR>)BmWw!;8-mq7 zBBnbjwx8Kyv|hd*`5}84flTHR1Y@@uqjG`UG+jN_YK&RYTt7DVwfEDXDW4U+iO{>K zw1hr{_XE*S*K9TzzUlJH2rh^hUm2v7_XjwTuYap|>zeEDY$HOq3X4Tz^X}E9z)x4F zs+T?Ed+Hj<#jY-`Va~fT2C$=qFT-5q$@p9~0{G&eeL~tiIAHXA!f6C(rAlS^)&k<- zXU|ZVs}XQ>s5iONo~t!XXZgtaP$Iau;JT%h)>}v54yut~pykaNye4axEK#5@?TSsQ zE;Jvf9I$GVb|S`7$pG)4vgo9NXsKr?u=F!GnA%VS2z$@Z(!MR9?EPcAqi5ft)Iz6sNl`%kj+_H-X`R<>BFrBW=fSlD|{`D%@Rcbu2?%>t7i34k?Ujb)2@J-`j#4 zLK<69qcUuniIan-$A1+fR=?@+thwDIXtF1Tks@Br-xY zfB+zblrR(ke`U;6U~-;p1Kg8Lh6v~LjW@9l2P6s+?$2!ZRPX`(ZkRGe7~q(4&gEi<$ch`5kQ?*1=GSqkeV z{SA1EaW_A!t{@^UY2D^YO0(H@+kFVzZaAh0_`A`f(}G~EP~?B|%gtxu&g%^x{EYSz zk+T;_c@d;+n@$<>V%P=nk36?L!}?*=vK4>nJSm+1%a}9UlmTJTrfX4{Lb7smNQn@T zw9p2%(Zjl^bWGo1;DuMHN(djsEm)P8mEC2sL@KyPjwD@d%QnZ$ zMJ3cnn!_!iP{MzWk%PI&D?m?C(y2d|2VChluN^yHya(b`h>~GkI1y;}O_E57zOs!{ zt2C@M$^PR2U#(dZmA-sNreB@z-yb0Bf7j*yONhZG=onhx>t4)RB`r6&TP$n zgmN*)eCqvgriBO-abHQ8ECN0bw?z5Bxpx z=jF@?zFdVn?@gD5egM4o$m`}lV(CWrOKKq(sv*`mNcHcvw&Xryfw<{ch{O&qc#WCTXX6=#{MV@q#iHYba!OUY+MGeNTjP%Fj!WgM&`&RlI^=AWTOqy-o zHo9YFt!gQ*p7{Fl86>#-JLZo(b^O`LdFK~OsZBRR@6P?ad^Ujbqm_j^XycM4ZHFyg ziUbIFW#2tj`65~#2V!4z7DM8Z;fG0|APaQ{a2VNYpNotB7eZ5kp+tPDz&Lqs0j%Y4tA*URpcfi z_M(FD=fRGdqf430j}1z`O0I=;tLu81bwJXdYiN7_&a-?ly|-j*+=--XGvCq#32Gh(=|qj5F?kmihk{%M&$}udW5)DHK zF_>}5R8&&API}o0osZJRL3n~>76nUZ&L&iy^s>PMnNcYZ|9*1$v-bzbT3rpWsJ+y{ zPrg>5Zlery96Um?lc6L|)}&{992{_$J&=4%nRp9BAC6!IB=A&=tF>r8S*O-=!G(_( zwXbX_rGZgeiK*&n5E;f=k{ktyA1(;x_kiMEt0*gpp_4&(twlS2e5C?NoD{n>X2AT# zY@Zp?#!b1zNq96MQqeO*M1MMBin5v#RH52&Xd~DO6-BZLnA6xO1$sou(YJ1Dlc{WF zVa%2DyYm`V#81jP@70IJ;DX@y*iUt$MLm)ByAD$eUuji|5{ptFYq(q)mE(5bOpxjM z^Q`AHWq44SG3`_LxC9fwR)XRVIp=B%<(-lOC3jI#bb@dK(*vjom!=t|#<@dZql%>O z15y^{4tQoeW9Lu%G&V$90x6F)xN6y_oIn;!Q zs)8jT$;&;u%Y>=T3hg34A-+Y*na=|glcStr5D;&5*t5*DmD~x;zQAV5{}Ya`?RRGa zT*t9@$a~!co;pD^!J5bo?lDOWFx%)Y=-fJ+PDGc0>;=q=s?P4aHForSB+)v0WY2JH z?*`O;RHum6j%#LG)Vu#ciO#+jRC3!>T(9fr+XE7T2B7Z|0nR5jw@WG)kDDzTJ=o4~ zUpeyt7}_nd`t}j9BKqryOha{34erm)RmST)_9Aw)@ zHbiyg5n&E{_CQR@h<}34d7WM{s{%5wdty1l+KX8*?+-YkNK2Be*6&jc>@{Fd;Ps|| z26LqdI3#9le?;}risDq$K5G3yoqK}C^@-8z^wj%tdgw-6@F#Ju{Sg7+y)L?)U$ez> zoOaP$UFZ?y5BiFycir*pnaAaY+|%1%8&|(@VB)zweR%?IidwJyK5J!STzw&2RFx zZV@qeaCB01Hu#U9|1#=Msc8Pgz5P*4Lrp!Q+~(G!OiNR{qa7|r^H?FC6gVhkk3y7=uW#Sh;&>78bZ}aK*C#NH$9rX@M3f{nckYI+5QG?Aj1DM)@~z_ zw!UAD@gedTlePB*%4+55naJ8ak_;))#S;4ji!LOqY5VRI){GMwHR~}6t4g>5C_#U# ztYC!tjKjrKvRy=GAsJVK++~$|+s!w9z3H4G^mACv=EErXNSmH7qN}%PKcN|8%9=i)qS5+$L zu&ya~HW%RMVJi4T^pv?>mw*Gf<)-7gf#Qj|e#w2|v4#t!%Jk{&xlf;$_?jW*n!Pyx zkG$<18kiLOAUPuFfyu-EfWX%4jYnjBYc~~*9JEz6oa)_R|8wjZA|RNrAp%}14L7fW zi7A5Wym*K+V8pkqqO-X#3ft{0qs?KVt^)?kS>AicmeO&q+~J~ zp0YJ_P~_a8j= zsAs~G=8F=M{4GZL{|B__UorX@MRNQLn?*_gym4aW(~+i13knnk1P=khoC-ViMZk+x zLW(l}oAg1H`dU+Fv**;qw|ANDSRs>cGqL!Yw^`; zv;{E&8CNJcc)GHzTYM}f&NPw<6j{C3gaeelU#y!M)w-utYEHOCCJo|Vgp7K6C_$14 zqIrLUB0bsgz^D%V%fbo2f9#yb#CntTX?55Xy|Kps&Xek*4_r=KDZ z+`TQuv|$l}MWLzA5Ay6Cvsa^7xvwXpy?`w(6vx4XJ zWuf1bVSb#U8{xlY4+wlZ$9jjPk)X_;NFMqdgq>m&W=!KtP+6NL57`AMljW+es zzqjUjgz;V*kktJI?!NOg^s_)ph45>4UDA!Vo0hn>KZ+h-3=?Y3*R=#!fOX zP$Y~+14$f66ix?UWB_6r#fMcC^~X4R-<&OD1CSDNuX~y^YwJ>sW0j`T<2+3F9>cLo z#!j57$ll2K9(%$4>eA7(>FJX5e)pR5&EZK!IMQzOfik#FU*o*LGz~7u(8}XzIQRy- z!U7AlMTIe|DgQFmc%cHy_9^{o`eD%ja_L>ckU6$O4*U**o5uR7`FzqkU8k4gxtI=o z^P^oGFPm5jwZMI{;nH}$?p@uV8FT4r=|#GziKXK07bHJLtK}X%I0TON$uj(iJ`SY^ zc$b2CoxCQ>7LH@nxcdW&_C#fMYBtTxcg46dL{vf%EFCZ~eErMvZq&Z%Lhumnkn^4A zsx$ay(FnN7kYah}tZ@0?-0Niroa~13`?hVi6`ndno`G+E8;$<6^gsE-K3)TxyoJ4M zb6pj5=I8^FD5H@`^V#Qb2^0cx7wUz&cruA5g>6>qR5)O^t1(-qqP&1g=qvY#s&{bx zq8Hc%LsbK1*%n|Y=FfojpE;w~)G0-X4i*K3{o|J7`krhIOd*c*$y{WIKz2n2*EXEH zT{oml3Th5k*vkswuFXdGDlcLj15Nec5pFfZ*0?XHaF_lVuiB%Pv&p7z)%38}%$Gup zVTa~C8=cw%6BKn_|4E?bPNW4PT7}jZQLhDJhvf4z;~L)506IE0 zX!tWXX(QOQPRj-p80QG79t8T2^az4Zp2hOHziQlvT!|H)jv{Ixodabzv6lBj)6WRB z{)Kg@$~~(7$-az?lw$4@L%I&DI0Lo)PEJJziWP33a3azb?jyXt1v0N>2kxwA6b%l> zZqRpAo)Npi&loWbjFWtEV)783BbeIAhqyuc+~>i7aQ8shIXt)bjCWT6$~ro^>99G} z2XfmT0(|l!)XJb^E!#3z4oEGIsL(xd; zYX1`1I(cG|u#4R4T&C|m*9KB1`UzKvho5R@1eYtUL9B72{i(ir&ls8g!pD ztR|25xGaF!4z5M+U@@lQf(12?xGy`!|3E}7pI$k`jOIFjiDr{tqf0va&3pOn6Pu)% z@xtG2zjYuJXrV)DUrIF*y<1O1<$#54kZ#2;=X51J^F#0nZ0(;S$OZDt_U2bx{RZ=Q zMMdd$fH|!s{ zXq#l;{`xfV`gp&C>A`WrQU?d{!Ey5(1u*VLJt>i27aZ-^&2IIk=zP5p+{$q(K?2(b z8?9h)kvj9SF!Dr zoyF}?V|9;6abHxWk2cEvGs$-}Pg}D+ZzgkaN&$Snp%;5m%zh1E#?Wac-}x?BYlGN#U#Mek*}kek#I9XaHt?mz3*fDrRTQ#&#~xyeqJk1QJ~E$7qsw6 z?sV;|?*=-{M<1+hXoj?@-$y+(^BJ1H~wQ9G8C0#^aEAyhDduNX@haoa=PuPp zYsGv8UBfQaRHgBgLjmP^eh>fLMeh{8ic)?xz?#3kX-D#Z{;W#cd_`9OMFIaJg-=t`_3*!YDgtNQ2+QUEAJB9M{~AvT$H`E)IKmCR21H532+ata8_i_MR@ z2Xj<3w<`isF~Ah$W{|9;51ub*f4#9ziKrOR&jM{x7I_7()O@`F*5o$KtZ?fxU~g`t zUovNEVKYn$U~VX8eR)qb`7;D8pn*Pp$(otYTqL)5KH$lUS-jf}PGBjy$weoceAcPp z&5ZYB$r&P$MN{0H0AxCe4Qmd3T%M*5d4i%#!nmBCN-WU-4m4Tjxn-%j3HagwTxCZ9 z)j5vO-C7%s%D!&UfO>bi2oXiCw<-w{vVTK^rVbv#W=WjdADJy8$khnU!`ZWCIU`># zyjc^1W~pcu>@lDZ{zr6gv%)2X4n27~Ve+cQqcND%0?IFSP4sH#yIaXXYAq^z3|cg` z`I3$m%jra>e2W-=DiD@84T!cb%||k)nPmEE09NC%@PS_OLhkrX*U!cgD*;;&gIaA(DyVT4QD+q_xu z>r`tg{hiGY&DvD-)B*h+YEd+Zn)WylQl}<4>(_NlsKXCRV;a)Rcw!wtelM2_rWX`j zTh5A|i6=2BA(iMCnj_fob@*eA;V?oa4Z1kRBGaU07O70fb6-qmA$Hg$ps@^ka1=RO zTbE_2#)1bndC3VuK@e!Sftxq4=Uux}fDxXE#Q5_x=E1h>T5`DPHz zbH<_OjWx$wy7=%0!mo*qH*7N4tySm+R0~(rbus`7;+wGh;C0O%x~fEMkt!eV>U$`i z5>Q(o z=t$gPjgGh0&I7KY#k50V7DJRX<%^X z>6+ebc9efB3@eE2Tr){;?_w`vhgF>`-GDY(YkR{9RH(MiCnyRtd!LxXJ75z+?2 zGi@m^+2hKJ5sB1@Xi@s_@p_Kwbc<*LQ_`mr^Y%j}(sV_$`J(?_FWP)4NW*BIL~sR>t6 zM;qTJZ~GoY36&{h-Pf}L#y2UtR}>ZaI%A6VkU>vG4~}9^i$5WP2Tj?Cc}5oQxe2=q z8BeLa$hwCg_psjZyC2+?yX4*hJ58Wu^w9}}7X*+i5Rjqu5^@GzXiw#SUir1G1`jY% zOL=GE_ENYxhcyUrEt9XlMNP6kx6h&%6^u3@zB8KUCAa18T(R2J`%JjWZ z!{7cXaEW+Qu*iJPu+m>QqW}Lo$4Z+!I)0JNzZ&_M%=|B1yejFRM04bGAvu{=lNPd+ zJRI^DRQ(?FcVUD+bgEcAi@o(msqys9RTCG#)TjI!9~3-dc`>gW;HSJuQvH~d`MQs86R$|SKXHh zqS9Qy)u;T`>>a!$LuaE2keJV%;8g)tr&Nnc;EkvA-RanHXsy)D@XN0a>h}z2j81R; zsUNJf&g&rKpuD0WD@=dDrPHdBoK42WoBU|nMo17o(5^;M|dB4?|FsAGVrSyWcI`+FVw^vTVC`y}f(BwJl zrw3Sp151^9=}B})6@H*i4-dIN_o^br+BkcLa^H56|^2XsT0dESw2 zMX>(KqNl=x2K5=zIKg}2JpGAZu{I_IO}0$EQ5P{4zol**PCt3F4`GX}2@vr8#Y)~J zKb)gJeHcFnR@4SSh%b;c%J`l=W*40UPjF#q{<}ywv-=vHRFmDjv)NtmC zQx9qm)d%0zH&qG7AFa3VAU1S^(n8VFTC~Hb+HjYMjX8r#&_0MzlNR*mnLH5hi}`@{ zK$8qiDDvS_(L9_2vHgzEQ${DYSE;DqB!g*jhJghE&=LTnbgl&Xepo<*uRtV{2wDHN z)l;Kg$TA>Y|K8Lc&LjWGj<+bp4Hiye_@BfU(y#nF{fpR&|Ltbye?e^j0}8JC4#xi% zv29ZR%8%hk=3ZDvO-@1u8KmQ@6p%E|dlHuy#H1&MiC<*$YdLkHmR#F3ae;bKd;@*i z2_VfELG=B}JMLCO-6UQy^>RDE%K4b>c%9ki`f~Z2Qu8hO7C#t%Aeg8E%+}6P7Twtg z-)dj(w}_zFK&86KR@q9MHicUAucLVshUdmz_2@32(V`y3`&Kf8Q2I)+!n0mR=rrDU zXvv^$ho;yh*kNqJ#r1}b0|i|xRUF6;lhx$M*uG3SNLUTC@|htC z-=fsw^F%$qqz4%QdjBrS+ov}Qv!z00E+JWas>p?z@=t!WWU3K*?Z(0meTuTOC7OTx zU|kFLE0bLZ+WGcL$u4E}5dB0g`h|uwv3=H6f+{5z9oLv-=Q45+n~V4WwgO=CabjM% zBAN+RjM65(-}>Q2V#i1Na@a0`08g&y;W#@sBiX6Tpy8r}*+{RnyGUT`?XeHSqo#|J z^ww~c;ou|iyzpErDtlVU=`8N7JSu>4M z_pr9=tX0edVn9B}YFO2y(88j#S{w%E8vVOpAboK*27a7e4Ekjt0)hIX99*1oE;vex z7#%jhY=bPijA=Ce@9rRO(Vl_vnd00!^TAc<+wVvRM9{;hP*rqEL_(RzfK$er_^SN; z)1a8vo8~Dr5?;0X0J62Cusw$A*c^Sx1)dom`-)Pl7hsW4i(r*^Mw`z5K>!2ixB_mu z*Ddqjh}zceRFdmuX1akM1$3>G=#~|y?eYv(e-`Qy?bRHIq=fMaN~fB zUa6I8Rt=)jnplP>yuS+P&PxeWpJ#1$F`iqRl|jF$WL_aZFZl@kLo&d$VJtu&w?Q0O zzuXK>6gmygq(yXJy0C1SL}T8AplK|AGNUOhzlGeK_oo|haD@)5PxF}rV+5`-w{Aag zus45t=FU*{LguJ11Sr-28EZkq;!mJO7AQGih1L4rEyUmp>B!%X0YemsrV3QFvlgt* z5kwlPzaiJ+kZ^PMd-RRbl(Y?F*m`4*UIhIuf#8q>H_M=fM*L_Op-<_r zBZagV=4B|EW+KTja?srADTZXCd3Yv%^Chfpi)cg{ED${SI>InNpRj5!euKv?=Xn92 zsS&FH(*w`qLIy$doc>RE&A5R?u zzkl1sxX|{*fLpXvIW>9d<$ePROttn3oc6R!sN{&Y+>Jr@yeQN$sFR z;w6A<2-0%UA?c8Qf;sX7>>uKRBv3Ni)E9pI{uVzX|6Bb0U)`lhLE3hK58ivfRs1}d zNjlGK0hdq0qjV@q1qI%ZFMLgcpWSY~mB^LK)4GZ^h_@H+3?dAe_a~k*;9P_d7%NEFP6+ zgV(oGr*?W(ql?6SQ~`lUsjLb%MbfC4V$)1E0Y_b|OIYxz4?O|!kRb?BGrgiH5+(>s zoqM}v*;OBfg-D1l`M6T6{K`LG+0dJ1)!??G5g(2*vlNkm%Q(MPABT$r13q?|+kL4- zf)Mi5r$sn;u41aK(K#!m+goyd$c!KPl~-&-({j#D4^7hQkV3W|&>l_b!}!z?4($OA z5IrkfuT#F&S1(`?modY&I40%gtroig{YMvF{K{>5u^I51k8RriGd${z)=5k2tG zM|&Bp5kDTfb#vfuTTd?)a=>bX=lokw^y9+2LS?kwHQIWI~pYgy7 zb?A-RKVm_vM5!9?C%qYdfRAw& zAU7`up~%g=p@}pg#b7E)BFYx3g%(J36Nw(Dij!b>cMl@CSNbrW!DBDbTD4OXk!G4x zi}JBKc8HBYx$J~31PXH+4^x|UxK~(<@I;^3pWN$E=sYma@JP|8YL`L(zI6Y#c%Q{6 z*APf`DU$S4pr#_!60BH$FGViP14iJmbrzSrOkR;f3YZa{#E7Wpd@^4E-zH8EgPc-# zKWFPvh%WbqU_%ZEt`=Q?odKHc7@SUmY{GK`?40VuL~o)bS|is$Hn=<=KGHOsEC5tB zFb|q}gGlL97NUf$G$>^1b^3E18PZ~Pm9kX%*ftnolljiEt@2#F2R5ah$zbXd%V_Ev zyDd{1o_uuoBga$fB@Fw!V5F3jIr=a-ykqrK?WWZ#a(bglI_-8pq74RK*KfQ z0~Dzus7_l;pMJYf>Bk`)`S8gF!To-BdMnVw5M-pyu+aCiC5dwNH|6fgRsIKZcF&)g zr}1|?VOp}I3)IR@m1&HX1~#wsS!4iYqES zK}4J{Ei>;e3>LB#Oly>EZkW14^@YmpbgxCDi#0RgdM${&wxR+LiX}B+iRioOB0(pDKpVEI;ND?wNx>%e|m{RsqR_{(nmQ z3ZS}@t!p4a(BKx_-CYwrcyJ5u1TO9bcXti$8sy>xcLKqKCc#~UOZYD{llKTSFEjJ~ zyNWt>tLU}*>^`TvPxtP%F`ZJQw@W0^>x;!^@?k_)9#bF$j0)S3;mH-IR5y82l|%=F z2lR8zhP?XNP-ucZZ6A+o$xOyF!w;RaLHGh57GZ|TCXhJqY~GCh)aXEV$1O&$c}La1 zjuJxkY9SM4av^Hb;i7efiYaMwI%jGy`3NdY)+mcJhF(3XEiSlU3c|jMBi|;m-c?~T z+x0_@;SxcoY=(6xNgO$bBt~Pj8`-<1S|;Bsjrzw3@zSjt^JC3X3*$HI79i~!$RmTz zsblZsLYs7L$|=1CB$8qS!tXrWs!F@BVuh?kN(PvE5Av-*r^iYu+L^j^m9JG^#=m>@ z=1soa)H*w6KzoR$B8mBCXoU;f5^bVuwQ3~2LKg!yxomG1#XPmn(?YH@E~_ED+W6mxs%x{%Z<$pW`~ON1~2XjP5v(0{C{+6Dm$00tsd3w=f=ZENy zOgb-=f}|Hb*LQ$YdWg<(u7x3`PKF)B7ZfZ6;1FrNM63 z?O6tE%EiU@6%rVuwIQjvGtOofZBGZT1Sh(xLIYt9c4VI8`!=UJd2BfLjdRI#SbVAX ziT(f*RI^T!IL5Ac>ql7uduF#nuCRJ1)2bdvAyMxp-5^Ww5p#X{rb5)(X|fEhDHHW{ zw(Lfc$g;+Q`B0AiPGtmK%*aWfQQ$d!*U<|-@n2HZvCWSiw^I>#vh+LyC;aaVWGbmkENr z&kl*8o^_FW$T?rDYLO1Pyi%>@&kJKQoH2E0F`HjcN}Zlnx1ddoDA>G4Xu_jyp6vuT zPvC}pT&Owx+qB`zUeR|4G;OH(<<^_bzkjln0k40t`PQxc$7h(T8Ya~X+9gDc8Z9{Z z&y0RAU}#_kQGrM;__MK9vwIwK^aoqFhk~dK!ARf1zJqHMxF2?7-8|~yoO@_~Ed;_wvT%Vs{9RK$6uUQ|&@#6vyBsFK9eZW1Ft#D2)VpQRwpR(;x^ zdoTgMqfF9iBl%{`QDv7B0~8{8`8k`C4@cbZAXBu00v#kYl!#_Wug{)2PwD5cNp?K^ z9+|d-4z|gZ!L{57>!Ogfbzchm>J1)Y%?NThxIS8frAw@z>Zb9v%3_3~F@<=LG%r*U zaTov}{{^z~SeX!qgSYow`_5)ij*QtGp4lvF`aIGQ>@3ZTkDmsl#@^5*NGjOuu82}o zzLF~Q9SW+mP=>88%eSA1W4_W7-Q>rdq^?t=m6}^tDPaBRGFLg%ak93W!kOp#EO{6& zP%}Iff5HZQ9VW$~+9r=|Quj#z*=YwcnssS~9|ub2>v|u1JXP47vZ1&L1O%Z1DsOrDfSIMHU{VT>&>H=9}G3i@2rP+rx@eU@uE8rJNec zij~#FmuEBj03F1~ct@C@$>y)zB+tVyjV3*n`mtAhIM0$58vM9jOQC}JJOem|EpwqeMuYPxu3sv}oMS?S#o6GGK@8PN59)m&K4Dc&X% z(;XL_kKeYkafzS3Wn5DD>Yiw{LACy_#jY4op(>9q>>-*9@C0M+=b#bknAWZ37^(Ij zq>H%<@>o4a#6NydoF{_M4i4zB_KG)#PSye9bk0Ou8h%1Dtl7Q_y#7*n%g)?m>xF~( zjqvOwC;*qvN_3(*a+w2|ao0D?@okOvg8JskUw(l7n`0fncglavwKd?~l_ryKJ^Ky! zKCHkIC-o7%fFvPa$)YNh022lakMar^dgL=t#@XLyNHHw!b?%WlM)R@^!)I!smZL@k zBi=6wE5)2v&!UNV(&)oOYW(6Qa!nUjDKKBf-~Da=#^HE4(@mWk)LPvhyN3i4goB$3K8iV7uh zsv+a?#c4&NWeK(3AH;ETrMOIFgu{_@%XRwCZ;L=^8Ts)hix4Pf3yJRQ<8xb^CkdmC z?c_gB)XmRsk`9ch#tx4*hO=#qS7={~Vb4*tTf<5P%*-XMfUUYkI9T1cEF;ObfxxI-yNuA=I$dCtz3ey znVkctYD*`fUuZ(57+^B*R=Q}~{1z#2!ca?)+YsRQb+lt^LmEvZt_`=j^wqig+wz@n@ z`LIMQJT3bxMzuKg8EGBU+Q-6cs5(@5W?N>JpZL{$9VF)veF`L5%DSYTNQEypW%6$u zm_~}T{HeHj1bAlKl8ii92l9~$dm=UM21kLemA&b$;^!wB7#IKWGnF$TVq!!lBlG4 z{?Rjz?P(uvid+|i$VH?`-C&Gcb3{(~Vpg`w+O);Wk1|Mrjxrht0GfRUnZqz2MhrXa zqgVC9nemD5)H$to=~hp)c=l9?#~Z_7i~=U-`FZxb-|TR9@YCxx;Zjo-WpMNOn2)z) zFPGGVl%3N$f`gp$gPnWC+f4(rmts%fidpo^BJx72zAd7|*Xi{2VXmbOm)1`w^tm9% znM=0Fg4bDxH5PxPEm{P3#A(mxqlM7SIARP?|2&+c7qmU8kP&iApzL|F>Dz)Ixp_`O zP%xrP1M6@oYhgo$ZWwrAsYLa4 z|I;DAvJxno9HkQrhLPQk-8}=De{9U3U%)dJ$955?_AOms!9gia%)0E$Mp}$+0er@< zq7J&_SzvShM?e%V?_zUu{niL@gt5UFOjFJUJ}L?$f%eU%jUSoujr{^O=?=^{19`ON zlRIy8Uo_nqcPa6@yyz`CM?pMJ^^SN^Fqtt`GQ8Q#W4kE7`V9^LT}j#pMChl!j#g#J zr-=CCaV%xyFeQ9SK+mG(cTwW*)xa(eK;_Z(jy)woZp~> zA(4}-&VH+TEeLzPTqw&FOoK(ZjD~m{KW05fiGLe@E3Z2`rLukIDahE*`u!ubU)9`o zn^-lyht#E#-dt~S>}4y$-mSbR8{T@}22cn^refuQ08NjLOv?JiEWjyOnzk<^R5%gO zhUH_B{oz~u#IYwVnUg8?3P*#DqD8#X;%q%HY**=I>>-S|!X*-!x1{^l#OnR56O>iD zc;i;KS+t$koh)E3)w0OjWJl_aW2;xF=9D9Kr>)(5}4FqUbk# zI#$N8o0w;IChL49m9CJTzoC!|u{Ljd%ECgBOf$}&jA^$(V#P#~)`&g`H8E{uv52pp zwto`xUL-L&WTAVREEm$0g_gYPL(^vHq(*t1WCH_6alhkeW&GCZ3hL)|{O-jiFOBrF z!EW=Jej|dqQitT6!B-7&io2K)WIm~Q)v@yq%U|VpV+I?{y0@Yd%n8~-NuuM*pM~KA z85YB};IS~M(c<}4Hxx>qRK0cdl&e?t253N%vefkgds>Ubn8X}j6Vpgs>a#nFq$osY z1ZRwLqFv=+BTb=i%D2Wv>_yE0z}+niZ4?rE|*a3d7^kndWGwnFqt+iZ(7+aln<}jzbAQ(#Z2SS}3S$%Bd}^ zc9ghB%O)Z_mTZMRC&H#)I#fiLuIkGa^`4e~9oM5zKPx?zjkC&Xy0~r{;S?FS%c7w< zWbMpzc(xSw?9tGxG~_l}Acq}zjt5ClaB7-!vzqnlrX;}$#+PyQ9oU)_DfePh2E1<7 ztok6g6K^k^DuHR*iJ?jw?bs_whk|bx`dxu^nC6#e{1*m~z1eq7m}Cf$*^Eua(oi_I zAL+3opNhJteu&mWQ@kQWPucmiP)4|nFG`b2tpC;h{-PI@`+h?9v=9mn|0R-n8#t=+Z*FD(c5 zjj79Jxkgck*DV=wpFgRZuwr%}KTm+dx?RT@aUHJdaX-ODh~gByS?WGx&czAkvkg;x zrf92l8$Or_zOwJVwh>5rB`Q5_5}ef6DjS*$x30nZbuO3dijS*wvNEqTY5p1_A0gWr znH<(Qvb!os14|R)n2Ost>jS2;d1zyLHu`Svm|&dZD+PpP{Bh>U&`Md;gRl64q;>{8MJJM$?UNUd`aC>BiLe>*{ zJY15->yW+<3rLgYeTruFDtk1ovU<$(_y7#HgUq>)r0{^}Xbth}V#6?%5jeFYt;SG^ z3qF)=uWRU;Jj)Q}cpY8-H+l_n$2$6{ZR?&*IGr{>ek!69ZH0ZoJ*Ji+ezzlJ^%qL3 zO5a`6gwFw(moEzqxh=yJ9M1FTn!eo&qD#y5AZXErHs%22?A+JmS&GIolml!)rZTnUDM3YgzYfT#;OXn)`PWv3Ta z!-i|-Wojv*k&bC}_JJDjiAK(Ba|YZgUI{f}TdEOFT2+}nPmttytw7j%@bQZDV1vvj z^rp{gRkCDmYJHGrE1~e~AE!-&6B6`7UxVQuvRrfdFkGX8H~SNP_X4EodVd;lXd^>eV1jN+Tt4}Rsn)R0LxBz0c=NXU|pUe!MQQFkGBWbR3&(jLm z%RSLc#p}5_dO{GD=DEFr=Fc% z85CBF>*t!6ugI?soX(*JNxBp+-DdZ4X0LldiK}+WWGvXV(C(Ht|!3$psR=&c*HIM=BmX;pRIpz@Ale{9dhGe(U2|Giv;# zOc|;?p67J=Q(kamB*aus=|XP|m{jN^6@V*Bpm?ye56Njh#vyJqE=DweC;?Rv7faX~ zde03n^I~0B2vUmr;w^X37tVxUK?4}ifsSH5_kpKZIzpYu0;Kv}SBGfI2AKNp+VN#z`nI{UNDRbo-wqa4NEls zICRJpu)??cj^*WcZ^MAv+;bDbh~gpN$1Cor<{Y2oyIDws^JsfW^5AL$azE(T0p&pP z1Mv~6Q44R&RHoH95&OuGx2srIr<@zYJTOMKiVs;Bx3py89I87LOb@%mr`0)#;7_~Z zzcZj8?w=)>%5@HoCHE_&hnu(n_yQ-L(~VjpjjkbT7e)Dk5??fApg(d>vwLRJ-x{um z*Nt?DqTSxh_MIyogY!vf1mU1`Gld-&L)*43f6dilz`Q@HEz;+>MDDYv9u!s;WXeao zUq=TaL$P*IFgJzrGc>j1dDOd zed+=ZBo?w4mr$2)Ya}?vedDopomhW1`#P<%YOJ_j=WwClX0xJH-f@s?^tmzs_j7t!k zK@j^zS0Q|mM4tVP5Ram$VbS6|YDY&y?Q1r1joe9dj08#CM{RSMTU}(RCh`hp_Rkl- zGd|Cv~G@F{DLhCizAm9AN!^{rNs8hu!G@8RpnGx7e`-+K$ffN<0qjR zGq^$dj_Tv!n*?zOSyk5skI7JVKJ)3jysnjIu-@VSzQiP8r6MzudCU=~?v-U8yzo^7 zGf~SUTvEp+S*!X9uX!sq=o}lH;r{pzk~M*VA(uyQ`3C8!{C;)&6)95fv(cK!%Cuz$ z_Zal57H6kPN>25KNiI6z6F)jzEkh#%OqU#-__Xzy)KyH};81#N6OfX$$IXWzOn`Q& z4f$Z1t>)8&8PcYfEwY5UadU1yg+U*(1m2ZlHoC-!2?gB!!fLhmTl))D@dhvkx#+Yj z1O=LV{(T%{^IeCuFK>%QR!VZ4GnO5tK8a+thWE zg4VytZrwcS?7^ zuZfhYnB8dwd%VLO?DK7pV5Wi<(`~DYqOXn8#jUIL^)12*Dbhk4GmL_E2`WX&iT16o zk(t|hok(Y|v-wzn?4x34T)|+SfZP>fiq!><*%vnxGN~ypST-FtC+@TPv*vYv@iU!_ z@2gf|PrgQ?Ktf*9^CnJ(x*CtZVB8!OBfg0%!wL;Z8(tYYre0vcnPGlyCc$V(Ipl*P z_(J!a=o@vp^%Efme!K74(Ke7A>Y}|sxV+JL^aYa{~m%5#$$+R1? zGaQhZTTX!#s#=Xtpegqero$RNt&`4xn3g$)=y*;=N=Qai)}~`xtxI_N*#MMCIq#HFifT zz(-*m;pVH&+4bixL&Bbg)W5FN^bH87pAHp)zPkWNMfTFqS=l~AC$3FX3kQUSh_C?-ZftyClgM)o_D7cX$RGlEYblux0jv5 zTr|i-I3@ZPCGheCl~BGhImF)K4!9@?pC(gi3ozX=a!|r1)LFxy_8c&wY0<^{2cm|P zv6Y`QktY*;I)IUd5y3ne1CqpVanlY45z8hf4&$EUBnucDj16pDa4&GI&TArYhf*xh zdj>*%APH8(h~c>o@l#%T>R$e>rwVx_WUB|~V`p^JHsg*y12lzj&zF}w6W09HwB2yb z%Q~`es&(;7#*DUC_w-Dmt7|$*?TA_m;zB+-u{2;Bg{O}nV7G_@7~<)Bv8fH^G$XG8$(&{A zwXJK5LRK%M34(t$&NI~MHT{UQ9qN-V_yn|%PqC81EIiSzmMM=2zb`mIwiP_b)x+2M z7Gd`83h79j#SItpQ}luuf2uOU`my_rY5T{6P#BNlb%h%<#MZb=m@y5aW;#o1^2Z)SWo+b`y0gV^iRcZtz5!-05vF z7wNo=hc6h4hc&s@uL^jqRvD6thVYtbErDK9k!;+a0xoE0WL7zLixjn5;$fXvT=O3I zT6jI&^A7k6R{&5#lVjz#8%_RiAa2{di{`kx79K+j72$H(!ass|B%@l%KeeKchYLe_ z>!(JC2fxsv>XVen+Y42GeYPxMWqm`6F$(E<6^s|g(slNk!lL*6v^W2>f6hh^mE$s= z3D$)}{V5(Qm&A6bp%2Q}*GZ5Qrf}n7*Hr51?bJOyA-?B4vg6y_EX<*-e20h{=0Mxs zbuQGZ$fLyO5v$nQ&^kuH+mNq9O#MWSfThtH|0q1i!NrWj^S}_P;Q1OkYLW6U^?_7G zx2wg?CULj7))QU(n{$0JE%1t2dWrMi2g-Os{v|8^wK{@qlj%+1b^?NI z$}l2tjp0g>K3O+p%yK<9!XqmQ?E9>z&(|^Pi~aSRwI5x$jaA62GFz9%fmO3t3a>cq zK8Xbv=5Ps~4mKN5+Eqw12(!PEyedFXv~VLxMB~HwT1Vfo51pQ#D8e$e4pFZ{&RC2P z5gTIzl{3!&(tor^BwZfR8j4k{7Rq#`riKXP2O-Bh66#WWK2w=z;iD9GLl+3 zpHIaI4#lQ&S-xBK8PiQ%dwOh?%BO~DCo06pN7<^dnZCN@NzY{_Z1>rrB0U|nC&+!2 z2y!oBcTd2;@lzyk(B=TkyZ)zy0deK05*Q0zk+o$@nun`VI1Er7pjq>8V zNmlW{p7S^Btgb(TA}jL(uR>`0w8gHP^T~Sh5Tkip^spk4SBAhC{TZU}_Z)UJw-}zm zPq{KBm!k)?P{`-(9?LFt&YN4s%SIZ-9lJ!Ws~B%exHOeVFk3~}HewnnH(d)qkLQ_d z6h>O)pEE{vbOVw}E+jdYC^wM+AAhaI(YAibUc@B#_mDss0Ji&BK{WG`4 zOk>vSNq(Bq2IB@s>>Rxm6Wv?h;ZXkpb1l8u|+_qXWdC*jjcPCixq;!%BVPSp#hP zqo`%cNf&YoQXHC$D=D45RiT|5ngPlh?0T~?lUf*O)){K@*Kbh?3RW1j9-T?%lDk@y z4+~?wKI%Y!-=O|_IuKz|=)F;V7ps=5@g)RrE;;tvM$gUhG>jHcw2Hr@fS+k^Zr~>G z^JvPrZc}_&d_kEsqAEMTMJw!!CBw)u&ZVzmq+ZworuaE&TT>$pYsd9|g9O^0orAe8 z221?Va!l1|Y5X1Y?{G7rt1sX#qFA^?RLG^VjoxPf63;AS=_mVDfGJKg73L zsGdnTUD40y(>S##2l|W2Cy!H(@@5KBa(#gs`vlz}Y~$ot5VsqPQ{{YtjYFvIumZzt zA{CcxZLJR|4#{j7k~Tu*jkwz8QA|5G1$Cl895R`Zyp;irp1{KN){kB30O8P1W5;@bG znvX74roeMmQlUi=v9Y%(wl$ZC#9tKNFpvi3!C}f1m6Ct|l2g%psc{TJp)@yu)*e2> z((p0Fg*8gJ!|3WZke9;Z{8}&NRkv7iP=#_y-F}x^y?2m%-D_aj^)f04%mneyjo_;) z6qc_Zu$q37d~X``*eP~Q>I2gg%rrV8v=kDfpp$=%Vj}hF)^dsSWygoN(A$g*E=Do6FX?&(@F#7pbiJ`;c0c@Ul zDqW_90Wm#5f2L<(Lf3)3TeXtI7nhYwRm(F;*r_G6K@OPW4H(Y3O5SjUzBC}u3d|eQ8*8d@?;zUPE+i#QNMn=r(ap?2SH@vo*m z3HJ%XuG_S6;QbWy-l%qU;8x;>z>4pMW7>R}J%QLf%@1BY(4f_1iixd-6GlO7Vp*yU zp{VU^3?s?90i=!#>H`lxT!q8rk>W_$2~kbpz7eV{3wR|8E=8**5?qn8#n`*(bt1xRQrdGxyx2y%B$qmw#>ZV$c7%cO#%JM1lY$Y0q?Yuo> ze9KdJoiM)RH*SB%^;TAdX-zEjA7@%y=!0=Zg%iWK7jVI9b&Dk}0$Af&08KHo+ zOwDhFvA(E|ER%a^cdh@^wLUlmIv6?_3=BvX8jKk92L=Y}7Jf5OGMfh` zBdR1wFCi-i5@`9km{isRb0O%TX+f~)KNaEz{rXQa89`YIF;EN&gN)cigu6mNh>?Cm zAO&Im2flv6D{jwm+y<%WsPe4!89n~KN|7}Cb{Z;XweER73r}Qp2 zz}WP4j}U0&(uD&9yGy6`!+_v-S(yG*iytsTR#x_Rc>=6u^vnRDnf1gP{#2>`ffrAC% zTZ5WQ@hAK;P;>kX{D)mIXe4%a5p=LO1xXH@8T?mz7Q@d)$3pL{{B!2{-v70L*o1AO+|n5beiw~ zk@(>m?T3{2k2c;NWc^`4@P&Z?BjxXJ@;x1qhn)9Mn*IFdt_J-dIqx5#d`NfyfX~m( zIS~5)MfZ2Uy?_4W`47i}u0ZgPh<{D|w_d#;D}Q&U$Q-G}xM1A@1f{#%A$jh6Qp&0hQ<0bPOM z-{1Wm&p%%#eb_?x7i;bol EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..a9f1ef8 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.3/apache-maven-3.8.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/docker.md b/docker.md new file mode 100644 index 0000000..0f86bfe --- /dev/null +++ b/docker.md @@ -0,0 +1,7 @@ +``` +docker create --name mysql8 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v c:\work\mysqldata:/var/lib/mysql mysql:8.0.27 +``` + +docker start mysql8 + +docker stop mysql8 \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..64863a6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + + ddd-start + ddd-start2 + 2.0 + ddd-start2 + ddd-start2 + + 17 + + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-mail + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.0 + + + + com.h2database + h2 + runtime + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/myshop/ShopApplication.java b/src/main/java/com/myshop/ShopApplication.java new file mode 100644 index 0000000..ec98fde --- /dev/null +++ b/src/main/java/com/myshop/ShopApplication.java @@ -0,0 +1,18 @@ +package com.myshop; + +import com.myshop.common.jpa.RangeableRepositoryImpl; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.scheduling.annotation.EnableAsync; + +@SpringBootApplication +@EnableAsync +@EnableJpaRepositories(repositoryBaseClass = RangeableRepositoryImpl.class) +public class ShopApplication { + + public static void main(String[] args) { + SpringApplication.run(ShopApplication.class, args); + } + +} diff --git a/src/main/java/com/myshop/admin/ui/AdminOrderController.java b/src/main/java/com/myshop/admin/ui/AdminOrderController.java new file mode 100644 index 0000000..edd1465 --- /dev/null +++ b/src/main/java/com/myshop/admin/ui/AdminOrderController.java @@ -0,0 +1,72 @@ +package com.myshop.admin.ui; + +import com.myshop.common.ui.Pagination; +import com.myshop.order.command.application.StartShippingRequest; +import com.myshop.order.command.application.StartShippingService; +import com.myshop.order.query.application.ListRequest; +import com.myshop.order.query.application.OrderDetail; +import com.myshop.order.query.application.OrderDetailService; +import com.myshop.order.query.application.OrderViewListService; +import com.myshop.order.query.dto.OrderSummary; +import org.springframework.dao.OptimisticLockingFailureException; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Optional; + +@Controller +public class AdminOrderController { + + private OrderViewListService orderViewListService; + private OrderDetailService orderDetailService; + private StartShippingService startShippingService; + + public AdminOrderController(OrderViewListService orderViewListService, OrderDetailService orderDetailService, StartShippingService startShippingService) { + this.orderViewListService = orderViewListService; + this.orderDetailService = orderDetailService; + this.startShippingService = startShippingService; + } + + @RequestMapping("/admin/orders") + public String orders(@RequestParam(name = "p", defaultValue = "1") int page, + ModelMap modelMap) { + int size = 20; + ListRequest listRequest = new ListRequest(page - 1, size); + Page orderPage = orderViewListService.getList(listRequest); + modelMap.addAttribute("orderPage", orderPage); + modelMap.addAttribute("pagination", + new Pagination( + orderPage.getNumber() + 1, + orderPage.getTotalPages(), + 5 + )); + return "admin/adminOrders"; + } + + @RequestMapping("/admin/orders/{orderNo}") + public String orderDetail(@PathVariable("orderNo") String orderNo, ModelMap modelMap) { + Optional orderDetail = orderDetailService.getOrderDetail(orderNo); + if (orderDetail.isPresent()) { + modelMap.addAttribute("order", orderDetail.get()); + return "admin/adminOrderDetail"; + } else { + return "admin/noOrder"; + } + } + + @RequestMapping(value = "/admin/orders/{orderNo}/shipping", method = RequestMethod.POST) + public String startShippingOrder(@PathVariable("orderNo") String orderNo, + @RequestParam("version") long version) { + try { + startShippingService.startShipping(new StartShippingRequest(orderNo, version)); + return "admin/adminOrderShipped"; + } catch (OptimisticLockingFailureException e) { + return "admin/adminOrderLockFail"; + } + } +} diff --git a/src/main/java/com/myshop/board/domain/Article.java b/src/main/java/com/myshop/board/domain/Article.java new file mode 100644 index 0000000..38d6431 --- /dev/null +++ b/src/main/java/com/myshop/board/domain/Article.java @@ -0,0 +1,48 @@ +package com.myshop.board.domain; + +import javax.persistence.*; + +@Entity +@Table(name = "article") +@SecondaryTable( + name = "article_content", + pkJoinColumns = @PrimaryKeyJoinColumn(name = "id") +) +public class Article { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String title; + + @AttributeOverrides({ + @AttributeOverride( + name = "content", + column = @Column(table = "article_content", name = "content")), + @AttributeOverride( + name = "contentType", + column = @Column(table = "article_content", name = "content_type")) + }) + @Embedded + private ArticleContent content; + + protected Article() { + } + + public Article(String title, ArticleContent content) { + this.title = title; + this.content = content; + } + + public Long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public ArticleContent getContent() { + return content; + } +} diff --git a/src/main/java/com/myshop/board/domain/ArticleContent.java b/src/main/java/com/myshop/board/domain/ArticleContent.java new file mode 100644 index 0000000..991f563 --- /dev/null +++ b/src/main/java/com/myshop/board/domain/ArticleContent.java @@ -0,0 +1,28 @@ +package com.myshop.board.domain; + +import javax.persistence.Access; +import javax.persistence.AccessType; +import javax.persistence.Embeddable; + +@Embeddable +@Access(AccessType.FIELD) +public class ArticleContent { + private String content; + private String contentType; + + protected ArticleContent() { + } + + public ArticleContent(String content, String contentType) { + this.content = content; + this.contentType = contentType; + } + + public String getContent() { + return content; + } + + public String getContentType() { + return contentType; + } +} diff --git a/src/main/java/com/myshop/board/domain/ArticleRepository.java b/src/main/java/com/myshop/board/domain/ArticleRepository.java new file mode 100644 index 0000000..4b3831d --- /dev/null +++ b/src/main/java/com/myshop/board/domain/ArticleRepository.java @@ -0,0 +1,11 @@ +package com.myshop.board.domain; + +import org.springframework.data.repository.Repository; + +import java.util.Optional; + +public interface ArticleRepository extends Repository { + void save(Article article); + + Optional
findById(Long id); +} diff --git a/src/main/java/com/myshop/catalog/NoCategoryException.java b/src/main/java/com/myshop/catalog/NoCategoryException.java new file mode 100644 index 0000000..c0d9d2d --- /dev/null +++ b/src/main/java/com/myshop/catalog/NoCategoryException.java @@ -0,0 +1,4 @@ +package com.myshop.catalog; + +public class NoCategoryException extends RuntimeException { +} diff --git a/src/main/java/com/myshop/catalog/command/domain/category/Category.java b/src/main/java/com/myshop/catalog/command/domain/category/Category.java new file mode 100644 index 0000000..e7f0a65 --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/category/Category.java @@ -0,0 +1,32 @@ +package com.myshop.catalog.command.domain.category; + +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "category") +public class Category { + @EmbeddedId + private CategoryId id; + + @Column(name = "name") + private String name; + + protected Category() { + } + + public Category(CategoryId id, String name) { + this.id = id; + this.name = name; + } + + public CategoryId getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/com/myshop/catalog/command/domain/category/CategoryId.java b/src/main/java/com/myshop/catalog/command/domain/category/CategoryId.java new file mode 100644 index 0000000..a60530f --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/category/CategoryId.java @@ -0,0 +1,43 @@ +package com.myshop.catalog.command.domain.category; + +import javax.persistence.Access; +import javax.persistence.AccessType; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +@Embeddable +@Access(AccessType.FIELD) +public class CategoryId implements Serializable { + @Column(name = "category_id") + private Long value; + + protected CategoryId() { + } + + public CategoryId(Long value) { + this.value = value; + } + + public Long getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CategoryId that = (CategoryId) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return value != null ? value.hashCode() : 0; + } + + public static CategoryId of(Long value) { + return new CategoryId(value); + } +} diff --git a/src/main/java/com/myshop/catalog/command/domain/category/CategoryRepository.java b/src/main/java/com/myshop/catalog/command/domain/category/CategoryRepository.java new file mode 100644 index 0000000..05b411f --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/category/CategoryRepository.java @@ -0,0 +1,12 @@ +package com.myshop.catalog.command.domain.category; + +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; + +public interface CategoryRepository extends Repository { + Optional findById(CategoryId id); + + List findAll(); +} diff --git a/src/main/java/com/myshop/catalog/command/domain/product/ExternalImage.java b/src/main/java/com/myshop/catalog/command/domain/product/ExternalImage.java new file mode 100644 index 0000000..68046cf --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/product/ExternalImage.java @@ -0,0 +1,30 @@ +package com.myshop.catalog.command.domain.product; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue("EI") +public class ExternalImage extends Image { + protected ExternalImage() { + } + + public ExternalImage(String path) { + super(path); + } + + @Override + public String getUrl() { + return getPath(); + } + + @Override + public boolean hasThumbnail() { + return false; + } + + @Override + public String getThumbnailUrl() { + return null; + } +} diff --git a/src/main/java/com/myshop/catalog/command/domain/product/Image.java b/src/main/java/com/myshop/catalog/command/domain/product/Image.java new file mode 100644 index 0000000..23d7f43 --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/product/Image.java @@ -0,0 +1,45 @@ +package com.myshop.catalog.command.domain.product; + +import javax.persistence.*; +import java.time.LocalDateTime; +import java.util.Date; + +@Entity +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@DiscriminatorColumn(name = "image_type") +@Table(name = "image") +public abstract class Image { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "image_id") + private Long id; + + @Column(name = "image_path") + private String path; + + @Column(name = "upload_time") + private LocalDateTime uploadTime; + + protected Image() { + } + + public Image(String path) { + this.path = path; + this.uploadTime = LocalDateTime.now(); + } + + protected String getPath() { + return path; + } + + public LocalDateTime getUploadTime() { + return uploadTime; + } + + public abstract String getUrl(); + + public abstract boolean hasThumbnail(); + + public abstract String getThumbnailUrl(); + +} diff --git a/src/main/java/com/myshop/catalog/command/domain/product/InternalImage.java b/src/main/java/com/myshop/catalog/command/domain/product/InternalImage.java new file mode 100644 index 0000000..0c416f0 --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/product/InternalImage.java @@ -0,0 +1,30 @@ +package com.myshop.catalog.command.domain.product; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue("II") +public class InternalImage extends Image { + protected InternalImage() { + } + + public InternalImage(String path) { + super(path); + } + + @Override + public String getUrl() { + return "/images/original/" + getPath(); + } + + @Override + public boolean hasThumbnail() { + return true; + } + + @Override + public String getThumbnailUrl() { + return "/images/thumbnail/" + getPath(); + } +} diff --git a/src/main/java/com/myshop/catalog/command/domain/product/Option.java b/src/main/java/com/myshop/catalog/command/domain/product/Option.java new file mode 100644 index 0000000..41d591e --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/product/Option.java @@ -0,0 +1,28 @@ +package com.myshop.catalog.command.domain.product; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +@Embeddable +public class Option { + @Column(name = "option_value") + private String value; + @Column(name = "option_title") + private String title; + + private Option() { + } + + public Option(String value, String title) { + this.value = value; + this.title = title; + } + + public String getValue() { + return value; + } + + public String getTitle() { + return title; + } +} diff --git a/src/main/java/com/myshop/catalog/command/domain/product/Product.java b/src/main/java/com/myshop/catalog/command/domain/product/Product.java new file mode 100644 index 0000000..077d5d7 --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/product/Product.java @@ -0,0 +1,77 @@ +package com.myshop.catalog.command.domain.product; + +import com.myshop.catalog.command.domain.category.CategoryId; +import com.myshop.common.jpa.MoneyConverter; +import com.myshop.common.model.Money; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +@Entity +@Table(name = "product") +public class Product { + @EmbeddedId + private ProductId id; + + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable(name = "product_category", + joinColumns = @JoinColumn(name = "product_id")) + private Set categoryIds; + + private String name; + + @Convert(converter = MoneyConverter.class) + private Money price; + + private String detail; + + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, + orphanRemoval = true, fetch = FetchType.LAZY) + @JoinColumn(name = "product_id") + @OrderColumn(name = "list_idx") + private List images = new ArrayList<>(); + + protected Product() { + } + + public Product(ProductId id, String name, Money price, String detail, List images) { + this.id = id; + this.name = name; + this.price = price; + this.detail = detail; + this.images.addAll(images); + } + + public ProductId getId() { + return id; + } + + public String getName() { + return name; + } + + public Money getPrice() { + return price; + } + + public String getDetail() { + return detail; + } + + public List getImages() { + return Collections.unmodifiableList(images); + } + + public void changeImages(List newImages) { + images.clear(); + images.addAll(newImages); + } + + public String getFirstIamgeThumbnailPath() { + if (images == null || images.isEmpty()) return null; + return images.get(0).getThumbnailUrl(); + } +} diff --git a/src/main/java/com/myshop/catalog/command/domain/product/ProductId.java b/src/main/java/com/myshop/catalog/command/domain/product/ProductId.java new file mode 100644 index 0000000..82b7559 --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/product/ProductId.java @@ -0,0 +1,43 @@ +package com.myshop.catalog.command.domain.product; + +import javax.persistence.Access; +import javax.persistence.AccessType; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +@Embeddable +@Access(AccessType.FIELD) +public class ProductId implements Serializable { + @Column(name = "product_id") + private String id; + + protected ProductId() { + } + + public ProductId(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ProductId productId = (ProductId) o; + return Objects.equals(id, productId.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + public static ProductId of(String id) { + return new ProductId(id); + } +} diff --git a/src/main/java/com/myshop/catalog/command/domain/product/ProductRepository.java b/src/main/java/com/myshop/catalog/command/domain/product/ProductRepository.java new file mode 100644 index 0000000..0bf9c58 --- /dev/null +++ b/src/main/java/com/myshop/catalog/command/domain/product/ProductRepository.java @@ -0,0 +1,14 @@ +package com.myshop.catalog.command.domain.product; + +import org.springframework.data.repository.Repository; + +import java.util.Optional; + +public interface ProductRepository extends Repository { + void save(Product product); + + Optional findById(ProductId id); + + void flush(); +} + diff --git a/src/main/java/com/myshop/catalog/query/category/CategoryData.java b/src/main/java/com/myshop/catalog/query/category/CategoryData.java new file mode 100644 index 0000000..fe38cab --- /dev/null +++ b/src/main/java/com/myshop/catalog/query/category/CategoryData.java @@ -0,0 +1,34 @@ +package com.myshop.catalog.query.category; + +import com.myshop.catalog.command.domain.category.CategoryId; + +import javax.persistence.Column; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "category") +public class CategoryData { + @EmbeddedId + private CategoryId id; + + @Column(name = "name") + private String name; + + protected CategoryData() { + } + + public CategoryData(CategoryId id, String name) { + this.id = id; + this.name = name; + } + + public CategoryId getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/com/myshop/catalog/query/category/CategoryDataDao.java b/src/main/java/com/myshop/catalog/query/category/CategoryDataDao.java new file mode 100644 index 0000000..99ad1be --- /dev/null +++ b/src/main/java/com/myshop/catalog/query/category/CategoryDataDao.java @@ -0,0 +1,13 @@ +package com.myshop.catalog.query.category; + +import com.myshop.catalog.command.domain.category.CategoryId; +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; + +public interface CategoryDataDao extends Repository { + Optional findById(CategoryId id); + + List findAll(); +} diff --git a/src/main/java/com/myshop/catalog/query/product/CategoryProduct.java b/src/main/java/com/myshop/catalog/query/product/CategoryProduct.java new file mode 100644 index 0000000..8c64985 --- /dev/null +++ b/src/main/java/com/myshop/catalog/query/product/CategoryProduct.java @@ -0,0 +1,53 @@ +package com.myshop.catalog.query.product; + +import com.myshop.catalog.query.category.CategoryData; + +import java.util.List; + +public class CategoryProduct { + private CategoryData category; + + private List items; + private int page; + private int size; + private long totalCount; + private int totalPages; + + public CategoryProduct(CategoryData category, + List items, + int page, + int size, + long totalCount, + int totalPages) { + this.category = category; + this.items = items; + this.page = page; + this.size = size; + this.totalCount = totalCount; + this.totalPages = totalPages; + } + + public CategoryData getCategory() { + return category; + } + + public List getItems() { + return items; + } + + public int getPage() { + return page; + } + + public int getSize() { + return size; + } + + public long getTotalCount() { + return totalCount; + } + + public int getTotalPages() { + return totalPages; + } +} diff --git a/src/main/java/com/myshop/catalog/query/product/ImageData.java b/src/main/java/com/myshop/catalog/query/product/ImageData.java new file mode 100644 index 0000000..4b1b6c9 --- /dev/null +++ b/src/main/java/com/myshop/catalog/query/product/ImageData.java @@ -0,0 +1,12 @@ +package com.myshop.catalog.query.product; + +import javax.persistence.Column; +import java.time.LocalDateTime; + +public class ImageData { + @Column(name = "image_path") + private String path; + + private LocalDateTime uploadTime; + +} diff --git a/src/main/java/com/myshop/catalog/query/product/ProductData.java b/src/main/java/com/myshop/catalog/query/product/ProductData.java new file mode 100644 index 0000000..9f85e98 --- /dev/null +++ b/src/main/java/com/myshop/catalog/query/product/ProductData.java @@ -0,0 +1,76 @@ +package com.myshop.catalog.query.product; + +import com.myshop.catalog.command.domain.category.CategoryId; +import com.myshop.catalog.command.domain.product.Image; +import com.myshop.catalog.command.domain.product.ProductId; +import com.myshop.common.jpa.MoneyConverter; +import com.myshop.common.model.Money; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +@Entity +@Table(name = "product") +public class ProductData { + @EmbeddedId + private ProductId id; + + @ElementCollection + @CollectionTable(name = "product_category", + joinColumns = @JoinColumn(name = "product_id")) + private Set categoryIds; + + private String name; + + @Convert(converter = MoneyConverter.class) + private Money price; + + private String detail; + + // TODO 목록에서 사용할 것 + + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, + orphanRemoval = true, fetch = FetchType.EAGER) + @JoinColumn(name = "product_id") + @OrderColumn(name = "list_idx") + private List images = new ArrayList<>(); + + protected ProductData() { + } + + public ProductData(ProductId id, String name, Money price, String detail, List images) { + this.id = id; + this.name = name; + this.price = price; + this.detail = detail; + this.images.addAll(images); + } + + public ProductId getId() { + return id; + } + + public String getName() { + return name; + } + + public Money getPrice() { + return price; + } + + public String getDetail() { + return detail; + } + + public List getImages() { + return Collections.unmodifiableList(images); + } + + public String getFirstIamgeThumbnailPath() { + if (images == null || images.isEmpty()) return null; + return images.get(0).getThumbnailUrl(); + } +} diff --git a/src/main/java/com/myshop/catalog/query/product/ProductDataDao.java b/src/main/java/com/myshop/catalog/query/product/ProductDataDao.java new file mode 100644 index 0000000..385aee3 --- /dev/null +++ b/src/main/java/com/myshop/catalog/query/product/ProductDataDao.java @@ -0,0 +1,15 @@ +package com.myshop.catalog.query.product; + +import com.myshop.catalog.command.domain.category.CategoryId; +import com.myshop.catalog.command.domain.product.ProductId; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.Repository; + +import java.util.Optional; + +public interface ProductDataDao extends Repository { + Optional findById(ProductId id); + + Page findByCategoryIdsContains(CategoryId id, Pageable pageable); +} diff --git a/src/main/java/com/myshop/catalog/query/product/ProductQueryService.java b/src/main/java/com/myshop/catalog/query/product/ProductQueryService.java new file mode 100644 index 0000000..2b6e458 --- /dev/null +++ b/src/main/java/com/myshop/catalog/query/product/ProductQueryService.java @@ -0,0 +1,55 @@ +package com.myshop.catalog.query.product; + +import com.myshop.catalog.NoCategoryException; +import com.myshop.catalog.command.domain.category.CategoryId; +import com.myshop.catalog.command.domain.product.ProductId; +import com.myshop.catalog.query.category.CategoryData; +import com.myshop.catalog.query.category.CategoryDataDao; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +import static java.util.stream.Collectors.toList; + +@Service +public class ProductQueryService { + private ProductDataDao productDataDao; + private CategoryDataDao categoryDataDao; + + public ProductQueryService(ProductDataDao productDataDao, + CategoryDataDao categoryDataDao) { + this.productDataDao = productDataDao; + this.categoryDataDao = categoryDataDao; + } + + @Transactional + public CategoryProduct getProductInCategory(Long categoryId, int page, int size) { + CategoryData category = categoryDataDao.findById(new CategoryId(categoryId)) + .orElseThrow(() -> new NoCategoryException()); + + Page productPage = productDataDao.findByCategoryIdsContains(category.getId(), Pageable.ofSize(size).withPage(page - 1)); + return new CategoryProduct(category, + toSummary(productPage.getContent()), + page, + productPage.getSize(), + productPage.getTotalElements(), + productPage.getTotalPages()); + } + + private List toSummary(List products) { + return products.stream().map( + prod -> new ProductSummary( + prod.getId().getId(), + prod.getName(), + prod.getPrice().getValue(), + prod.getFirstIamgeThumbnailPath())).collect(toList()); + } + + public Optional getProduct(String productId) { + return productDataDao.findById(new ProductId(productId)); + } +} diff --git a/src/main/java/com/myshop/catalog/query/product/ProductSummary.java b/src/main/java/com/myshop/catalog/query/product/ProductSummary.java new file mode 100644 index 0000000..2d79382 --- /dev/null +++ b/src/main/java/com/myshop/catalog/query/product/ProductSummary.java @@ -0,0 +1,31 @@ +package com.myshop.catalog.query.product; + +public class ProductSummary { + private String id; + private String name; + private int price; + private String image; + + public ProductSummary(String productId, String name, int price, String image) { + this.id = productId; + this.name = name; + this.price = price; + this.image = image; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public int getPrice() { + return price; + } + + public String getImage() { + return image; + } +} diff --git a/src/main/java/com/myshop/catalog/ui/ProductController.java b/src/main/java/com/myshop/catalog/ui/ProductController.java new file mode 100644 index 0000000..89fef78 --- /dev/null +++ b/src/main/java/com/myshop/catalog/ui/ProductController.java @@ -0,0 +1,59 @@ +package com.myshop.catalog.ui; + +import com.myshop.catalog.query.category.CategoryData; +import com.myshop.catalog.query.category.CategoryDataDao; +import com.myshop.catalog.query.product.CategoryProduct; +import com.myshop.catalog.query.product.ProductData; +import com.myshop.catalog.query.product.ProductQueryService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Optional; + +@Controller +public class ProductController { + private CategoryDataDao categoryDataDao; + private ProductQueryService productQueryService; + + public ProductController(CategoryDataDao categoryDataDao, + ProductQueryService productQueryService) { + this.categoryDataDao = categoryDataDao; + this.productQueryService = productQueryService; + } + + @RequestMapping("/categories") + public String categories(ModelMap model) { + List categories = categoryDataDao.findAll(); + model.addAttribute("categories", categories); + return "category/categoryList"; + } + + @RequestMapping("/categories/{categoryId}") + public String list(@PathVariable("categoryId") Long categoryId, + @RequestParam(name = "page", required = false, defaultValue = "1") int page, + ModelMap model) { + CategoryProduct productInCategory = productQueryService.getProductInCategory(categoryId, page, 10); + model.addAttribute("productInCategory", productInCategory); + return "category/productList"; + } + + @RequestMapping("/products/{productId}") + public String detail(@PathVariable("productId") String productId, + ModelMap model, + HttpServletResponse response) throws IOException { + Optional product = productQueryService.getProduct(productId); + if (product.isPresent()) { + model.addAttribute("product", product.get()); + return "category/productDetail"; + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + return null; + } + } +} diff --git a/src/main/java/com/myshop/common/ValidationError.java b/src/main/java/com/myshop/common/ValidationError.java new file mode 100644 index 0000000..627a728 --- /dev/null +++ b/src/main/java/com/myshop/common/ValidationError.java @@ -0,0 +1,31 @@ +package com.myshop.common; + +public class ValidationError { + private String name; + private String code; + + public ValidationError(String name, String code) { + this.name = name; + this.code = code; + } + + public String getName() { + return name; + } + + public String getCode() { + return code; + } + + public boolean hasName() { + return name != null; + } + + public static ValidationError of(String code) { + return new ValidationError(null, code); + } + + public static ValidationError of(String name, String code) { + return new ValidationError(name, code); + } +} diff --git a/src/main/java/com/myshop/common/ValidationErrorException.java b/src/main/java/com/myshop/common/ValidationErrorException.java new file mode 100644 index 0000000..da781e1 --- /dev/null +++ b/src/main/java/com/myshop/common/ValidationErrorException.java @@ -0,0 +1,15 @@ +package com.myshop.common; + +import java.util.List; + +public class ValidationErrorException extends RuntimeException { + private List errors; + + public ValidationErrorException(List errors) { + this.errors = errors; + } + + public List getErrors() { + return errors; + } +} diff --git a/src/main/java/com/myshop/common/VersionConflictException.java b/src/main/java/com/myshop/common/VersionConflictException.java new file mode 100644 index 0000000..20fdb1f --- /dev/null +++ b/src/main/java/com/myshop/common/VersionConflictException.java @@ -0,0 +1,4 @@ +package com.myshop.common; + +public class VersionConflictException extends RuntimeException { +} diff --git a/src/main/java/com/myshop/common/event/Event.java b/src/main/java/com/myshop/common/event/Event.java new file mode 100644 index 0000000..f0739fc --- /dev/null +++ b/src/main/java/com/myshop/common/event/Event.java @@ -0,0 +1,14 @@ +package com.myshop.common.event; + +public abstract class Event { + private long timestamp; + + public Event() { + this.timestamp = System.currentTimeMillis(); + } + + public long getTimestamp() { + return timestamp; + } + +} diff --git a/src/main/java/com/myshop/common/event/EventStoreHandler.java b/src/main/java/com/myshop/common/event/EventStoreHandler.java new file mode 100644 index 0000000..8b41834 --- /dev/null +++ b/src/main/java/com/myshop/common/event/EventStoreHandler.java @@ -0,0 +1,19 @@ +package com.myshop.common.event; + +import com.myshop.eventstore.api.EventStore; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Component +public class EventStoreHandler { + private EventStore eventStore; + + public EventStoreHandler(EventStore eventStore) { + this.eventStore = eventStore; + } + + @EventListener(Event.class) + public void handle(Event event) { + eventStore.save(event); + } +} diff --git a/src/main/java/com/myshop/common/event/Events.java b/src/main/java/com/myshop/common/event/Events.java new file mode 100644 index 0000000..3b18c86 --- /dev/null +++ b/src/main/java/com/myshop/common/event/Events.java @@ -0,0 +1,17 @@ +package com.myshop.common.event; + +import org.springframework.context.ApplicationEventPublisher; + +public class Events { + private static ApplicationEventPublisher publisher; + + static void setPublisher(ApplicationEventPublisher publisher) { + Events.publisher = publisher; + } + + public static void raise(Object event) { + if (publisher != null) { + publisher.publishEvent(event); + } + } +} diff --git a/src/main/java/com/myshop/common/event/EventsConfiguration.java b/src/main/java/com/myshop/common/event/EventsConfiguration.java new file mode 100644 index 0000000..1d48729 --- /dev/null +++ b/src/main/java/com/myshop/common/event/EventsConfiguration.java @@ -0,0 +1,18 @@ +package com.myshop.common.event; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class EventsConfiguration { + @Autowired + private ApplicationContext applicationContext; + + @Bean + public InitializingBean eventsInitializer() { + return () -> Events.setPublisher(applicationContext); + } +} diff --git a/src/main/java/com/myshop/common/jpa/EmailSetConverter.java b/src/main/java/com/myshop/common/jpa/EmailSetConverter.java new file mode 100644 index 0000000..c099369 --- /dev/null +++ b/src/main/java/com/myshop/common/jpa/EmailSetConverter.java @@ -0,0 +1,31 @@ +package com.myshop.common.jpa; + +import com.myshop.common.model.Email; +import com.myshop.common.model.EmailSet; + +import javax.persistence.AttributeConverter; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toSet; + +public class EmailSetConverter implements AttributeConverter { + @Override + public String convertToDatabaseColumn(EmailSet attribute) { + if (attribute == null) return null; + return attribute.getEmails().stream() + .map(email -> email.getAddress()) + .collect(Collectors.joining(",")); + } + + @Override + public EmailSet convertToEntityAttribute(String dbData) { + if (dbData == null) return null; + String[] emails = dbData.split(","); + Set emailSet = Arrays.stream(emails) + .map(value -> new Email(value)) + .collect(toSet()); + return new EmailSet(emailSet); + } +} diff --git a/src/main/java/com/myshop/common/jpa/MoneyConverter.java b/src/main/java/com/myshop/common/jpa/MoneyConverter.java new file mode 100644 index 0000000..4eb38fe --- /dev/null +++ b/src/main/java/com/myshop/common/jpa/MoneyConverter.java @@ -0,0 +1,18 @@ +package com.myshop.common.jpa; + +import com.myshop.common.model.Money; + +import javax.persistence.AttributeConverter; + +public class MoneyConverter implements AttributeConverter { + + @Override + public Integer convertToDatabaseColumn(Money money) { + return money == null ? null : money.getValue(); + } + + @Override + public Money convertToEntityAttribute(Integer value) { + return value == null ? null : new Money(value); + } +} diff --git a/src/main/java/com/myshop/common/jpa/Rangeable.java b/src/main/java/com/myshop/common/jpa/Rangeable.java new file mode 100644 index 0000000..41edfac --- /dev/null +++ b/src/main/java/com/myshop/common/jpa/Rangeable.java @@ -0,0 +1,31 @@ +package com.myshop.common.jpa; + +import org.springframework.data.domain.Sort; + +public class Rangeable { + private int start; + private int limit; + private Sort sort; + + public Rangeable(int start, int limit, Sort sort) { + this.start = start; + this.limit = limit; + this.sort = sort; + } + + public int getStart() { + return start; + } + + public int getLimit() { + return limit; + } + + public Sort getSort() { + return sort; + } + + public static Rangeable of(int start, int limit) { + return new Rangeable(start, limit, Sort.unsorted()); + } +} \ No newline at end of file diff --git a/src/main/java/com/myshop/common/jpa/RangeableExecutor.java b/src/main/java/com/myshop/common/jpa/RangeableExecutor.java new file mode 100644 index 0000000..f9424ec --- /dev/null +++ b/src/main/java/com/myshop/common/jpa/RangeableExecutor.java @@ -0,0 +1,9 @@ +package com.myshop.common.jpa; + +import org.springframework.data.jpa.domain.Specification; + +import java.util.List; + +public interface RangeableExecutor { + List getRange(Specification spec, Rangeable rangeable); +} \ No newline at end of file diff --git a/src/main/java/com/myshop/common/jpa/RangeableRepository.java b/src/main/java/com/myshop/common/jpa/RangeableRepository.java new file mode 100644 index 0000000..fe487f8 --- /dev/null +++ b/src/main/java/com/myshop/common/jpa/RangeableRepository.java @@ -0,0 +1,11 @@ +package com.myshop.common.jpa; + +import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.Repository; + +import java.io.Serializable; + +@NoRepositoryBean +public interface RangeableRepository + extends Repository, RangeableExecutor { +} \ No newline at end of file diff --git a/src/main/java/com/myshop/common/jpa/RangeableRepositoryImpl.java b/src/main/java/com/myshop/common/jpa/RangeableRepositoryImpl.java new file mode 100644 index 0000000..bd88198 --- /dev/null +++ b/src/main/java/com/myshop/common/jpa/RangeableRepositoryImpl.java @@ -0,0 +1,32 @@ +package com.myshop.common.jpa; + +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.support.JpaEntityInformation; +import org.springframework.data.jpa.repository.support.SimpleJpaRepository; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import java.io.Serializable; +import java.util.List; + +public class RangeableRepositoryImpl + extends SimpleJpaRepository + implements RangeableRepository { + + public RangeableRepositoryImpl( + JpaEntityInformation entityInformation, + EntityManager entityManager) { + super(entityInformation, entityManager); + } + + @Override + public List getRange(Specification spec, Rangeable rangeable) { + TypedQuery query = getQuery( + spec, getDomainClass(), rangeable.getSort()); + + query.setFirstResult(rangeable.getStart()); + query.setMaxResults(rangeable.getLimit()); + + return query.getResultList(); + } +} \ No newline at end of file diff --git a/src/main/java/com/myshop/common/jpa/SpecBuilder.java b/src/main/java/com/myshop/common/jpa/SpecBuilder.java new file mode 100644 index 0000000..e514263 --- /dev/null +++ b/src/main/java/com/myshop/common/jpa/SpecBuilder.java @@ -0,0 +1,48 @@ +package com.myshop.common.jpa; + +import org.springframework.data.jpa.domain.Specification; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +public class SpecBuilder { + public static Builder builder(Class type) { + return new Builder(); + } + + public static class Builder { + private List> specs = new ArrayList<>(); + + public Builder and(Specification spec) { + specs.add(spec); + return this; + } + + public Builder ifHasText(String str, + Function> specSupplier) { + if (StringUtils.hasText(str)) { + specs.add(specSupplier.apply(str)); + } + return this; + } + + public Builder ifTrue(Boolean cond, + Supplier> specSupplier) { + if (cond != null && cond.booleanValue()) { + specs.add(specSupplier.get()); + } + return this; + } + + public Specification toSpec() { + Specification spec = Specification.where(null); + for (Specification s : specs) { + spec = spec.and(s); + } + return spec; + } + } +} diff --git a/src/main/java/com/myshop/common/model/Address.java b/src/main/java/com/myshop/common/model/Address.java new file mode 100644 index 0000000..69df2f7 --- /dev/null +++ b/src/main/java/com/myshop/common/model/Address.java @@ -0,0 +1,37 @@ +package com.myshop.common.model; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +@Embeddable +public class Address { + @Column(name = "zip_code") + private String zipCode; + + @Column(name = "address1") + private String address1; + + @Column(name = "address2") + private String address2; + + public Address() { + } + + public Address(String zipCode, String address1, String address2) { + this.zipCode = zipCode; + this.address1 = address1; + this.address2 = address2; + } + + public String getZipCode() { + return zipCode; + } + + public String getAddress1() { + return address1; + } + + public String getAddress2() { + return address2; + } +} diff --git a/src/main/java/com/myshop/common/model/Email.java b/src/main/java/com/myshop/common/model/Email.java new file mode 100644 index 0000000..5f01166 --- /dev/null +++ b/src/main/java/com/myshop/common/model/Email.java @@ -0,0 +1,32 @@ +package com.myshop.common.model; + +import java.util.Objects; + +public class Email { + private String address; + + public Email(String address) { + this.address = address; + } + + public String getAddress() { + return address; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Email email = (Email) o; + return Objects.equals(address, email.address); + } + + @Override + public int hashCode() { + return Objects.hash(address); + } + + public static Email of(String address) { + return new Email(address); + } +} diff --git a/src/main/java/com/myshop/common/model/EmailSet.java b/src/main/java/com/myshop/common/model/EmailSet.java new file mode 100644 index 0000000..7b720b8 --- /dev/null +++ b/src/main/java/com/myshop/common/model/EmailSet.java @@ -0,0 +1,18 @@ +package com.myshop.common.model; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public class EmailSet { + private Set emails = new HashSet<>(); + + public EmailSet(Set emails) { + this.emails.addAll(emails); + } + + public Set getEmails() { + return Collections.unmodifiableSet(emails); + } + +} diff --git a/src/main/java/com/myshop/common/model/Money.java b/src/main/java/com/myshop/common/model/Money.java new file mode 100644 index 0000000..da91b02 --- /dev/null +++ b/src/main/java/com/myshop/common/model/Money.java @@ -0,0 +1,38 @@ +package com.myshop.common.model; + +import java.util.Objects; + +public class Money { + + private int value; + + public Money(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public Money multiply(int multiplier) { + return new Money(value * multiplier); + } + + @Override + public String toString() { + return Integer.toString(value); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Money money = (Money) o; + return value == money.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/com/myshop/common/ui/Pagination.java b/src/main/java/com/myshop/common/ui/Pagination.java new file mode 100644 index 0000000..6f50608 --- /dev/null +++ b/src/main/java/com/myshop/common/ui/Pagination.java @@ -0,0 +1,65 @@ +package com.myshop.common.ui; + +public class Pagination { + private int current; + private int beginPage; + private int endPage; + private int numberOfPage; + private int totalPages; + + public Pagination(int current, int totalPages, int numberOfPage) { + this.current = current; + this.totalPages = totalPages; + this.numberOfPage = numberOfPage; + int pageMod = current % 5; + beginPage = pageMod == 0 ? current - 5 + 1 : current - pageMod + 1; + endPage = beginPage + 5 - 1; + if (endPage > totalPages) { + endPage = totalPages; + } + } + + public int getCurrent() { + return current; + } + + public int getTotalPages() { + return totalPages; + } + + public int getBeginPage() { + return beginPage; + } + + public int getEndPage() { + return endPage; + } + + public int getNumberOfPage() { + return numberOfPage; + } + + public boolean isHasPrevious() { + return beginPage > 1; + } + + public int getPreviousBeginPage() { + return beginPage - numberOfPage; + } + + public int getNextBeginPage() { + return beginPage + numberOfPage; + } + + public boolean isHasNext() { + return endPage < totalPages; + } + + public int[] getPageNos() { + int[] result = new int[endPage - beginPage + 1]; + for (int i = beginPage ; i <= endPage ; i++) { + result[i - beginPage] = i; + } + return result; + } +} diff --git a/src/main/java/com/myshop/eventstore/api/EventEntry.java b/src/main/java/com/myshop/eventstore/api/EventEntry.java new file mode 100644 index 0000000..3fef163 --- /dev/null +++ b/src/main/java/com/myshop/eventstore/api/EventEntry.java @@ -0,0 +1,45 @@ +package com.myshop.eventstore.api; + +public class EventEntry { + private Long id; + private String type; + private String contentType; + private String payload; + private long timestamp; + + public EventEntry(String type, String contentType, String payload) { + this.type = type; + this.contentType = contentType; + this.payload = payload; + this.timestamp = System.currentTimeMillis(); + } + + public EventEntry(Long id, String type, String contentType, String payload, + long timestamp) { + this.id = id; + this.type = type; + this.contentType = contentType; + this.payload = payload; + this.timestamp = timestamp; + } + + public Long getId() { + return id; + } + + public String getType() { + return type; + } + + public String getContentType() { + return contentType; + } + + public String getPayload() { + return payload; + } + + public long getTimestamp() { + return timestamp; + } +} diff --git a/src/main/java/com/myshop/eventstore/api/EventStore.java b/src/main/java/com/myshop/eventstore/api/EventStore.java new file mode 100644 index 0000000..8c02e6d --- /dev/null +++ b/src/main/java/com/myshop/eventstore/api/EventStore.java @@ -0,0 +1,9 @@ +package com.myshop.eventstore.api; + +import java.util.List; + +public interface EventStore { + void save(Object event); + + List get(long offset, long limit); +} diff --git a/src/main/java/com/myshop/eventstore/api/PayloadConvertException.java b/src/main/java/com/myshop/eventstore/api/PayloadConvertException.java new file mode 100644 index 0000000..0a89f8f --- /dev/null +++ b/src/main/java/com/myshop/eventstore/api/PayloadConvertException.java @@ -0,0 +1,7 @@ +package com.myshop.eventstore.api; + +public class PayloadConvertException extends RuntimeException { + public PayloadConvertException(Exception e) { + super(e); + } +} diff --git a/src/main/java/com/myshop/eventstore/infra/JdbcEventStore.java b/src/main/java/com/myshop/eventstore/infra/JdbcEventStore.java new file mode 100644 index 0000000..85ce292 --- /dev/null +++ b/src/main/java/com/myshop/eventstore/infra/JdbcEventStore.java @@ -0,0 +1,66 @@ +package com.myshop.eventstore.infra; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.myshop.eventstore.api.EventEntry; +import com.myshop.eventstore.api.EventStore; +import com.myshop.eventstore.api.PayloadConvertException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import java.sql.Timestamp; +import java.util.List; + +@Component +public class JdbcEventStore implements EventStore { + private ObjectMapper objectMapper; + private JdbcTemplate jdbcTemplate; + + public JdbcEventStore(ObjectMapper objectMapper, JdbcTemplate jdbcTemplate) { + this.objectMapper = objectMapper; + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public void save(Object event) { + EventEntry entry = new EventEntry(event.getClass().getName(), + "application/json", toJson(event)); + jdbcTemplate.update( + "insert into evententry " + + "(type, content_type, payload, timestamp) " + + "values (?, ?, ?, ?)", + ps -> { + ps.setString(1, entry.getType()); + ps.setString(2, entry.getContentType()); + ps.setString(3, entry.getPayload()); + ps.setTimestamp(4, new Timestamp(entry.getTimestamp())); + }); + } + + private String toJson(Object event) { + try { + return objectMapper.writeValueAsString(event); + } catch (JsonProcessingException e) { + throw new PayloadConvertException(e); + } + } + + @Override + public List get(long offset, long limit) { + return jdbcTemplate.query( + "select * from evententry order by id asc limit ?, ?", + ps -> { + ps.setLong(1, offset); + ps.setLong(2, limit); + }, + (rs, rowNum) -> { + return new EventEntry( + rs.getLong("id"), + rs.getString("type"), + rs.getString("content_type"), + rs.getString("payload"), + rs.getTimestamp("timestamp").getTime()); + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/myshop/eventstore/ui/EventApi.java b/src/main/java/com/myshop/eventstore/ui/EventApi.java new file mode 100644 index 0000000..726888a --- /dev/null +++ b/src/main/java/com/myshop/eventstore/ui/EventApi.java @@ -0,0 +1,26 @@ +package com.myshop.eventstore.ui; + +import com.myshop.eventstore.api.EventEntry; +import com.myshop.eventstore.api.EventStore; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class EventApi { + private EventStore eventStore; + + public EventApi(EventStore eventStore) { + this.eventStore = eventStore; + } + + @RequestMapping(value = "/api/events", method = RequestMethod.GET) + public List list( + @RequestParam("offset") Long offset, + @RequestParam("limit") Long limit) { + return eventStore.get(offset, limit); + } +} diff --git a/src/main/java/com/myshop/integration/EventForwarder.java b/src/main/java/com/myshop/integration/EventForwarder.java new file mode 100644 index 0000000..7cc2f9b --- /dev/null +++ b/src/main/java/com/myshop/integration/EventForwarder.java @@ -0,0 +1,60 @@ +package com.myshop.integration; + +import com.myshop.eventstore.api.EventEntry; +import com.myshop.eventstore.api.EventStore; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class EventForwarder { + private static final int DEFAULT_LIMIT_SIZE = 100; + + private EventStore eventStore; + private OffsetStore offsetStore; + private EventSender eventSender; + private int limitSize = DEFAULT_LIMIT_SIZE; + + public EventForwarder(EventStore eventStore, + OffsetStore offsetStore, + EventSender eventSender) { + this.eventStore = eventStore; + this.offsetStore = offsetStore; + this.eventSender = eventSender; + } + + @Scheduled(initialDelay = 1000L, fixedDelay = 1000L) + public void getAndSend() { + long nextOffset = getNextOffset(); + List events = eventStore.get(nextOffset, limitSize); + if (!events.isEmpty()) { + int processedCount = sendEvent(events); + if (processedCount > 0) { + saveNextOffset(nextOffset + processedCount); + } + } + } + + private long getNextOffset() { + return offsetStore.get(); + } + + private int sendEvent(List events) { + int processedCount = 0; + try { + for (EventEntry entry : events) { + eventSender.send(entry); + processedCount++; + } + } catch(Exception ex) { + // 로깅 처리 + } + return processedCount; + } + + private void saveNextOffset(long nextOffset) { + offsetStore.update(nextOffset); + } + +} diff --git a/src/main/java/com/myshop/integration/EventSender.java b/src/main/java/com/myshop/integration/EventSender.java new file mode 100644 index 0000000..1da310f --- /dev/null +++ b/src/main/java/com/myshop/integration/EventSender.java @@ -0,0 +1,7 @@ +package com.myshop.integration; + +import com.myshop.eventstore.api.EventEntry; + +public interface EventSender { + void send(EventEntry event); +} diff --git a/src/main/java/com/myshop/integration/OffsetStore.java b/src/main/java/com/myshop/integration/OffsetStore.java new file mode 100644 index 0000000..6a58691 --- /dev/null +++ b/src/main/java/com/myshop/integration/OffsetStore.java @@ -0,0 +1,6 @@ +package com.myshop.integration; + +public interface OffsetStore { + long get(); + void update(long nextOffset); +} diff --git a/src/main/java/com/myshop/integration/infra/MemoryOffsetStore.java b/src/main/java/com/myshop/integration/infra/MemoryOffsetStore.java new file mode 100644 index 0000000..4641999 --- /dev/null +++ b/src/main/java/com/myshop/integration/infra/MemoryOffsetStore.java @@ -0,0 +1,19 @@ +package com.myshop.integration.infra; + +import com.myshop.integration.OffsetStore; +import org.springframework.stereotype.Component; + +@Component +public class MemoryOffsetStore implements OffsetStore { + private long nextOffset = 0; + + @Override + public long get() { + return nextOffset; + } + + @Override + public void update(long nextOffset) { + this.nextOffset = nextOffset; + } +} diff --git a/src/main/java/com/myshop/integration/infra/SysoutEventSender.java b/src/main/java/com/myshop/integration/infra/SysoutEventSender.java new file mode 100644 index 0000000..eb11e3f --- /dev/null +++ b/src/main/java/com/myshop/integration/infra/SysoutEventSender.java @@ -0,0 +1,13 @@ +package com.myshop.integration.infra; + +import com.myshop.eventstore.api.EventEntry; +import com.myshop.integration.EventSender; +import org.springframework.stereotype.Component; + +@Component +public class SysoutEventSender implements EventSender { + @Override + public void send(EventEntry event) { + System.out.println("EventSender send event : " + event); + } +} diff --git a/src/main/java/com/myshop/lock/AlreadyLockedException.java b/src/main/java/com/myshop/lock/AlreadyLockedException.java new file mode 100644 index 0000000..808777d --- /dev/null +++ b/src/main/java/com/myshop/lock/AlreadyLockedException.java @@ -0,0 +1,4 @@ +package com.myshop.lock; + +public class AlreadyLockedException extends LockException { +} diff --git a/src/main/java/com/myshop/lock/LockData.java b/src/main/java/com/myshop/lock/LockData.java new file mode 100644 index 0000000..b293a97 --- /dev/null +++ b/src/main/java/com/myshop/lock/LockData.java @@ -0,0 +1,35 @@ +package com.myshop.lock; + +public class LockData { + private String type; + private String id; + private String lockId; + private long timestamp; + + public LockData(String type, String id, String lockId, long timestamp) { + this.type = type; + this.id = id; + this.lockId = lockId; + this.timestamp = timestamp; + } + + public String getType() { + return type; + } + + public String getId() { + return id; + } + + public String getLockId() { + return lockId; + } + + public long getTimestamp() { + return timestamp; + } + + public boolean isExpired() { + return timestamp < System.currentTimeMillis(); + } +} \ No newline at end of file diff --git a/src/main/java/com/myshop/lock/LockException.java b/src/main/java/com/myshop/lock/LockException.java new file mode 100644 index 0000000..ec042ab --- /dev/null +++ b/src/main/java/com/myshop/lock/LockException.java @@ -0,0 +1,14 @@ +package com.myshop.lock; + +public class LockException extends RuntimeException { + public LockException() { + } + + public LockException(String message) { + super(message); + } + + public LockException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/myshop/lock/LockId.java b/src/main/java/com/myshop/lock/LockId.java new file mode 100644 index 0000000..8cace86 --- /dev/null +++ b/src/main/java/com/myshop/lock/LockId.java @@ -0,0 +1,13 @@ +package com.myshop.lock; + +public class LockId { + private String value; + + public LockId(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/com/myshop/lock/LockManager.java b/src/main/java/com/myshop/lock/LockManager.java new file mode 100644 index 0000000..b148d99 --- /dev/null +++ b/src/main/java/com/myshop/lock/LockManager.java @@ -0,0 +1,11 @@ +package com.myshop.lock; + +public interface LockManager { + LockId tryLock(String type, String id) throws LockException; + + void checkLock(LockId lockId) throws LockException; + + void releaseLock(LockId lockId) throws LockException; + + void extendLockExpiration(LockId lockId, long inc) throws LockException; +} diff --git a/src/main/java/com/myshop/lock/LockManagerException.java b/src/main/java/com/myshop/lock/LockManagerException.java new file mode 100644 index 0000000..79fccd5 --- /dev/null +++ b/src/main/java/com/myshop/lock/LockManagerException.java @@ -0,0 +1,7 @@ +package com.myshop.lock; + +public class LockManagerException extends RuntimeException { + public LockManagerException(Exception cause) { + super(cause); + } +} diff --git a/src/main/java/com/myshop/lock/LockingFailException.java b/src/main/java/com/myshop/lock/LockingFailException.java new file mode 100644 index 0000000..377af4b --- /dev/null +++ b/src/main/java/com/myshop/lock/LockingFailException.java @@ -0,0 +1,10 @@ +package com.myshop.lock; + +public class LockingFailException extends LockException { + public LockingFailException() { + } + + public LockingFailException(Exception cause) { + super(cause); + } +} diff --git a/src/main/java/com/myshop/lock/NoLockException.java b/src/main/java/com/myshop/lock/NoLockException.java new file mode 100644 index 0000000..112651d --- /dev/null +++ b/src/main/java/com/myshop/lock/NoLockException.java @@ -0,0 +1,4 @@ +package com.myshop.lock; + +public class NoLockException extends RuntimeException { +} diff --git a/src/main/java/com/myshop/lock/SpringLockManager.java b/src/main/java/com/myshop/lock/SpringLockManager.java new file mode 100644 index 0000000..f8da1a0 --- /dev/null +++ b/src/main/java/com/myshop/lock/SpringLockManager.java @@ -0,0 +1,108 @@ +package com.myshop.lock; + +import org.springframework.dao.DuplicateKeyException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Component +public class SpringLockManager implements LockManager { + private int lockTimeout = 5 * 60 * 1000; + private JdbcTemplate jdbcTemplate; + + private RowMapper lockDataRowMapper = (rs, rowNum) -> + new LockData(rs.getString(1), rs.getString(2), + rs.getString(3), rs.getTimestamp(4).getTime()); + + public SpringLockManager(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public LockId tryLock(String type, String id) throws LockException { + checkAlreadyLocked(type, id); + LockId lockId = new LockId(UUID.randomUUID().toString()); + locking(type, id, lockId); + return lockId; + } + + private void checkAlreadyLocked(String type, String id) { + List locks = jdbcTemplate.query( + "select * from locks where type = ? and id = ?", + lockDataRowMapper, type, id); + Optional lockData = handleExpiration(locks); + if (lockData.isPresent()) throw new AlreadyLockedException(); + } + + private Optional handleExpiration(List locks) { + if (locks.isEmpty()) return Optional.empty(); + LockData lockData = locks.get(0); + if (lockData.isExpired()) { + jdbcTemplate.update( + "delete from locks where type = ? and id = ?", + lockData.getType(), lockData.getId()); + return Optional.empty(); + } else { + return Optional.of(lockData); + } + } + + private void locking(String type, String id, LockId lockId) { + try { + int updatedCount = jdbcTemplate.update( + "insert into locks values (?, ?, ?, ?)", + type, id, lockId.getValue(), new Timestamp(getExpirationTime())); + if (updatedCount == 0) throw new LockingFailException(); + } catch (DuplicateKeyException e) { + throw new LockingFailException(e); + } + } + + private long getExpirationTime() { + return System.currentTimeMillis() + lockTimeout; + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public void checkLock(LockId lockId) throws LockException { + Optional lockData = getLockData(lockId); + if (!lockData.isPresent()) throw new NoLockException(); + } + + private Optional getLockData(LockId lockId) { + List locks = jdbcTemplate.query( + "select * from locks where lockid = ?", + lockDataRowMapper, lockId.getValue()); + return handleExpiration(locks); + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public void extendLockExpiration(LockId lockId, long inc) throws LockException { + Optional lockDataOpt = getLockData(lockId); + LockData lockData = + lockDataOpt.orElseThrow(() -> new NoLockException()); + jdbcTemplate.update( + "update locks set expiration_time = ? where type = ? AND id = ?", + new Timestamp(lockData.getTimestamp() + inc), + lockData.getType(), lockData.getId()); + } + + @Transactional(propagation = Propagation.REQUIRES_NEW) + @Override + public void releaseLock(LockId lockId) throws LockException { + jdbcTemplate.update("delete from locks where lockid = ?", lockId.getValue()); + } + + public void setLockTimeout(int lockTimeout) { + this.lockTimeout = lockTimeout; + } +} \ No newline at end of file diff --git a/src/main/java/com/myshop/member/command/application/BlockMemberService.java b/src/main/java/com/myshop/member/command/application/BlockMemberService.java new file mode 100644 index 0000000..c88eef3 --- /dev/null +++ b/src/main/java/com/myshop/member/command/application/BlockMemberService.java @@ -0,0 +1,28 @@ +package com.myshop.member.command.application; + +import com.myshop.member.command.domain.Member; +import com.myshop.member.command.domain.MemberId; +import com.myshop.member.command.domain.MemberRepository; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class BlockMemberService { + + private MemberRepository memberRepository; + + public BlockMemberService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + @PreAuthorize("hasRole('ADMIN')") + @Transactional + public void block(String memberId) { + Member member = memberRepository.findById(new MemberId(memberId)) + .orElseThrow(() -> new NoMemberException()); + + member.block(); + } + +} diff --git a/src/main/java/com/myshop/member/command/application/NoMemberException.java b/src/main/java/com/myshop/member/command/application/NoMemberException.java new file mode 100644 index 0000000..84a8eea --- /dev/null +++ b/src/main/java/com/myshop/member/command/application/NoMemberException.java @@ -0,0 +1,4 @@ +package com.myshop.member.command.application; + +public class NoMemberException extends RuntimeException { +} diff --git a/src/main/java/com/myshop/member/command/domain/IdPasswordNotMatchingException.java b/src/main/java/com/myshop/member/command/domain/IdPasswordNotMatchingException.java new file mode 100644 index 0000000..908b2c2 --- /dev/null +++ b/src/main/java/com/myshop/member/command/domain/IdPasswordNotMatchingException.java @@ -0,0 +1,4 @@ +package com.myshop.member.command.domain; + +public class IdPasswordNotMatchingException extends RuntimeException { +} diff --git a/src/main/java/com/myshop/member/command/domain/Member.java b/src/main/java/com/myshop/member/command/domain/Member.java new file mode 100644 index 0000000..6356133 --- /dev/null +++ b/src/main/java/com/myshop/member/command/domain/Member.java @@ -0,0 +1,85 @@ +package com.myshop.member.command.domain; + +import com.myshop.common.event.Events; +import com.myshop.common.jpa.EmailSetConverter; +import com.myshop.common.model.Email; +import com.myshop.common.model.EmailSet; + +import javax.persistence.*; +import java.util.Random; +import java.util.Set; + +@Entity +@Table(name = "member") +public class Member { + @EmbeddedId + private MemberId id; + + private String name; + @Embedded + private Password password; + + private boolean blocked; + + @Column(name = "emails") + @Convert(converter = EmailSetConverter.class) + private EmailSet emails; + + protected Member() { + } + + public Member(MemberId id, String name) { + this.id = id; + this.name = name; + } + + public MemberId getId() { + return id; + } + + public String getName() { + return name; + } + + public void initializePassword() { + String newPassword = generateRandomPassword(); + this.password = new Password(newPassword); + Events.raise(new PasswordChangedEvent(id.getId(), newPassword)); + } + + private String generateRandomPassword() { + Random random = new Random(); + int number = random.nextInt(); + return Integer.toHexString(number); + } + + public void changeEmails(Set emails) { + this.emails = new EmailSet(emails); + } + + public void block() { + this.blocked = true; + Events.raise(new MemberBlockedEvent(id.getId())); + } + + public void unblock() { + this.blocked = false; + Events.raise(new MemberUnblockedEvent(id.getId())); + } + + public void changePassword(String oldPw, String newPw) { + if (!password.match(oldPw)) { + throw new IdPasswordNotMatchingException(); + } + this.password = new Password(newPw); + Events.raise(new PasswordChangedEvent(id.getId(), newPw)); + } + + public boolean isBlocked() { + return blocked; + } + + public EmailSet getEmails() { + return emails; + } +} diff --git a/src/main/java/com/myshop/member/command/domain/MemberBlockedEvent.java b/src/main/java/com/myshop/member/command/domain/MemberBlockedEvent.java new file mode 100644 index 0000000..833898c --- /dev/null +++ b/src/main/java/com/myshop/member/command/domain/MemberBlockedEvent.java @@ -0,0 +1,15 @@ +package com.myshop.member.command.domain; + +import com.myshop.common.event.Event; + +public class MemberBlockedEvent extends Event { + private String memberId; + + public MemberBlockedEvent(String memberId) { + this.memberId = memberId; + } + + public String getMemberId() { + return memberId; + } +} diff --git a/src/main/java/com/myshop/member/command/domain/MemberId.java b/src/main/java/com/myshop/member/command/domain/MemberId.java new file mode 100644 index 0000000..4f6559b --- /dev/null +++ b/src/main/java/com/myshop/member/command/domain/MemberId.java @@ -0,0 +1,40 @@ +package com.myshop.member.command.domain; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +@Embeddable +public class MemberId implements Serializable { + @Column(name = "member_id") + private String id; + + protected MemberId() { + } + + public MemberId(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MemberId memberId = (MemberId) o; + return Objects.equals(id, memberId.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + public static MemberId of(String id) { + return new MemberId(id); + } +} diff --git a/src/main/java/com/myshop/member/command/domain/MemberRepository.java b/src/main/java/com/myshop/member/command/domain/MemberRepository.java new file mode 100644 index 0000000..77e3491 --- /dev/null +++ b/src/main/java/com/myshop/member/command/domain/MemberRepository.java @@ -0,0 +1,25 @@ +package com.myshop.member.command.domain; + +import org.springframework.data.jpa.repository.Lock; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.jpa.repository.QueryHints; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.query.Param; + +import javax.persistence.LockModeType; +import javax.persistence.QueryHint; +import java.util.Optional; + +public interface MemberRepository extends Repository { + Optional findById(MemberId memberId); + + @Lock(LockModeType.PESSIMISTIC_WRITE) + @QueryHints({ + @QueryHint(name = "javax.persistence.lock.timeout", value = "3000") + }) + @Query("select m from Member m where m.id = :id") + Optional findByIdForUpdate(@Param("id") MemberId memberId); + + void save(Member member); + +} diff --git a/src/main/java/com/myshop/member/command/domain/MemberUnblockedEvent.java b/src/main/java/com/myshop/member/command/domain/MemberUnblockedEvent.java new file mode 100644 index 0000000..3c2122f --- /dev/null +++ b/src/main/java/com/myshop/member/command/domain/MemberUnblockedEvent.java @@ -0,0 +1,13 @@ +package com.myshop.member.command.domain; + +public class MemberUnblockedEvent { + private String memberId; + + public MemberUnblockedEvent(String memberId) { + this.memberId = memberId; + } + + public String getMemberId() { + return memberId; + } +} diff --git a/src/main/java/com/myshop/member/command/domain/Password.java b/src/main/java/com/myshop/member/command/domain/Password.java new file mode 100644 index 0000000..6ac84c1 --- /dev/null +++ b/src/main/java/com/myshop/member/command/domain/Password.java @@ -0,0 +1,21 @@ +package com.myshop.member.command.domain; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +@Embeddable +public class Password { + @Column(name = "password") + private String value; + + protected Password() { + } + + public Password(String value) { + this.value = value; + } + + public boolean match(String password) { + return this.value.equals(password); + } +} diff --git a/src/main/java/com/myshop/member/command/domain/PasswordChangedEvent.java b/src/main/java/com/myshop/member/command/domain/PasswordChangedEvent.java new file mode 100644 index 0000000..93f1d4a --- /dev/null +++ b/src/main/java/com/myshop/member/command/domain/PasswordChangedEvent.java @@ -0,0 +1,19 @@ +package com.myshop.member.command.domain; + +public class PasswordChangedEvent { + private String id; + private String newPassword; + + public PasswordChangedEvent(String id, String newPassword) { + this.id = id; + this.newPassword = newPassword; + } + + public String getId() { + return id; + } + + public String getNewPassword() { + return newPassword; + } +} diff --git a/src/main/java/com/myshop/member/infra/PasswordChangedEventHandler.java b/src/main/java/com/myshop/member/infra/PasswordChangedEventHandler.java new file mode 100644 index 0000000..5cac0b5 --- /dev/null +++ b/src/main/java/com/myshop/member/infra/PasswordChangedEventHandler.java @@ -0,0 +1,13 @@ +package com.myshop.member.infra; + +import com.myshop.member.command.domain.PasswordChangedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +@Component +public class PasswordChangedEventHandler { + @EventListener(PasswordChangedEvent.class) + public void handle(PasswordChangedEvent event) { + // 이메일 발송 코드 + } +} diff --git a/src/main/java/com/myshop/member/query/MemberData.java b/src/main/java/com/myshop/member/query/MemberData.java new file mode 100644 index 0000000..c48f29b --- /dev/null +++ b/src/main/java/com/myshop/member/query/MemberData.java @@ -0,0 +1,39 @@ +package com.myshop.member.query; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "member") +public class MemberData { + @Id + @Column(name = "member_id") + private String id; + @Column(name = "name") + private String name; + @Column(name = "blocked") + private boolean blocked; + + protected MemberData() { + } + + public MemberData(String id, String name, boolean blocked) { + this.id = id; + this.name = name; + this.blocked = blocked; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public boolean isBlocked() { + return blocked; + } +} diff --git a/src/main/java/com/myshop/member/query/MemberDataDao.java b/src/main/java/com/myshop/member/query/MemberDataDao.java new file mode 100644 index 0000000..8007144 --- /dev/null +++ b/src/main/java/com/myshop/member/query/MemberDataDao.java @@ -0,0 +1,26 @@ +package com.myshop.member.query; + +import com.myshop.common.jpa.Rangeable; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.repository.Repository; + +import java.util.List; +import java.util.Optional; + +public interface MemberDataDao extends Repository { + + MemberData findById(String memberId); + + Page findByBlocked(boolean blocked, Pageable pageable); + List findByNameLike(String name, Pageable pageable); + + List findAll(Specification spec, Pageable pageable); + + List getRange(Specification spec, Rangeable rangeable); + + List findFirst3ByNameLikeOrderByName(String name); + Optional findFirstByNameLikeOrderByName(String name); + MemberData findFirstByBlockedOrderById(boolean blocked); +} diff --git a/src/main/java/com/myshop/member/query/MemberDataSpecs.java b/src/main/java/com/myshop/member/query/MemberDataSpecs.java new file mode 100644 index 0000000..db7204f --- /dev/null +++ b/src/main/java/com/myshop/member/query/MemberDataSpecs.java @@ -0,0 +1,14 @@ +package com.myshop.member.query; + +import org.springframework.data.jpa.domain.Specification; + +public class MemberDataSpecs { + + public static Specification nonBlocked() { + return (root, query, cb) -> cb.equal(root.get("blocked"), false); + } + + public static Specification nameLike(String keyword) { + return (root, query, cb) -> cb.like(root.get("name"), keyword + "%"); + } +} diff --git a/src/main/java/com/myshop/member/query/MemberQueryService.java b/src/main/java/com/myshop/member/query/MemberQueryService.java new file mode 100644 index 0000000..8411071 --- /dev/null +++ b/src/main/java/com/myshop/member/query/MemberQueryService.java @@ -0,0 +1,21 @@ +package com.myshop.member.query; + +import com.myshop.member.command.application.NoMemberException; +import org.springframework.stereotype.Service; + +@Service +public class MemberQueryService { + private MemberDataDao memberDataDao; + + public MemberQueryService(MemberDataDao memberDataDao) { + this.memberDataDao = memberDataDao; + } + + public MemberData getMemberData(String memberId) { + MemberData memberData = memberDataDao.findById(memberId); + if (memberData == null) { + throw new NoMemberException(); + } + return memberData; + } +} diff --git a/src/main/java/com/myshop/order/NoOrderException.java b/src/main/java/com/myshop/order/NoOrderException.java new file mode 100644 index 0000000..08046fe --- /dev/null +++ b/src/main/java/com/myshop/order/NoOrderException.java @@ -0,0 +1,4 @@ +package com.myshop.order; + +public class NoOrderException extends RuntimeException { +} diff --git a/src/main/java/com/myshop/order/command/application/CancelOrderService.java b/src/main/java/com/myshop/order/command/application/CancelOrderService.java new file mode 100644 index 0000000..d604a8d --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/CancelOrderService.java @@ -0,0 +1,29 @@ +package com.myshop.order.command.application; + +import com.myshop.order.NoOrderException; +import com.myshop.order.command.domain.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class CancelOrderService { + private OrderRepository orderRepository; + private CancelPolicy cancelPolicy; + + public CancelOrderService(OrderRepository orderRepository, + CancelPolicy cancelPolicy) { + this.orderRepository = orderRepository; + this.cancelPolicy = cancelPolicy; + } + + @Transactional + public void cancel(OrderNo orderNo, Canceller canceller) { + Order order = orderRepository.findById(orderNo) + .orElseThrow(() -> new NoOrderException()); + if (!cancelPolicy.hasCancellationPermission(order, canceller)) { + throw new NoCancellablePermission(); + } + order.cancel(); + } + +} diff --git a/src/main/java/com/myshop/order/command/application/ChangeShippingRequest.java b/src/main/java/com/myshop/order/command/application/ChangeShippingRequest.java new file mode 100644 index 0000000..8f80bdd --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/ChangeShippingRequest.java @@ -0,0 +1,21 @@ +package com.myshop.order.command.application; + +import com.myshop.order.command.domain.ShippingInfo; + +public class ChangeShippingRequest { + private String number; + private ShippingInfo shippingInfo; + + public ChangeShippingRequest(String number, ShippingInfo shippingInfo) { + this.number = number; + this.shippingInfo = shippingInfo; + } + + public String getNumber() { + return number; + } + + public ShippingInfo getShippingInfo() { + return shippingInfo; + } +} diff --git a/src/main/java/com/myshop/order/command/application/ChangeShippingService.java b/src/main/java/com/myshop/order/command/application/ChangeShippingService.java new file mode 100644 index 0000000..d940039 --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/ChangeShippingService.java @@ -0,0 +1,27 @@ +package com.myshop.order.command.application; + +import com.myshop.order.NoOrderException; +import com.myshop.order.command.domain.Order; +import com.myshop.order.command.domain.OrderNo; +import com.myshop.order.command.domain.OrderRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Service +public class ChangeShippingService { + private OrderRepository orderRepository; + + public ChangeShippingService(OrderRepository orderRepository) { + this.orderRepository = orderRepository; + } + + @Transactional + public void changeShipping(ChangeShippingRequest changeReq) { + Optional orderOpt = orderRepository.findById(new OrderNo(changeReq.getNumber())); + Order order = orderOpt.orElseThrow(() -> new NoOrderException()); + order.changeShippingInfo(changeReq.getShippingInfo()); + } + +} diff --git a/src/main/java/com/myshop/order/command/application/NoCancellablePermission.java b/src/main/java/com/myshop/order/command/application/NoCancellablePermission.java new file mode 100644 index 0000000..648ecd6 --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/NoCancellablePermission.java @@ -0,0 +1,4 @@ +package com.myshop.order.command.application; + +public class NoCancellablePermission extends RuntimeException { +} diff --git a/src/main/java/com/myshop/order/command/application/NoOrderProductException.java b/src/main/java/com/myshop/order/command/application/NoOrderProductException.java new file mode 100644 index 0000000..bf2ff2c --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/NoOrderProductException.java @@ -0,0 +1,13 @@ +package com.myshop.order.command.application; + +public class NoOrderProductException extends RuntimeException { + private String productId; + + public NoOrderProductException(String productId) { + this.productId = productId; + } + + public String getProductId() { + return productId; + } +} diff --git a/src/main/java/com/myshop/order/command/application/OrderProduct.java b/src/main/java/com/myshop/order/command/application/OrderProduct.java new file mode 100644 index 0000000..d5d9b83 --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/OrderProduct.java @@ -0,0 +1,22 @@ +package com.myshop.order.command.application; + +public class OrderProduct { + private String productId; + private int quantity; + + public OrderProduct() { + } + + public OrderProduct(String productId, int quantity) { + this.productId = productId; + this.quantity = quantity; + } + + public String getProductId() { + return productId; + } + + public int getQuantity() { + return quantity; + } +} diff --git a/src/main/java/com/myshop/order/command/application/OrderRequest.java b/src/main/java/com/myshop/order/command/application/OrderRequest.java new file mode 100644 index 0000000..3f09d5b --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/OrderRequest.java @@ -0,0 +1,36 @@ +package com.myshop.order.command.application; + +import com.myshop.member.command.domain.MemberId; +import com.myshop.order.command.domain.ShippingInfo; + +import java.util.List; + +public class OrderRequest { + private List orderProducts; + private MemberId ordererMemberId; + private ShippingInfo shippingInfo; + + public List getOrderProducts() { + return orderProducts; + } + + public void setOrderProducts(List orderProducts) { + this.orderProducts = orderProducts; + } + + public MemberId getOrdererMemberId() { + return ordererMemberId; + } + + public void setOrdererMemberId(MemberId ordererMemberId) { + this.ordererMemberId = ordererMemberId; + } + + public ShippingInfo getShippingInfo() { + return shippingInfo; + } + + public void setShippingInfo(ShippingInfo shippingInfo) { + this.shippingInfo = shippingInfo; + } +} diff --git a/src/main/java/com/myshop/order/command/application/OrderRequestValidator.java b/src/main/java/com/myshop/order/command/application/OrderRequestValidator.java new file mode 100644 index 0000000..4f81b71 --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/OrderRequestValidator.java @@ -0,0 +1,52 @@ +package com.myshop.order.command.application; + +import com.myshop.common.ValidationError; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +public class OrderRequestValidator { + public List validate(OrderRequest orderRequest) { + List errors = new ArrayList<>(); + if (orderRequest == null) { + errors.add(ValidationError.of("required")); + } else { + if (orderRequest.getOrdererMemberId() == null) + errors.add(ValidationError.of("ordererMemberId", "required")); + if (orderRequest.getOrderProducts() == null) + errors.add(ValidationError.of("orderProducts", "required")); + if (orderRequest.getOrderProducts().isEmpty()) + errors.add(ValidationError.of("orderProducts", "required")); + + if (orderRequest.getShippingInfo() == null) { + errors.add(ValidationError.of("shippingInfo", "required")); + } else { + if (orderRequest.getShippingInfo().getReceiver() == null) { + errors.add(ValidationError.of("shippingInfo.receiver", "required")); + } else { + if (!StringUtils.hasText(orderRequest.getShippingInfo().getReceiver().getName())) { + errors.add(ValidationError.of("shippingInfo.receiver.name", "required")); + } + if (!StringUtils.hasText(orderRequest.getShippingInfo().getReceiver().getPhone())) { + errors.add(ValidationError.of("shippingInfo.receiver.phone", "required")); + } + if (orderRequest.getShippingInfo().getAddress() == null) { + errors.add(ValidationError.of("shippingInfo.address", "required")); + } else { + if (!StringUtils.hasText(orderRequest.getShippingInfo().getAddress().getZipCode())) { + errors.add(ValidationError.of("shippingInfo.address.zipCode", "required")); + } + if (!StringUtils.hasText(orderRequest.getShippingInfo().getAddress().getAddress1())) { + errors.add(ValidationError.of("shippingInfo.address.address1", "required")); + } + if (!StringUtils.hasText(orderRequest.getShippingInfo().getAddress().getAddress2())) { + errors.add(ValidationError.of("shippingInfo.address.address2", "required")); + } + } + } + } + } + return errors; + } +} diff --git a/src/main/java/com/myshop/order/command/application/PlaceOrderService.java b/src/main/java/com/myshop/order/command/application/PlaceOrderService.java new file mode 100644 index 0000000..ce74f9f --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/PlaceOrderService.java @@ -0,0 +1,53 @@ +package com.myshop.order.command.application; + +import com.myshop.catalog.command.domain.product.Product; +import com.myshop.catalog.command.domain.product.ProductId; +import com.myshop.catalog.command.domain.product.ProductRepository; +import com.myshop.common.ValidationError; +import com.myshop.common.ValidationErrorException; +import com.myshop.order.command.domain.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Service +public class PlaceOrderService { + private ProductRepository productRepository; + private OrderRepository orderRepository; + private OrdererService ordererService; + + public PlaceOrderService(ProductRepository productRepository, + OrderRepository orderRepository, + OrdererService ordererService) { + this.productRepository = productRepository; + this.orderRepository = orderRepository; + this.ordererService = ordererService; + } + + @Transactional + public OrderNo placeOrder(OrderRequest orderRequest) { + List errors = validateOrderRequest(orderRequest); + if (!errors.isEmpty()) throw new ValidationErrorException(errors); + + List orderLines = new ArrayList<>(); + for (OrderProduct op : orderRequest.getOrderProducts()) { + Optional productOpt = productRepository.findById(new ProductId(op.getProductId())); + Product product = productOpt.orElseThrow(() -> new NoOrderProductException(op.getProductId())); + orderLines.add(new OrderLine(product.getId(), product.getPrice(), op.getQuantity())); + } + OrderNo orderNo = orderRepository.nextOrderNo(); + Orderer orderer = ordererService.createOrderer(orderRequest.getOrdererMemberId()); + + Order order = new Order(orderNo, orderer, orderLines, orderRequest.getShippingInfo(), OrderState.PAYMENT_WAITING); + orderRepository.save(order); + return orderNo; + } + + private List validateOrderRequest(OrderRequest orderRequest) { + return new OrderRequestValidator().validate(orderRequest); + } + +} diff --git a/src/main/java/com/myshop/order/command/application/RefundService.java b/src/main/java/com/myshop/order/command/application/RefundService.java new file mode 100644 index 0000000..e12be1b --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/RefundService.java @@ -0,0 +1,5 @@ +package com.myshop.order.command.application; + +public interface RefundService { + void refund(String orderNumber); +} diff --git a/src/main/java/com/myshop/order/command/application/StartShippingRequest.java b/src/main/java/com/myshop/order/command/application/StartShippingRequest.java new file mode 100644 index 0000000..8d9c401 --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/StartShippingRequest.java @@ -0,0 +1,22 @@ +package com.myshop.order.command.application; + +public class StartShippingRequest { + private String orderNumber; + private long version; + + protected StartShippingRequest() { + } + + public StartShippingRequest(String orderNumber, long version) { + this.orderNumber = orderNumber; + this.version = version; + } + + public String getOrderNumber() { + return orderNumber; + } + + public long getVersion() { + return version; + } +} diff --git a/src/main/java/com/myshop/order/command/application/StartShippingService.java b/src/main/java/com/myshop/order/command/application/StartShippingService.java new file mode 100644 index 0000000..1f446a1 --- /dev/null +++ b/src/main/java/com/myshop/order/command/application/StartShippingService.java @@ -0,0 +1,30 @@ +package com.myshop.order.command.application; + +import com.myshop.common.VersionConflictException; +import com.myshop.order.NoOrderException; +import com.myshop.order.command.domain.Order; +import com.myshop.order.command.domain.OrderNo; +import com.myshop.order.command.domain.OrderRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Service +public class StartShippingService { + private OrderRepository orderRepository; + + public StartShippingService(OrderRepository orderRepository) { + this.orderRepository = orderRepository; + } + + @Transactional + public void startShipping(StartShippingRequest req) { + Optional orderOpt = orderRepository.findById(new OrderNo(req.getOrderNumber())); + Order order = orderOpt.orElseThrow(() -> new NoOrderException()); + if (order.matchVersion(req.getVersion())) { + throw new VersionConflictException(); + } + order.startShipping(); + } +} diff --git a/src/main/java/com/myshop/order/command/domain/AlreadyShippedException.java b/src/main/java/com/myshop/order/command/domain/AlreadyShippedException.java new file mode 100644 index 0000000..488cc5f --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/AlreadyShippedException.java @@ -0,0 +1,4 @@ +package com.myshop.order.command.domain; + +public class AlreadyShippedException extends RuntimeException { +} diff --git a/src/main/java/com/myshop/order/command/domain/CancelPolicy.java b/src/main/java/com/myshop/order/command/domain/CancelPolicy.java new file mode 100644 index 0000000..10aad7c --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/CancelPolicy.java @@ -0,0 +1,5 @@ +package com.myshop.order.command.domain; + +public interface CancelPolicy { + boolean hasCancellationPermission(Order order, Canceller canceller); +} diff --git a/src/main/java/com/myshop/order/command/domain/Canceller.java b/src/main/java/com/myshop/order/command/domain/Canceller.java new file mode 100644 index 0000000..e1943a0 --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/Canceller.java @@ -0,0 +1,17 @@ +package com.myshop.order.command.domain; + +public class Canceller { + private String memberId; + + public Canceller(String memberId) { + this.memberId = memberId; + } + + public String getMemberId() { + return memberId; + } + + public static Canceller of(String memberId) { + return new Canceller(memberId); + } +} diff --git a/src/main/java/com/myshop/order/command/domain/Order.java b/src/main/java/com/myshop/order/command/domain/Order.java new file mode 100644 index 0000000..8907aae --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/Order.java @@ -0,0 +1,158 @@ +package com.myshop.order.command.domain; + +import com.myshop.common.event.Events; +import com.myshop.common.jpa.MoneyConverter; +import com.myshop.common.model.Money; + +import javax.persistence.*; +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Table(name = "purchase_order") +@Access(AccessType.FIELD) +public class Order { + @EmbeddedId + private OrderNo number; + + @Version + private long version; + + @Embedded + private Orderer orderer; + + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable(name = "order_line", joinColumns = @JoinColumn(name = "order_number")) + @OrderColumn(name = "line_idx") + private List orderLines; + + @Convert(converter = MoneyConverter.class) + @Column(name = "total_amounts") + private Money totalAmounts; + + @Embedded + private ShippingInfo shippingInfo; + + @Column(name = "state") + @Enumerated(EnumType.STRING) + private OrderState state; + + @Column(name = "order_date") + private LocalDateTime orderDate; + + protected Order() { + } + + public Order(OrderNo number, Orderer orderer, List orderLines, + ShippingInfo shippingInfo, OrderState state) { + setNumber(number); + setOrderer(orderer); + setOrderLines(orderLines); + setShippingInfo(shippingInfo); + this.state = state; + this.orderDate = LocalDateTime.now(); + Events.raise(new OrderPlacedEvent(number.getNumber(), orderer, orderLines, orderDate)); + } + + private void setNumber(OrderNo number) { + if (number == null) throw new IllegalArgumentException("no number"); + this.number = number; + } + + private void setOrderer(Orderer orderer) { + if (orderer == null) throw new IllegalArgumentException("no orderer"); + this.orderer = orderer; + } + + private void setOrderLines(List orderLines) { + verifyAtLeastOneOrMoreOrderLines(orderLines); + this.orderLines = orderLines; + calculateTotalAmounts(); + } + + private void verifyAtLeastOneOrMoreOrderLines(List orderLines) { + if (orderLines == null || orderLines.isEmpty()) { + throw new IllegalArgumentException("no OrderLine"); + } + } + + private void calculateTotalAmounts() { + this.totalAmounts = new Money(orderLines.stream() + .mapToInt(x -> x.getAmounts().getValue()).sum()); + } + + private void setShippingInfo(ShippingInfo shippingInfo) { + if (shippingInfo == null) throw new IllegalArgumentException("no shipping info"); + this.shippingInfo = shippingInfo; + } + + public OrderNo getNumber() { + return number; + } + + public long getVersion() { + return version; + } + + public Orderer getOrderer() { + return orderer; + } + + public Money getTotalAmounts() { + return totalAmounts; + } + + public ShippingInfo getShippingInfo() { + return shippingInfo; + } + + public OrderState getState() { + return state; + } + + public void changeShippingInfo(ShippingInfo newShippingInfo) { + verifyNotYetShipped(); + setShippingInfo(newShippingInfo); + Events.raise(new ShippingInfoChangedEvent(number, newShippingInfo)); + } + + public void cancel() { + verifyNotYetShipped(); + this.state = OrderState.CANCELED; + Events.raise(new OrderCanceledEvent(number.getNumber())); + } + + private void verifyNotYetShipped() { + if (!isNotYetShipped()) + throw new AlreadyShippedException(); + } + + public boolean isNotYetShipped() { + return state == OrderState.PAYMENT_WAITING || state == OrderState.PREPARING; + } + + public List getOrderLines() { + return orderLines; + } + + public boolean matchVersion(long version) { + return this.version == version; + } + + public void startShipping() { + verifyShippableState(); + this.state = OrderState.SHIPPED; + Events.raise(new ShippingStartedEvent(number.getNumber())); + } + + private void verifyShippableState() { + verifyNotYetShipped(); + verifyNotCanceled(); + } + + private void verifyNotCanceled() { + if (state == OrderState.CANCELED) { + throw new OrderAlreadyCanceledException(); + } + } +} diff --git a/src/main/java/com/myshop/order/command/domain/OrderAlreadyCanceledException.java b/src/main/java/com/myshop/order/command/domain/OrderAlreadyCanceledException.java new file mode 100644 index 0000000..74019dc --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/OrderAlreadyCanceledException.java @@ -0,0 +1,4 @@ +package com.myshop.order.command.domain; + +public class OrderAlreadyCanceledException extends RuntimeException { +} diff --git a/src/main/java/com/myshop/order/command/domain/OrderCanceledEvent.java b/src/main/java/com/myshop/order/command/domain/OrderCanceledEvent.java new file mode 100644 index 0000000..726ec57 --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/OrderCanceledEvent.java @@ -0,0 +1,16 @@ +package com.myshop.order.command.domain; + +import com.myshop.common.event.Event; + +public class OrderCanceledEvent extends Event { + private String orderNumber; + + public OrderCanceledEvent(String number) { + super(); + this.orderNumber = number; + } + + public String getOrderNumber() { + return orderNumber; + } +} diff --git a/src/main/java/com/myshop/order/command/domain/OrderLine.java b/src/main/java/com/myshop/order/command/domain/OrderLine.java new file mode 100644 index 0000000..d3cf379 --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/OrderLine.java @@ -0,0 +1,57 @@ +package com.myshop.order.command.domain; + +import com.myshop.catalog.command.domain.product.ProductId; +import com.myshop.common.jpa.MoneyConverter; +import com.myshop.common.model.Money; + +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Embeddable; +import javax.persistence.Embedded; + +@Embeddable +public class OrderLine { + @Embedded + private ProductId productId; + + @Convert(converter = MoneyConverter.class) + @Column(name = "price") + private Money price; + + @Column(name = "quantity") + private int quantity; + + @Convert(converter = MoneyConverter.class) + @Column(name = "amounts") + private Money amounts; + + protected OrderLine() { + } + + public OrderLine(ProductId productId, Money price, int quantity) { + this.productId = productId; + this.price = price; + this.quantity = quantity; + this.amounts = calculateAmounts(); + } + + private Money calculateAmounts() { + return price.multiply(quantity); + } + + public ProductId getProductId() { + return productId; + } + + public Money getPrice() { + return price; + } + + public int getQuantity() { + return quantity; + } + + public Money getAmounts() { + return amounts; + } +} diff --git a/src/main/java/com/myshop/order/command/domain/OrderNo.java b/src/main/java/com/myshop/order/command/domain/OrderNo.java new file mode 100644 index 0000000..6bc4ec8 --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/OrderNo.java @@ -0,0 +1,40 @@ +package com.myshop.order.command.domain; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serializable; +import java.util.Objects; + +@Embeddable +public class OrderNo implements Serializable { + @Column(name = "order_number") + private String number; + + protected OrderNo() { + } + + public OrderNo(String number) { + this.number = number; + } + + public String getNumber() { + return number; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OrderNo orderNo = (OrderNo) o; + return Objects.equals(number, orderNo.number); + } + + @Override + public int hashCode() { + return Objects.hash(number); + } + + public static OrderNo of(String number) { + return new OrderNo(number); + } +} diff --git a/src/main/java/com/myshop/order/command/domain/OrderPlacedEvent.java b/src/main/java/com/myshop/order/command/domain/OrderPlacedEvent.java new file mode 100644 index 0000000..450466d --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/OrderPlacedEvent.java @@ -0,0 +1,38 @@ +package com.myshop.order.command.domain; + +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +public class OrderPlacedEvent { + private String number; + private Orderer orderer; + private List orderLines; + private LocalDateTime orderDate; + + private OrderPlacedEvent() { + } + + public OrderPlacedEvent(String number, Orderer orderer, List orderLines, LocalDateTime orderDate) { + this.number = number; + this.orderer = orderer; + this.orderLines = orderLines; + this.orderDate = orderDate; + } + + public String getNumber() { + return number; + } + + public Orderer getOrderer() { + return orderer; + } + + public List getOrderLines() { + return orderLines; + } + + public LocalDateTime getOrderDate() { + return orderDate; + } +} diff --git a/src/main/java/com/myshop/order/command/domain/OrderRepository.java b/src/main/java/com/myshop/order/command/domain/OrderRepository.java new file mode 100644 index 0000000..2173548 --- /dev/null +++ b/src/main/java/com/myshop/order/command/domain/OrderRepository.java @@ -0,0 +1,19 @@ +package com.myshop.order.command.domain; + +import org.springframework.data.repository.Repository; + +import java.util.Date; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; + +public interface OrderRepository extends Repository { + Optional findById(OrderNo id); + + void save(Order order); + + default OrderNo nextOrderNo() { + int randomNo = ThreadLocalRandom.current().nextInt(900000) + 100000; + String number = String.format("%tY% authorities = authentication.getAuthorities(); + if (authorities == null) return false; + return authorities.stream().anyMatch(authority -> authority.getAuthority().equals("ROLE_ADMIN")); + } +} diff --git a/src/main/java/com/myshop/order/infra/paygate/ExternalRefundService.java b/src/main/java/com/myshop/order/infra/paygate/ExternalRefundService.java new file mode 100644 index 0000000..5cd1751 --- /dev/null +++ b/src/main/java/com/myshop/order/infra/paygate/ExternalRefundService.java @@ -0,0 +1,16 @@ +package com.myshop.order.infra.paygate; + +import com.myshop.order.command.application.RefundService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class ExternalRefundService implements RefundService { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public void refund(String orderNumber) { + logger.info("refund order[{}]", orderNumber); + } +} diff --git a/src/main/java/com/myshop/order/query/application/ListRequest.java b/src/main/java/com/myshop/order/query/application/ListRequest.java new file mode 100644 index 0000000..a9456be --- /dev/null +++ b/src/main/java/com/myshop/order/query/application/ListRequest.java @@ -0,0 +1,19 @@ +package com.myshop.order.query.application; + +public class ListRequest { + private int page; + private int size; + + public ListRequest(int page, int size) { + this.page = page; + this.size = size; + } + + public int getPage() { + return page; + } + + public int getSize() { + return size; + } +} diff --git a/src/main/java/com/myshop/order/query/application/OrderDetail.java b/src/main/java/com/myshop/order/query/application/OrderDetail.java new file mode 100644 index 0000000..e3dfa81 --- /dev/null +++ b/src/main/java/com/myshop/order/query/application/OrderDetail.java @@ -0,0 +1,63 @@ +package com.myshop.order.query.application; + +import com.myshop.order.command.domain.Order; +import com.myshop.order.command.domain.OrderState; +import com.myshop.order.command.domain.Orderer; +import com.myshop.order.command.domain.ShippingInfo; + +import java.util.List; + +public class OrderDetail { + + private final String number; + private long version; + private final Orderer orderer; + private final ShippingInfo shippingInfo; + private final OrderState state; + private final int totalAmounts; + private List orderLines; + private final boolean notYetShipped; + + public OrderDetail(Order order, List orderLines) { + this.orderLines = orderLines; + number = order.getNumber().getNumber(); + version = order.getVersion(); + orderer = order.getOrderer(); + shippingInfo = order.getShippingInfo(); + state = order.getState(); + notYetShipped = order.isNotYetShipped(); + totalAmounts = order.getTotalAmounts().getValue(); + } + + public String getNumber() { + return number; + } + + public long getVersion() { + return version; + } + + public Orderer getOrderer() { + return orderer; + } + + public ShippingInfo getShippingInfo() { + return shippingInfo; + } + + public OrderState getState() { + return state; + } + + public int getTotalAmounts() { + return totalAmounts; + } + + public List getOrderLines() { + return orderLines; + } + + public boolean isNotYetShipped() { + return notYetShipped; + } +} diff --git a/src/main/java/com/myshop/order/query/application/OrderDetailService.java b/src/main/java/com/myshop/order/query/application/OrderDetailService.java new file mode 100644 index 0000000..7d66414 --- /dev/null +++ b/src/main/java/com/myshop/order/query/application/OrderDetailService.java @@ -0,0 +1,39 @@ +package com.myshop.order.query.application; + +import com.myshop.catalog.query.product.ProductData; +import com.myshop.catalog.query.product.ProductQueryService; +import com.myshop.order.command.domain.Order; +import com.myshop.order.command.domain.OrderNo; +import com.myshop.order.command.domain.OrderRepository; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Component +public class OrderDetailService { + private OrderRepository orderRepository; + private ProductQueryService productQueryService; + + public OrderDetailService(OrderRepository orderRepository, + ProductQueryService productQueryService) { + this.orderRepository = orderRepository; + this.productQueryService = productQueryService; + } + + @Transactional + public Optional getOrderDetail(String orderNumber) { + Optional orderOpt = orderRepository.findById(new OrderNo(orderNumber)); + return orderOpt.map(order -> { + List orderLines = order.getOrderLines().stream() + .map(orderLine -> { + Optional productOpt = + productQueryService.getProduct(orderLine.getProductId().getId()); + return new OrderLineDetail(orderLine, productOpt.orElse(null)); + }).collect(Collectors.toList()); + return new OrderDetail(order, orderLines); + }); + } +} diff --git a/src/main/java/com/myshop/order/query/application/OrderLineDetail.java b/src/main/java/com/myshop/order/query/application/OrderLineDetail.java new file mode 100644 index 0000000..d5a82e7 --- /dev/null +++ b/src/main/java/com/myshop/order/query/application/OrderLineDetail.java @@ -0,0 +1,47 @@ +package com.myshop.order.query.application; + +import com.myshop.catalog.query.product.ProductData; +import com.myshop.order.command.domain.OrderLine; + +public class OrderLineDetail { + + private final String productId; + private final int price; + private final int quantity; + private final int amounts; + private final String productName; + private final String productImagePath; + + public OrderLineDetail(OrderLine orderLine, ProductData product) { + productId = orderLine.getProductId().getId(); + price = orderLine.getPrice().getValue(); + quantity = orderLine.getQuantity(); + amounts = orderLine.getAmounts().getValue(); + productName = product.getName(); + productImagePath = product.getFirstIamgeThumbnailPath(); + } + + public String getProductId() { + return productId; + } + + public int getPrice() { + return price; + } + + public int getQuantity() { + return quantity; + } + + public int getAmounts() { + return amounts; + } + + public String getProductName() { + return productName; + } + + public String getProductImagePath() { + return productImagePath; + } +} diff --git a/src/main/java/com/myshop/order/query/application/OrderViewListService.java b/src/main/java/com/myshop/order/query/application/OrderViewListService.java new file mode 100644 index 0000000..21622a2 --- /dev/null +++ b/src/main/java/com/myshop/order/query/application/OrderViewListService.java @@ -0,0 +1,27 @@ +package com.myshop.order.query.application; + +import com.myshop.order.query.dao.OrderSummaryDao; +import com.myshop.order.query.dto.OrderSummary; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +public class OrderViewListService { + private OrderSummaryDao orderSummaryDao; + + public OrderViewListService(OrderSummaryDao orderSummaryDao) { + this.orderSummaryDao = orderSummaryDao; + } + + @Transactional + public Page getList(ListRequest listReq) { + PageRequest pageable = PageRequest.of( + listReq.getPage(), + listReq.getSize(), + Sort.by(Sort.Direction.DESC, "number")); + return orderSummaryDao.findAll(pageable); + } +} diff --git a/src/main/java/com/myshop/order/query/dao/OrderSummaryDao.java b/src/main/java/com/myshop/order/query/dao/OrderSummaryDao.java new file mode 100644 index 0000000..85cf7d7 --- /dev/null +++ b/src/main/java/com/myshop/order/query/dao/OrderSummaryDao.java @@ -0,0 +1,38 @@ +package com.myshop.order.query.dao; + +import com.myshop.order.query.dto.OrderSummary; +import com.myshop.order.query.dto.OrderView; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; + +import java.util.List; + +public interface OrderSummaryDao extends Repository { + List findByOrdererId(String ordererId); + List findByOrdererId(String ordererId, Sort sort); + List findByOrdererId(String ordererId, Pageable pageable); + List findByOrdererIdOrderByNumberDesc(String ordererId); + + List findAll(Specification spec); + List findAll(Specification spec, Sort sort); + List findAll(Specification spec, Pageable pageable); + + Page findAll(Pageable pageable); + + @Query(""" + select new com.myshop.order.query.dto.OrderView( + o.number, o.state, m.name, m.id, p.name + ) + from Order o join o.orderLines ol, Member m, Product p + where o.orderer.memberId.id = :ordererId + and o.orderer.memberId.id = m.id + and index(ol) = 0 + and ol.productId.id = p.id + order by o.number.number desc + """) + List findOrderView(String ordererId); +} diff --git a/src/main/java/com/myshop/order/query/dao/OrderSummarySpecs.java b/src/main/java/com/myshop/order/query/dao/OrderSummarySpecs.java new file mode 100644 index 0000000..5066b8d --- /dev/null +++ b/src/main/java/com/myshop/order/query/dao/OrderSummarySpecs.java @@ -0,0 +1,24 @@ +package com.myshop.order.query.dao; + +import com.myshop.order.query.dto.OrderSummary; +import com.myshop.order.query.dto.OrderSummary_; +import org.springframework.data.jpa.domain.Specification; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Root; +import java.time.LocalDateTime; + +public class OrderSummarySpecs { + public static Specification ordererId(String ordererId) { + return (Root root, CriteriaQuery query, CriteriaBuilder cb) -> + cb.equal(root.get("ordererId"), ordererId); + } + + public static Specification orderDateBetween( + LocalDateTime from, LocalDateTime to) { + return (Root root, CriteriaQuery query, CriteriaBuilder cb) -> + cb.between(root.get(OrderSummary_.orderDate), from, to); + } +} diff --git a/src/main/java/com/myshop/order/query/dao/OrdererIdSpec.java b/src/main/java/com/myshop/order/query/dao/OrdererIdSpec.java new file mode 100644 index 0000000..7b5bda9 --- /dev/null +++ b/src/main/java/com/myshop/order/query/dao/OrdererIdSpec.java @@ -0,0 +1,26 @@ +package com.myshop.order.query.dao; + +import com.myshop.order.query.dto.OrderSummary; +import com.myshop.order.query.dto.OrderSummary_; +import org.springframework.data.jpa.domain.Specification; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +public class OrdererIdSpec implements Specification { + + private String ordererId; + + public OrdererIdSpec(String ordererId) { + this.ordererId = ordererId; + } + + @Override + public Predicate toPredicate(Root root, + CriteriaQuery query, + CriteriaBuilder cb) { + return cb.equal(root.get(OrderSummary_.ordererId), ordererId); + } +} diff --git a/src/main/java/com/myshop/order/query/dto/OrderSummary.java b/src/main/java/com/myshop/order/query/dto/OrderSummary.java new file mode 100644 index 0000000..ff5b44b --- /dev/null +++ b/src/main/java/com/myshop/order/query/dto/OrderSummary.java @@ -0,0 +1,96 @@ +package com.myshop.order.query.dto; + +import org.hibernate.annotations.Immutable; +import org.hibernate.annotations.Subselect; +import org.hibernate.annotations.Synchronize; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import java.time.LocalDateTime; + +@Entity +@Immutable +@Subselect( + """ + select o.order_number as number, + o.version, + o.orderer_id, + o.orderer_name, + o.total_amounts, + o.receiver_name, + o.state, + o.order_date, + p.product_id, + p.name as product_name + from purchase_order o inner join order_line ol + on o.order_number = ol.order_number + cross join product p + where + ol.line_idx = 0 + and ol.product_id = p.product_id""" +) +@Synchronize({"purchase_order", "order_line", "product"}) +public class OrderSummary { + @Id + private String number; + private long version; + @Column(name = "orderer_id") + private String ordererId; + @Column(name = "orderer_name") + private String ordererName; + @Column(name = "total_amounts") + private int totalAmounts; + @Column(name = "receiver_name") + private String receiverName; + private String state; + @Column(name = "order_date") + private LocalDateTime orderDate; + @Column(name = "product_id") + private String productId; + @Column(name = "product_name") + private String productName; + + protected OrderSummary() { + } + + public String getNumber() { + return number; + } + + public long getVersion() { + return version; + } + + public String getOrdererId() { + return ordererId; + } + + public String getOrdererName() { + return ordererName; + } + + public int getTotalAmounts() { + return totalAmounts; + } + + public String getReceiverName() { + return receiverName; + } + + public String getState() { + return state; + } + + public LocalDateTime getOrderDate() { + return orderDate; + } + + public String getProductId() { + return productId; + } + + public String getProductName() { + return productName; + } +} diff --git a/src/main/java/com/myshop/order/query/dto/OrderSummary_.java b/src/main/java/com/myshop/order/query/dto/OrderSummary_.java new file mode 100644 index 0000000..2f23872 --- /dev/null +++ b/src/main/java/com/myshop/order/query/dto/OrderSummary_.java @@ -0,0 +1,19 @@ +package com.myshop.order.query.dto; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.time.LocalDateTime; + +@StaticMetamodel(OrderSummary.class) +public class OrderSummary_ { + public static volatile SingularAttribute number; + public static volatile SingularAttribute version; + public static volatile SingularAttribute ordererId; + public static volatile SingularAttribute ordererName; + public static volatile SingularAttribute totalAmounts; + public static volatile SingularAttribute receiverName; + public static volatile SingularAttribute state; + public static volatile SingularAttribute orderDate; + public static volatile SingularAttribute productId; + public static volatile SingularAttribute productName; +} diff --git a/src/main/java/com/myshop/order/query/dto/OrderView.java b/src/main/java/com/myshop/order/query/dto/OrderView.java new file mode 100644 index 0000000..f6944af --- /dev/null +++ b/src/main/java/com/myshop/order/query/dto/OrderView.java @@ -0,0 +1,42 @@ +package com.myshop.order.query.dto; + +import com.myshop.member.command.domain.MemberId; +import com.myshop.order.command.domain.OrderNo; +import com.myshop.order.command.domain.OrderState; + +public class OrderView { + + private final String number; + private final OrderState state; + private final String memberName; + private final String memberId; + private final String productName; + + public OrderView(OrderNo number, OrderState state, String memberName, MemberId memberId, String productName) { + this.number = number.getNumber(); + this.state = state; + this.memberName = memberName; + this.memberId = memberId.getId(); + this.productName = productName; + } + + public String getNumber() { + return number; + } + + public OrderState getState() { + return state; + } + + public String getMemberName() { + return memberName; + } + + public String getMemberId() { + return memberId; + } + + public String getProductName() { + return productName; + } +} diff --git a/src/main/java/com/myshop/order/ui/CancelOrderController.java b/src/main/java/com/myshop/order/ui/CancelOrderController.java new file mode 100644 index 0000000..b21482e --- /dev/null +++ b/src/main/java/com/myshop/order/ui/CancelOrderController.java @@ -0,0 +1,27 @@ +package com.myshop.order.ui; + +import com.myshop.order.command.application.CancelOrderService; +import com.myshop.order.command.domain.Canceller; +import com.myshop.order.command.domain.OrderNo; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class CancelOrderController { + private CancelOrderService cancelOrderService; + + public CancelOrderController(CancelOrderService cancelOrderService) { + this.cancelOrderService = cancelOrderService; + } + + @RequestMapping("/my/orders/{orderNo}/cancel") + public String orderDetail(@PathVariable("orderNo") String orderNo, ModelMap modelMap) { + User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + cancelOrderService.cancel(new OrderNo(orderNo), new Canceller(user.getUsername())); + return "my/orderCanceled"; + } +} diff --git a/src/main/java/com/myshop/order/ui/MyOrderController.java b/src/main/java/com/myshop/order/ui/MyOrderController.java new file mode 100644 index 0000000..d292c66 --- /dev/null +++ b/src/main/java/com/myshop/order/ui/MyOrderController.java @@ -0,0 +1,48 @@ +package com.myshop.order.ui; + +import com.myshop.order.query.application.OrderDetail; +import com.myshop.order.query.application.OrderDetailService; +import com.myshop.order.query.dao.OrderSummaryDao; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.Optional; + +@Controller +public class MyOrderController { + private OrderDetailService orderDetailService; + private OrderSummaryDao orderSummaryDao; + + public MyOrderController(OrderDetailService orderDetailService, + OrderSummaryDao orderSummaryDao) { + this.orderDetailService = orderDetailService; + this.orderSummaryDao = orderSummaryDao; + } + + @RequestMapping("/my/orders") + public String orders(ModelMap modelMap) { + User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + modelMap.addAttribute("orders", orderSummaryDao.findByOrdererId(user.getUsername())); + return "my/orders"; + } + + @RequestMapping("/my/orders/{orderNo}") + public String orderDetail(@PathVariable("orderNo") String orderNo, ModelMap modelMap) { + User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + Optional orderDetail = orderDetailService.getOrderDetail(orderNo); + if (orderDetail.isPresent()) { + if (orderDetail.get().getOrderer().getMemberId().getId().equals(user.getUsername())) { + modelMap.addAttribute("order", orderDetail.get()); + return "my/orderDetail"; + } else { + return "my/notYourOrder"; + } + } else { + return "my/noOrder"; + } + } +} diff --git a/src/main/java/com/myshop/order/ui/OrderController.java b/src/main/java/com/myshop/order/ui/OrderController.java new file mode 100644 index 0000000..82e0b10 --- /dev/null +++ b/src/main/java/com/myshop/order/ui/OrderController.java @@ -0,0 +1,106 @@ +package com.myshop.order.ui; + +import com.myshop.catalog.query.product.ProductData; +import com.myshop.catalog.query.product.ProductQueryService; +import com.myshop.common.ValidationErrorException; +import com.myshop.member.command.domain.MemberId; +import com.myshop.order.command.application.NoOrderProductException; +import com.myshop.order.command.application.OrderProduct; +import com.myshop.order.command.application.OrderRequest; +import com.myshop.order.command.application.PlaceOrderService; +import com.myshop.order.command.domain.OrderNo; +import com.myshop.order.command.domain.OrdererService; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.User; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Controller +public class OrderController { + private ProductQueryService productQueryService; + private PlaceOrderService placeOrderService; + private OrdererService ordererService; + + public OrderController(ProductQueryService productQueryService, + PlaceOrderService placeOrderService, + OrdererService ordererService) { + this.productQueryService = productQueryService; + this.placeOrderService = placeOrderService; + this.ordererService = ordererService; + } + + @PostMapping("/orders/orderConfirm") + public String orderConfirm(@ModelAttribute("orderReq") OrderRequest orderRequest, + ModelMap modelMap) { + User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + orderRequest.setOrdererMemberId(MemberId.of(user.getUsername())); + populateProductsAndTotalAmountsModel(orderRequest, modelMap); + return "order/confirm"; + } + + private void populateProductsAndTotalAmountsModel(OrderRequest orderRequest, ModelMap modelMap) { + List products = getProducts(orderRequest.getOrderProducts()); + modelMap.addAttribute("products", products); + int totalAmounts = 0; + for (int i = 0 ; i < orderRequest.getOrderProducts().size() ; i++) { + OrderProduct op = orderRequest.getOrderProducts().get(i); + ProductData prod = products.get(i); + totalAmounts += op.getQuantity() * prod.getPrice().getValue(); + } + modelMap.addAttribute("totalAmounts", totalAmounts); + } + + private List getProducts(List orderProducts) { + List results = new ArrayList<>(); + for (OrderProduct op : orderProducts) { + Optional productOpt = productQueryService.getProduct(op.getProductId()); + ProductData product = productOpt.orElseThrow(() -> new NoOrderProductException(op.getProductId())); + results.add(product); + } + return results; + } + + @PostMapping("/orders/order") + public String order(@ModelAttribute("orderReq") OrderRequest orderRequest, + BindingResult bindingResult, + ModelMap modelMap) { + User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + orderRequest.setOrdererMemberId(MemberId.of(user.getUsername())); + try { + OrderNo orderNo = placeOrderService.placeOrder(orderRequest); + modelMap.addAttribute("orderNo", orderNo.getNumber()); + return "order/orderComplete"; + } catch (ValidationErrorException e) { + e.getErrors().forEach(err -> { + if (err.hasName()) { + bindingResult.rejectValue(err.getName(), err.getCode()); + } else { + bindingResult.reject(err.getCode()); + } + }); + populateProductsAndTotalAmountsModel(orderRequest, modelMap); + return "order/confirm"; + } + } + + @ExceptionHandler(NoOrderProductException.class) + public String handleNoOrderProduct() { + return "order/noProduct"; + } + + @InitBinder + public void init(WebDataBinder binder) { + binder.initDirectFieldAccess(); + } + +} diff --git a/src/main/java/com/myshop/order/ui/OrderRequestValidator4Spring.java b/src/main/java/com/myshop/order/ui/OrderRequestValidator4Spring.java new file mode 100644 index 0000000..43e7057 --- /dev/null +++ b/src/main/java/com/myshop/order/ui/OrderRequestValidator4Spring.java @@ -0,0 +1,37 @@ +package com.myshop.order.ui; + +import com.myshop.order.command.application.OrderProduct; +import com.myshop.order.command.application.OrderRequest; +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; +import org.springframework.validation.Validator; + +public class OrderRequestValidator4Spring implements Validator { + @Override + public boolean supports(Class aClass) { + return OrderRequest.class.isAssignableFrom(aClass); + } + + @Override + public void validate(Object o, Errors errors) { + OrderRequest orderReq = (OrderRequest) o; + if (orderReq.getOrderProducts() == null || orderReq.getOrderProducts().isEmpty()) { + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "orderProducts", "required"); + } else { + for (int i = 0; i < orderReq.getOrderProducts().size(); i++) { + OrderProduct orderProduct = orderReq.getOrderProducts().get(i); + if (orderProduct.getProductId() == null || orderProduct.getProductId().trim().isEmpty()) { + errors.rejectValue("orderProducts[" + i + "].productId", "required"); + } + if (orderProduct.getQuantity() <= 0) { + errors.rejectValue("orderProducts[" + i + "].quantity", "nonPositive"); + } + } + } + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "shippingInfo.receiver.name", "required"); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "shippingInfo.receiver.phone", "required"); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "shippingInfo.address.zipCode", "required"); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "shippingInfo.address.address1", "required"); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "shippingInfo.address.address2", "required"); + } +} diff --git a/src/main/java/com/myshop/springconfig/security/CookieSecurityContextRepository.java b/src/main/java/com/myshop/springconfig/security/CookieSecurityContextRepository.java new file mode 100644 index 0000000..4a64f9a --- /dev/null +++ b/src/main/java/com/myshop/springconfig/security/CookieSecurityContextRepository.java @@ -0,0 +1,79 @@ +package com.myshop.springconfig.security; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.web.context.HttpRequestResponseHolder; +import org.springframework.security.web.context.SecurityContextRepository; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.net.URLDecoder; + +import static com.myshop.springconfig.security.WebSecurityConfig.AUTHCOOKIENAME; + +public class CookieSecurityContextRepository implements SecurityContextRepository { + private Logger logger = LoggerFactory.getLogger(getClass()); + + private UserDetailsService userDetailsService; + + public CookieSecurityContextRepository(UserDetailsService userDetailsService) { + this.userDetailsService = userDetailsService; + } + + @Override + public SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder) { + SecurityContext sc = SecurityContextHolder.createEmptyContext(); + Cookie cookie = findAuthCookie(requestResponseHolder.getRequest()); + if (cookie != null) { + String id = getUserId(cookie); + if (id != null) { + populateAuthentication(sc, id); + } + } + return sc; + } + + private void populateAuthentication(SecurityContext sc, String id) { + try { + UserDetails userDetails = userDetailsService.loadUserByUsername(id); + sc.setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities())); + } catch (UsernameNotFoundException e) { + logger.debug("user name not found: " + id, e); + } + } + + private String getUserId(Cookie cookie) { + try { + return URLDecoder.decode(cookie.getValue(), "utf-8"); + } catch (Exception ex) { + return null; + } + } + + private Cookie findAuthCookie(HttpServletRequest request) { + Cookie[] cookies = request.getCookies(); + if (cookies == null || cookies.length == 0) return null; + for (Cookie c : cookies) { + if (c.getName().equals(AUTHCOOKIENAME)) { + return c; + } + } + return null; + } + + @Override + public void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response) { + } + + @Override + public boolean containsContext(HttpServletRequest request) { + return false; + } +} diff --git a/src/main/java/com/myshop/springconfig/security/CustomAuthSuccessHandler.java b/src/main/java/com/myshop/springconfig/security/CustomAuthSuccessHandler.java new file mode 100644 index 0000000..b9b2347 --- /dev/null +++ b/src/main/java/com/myshop/springconfig/security/CustomAuthSuccessHandler.java @@ -0,0 +1,35 @@ +package com.myshop.springconfig.security; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import static com.myshop.springconfig.security.WebSecurityConfig.AUTHCOOKIENAME; + +public class CustomAuthSuccessHandler implements AuthenticationSuccessHandler { + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { + UserDetails user = (UserDetails) authentication.getPrincipal(); + try { + Cookie authCookie = new Cookie(AUTHCOOKIENAME, URLEncoder.encode(encryptId(user), "UTF-8")); + authCookie.setPath("/"); + response.addCookie(authCookie); + } catch (UnsupportedEncodingException ex) { + throw new RuntimeException(ex); + } + response.sendRedirect("/home"); + } + + private String encryptId(UserDetails user) { + return user.getUsername(); + } +} diff --git a/src/main/java/com/myshop/springconfig/security/WebSecurityConfig.java b/src/main/java/com/myshop/springconfig/security/WebSecurityConfig.java new file mode 100644 index 0000000..5728802 --- /dev/null +++ b/src/main/java/com/myshop/springconfig/security/WebSecurityConfig.java @@ -0,0 +1,79 @@ +package com.myshop.springconfig.security; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.NoOpPasswordEncoder; +import org.springframework.security.web.context.SecurityContextRepository; +import org.springframework.security.web.savedrequest.NullRequestCache; + +import javax.sql.DataSource; + +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +@Configuration +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + public static final String AUTHCOOKIENAME = "AUTH"; + + @Autowired + private DataSource dataSource; + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth + .jdbcAuthentication() + .dataSource(dataSource) + .usersByUsernameQuery("select member_id, password, 'true' from member where member_id = ?") + .authoritiesByUsernameQuery("select member_id, authority from member_authorities where member_id = ?") + .passwordEncoder(NoOpPasswordEncoder.getInstance()) + ; + } + + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring().antMatchers( + "/vendor/**", + "/api/**", + "/images/**", + "/favicon.ico"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.securityContext().securityContextRepository(new CookieSecurityContextRepository(userDetailsService())); + http.requestCache().requestCache(new NullRequestCache()); + + http + .authorizeRequests() + .antMatchers("/", "/home", "/categories/**", "/products/**").permitAll() + .antMatchers("/admin/**").hasRole("ADMIN") + .anyRequest().authenticated() + .and() + .formLogin() // login + .loginPage("/login") + .permitAll() + .successHandler(new CustomAuthSuccessHandler()) + .and() + .logout() // /login?logout + .logoutUrl("/logout") + .logoutSuccessUrl("/loggedOut") + .deleteCookies(AUTHCOOKIENAME) + .permitAll() + .and() + .csrf().disable() + ; + } + + @Bean + @Override + public UserDetailsService userDetailsServiceBean() { + return super.userDetailsService(); + } +} diff --git a/src/main/java/com/myshop/springconfig/web/WebMvcConfig.java b/src/main/java/com/myshop/springconfig/web/WebMvcConfig.java new file mode 100644 index 0000000..f1ed49b --- /dev/null +++ b/src/main/java/com/myshop/springconfig/web/WebMvcConfig.java @@ -0,0 +1,22 @@ +package com.myshop.springconfig.web; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addRedirectViewController("/", "/home"); + registry.addViewController("/home").setViewName("home"); + registry.addViewController("/login").setViewName("login"); + registry.addViewController("/error/forbidden").setViewName("error/forbidden"); + registry.addViewController("/error/notFound").setViewName("error/notFound"); + registry.addViewController("/my/main").setViewName("my/myMain"); + registry.addViewController("/admin/main").setViewName("admin/adminMain"); + registry.addViewController("/loggedOut").setViewName("loggedOut"); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..f8e2a48 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,15 @@ +spring.datasource.url=jdbc:mysql://localhost/shop?characterEncoding=utf8 +spring.datasource.username=shopuser +spring.datasource.password=shoppass +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.hikari.maximum-pool-size=10 + +spring.jpa.database=mysql +spring.jpa.show-sql=true +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl + +spring.jpa.open-in-view=false + +logging.level.root=INFO +logging.level.com.myshop=DEBUG +logging.level.org.springframework.security=DEBUG \ No newline at end of file diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties new file mode 100644 index 0000000..44553d5 --- /dev/null +++ b/src/main/resources/messages.properties @@ -0,0 +1,7 @@ +required=필수항목입니다. +PAYMENT_WAITING=결제 대기 +PREPARING=상품 준비 +SHIPPED=상품 발송 +DELIVERING=배송 중 +DELIVERY_COMPLETED=배송 완료 +CANCELED=취소 diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cf919e4b1b820325e75a4eddfccfa2ba009568ad GIT binary patch literal 15406 zcmeHNX>c4@5gv~JgdhA3QV7OCLd@l)IGq3iia*?uk%X*FVI_runEc6Z5l-FC(a{$sJoI>7CQ07&{>GmXAqspjR^cnk4(u zJjtKvmc+7K#7m!()YjkOdA+3fOb=){?YB$z#aa5C-M>(h8-FgTEx$(pfQ}W;?Gf^m zJ=6j^pOM(C@#19$BsTl)J`M1fJGNSXr?>x6(*OLu#20-)vb}S3EO%t3xU0Xedr58j zg^m^DN5o$6KK-3o{&~q@eRuWUQaHO?5>J0p+;!iP^zOfjyY|~syzr9PbFY=u=3hz* zw8>Y#f2-meog)tA6<_?J@_3^-E59Oc*Z0JpH^Cokeyj4}uDus~cv}eH&>4gMrQCr_ zxr2&Z(`&6&VRO__^PrdnJoKOE{JfnWDscX;FwMRr}2K==z=e~#T zb0pUu%1iV-{C906vq)zDGabn6enNeY{E05fpX$N8yIJ4am3G;l{~pP|^1S5w+VHO4 z0{HdtJ$@_poOg!!aJ%jUjm?rf(k_M5+u&n7?fX1+&MVdPh?I&s!9Vyqhoo?RuZUN~ zUjhEX!%EwpcO873E@3O>9KgIFo^wK&z}Eo<%5H%t&aw4RLVAcs8!c8z9Q$68-A*E=xZq~{2R(CceFi3 zqX55&P5ny6d%%D0gr8ZKd3@=ECI8OU*0S~>CCFx42(EB;m%_zcZVHVP$DaEx>@5pF^RdtzeNyh(te4vKkkT-I zCdb{*dvq+je?b7pwelyP4W0>?JKCXei4|W6jT_qZg#%dwo<2Hx@{*?mczez@&_6ej zHF4>`vt{7h8d^L%FMU3E<~Z*TTYTxH(0HurYS6m}_w8okT`)A49Nj&rE0FK`ZY|hFr>zLDVhn_)t&l3Sme9;Y3DrBS>KZ>!&VBD;g**gRCY0015 zp!?uA2A{pearpG_S9so)!oZ6v59(`r=i`B{o9_bBOLl)>WyEg`(#^c^58SO&pqCPU zmzXt&_S`>V^EkKM@iqEgGt{>5Ox*QTU{hML_6ErwTpBtHL(`uBUP*6z40Jj{uUmC< z@H+x$3qGU2NCuG(ysC9zB)@_5J9MPPkLHJ~s}X#pGm#ENIuPkVqyzsy9Y73> z@oA0oAtuPUpVRSG!~{Pzn7^+hf5!5hRbN9r!A%-NbXMJo+Ji5Oz3}>)apAz{MV_7Y z1`cB3@g*P8JiOC>ha_5W*4lvpuFkrZ^NcYU?ZZ++Y?m>2#z{+vwKL9IywHmn=&ypB ziAp@iqqDtpeOSa339oplfnc06hde`7Y_-gf({?N1`?X%eLtemN6YFEFaAv#4EGyTl z_nR@q9P$VV3~S7lvFTDSA*HO1p^T0(XOKU>R%5UM9n@7YF3MQCkLV#Uk@WG9&maz4 zDHHQ~X};RmALJAgEt3$JeNN{U1~KVUE?!;}d6RO>_N|b3IaV92TX7!DkrdAE(73LY zN*deF?w^mkjC(bP%3KR$wtg#V+>~*7)>Wht+gE;>r$J-BMC)5n%fcEL#@%(#8e|X>6Qaw|v@HB@}*1^JQ*5QPC3ax`$ zA&T_Fzb zGi&+s$07f6y`Nbl*?qt6n|uuB$zc;vugCfU_WHg>e$?Qw=Q*0ZJ#FdGJpCYSBi=hd z()t3{H&PDF&$E7!IFujnHtjH5W*>AM{*tbNedYR=YmS#ShgwItU?S!kwHA>zgv@QT z72|!Ovq?VxpyqFBe^dC)JZubinzWg>RG$EN%$YLxJIHT!eueU<-KU+SeyHCA+f{^J zpk3$r^4*m~ZZq^Q#9B_roxYvZyAPiUeh=$IsZaDnly{6dD=X?rDPQb8(>q)3mVbv& z0q?NCCVU`F=(?vb zFZE0DU{kr5?7_wQuBwH{b4tM1Wgeff^raLRK4js{4xHzG!CBYFuRaSsd+0E0Vd)2R zPpV6G?oNpA?C}b(c<_yf-h~isB|YdVZBe4_bGoMbtayLbg|Eboen)bObRg1!NCzSv zh;$&*f&WAY#&Qm_Tu(5DeIvgXVr2i5D+rJ03#?7 z={3@OB7KlSItT$mLN95Quplcdce(dH_ukL>oOAC!d;jkJ>xR!8kgSCFUF%uT^DWP- zQk{v&*P0TTrMi$QMe&K$)Pv+w$%4?fJWJk8NAOJ#XK(ZR@rj+js2vx3P2g zt{ppf@7%Ft*WO*b_k4RGKkeJQXWzGfeEX1pf9rSKw{G3OXXlQc|8~g#(v##9>fo;L zj(vA*>z1Ra?+$L+dT@)R8HGmXx&7a!hfMb0A6vfLx^4T8oyauyA_tToK&HQSD>CWr z$c&MrLy^}}+YWA*`SJ9H9kMs>?mX&!=*-jDv|Xyd7B|RQ_VCrt-h2FP_a1qL?++`g zAJaH~LQ_XqPygq0=S?nNx@>yI?CQ;1R@OGRZSC$qaDM3G>gMj_>*pU37!>^c#mlhp zR}qnM@qZ>HCjIp$`9pd}W>$7iZeB@gS$RceRdr2cQ*%pe+u!Y#*pc>T zvMa_|>0>pXzOSahz7PJcz>el3K|L#lhq3$|qOJtBhuR3MCu(07GQ?*X<|>}eDYOL+ z`HVKnB(SlI9agITr9O|SE?{IZv5ZrOr+ozg^SAP=32xAF>ACx#m}L^w(wg8z+|VbA zlA(U?)ye5Frgc=O1Vyv0vdiFF^%F zXe~-mUuEIFE}~0t=VnXN3!3(#!nhvaHNkp@c`L<_^Fe~@JFFz4j}}Z{t;a;z?#Sjj z%C$h!AcHSK37>(4OvnnnU(}W}H&Rbe@jQ=yqXecq!}4~V6ImHWPmX_xymRQrCDi}- z!-Bbl9e%$LFB8aXblQKMc!N6pb*ECL({H)Ut2sKAs6g5d{CD zQ9z*sFC#%USVP{&N?En<6i-wf_3#%;P#nV>T7UmT=W8xVP!sXYQgz-_2%8Ug+i|nJ zoCQ{OdYhNZ;&}Gvw>DB>k^9wCLscootArQWhm_~A{1Da98S{LpTsz=KRS_W#pHI3pllKLF z_;LdY>2>?0tGz`JB&bB;a?u>X`)h=5x|q=Lt98sLBo2PqbD~J(5eCkSEvy42G=npRxq5|yO(y~l7a;TlWBS1q7uuDhTn?p3<8`#&Cn(2jROH|P-lx9y8ht?$ z#Lz4f!R>5|fJxpf^yQEJ8Q~^j)7q?M*g7_W=KNk-9;{}gRfs|2G#y;{nI?sl0*6f6 ztGM52HVK#xeG#X;(qxvA52^_Zf6$e-G6UIeJerTqYQI#oW0Uf z*aN;}@-vgamW1H;h@-9z3%3D@mshaU1+VGBw0MDO#43H?ZNSx?cGpd9*wgcS=E-Fw zURvqn`N@&~zj&Cck??lDkJX+}=}sGeFV5ij0k1iH)mGBBfx2^r4)fZ%u3_-S!1CL& zVwc38%FSk2je6^KP{;x*4900{6xlQ@&}$3pEhpCr4nV}IsmL)T2CO>X%My?C6Uh@C z6Q?20J!S~o!k$yP0(AX`Nu+}dLjd82#Ph5=1?9G{eVwAU5nBl=4|4ydct&IWr9ROq zEYCeTIyE74bRlVZ=~?gCbQQqWESjNy21c6TJy_8da{;<3xa(8bp^hx->*?D19@cW* z*X-Uq2`q94eq({7RDO}0@JVbnsN0FT+~?&NZM|e~Z+CHdv_s>f6|4!BifeQTjI;0_ z*-5iBP@CT&(r=8=NXS}n`k{6?j;#*shVzI63zUy|&W|EHQoqWcI=VOu?)1#8?`$;5 zGz!^_^EHAQ*Rj@6}^guA`}NKlY`s0fR&Rt@JBjy$g8nu?VVy* z!}%6EQ>2{wzS|tRlg(aIV*yv`VI(NqmIUkwoDVMMtCZ`q<~IGL34Lp8H=F%dp8UK zcbVXE0%xa44l*wlNH-Ay&7_AX-a~!zyCXZ@u)jYqEDnz_`hLQNR6o{0eR5JGTw?WHIrHL#TABAYQYq7 zvWN#uu?7uqOoS4gKo86taeV&#?ws>3k4=4FM^yvk)&KUe zZv3+SKRc{wwa*$yN5{S#jX7OC70>-ZzKKgUT!~)Wz)4WsBa!T!>3$GQToF2gvPBZq z`}vX}W6Xf(^aeLuf}&VSP|iSPS~@zb9Dq{g}xJQ4J9+wNI3r)zvveJIqaaUv2J|cR;NX7;p2Xon1=sm;%QMYZ=I#nG> zy>5H1C)NM>`0obsOQh7LrJfWg*135WNKk}Fr7J-1Bkr+{2h`E7;hVxn@SMm2l$Vw# z>If_nTKD5?!LtuG)9=0Zk7HY8(=!0H{L6gxoY#q8_algnyn3>n0?A_W-B zI!+H4@4X;iq(iGUgjxxTIB-!qhol(ztMnESeT`pd0vi>^cM^mQp3T9@E`?JsS)I7a z=zhUcMbzKjQ6uf=FB}Xl)cXp1c8ayg;zHUvqDeRDEKygSOp|f6i?(k|9xW{D^p;K$ zIx6mZSENVfmjb~xTJ`tV+0@rMp%~UsWJW1p9G)U44)5|Xk(pnPC`F zvPFCX!2g4IMSyN4O9!U2EM{IM&%S)*xeDwK3}!0}KVDGiID+N@vNm-@G#_Y|9FQL$W?Q)a(Yg1Wga1sLqA1oMI%Ey4!K8Sw5voNe!FhzIpxr>9=2kBo7# z?pyn#A`=WxkGdXUQwaj*F@tI=9)E!VYeV}!PM@~{@HM&Ll5Kld!XIJoGC@|&VET30 zD}0y-kJy;7EpD#+HMuLuSRB)gt2)xwLU{)71w|7^=B#Y8&i7QEG3#NrZ=CkH{TcCe zkpjF+Aks1CKWDXO7J-qwXiS%U$2s9+K$g*h8JD2CwMNRSCYPZR9*iD#BOU23EK^od zF4lmfANoJc_ftPU{B-EXjfN9{D8`lkS3uF$2Kqz>woI3|)G1O8%w`*h0qn;@=AG^f z=;bvmw+Z-U6GD=MW<6An*A4iY6_uN}dl4SSj=N=~%*I)JcH+CKket$l#w%lEQYQl3 zfB(GVX44+bHMai$#J$8S@SDFHcn^zY3oA2+R&-z z(_$!pU8Wpx#WQ@^8XWzc+ja|-hdmJXgMDaxBTc$ng7V9ptDyT?e?P>lT+f8hPhvgD zQOOFg>&((29njB3D7}rSUlO{vArWXfpRO@N&5)q7-%L6FGcc`4%2l%rq9G;ogk~*842aa)ktQ1dpTbgHfbInKr#=sKabc~BfJK|KP(uoe1^3?y#lg~zE! zqZMp=4VmM^9gqoO-DAV0uC%I`YxtEu0f-Yqf0UrMNl@Z?_$cXbB$q8gwk)l#F|}7o ziH|Kr`Bn56%cpx6aF&i{9ab{mNj9oWVR5S&?QqA7%bN#X0bNO0QdqC3kS7CvKV3<) z=*5b31=-E$BW9Dp5qG)_m)>teV_M+WfygI6OHkiC*?%?N|J-ARF<%TxP^-Omo3q0E zpqB)-pLXcBoudhICJ|y{LBDq%$->g&75rHkIkD1HV6NcamtGjXYHvW{?3JL_6=sm4 z{8TrTc2IgNH-}LvXStOnK}9<0bQb^A*|PJC$jV0PrU-Zt+b&7!#> zc)L@N2n&+gZ}Cz$n@MMeFka66`gWktwSH|m^-*BDAO#4^A=--H!kBqV`MYqABVYPv zkHx@jIQCa~z%rL?0vvF>Y>7Ihh-lywR1U6wk&(VMRtg@SvgXxh_tpvf2 z_eaU%nj540sQR4EY>`~woDeKPOWR9O9k!%3-%aAZP7#OeQ)(h*XBbB|;KH zLEQ4E@Y3KlbMd_Ea$wk->Unye{3}#d3X}8&Sq1(nf;2#CE&`}#Q3%z#^ zKT@+kOzY7(V=;Xpt3`q`^2&g>yHAt0!~H5hf=L3?7W{XxI_Ptyx6YhZugAPuTHU=S zU4Gkr#IbcPCeR){{2+QD2c*wJKY|3$^wANgaU9#i9Mqpj z7xF^$Gw8f*krmk!ouZDtUbT{uTQEuPNdIex!*2CD^SyXbIRI9Q!5u~OGJS$o!ZqFq zsk|Yd^x=&g{ZF%9;Cw;8?vaDvH{|}8l&b>R6t8BvD>?++ z=)S-M_&79p9NkPFMziZF5v$r)ZOTIzm=X>;kZv(Y&{l)45um*oVM~2Mgd>@V|7i@lDE3Ckh|F)*j1-%FB|#bobRz z2@0EVdtcmtOQW%yB%Sg@E2f@G9hk9;qpMq{@a03zL6H8$1Abz{Da=}glYI$Y!snt$E=c78~+Lh3D&TM^;% z>oIp}Ka4>9xi9n6yiUl^lP6{d6Y~oYIKm(JLN6E(O&4xJuErfz|!tne9N3C+ln4Fu`-$aa;{pLHPS$^ofIm-gO!F z{?_NI;UuNHnyQe(o3nLw)jSm`xR@F0487$kA+AHYT(vO~=h)JIzQ7$vq(NrFDUaCIe7_+vbBIKwv)lehb!Oh7)faPqN z>)G4{H=<8Y5It27?}Fxsu-DIVEiz`L`9iip>{jn(1dnzht+(kT#TubYZYnQ&{l z1Z9eh9s=GBB%4_pJr=E=K0K31J(aM>cPLMtP^A z!5?d-1nCxhT=EsIJy&~dBKrC=v{K|s`WxU!m}Wud{EI#APKN|ml_RUl*321OHi7jJ z&$a_4D2MK;kNw9YUHu;wC0kfH?kY?lbpW~!>t!CZ06}p z3Id>sBn5hl&XGFtduZE;Klc|H9|Z~5`ym%L_VE0oVP$}DS%S*2ZAEMfZJ^eUUWQph z3cq3%z=HKa_4B`N+Igpd-qsAp!d7M{B zL37iJuCm7`&8t@KugHoLR%bbQ(IHYdP)vD^Wl4by*6x!WE>d73tm|Dw3?nn3{s={+ z9_U3+YxA=_J1-3$%Z3h-+a#zGbaSoe{oneXQ!J{7<@2*fEkwC&B*lv}sdM^5L>Z+i zz`b~>0@^X+PeZEJrPXNKD|G7M&GirQLY0?jMa04GY?|?U4Aql4?s1f%~CE*d!TO2V_ zOI8~H#X9sFe)Ns8u!Wl9TW@e3Oq%R4+R?^au&F($N~J-VG<(pcNf<0e9WAZ65)SQn zg2_SveKz9ksIEdDTDPi1`~gv$nE72b=iW+hvdtYI(nL zDHfzVrF`*C^axdP!%nA{0vXrnJpIq*3(N|9vjOvP;D^46+2>UMjWhMNNK9D_1EB^$ z=^?*Kr<0YH0z#w?_2s5M*O%eSHoYQ2O^+kQW;nSdrR-|V%=#yzJr+v8)`8K~OSHw? z@tw;L5Y`l{ADm+*Z}Hu(0{rbxW+qR;^DEs!%^R* z9a16isn8aWF```h#tm4ArbE7yA5*I9)4|{o3CbLyRV?QA&UnV?x3$T^)>IjB3f-9! zjV>X-D91ccl?OYs#sZ~uJ)-E+p`~U4{k|zd&Oyfi6wYiA%2V9AcAH1XnM)P0r_Z?B zfML#fp~0?6u8v50zZ*gWH}zAdLpM^*Dmx7H#~%`e`FcM?j2P0i?Z7GZM1;IlUwZ4^ zm++)Co3SypTh2dNIUM22ez%R4`k-MM+q*?w=Fc+r3ccH=GpxMNlXU);-KwkpFY)V4 zz1Ov-m<*=Ss=viRmq!m^1x3Eh}5y2ofv-GgK`1`$1Jgjuf$PN)SGL}#c1by68= z5WQnc{1)=ggPgm4fl5#nDWw|C+B*zzddCmb@El#Tn6lwcZ%q)`w34?o;0EjUL2s;_W0T;CkXD&oE&ETW-2Eq|p>@+0~+=FjQF1+qdZ7o)d^| zslh|R3)b`?=jf!F%eW0!N~lUXQ6nAtP5hA~%N}Z!(zgtstZXtrUT$Q)VqUgU&e#jA z1*9ZRTl}hBYYztxc^X_j|F+y%bpbuRBJAilK7iad{A(Cc>)|_eWZlkOLPv{KvrpxJaJZm1 zf2TZYCi)>`Ig~kxr#lS@WZNkGF`!sn*@lfamg^&`v+z4xg|ME$no=@p*iCy#*Ts=;YaB8uZFayN8JJ_?vZZT!J!X}icZz<7b{a01eeL$sp(lv za{_SJTYmUX0=nY?Qahdu8L^cW#~tBYXi{qZoW5oRtu{`Vh?!G`gq`61C_EtpuGyFX{ZfYLK9*Gg0b zJ0{R%l`X|!62GbWhWmNzOvSphrt5v8p1hy5TYb>|8KDUjNro zTZT?PyhhZ>3w(yuUtHY~6)}7k?W+TraA)XU(WN>kz5Z3)vz`tO=-Mgb;wqUJwA)D) zaU6Vy40lhO8+hE%o{0|9G|BphvfKo}(bXyXgw(LR%$G9e1rE^FLDkU;!BWWzwvO3? zziz#=NqQ#(lx^@gJ`yGseI#TC&7ssgD*v#@bRO*OSCF~B-SgMUgF|R`^v$ITUYp3T zKF=w1lT~*?gR!>j5tc_^cmJ?$T&WaE$0g#~jfJ*mriv-QiM7@hb#H@9pJbXN@FR5{ zx7Ioa=p>(Eba3hl}@#NrkSYAe+dB(Mk^+yS*>psnzQla1In zfet1|599Y#Ga)U$Z?GOkipnI=5iO%^U`YktI~h5qmBM!-Py2<{rUXuwm*%Mz7C40_ zGCvn>ZBcw-`S;|PqWG5NY-W-4t*SWN<6C0eX4;3Q@)P|99lys~c_1oxiv9S%C38E^ zQK@=q+;aLgt?ZJ@<$Qh9O7Xas*RI!hdbiB?2{J!KqL6-!f5AwP!(I60Fio}lB+)d( zn4EV(sqLq)mRBlsZ$jG1;7ztoLnlTE2#mTKu;0&}b|Rh@_;oPAAPhD{KE)3MHDx_S z&a@07J|Sf2iOu-3*()e{igb#o#iz7lw&B6EEj5NVi8dAEx4PRQcV-ie#H-ZSYi%qX z=P;jq8*w0fz>?Vp+VO5b%mMhz_}Ttcwi2Np`+~>d;oO-GniA9@{Nr0i<_)QaV6|u` z^q>beBz2|!6uI1G8F5M{UxZC=YOe7JosO5F9^&Y7q&I<0EXQ{PshOf5;GSfHQ1~wQ zHeIL=r>(E$>%c3a{j}#2R4KKCPDby65QBJI9~j}o$FpC)<3$+n1{>G72yjOFEz%tI zJ7*b4fwe;B&|wc$t!1B$&~^|hT;jVlVi+MDbb0oYR{F3Bd*$RA=nl9w$iLVg4F9~5 z7~+S7bN+gIf;(YEfyHc~FsQ;uf=AXWHqZPB;nv0O@`>YWQA@aqmu~i)p&^Dhjmt`U z+=AxjPnbs-A0>6s4EsphM0vzK3b?*h+hb_P64A#To0(_IuuQzrj#kH~KynnJjko~m zOo9;o;#mSwtE$8k-)>>vO53S&6aR`nP~Iz^_eZ4kML)f?hY#2r<;FO1uI?3M9YhsK z;)LGSf0t(w3?Bkt>c>}d0)+W+6p_hsu-iDvH-sCS(5&fj43)CPt@rG^8 z#qroXo`AJrUoiDGz)}@FEH5xwfnqhAWJ)!G08zQXKcOhd20c3bYuq1y%8d4YOVY6$ z#i5%slW{BN^&$ssaP2OhDm_{qk=F)w0=ZGor8~u&&XhYq!*Rr;%taqS>{86D-FFKX zEEk*<>Jk*}dmtVSac#71L?wm51@tcXRN&spfTzB^2)q>Wl6-o`g7y4K*;W!4c$oy+ z(PRJ0sOzC3()VnUcuhD2$@IZ{vIVlj3xel!BZI}-NEP$DIqhC!)v$5Lf5RFHz!AH~ z-z##;xTFQ5R!El$+)dI1qx@EeT?MD!Ajo*m!YMYVB`Yxfdem>#Wh?2$)#l-VnGJX7 z75oLQ2%~S4x)N2+@_7-SNDi*x9;;bFW*f}yT(_c+P+h?wXK$4!N$Y~|xyZ}C$IOhE zy+q}Ibb?}d&CKj$aIzihQQWRpiyQr?PAl71#TBoae?~P6j-^dsUi-(@TbzGA1QJV7 zaa6GM`U>EuAn0M$W0#5%U|J2yS)v59(W;;u(!OOWNMa^_(J?n5Z18+J6>><|SU$VZ zrzLUoWH2>)&Af9tOQf}%CTc&$8InbUVv3rDb(K;=@|;55eF8s#wOVZI{lP76K>@jq z_66YNzk1A|r9t#9foU^&Nf~FFsBF+^+2oZtgkBz>4ES7leLV5ho~3zM7Q|lX&xRpO z_qzhHeF{IvjY?2MHWHLIov*m5#R8sB_O61y2p*fo(GZ#>LCJX=@8m*8$BWnB_cKxLFeS>=l3(V`~PQt^njbl4KqE`vW- zYh>KDPVC;1NFhwM*~n&3UT=VNZmptjTsrhG8RR}ej%L6-*pD0Hzu%=6m+uhtSeQKu z*cGa!K6_$_wAeide`GPE#}9;R+&p9Na6x0_yJ-&5=2MYKEb~q$^pZ$WljilM&Q$W-if_;~cr{5+f?CM1-bhG5!g-kY8oeDpLi!5q zUc*0;pi~UCgdQDkhWQ=Xq^=$UF#VSQ_g8Trk}mb&^H31T;w!PUA=y&)6myp`rpX7G zsK08Hbaj9vrvKRqSD?kon!WEXCcY2+lI!B_0Y9Bux+qHc6+31&)8UjP*otsw=V9QE z;apZ!=gY|r=<`~qCmEYBrz2YZgGi_y0V7eiig)0Yvqj{PA1bNu?RWo7l2 zS1K++zJ1jQE<4~V=zw#e@-F-KpmZn1pc{>!D*Ez;Z6E@)z=iM#LoBj>V)8vt)kP|J z41f-q+ybR1rSuzUhW!sx8rJo@X_=lg5dUc9KRrkX)__=wXaGKCNk^ngeH1XC`iVTv zuM8ZueRPU5y|Jf6JOck(z&qtz+ojJvZ!=d3$spZ8Og3(q(EJB<4t$>5o&##!NRVG{ zH6w*cF_#C?+3OyPe=J1H{)XJ=5mQJt{nJe2eF0$`IN69yzE1o8Bxc*9{LrRT`lI;U zPWBzuYSt2zf0#jl3Xhp4EY$fJq4o$!~YH z(nQXba2>7AkXsb7O5-s17$CGRhOmTn^<@v)$(E($PTF(6S0iDSD!X7NY$n6DBia89 z{NRf&)d)X@WqnTvDO3}rtpX#EjHiD1mgdqD>QTd)Avf_oF^nEElGIVb+vS(qv;+oa#iOJxrP-qWfAX#sw%@ zC~Gv)rP}UhH{Cyk)x5NVctcLL-|}1qWKvR1-!ezC?iwBPIYPP>n02(G_*~>Etu7*R z_m>#?!aofd{xx1D_3K23>cGW4%*6-!NT*`Q?_v4&tw+h7g=Fb@_)+Sk@*fDU!N8w4 zb^C@H8{TULW2eS{ru*5;3%a-Uv@N(_y@&wW?*Eby`F{~Hzr*5M-{;F6iQQC06{`9D z%08!MeP!WYvv>Cnk5$OMtXhek1WHiP#gWxMR!l1E7ZrWcMWS?-;K(1)1wJ~-ldY_$ zVeaw9czUds*y-XY1}U&@B~(I9fpv(opsC0MQlNuKL2G*4Nb^9bu4|N7ziA{A5MbAv zvb*s9qxNlnN-ZZg@QAmLc%gipt;hw^mJUnw@1mNZ<9%E-+6jerRH){k&ToYkw!O;a zUe{S7?IPY1Q=lNxLFjgh&Oq3w?X3}ha0Ad=nW1#TcpE+!(XnM zmeWf`x{YQfGl#L$DS)(i4bm0a3z{Z?27r+=5!%&6el_AH3K&leNIK|A@21|Ic6Nq$ zT;8ztSkZ4mmr77E#)qIQxUcEL*t!Y?YKIsr1b#6~&|dqBolbq{eHKuFmJ{fs`PUXc z4Ul69C#OXBThLvi&J@iu(gVw&Hyew6G)*FA&`>?k$u0N`*~cZs#YeYZTs~!dvq4jD z@UrzrrFPK3G$r0=8bGgWU0!-MgPGgRpe#6x*7}CUsW9Vn60iPul0&Qm;JrvN8Qf<1 z!%F@|u89qrExq@z%8j1}jowYSM(3zi50@fWEk+;DE?PE-3cZFMAJS(_Nw23qy46a0 z3N-wH0GN*|KZxJxb`V}7WzO#e2HKhHuv8rmuC@|32x$19auJn9RSYDwB4kM5^1?5$ zTwDJ}xp}l6%$zl26WC+;zb~bx<+$oo=Hf3VY$B(A8bhcL3PGQn4P)LU%`o83djk`eHy&z))7_<%gc)FNt}A^Xgx84BsaKhO zSj;y6+4iI=1-w&<5DPm*EdM}5gI+(UU-=L|b#<9MOrM}Ug=N4{LkwT^OO!>gHp28w zDk`H~#$avwI5orYU>Z3NuK|n2pJhspR2KIJ5^yn%U$O=<+cW8MF0YWB_^_HM@1FV_ zu;>=&qjJ38aM&>2fw{?uOu1DrvTEu;db@6YD|+L$9>1JyL#O=yN35ewII=4Lgb0@C zoH`;bdX)AqL4PftF25&!OR~aO#-vq}*NMp$5fxAO|BE+de0MHnz~j}zB$7A|tG?gI zhzd^gK9cGpSL{u=#YKLxN%i)W>n9xg$is21vKPTyI$KtFZMY|!SxIbDFpb}55wT`k zf#XDLp7YOs%pey!Z%6> zAE!BwbgcK%e<|N<5c=yFJ86o!u2P4d3~w;QYXcu|IxA@$cFAaf~SKl576ob?1B#wG`A`ZwR$%OWseG3r8gUZS%Ddz=|@!oiM!X zPQeHZ3xJhn`tqP=8CPRRSC_@FU#^5FKvs6=)S_GxoL&lKKLsdCO}0!u8g|f~rX+aV zFUNj%bKRVZ1v=cv5hjUF!< z{G^%jbO3g4-5Pc)3UNe`dV*>PLUNv5KXrd~FT5MM#kW5gFy1<9Pm~Ag1!lm6f#}a+ zop|EN$--qW8GZu<(>?2?k0lk%`6~*a=i1}H;u-3#DM2nPEru2=LFLdJx6QEpblhKb zUZnT}k}PzQt~UHBy=?^)zKUq~C0>a45%5Xbc5EIOT2Nz))3 z-t}QeQDYyDCnE1NWaDcs6IwkXEPr@8E$VNiMX=t(q?i4%^y&<>6X`8D>|IieUAy%p z{AOL`;MhM|b&D;@ZJVattfKsu%}*~3P0E7?v%P1{evwP>9MXNbH%L8xskmRyd*gCB z(I|VPQpFQR2n2AaZOpP6gI)=Q=|`Oe`?gw|apzH;NWYUwP&R|vCbWIH0X$upitRsR zIt}E#m)?m0Uz27Wi9(VnhxIVWXvkoNlS8TW#1Om~1v-1emge(#16FL!Kh3 zlX*ag32I`Nb{9Czm(17DM|3%QjZ60l#flh3&lZBnmxL&0JbALYKLRtETUQDRbLVzcv%@yTW0Vr(qnTrF1X)X9t}F@b;Ubh~5bEcY&ixac@;e2cWfHY;)0HZJ=kZ{p_^$D8+?dbnKj3d0{=;L6mwo>)k)e z)%MNj(Fqz{I-_AW4(8Wp zmxQs|QG5N4V9L#Ma6)_iL_04^03pZrQh+iqb_B4MAze7`S9HJ7Rrq}~THHN<7`D#1p3b>kF4<|Oo2VOMGP zdnjiso5#2h@2=+G7uJ8Q9=KOp!Dlv0YdNRZ6ZU^C*MQ}!7!aOg(@Eb>_hd!_9|xwe zNSJe&6Gm5OnyyMv7e5XavY99S>5U~?KwC4KGqfQ6+7RthXj^AH47tI}Lr>vu^d9&i zqA>ms=SEHknMf}x4Ukfh|w)8>xbn2Kh z(oltlJFlIIbK6~bikK8ch<@i5J8pJ}Qd1P~&KvBbK1((Ti0i{@T@Rgz+7s`r#)qxo8*B$os37z=u~M?)@GU#jeP)oPyANX z{{$LW1c`J{wuR!%i0FD%+8`)3A`yG*pUqDP*n z)+Sy_lz;wE^e$prf-1Lr+~Tf&>Os$jNaRaufOWvbUKIH{OnOJqM6~sE?-vQGeSAHC1mpekG%szGz9$5Rt=3(nGYvo&5Y(yM1;=(Ydxkb_p;3fa19#CSM(1BmIQr zQ*)#_PUR;t+3a4Kiq*>~BV!5kh^FPM9LNwp(cv8u0FWc0rWT!t%>Q;~MK z;q}SZ`Xl-gCCsLgwPr-c7`}}-7VP|0UehKq6`yd@;4t>zas>_OOu!+8Tkb0)%qCA2Li+W1KLcWNbRt zJuLemO1Q=ZkBXvgRC(9WxYpiEIO3Rh^~HGwR8EWtnS?@=&YKG^LP=(H5ft`T^asL2XR1)vp=1_}uid|PK6wTG z2fn;*iNcnC;-r@Rb6VW&N0{8P0+;pK$rw*ws&GiY|1`&=~j;eBCI(8<`g<6VNAs#R6xaS^I< zgE%d4t_s;UIG#0h0)MdAEqUs3YpnUQl}Kzn4tITyM1#uSr^iDRaeB7-g?w5y;bdT9 zuEEi31cz?!(fIZ2gUm*Hq~dH7MHbmDH*V(Xy)Wl)q_q-JJ>?6d@0-UU-RH$NvPEtI z2NAsyCl=+!)qF&E1JJ=0cu&^{Qm^rmKGII&{h<#yS^JA0=QazQYk{%^l4A+bhvN>- z`2jy-x5IjY@vQ6!ZR%=m`$10T*uI{QV%i$;3z~0+12t#E0eAdGu-pBktIj^!ZGmtA<(OOe^(Y-vN94uE^ZD@(!zL_y2nIX%?kva2Ez#78G>0kn_w$ zBU5!3yhVBQYv$y!dT;o6)j`vlnaXE1$Lt+efbUJkx&Dc0X8dfvUNDiOhF|S)HvZDV z*-U35J?U7abU>;krR0U7*%~0O6FZ-8Ewi4bQ$W@iOxL9v3ZA*@p#`kW(DiR&g_LjI zuYovLB_m_`L+J)UH+=#rs2A2;n&PFp>DMBG3R!XKQV?4CWvW+N9+}&%>(gLt41W;@ zzj?DJ-n@E39XB$)5*^S(p>tISHUNf3G+=`|E5BY`y1hitWr6`dj8 zss`Nz9v4L0*`_nY%r-dRvJyUg*FCXs+fq<{TM|OPTuZ8uc-F(jr9HpV>~@IWaMQ{3 zNHIKTb)igZbkW!7u|W>><{`4bB!S?E=8`)dbW_uOJT$l-AA8m)<@T_!%&YO7qmOA- zdF)JNE%qs(WO#$0-y%OEd|qI-@8f7jMW20V@uYK(pT!wOF(0!zoaefH+re9*-7Hi6 z-Ur|coqrV#Y9jklJScnYiMn7^fhl29%fs`JPPIJx$W^Q`Gqe>6L--=R1qu{sG)jMu zK!6KFMUS}J8Kz-KcBU29(9@WpIvJ9aZA4dKpR@Srn6)Smg7R(qQ#YnZYW_3<5!J>+ zH1LA;`Gzps=sZbx-{YGLsJO^~scic{l7F{7Hk-CK&ef=Qb24MB7Fhhsj(PuZA#Pug z)u+J56?vXK$wibfyeJc7zxaFr%XTZ;z<;6`dGbvy@0p~}KMpce5YU-LA-ChO@?g1f z10tf;JWBadg32O87LFQGy0|5@lmzvm6HWj``QK6`Fzz0X>@N_V{JmugVnS9f%Afy? zp|B9w5@Nha{GN1mE#Kg0jyCjHzE-2+5r26%i~u1-zl%@k|9%er+O96x<~jG8KRl1@ zoKb|F#kCkLOIt8CnCeTiNk%d`i;2%eY-_S=FND>(VX-X!3^fnw7<9eD%3>$GU?&m) z%3A+neev%l>>c_u@454Uu%N>GD7FjEs>cie7XJaG;Zf{hjqrx zuU3DZpMpv>pf$2cpue7P=Xb7B;Z((C^%go8>cjP}nQ42;Xr^T@p6*a;!H7~crxFDl zLEpqw-`m+4F@(l~~Q^W^V|N`jW~R}hBk@YV6Q1Fxbw#<5UoaDQ%AXrAeEe%!!G?nw;R zZyBgGxq7wfTH7jO$ZbPnVg%CRolMmM zb!;gbX(J^+GdAoa-e83W&osh~(<&n~=PH5-_#PKX_9nasH-Tr^e3BnA&ds&A4;*P^ zz{jl7KAfv`ObQw?b{u-6qKaJxcO#7@Ioe#}mo+`Xock|!C-liC=KuK})&F<2QO|7K z{bTR0JGRFh|1LGn`}TUAmH5}mGuFoW-qWU5%AaQI5P!$oOY1Mbxb891VcfY6G2bB_ zl6KXT=Iy77e*72(+Y=H0XiEWb$X({P>-^oj-{6EG=n7@ELo|?4fovl&A*N~z?k`Z5 z7p2=>kUgjQeRYVEp?5K*eZ#VvycJQE>;6JiWl^pZoz;29K+0%`@gtw>BjsW5I*MCk zO+|TyMeg4zp^})8sa7QVQ^IQtruA7b{bQS-GB> zEpV=JNK(<4ag3%;B&Le;xTFr9K6>fl`f`(Km?rj3+zj>6_sP{d&_-B<08*Vkyl0DO zN1(KD26Pd>$um)|jPlKS2N_WT1@Z6kh-BzbdlB=6A|!1fI-`|__tnnZ@O>l@amfD) zz}~quD>#ZY066J)JAb5qjAbW};E>Jch`b$SR~;pFpK~MVOxH>_-)2<_ktX*cQ5XuM zg+rkKa!VG&WKvs?0jt|3jk)yz(=VdG;ogbawyr1e&;MI-UmDd^x_0SQg%eUBN{L8H zWl&HkEf9r}l!b^8G0HqgMMQ|0LPY|EoGL9uK}Z2Yu0e>%Bx67(5l93?1jNV~83SRS zlK@E|IjMfBAHBYHzwW+$yT4xj$F&knR?d5#dGBW*$)1sDuog~Cx2i08TU2?s@*!^@ zMcDntuhBw>=4@rIUDdL8z|vS96r)#kpZb?mUju-GHo;4Q|4XNRtA7v zc!7PkIK43lk-RH#6;*W80L^i}l0Fm1?dt|eT8mk=U^9fx54g1W%7Ffc2oNNJOo5M)PC%98?P$v7wjpjc|orqh6I7 z*dt+n=s}kmu}$D$*cddZ*BRN~@vH<^kCNz( zPzkP$A=}v^->Sr45cNxf6}t-hoyfZ7<(G1&ya?PY;!H|!Aelc4)->)Nor|e3xoLkGKN9F zRyEVLWR92<=cpwJos{YUd$Q5*I=%Aif>-(wjDVF|<+}N!4j7sjRm##gE+(Xp$X&W% zLkkMh!o7PH8E0kxy?Af3?=c;Ul(lT^W{dg->f~I}p=z;&A6|L*K}#R<61R_QuNmGi z%*(*QW1(7e8A5tRvQKvD#Z<97kz-p9>5QLajcNgtJ^}zHe`ZAj7M{EKra}mXsSVmZ zv&_Dxu()2p7=ofu-+@ZtbobqmBcPxW76xQQ5|U;-3hB98thdw!=LM=vwO+o34N`b- zcC8rw9Z5Osed_U|7;(n0v+{ONRuF5dfUHisEHN%58FF;m=S%yNeII(Jo~JK%k(UGZ zcz)Lv>wU4JViEZ@XBCyEozHqpODlgvX%YG$jMb9l&ge$>vu?@<%iESQVXwYGyMFR$ z8%Z*uE^rW;Gb%0~y2-{tZ^0wLg#97BUEnn9_s1folP8JZIr}M z*s@A0Z7GQU1ZfKh5cjGXF6|>pm5&d;DSCs|3rN<=Xpb-U>zC(4m(hJy!<@NFeskY@ zQ{z!5@_~|Qxo)UQ^5R+UVi(lozq;)cJO=4OMclbG!9kIiU`+t>K{_VdxfD+G&w(gY~4za&I5Bjo0D1F8C7+{X{+$wC;*c zcy-JXGl2Dpf>~4UyG7(uX^dGjJd0~QpRi4OGIVQZV773%M!Uu$(D!GJ#Lp=%Vj7gF zeUG!7Tt;~Xz@G_KMKg`Wh7^(`$QEaSGX+S(L{IoN>;~LJ+IFYGL*>z}tfG?W(N4f; zX2_NSIK-T;E=kyx7~;D>;oIz|B`d*_bUw?4k9ee0#=7rtH<9-Y0C2#CNOsmnk5$v< zuAF&8*)9wD7J8Zt$A>3A(Em{1esSiZsR#b4{FHLOs8sPuwK)N#@oNpLO^;}Yh2 zIq?Lv>Cf2$dt2Z>PC~8wY^Y405YCUl+}QVni*^8B|;T_jqo^06DS_lNHeHD@N@b! zg9otC$v%-i{0gN(?xt^ET8LsP1|2H*=*#ZQ*CeEV!0{d@Rnq)=o`#ZcJ1lRyO`fNN z1oWrMe-+Qo(Y?uxoOne9?eg`qMtr`pA>w_UY&kjCBjof-9#zH4qw$GxOPHboKIeMR z>%twMY`=~m{c^2yB)=cg-ph-GgPi!ObhsoRm1EeC9nh6Vy9k>C@1ld`EITR$-?3Su zY@GCR__aY5t*v%z?!J?m(#A=_BiR&45lN0+f#Q|iULShTQCV);#pB!hD6g}Vz4i+d zKG3U^#au1}BcU)FvZod{Cyz6pF^>@AF*%yuhSfqxt6xvj4Y0~H3rASDYt-sjjhxD- zc3ob}YnP-RMY2ThWGF8ApnPI1=jp@5R*K@Jpy_~f24D?+J=$)lQ;bBU!A&H3Qk9t* zd1+&?PDRD1Af5W@!)^C+4k_D=U@0w&S94X|rA}j~1AWKEFShSFG957v%t`p6A_JHj zGROaU+!qDySAG!mW4BIPcGI}?oe*CsQ-9~Bj!_jT=Y`)_9^vR%w76a#0@|tHoF{^1 zy8sLlnJM8~umFS4>U59c>Oj~TVDn6x3kPQK811e0*b$0NV>Ng$$*#VJJd(}7>2KR- z#~!O{)Kpj-ks_Thexz6TxE!~_F<5*@tVBnXzMBdO#6#s2{jVVugPND_^^3hfK`p?E zdKk@Ubs`{ij*YBrs)-)+3nGA}tqG2od2##->ojK^?7n~YUF#3oN zfP7m$4b{YdbQHrR*(Ql#2+@lfPE8Tm4?nEg_c<9-FaHvZRDo3OoCz94oOusy zQt(cuGmc3T^23?JecvKRR_3Ap!o~NrjCyI0E2!$3^#f3g`^r6cG<;mHS99v- zZ+(0(x=s#xHG_3W4(?->SL;yB51VD&VG9o|sGt-Z@r3P{EWC0u`#>!fXL&K%eZ7C) zpqG{Rtqx3YzVkl8!3O28t~IZceZ`YDLm`|7%J(5J30zVl?{;4k1D|@6wa6JQr1PvE zX}#s*)dZa=r7t68zZ+yq7aULg_O*Rh-lFc-;8_u|1eVlXX#1YuZi-r>C`>|Ci_rb_ z0rh((rRIRnH?`}gd*j8PK2cs$=jMY8b~jNkQ#8m~bijjN7ky<}6}-*_OTl{;azG&q zz#dZ9wrI4TO&@sgc-Xb%S1)#4<(a01_-fSP(?Ak|=F?X6A{uJe-FC~OEVzK^4a&8= z%FZJrNyW>GXc;fTSx;Btm7o0P9m}BYcg_f^FT`6^eL5@cTJZtt$^oP+T%W}2^CAGX zYc#FevJ%L7S$*}D`TLR=4B_L9ZchuWFe3z?$}y@z&0uNu4zCyU=e>oDqZunnmW1KV ze4k(AWK2nYtvFSqQ&ay9d7?@BcHHoYtVdH1_5ff15~?)-JL?-OswGW)yj9XfeFtW| zzo$`+on;2i>B*V}zV{hMRX~fQ-)6w}_=OEZ0KC9o@@S}H?fg`S4u{?ddZMoJ)3t4C z{}F>xWAE~k>Zob1_-vj(NW{{wdCBd|O-HqanY6cg;dW+ur0~@*mWl`$z=2nBVPXM1 zmo486ra|A}IcOh-ss(?7r#J>i_xG3G6ERf;6Q~Cv4{L-6SPi&j(}&>vj{4CMj|`3W zvQKo35?CxaGv}#8;xkb9eL$*>C~X4-#R2-0>b?0^Q0BB#Q=o4M;lya1dil{&HdeBa ztoAn?&RF1^T#Ot-e}J!ASMSa7c`d>1$iAg62$Cem7z!Lgn?Ib_a z^pfFY`Jvdlrn##OdbMBvwiQ&1D)*-*hs5+>k1frF7^nEQCeJ(j`erwdW#;2*U73jX z)<3o!`BNr$4Dv#B$Of0cIr9~)^lMb@Zw>W|^cA_^Et8L3mY7*=K$|ob)_q3FZME`M zbSfyyoo)ACo`h|!&;R)!_-z|b9b7X0Wf22XL9tT`0FX;ozbKe!R|i>KEHQ5PS0~+W zl)l320n%US7X^Kg`Kk&D4joc}t^}_}Jj>r_Z?*jJetPAE+c?D+@->ctpF1D(Sct;o zDJcdA2-Q`1VYYm0AQ*;$^cE3*l-&TRsOmSVD2>XvvC5KI#NbpRS9*cvRiJkXv@a=5_nW&X3ZWm#Kk`#PPy@$2E#zZ? zw1Vex%~YIv-8!82Ow&F2hCH~#GkF|jWX?GI2~syCbI?|` ze%`4#KK?CWiuRdAii<(ylAT`#a0*5N~s3CL5#_+H!Mj(O+VY?<;wK)UgHQF}%DBZEd^YkDwvc>IFa5mxQ0}sBvYa#Z^S@O`+T-SpP4oIa`g;0m zTHmMb^6sC7BK%A)TbGmAQoOtqv6;CU?+0{;1)i-HDFMvAc(b#K<<83ddQltrwPYg2 z%Jzbk7Z49BB2VvJHzO66w0KP@gYQ7;J%Eit>|56NM2X=IpK&EU8PEV$t_Q?a&q$yU z9;6QWd&9f?=AjzgPtiQ>2aH1>w&G4uCcXCX@2scsWr1IN+p~2w1CFjB?oQJAPLv)e zPi3S%4~p!iJVbTmc=Ubc63Mv1mCb!l_aXwtRB6`~T9GyM0-=N?q$?@QOeGQCBLpQl zyE*>GOQGQ$pwDGMjW`AJ09i?56+FZ)!80|=Q>S=esiMEuy?qqhN4n;N*-jxRrNILr#P9Y-J*D8%{-3@?!1q8>&c9WYzhn!>dLk)IFF-eLBaIR zBR;A`YCid=?2aHJHd&BhBiPh!ErO_0|1Pr6Vj@%}#?Rq)kiak`B5ybh{g{0IPng+r zbasD&bV2+KKb3jt}9Ajwre4!z8gcR$rcy%qfy~VEjRY>v%NJ{DV zQC&xjCvaP2#v)HtZ?_8>g6R@kP4fAY*t*sOQF?V&r~Gs9Y9pAA!RbQIHv;>HZ@UL( z4!b$y?+x>b9LSApK;*Eti`c_l@^*XTjiwb)_t2M``9O^_N#-T%&qsekW4`l;URXjUF zOr@*IRRDPJ$FCW!n!h;`Nh(*V5VLyZbL3mZ`nq6|3g`@g=tuM9lSIqAzWmf%S^!5J zP;YNv#tuS-<1uIJn+(Bx*NL!jAim&2z5j%}2J>c+Vnek%vbVWo*&6v--+4~C1%U`H zy)gN7HVC&(uH&z{nX{i&R2{$PO5#35tK66|c~HK&7FZyz9gRnSv!(~xz_3z^S(*u; z1uWP0!6h32b1R53VFb){UE#zK)QH_J`$6DCk0zbU_vrIgR3$VOisUg!=vc-Z>ax=7-i(fczFi0cMfS-ARftJqYt={yuKHI6SF! z6a54jkAiAj+!|I@Me&yP>OqgETk;>o!1KN-Cp;&^zxaQg>V7yq*- zHg71ODh+!yIh+Ca4NNC>qYMPTkBpU6C3O=H2@^?v_jF}j@@8>8zV9sF(UnwYE=GHo zh7HV&BYuMv4UmM9b3Vch;?ct3SqflmH0I5)qf!mqnBS9r3{xum@H(@ct1HP9esZ)) z$epW%EB{ev^sB@1>Aj!(?pigo%IOVCbJ$(2c)UrA?@nNCWF{C`{qdSx%S3dRO$8b1 zOz#Cnp}4nTM^QoAwTj0UuLEt#Jdgr=55AB0gx=HY{K#!Nn6Z#!f2|8-PIE3O z?3lJaJsEZ?Kb`7xXY8IsdUipTCa7;V)x!zP*glhy2p|lHP@X*2Kbgcq1+=mUhtvZvGMg;}}JSY6ftYc@Z?3rqqxrArhD zQY5)4)VwfnyAx-1;I+T{Q*LmJrDw}qmN~F>rAMhd;Q};4X}9dom%Cg^_N;+DwrzZ+ z+!IbDvC5!#&+rQqQ6c0V$I0}AD?9au#UHA1PP7=_)8uf|8R(f*%x~xNCL)i_v5JBy z6@9J6`{iF&s^81imq&O5VOHgS)s|`2dS}pKC!R?g&WF#n;QoY)6y_?W_LAei{NTuH zZ#XAIx4*pGggt5k|8#vNFKooBaiMoc;73&^1mylzepMcJcblkSx-}rCk!yA@VgdND`pxATbzCxN4{vO2MxGv)npe1m-N zWY3%kw8a|{c6~bjOJTe|6yg?dd($mAhB78@U@EPNaOUNiCpHfH$(>eV0I=K#;i>jV z1`6TjMY<+AoepQ$FJhSE?D6YGz{z?YS4u#W)pRAq$k{1b-^=HK5-@8DZm_ErZGT)Y zim}HEgU3s*9k+a)Yxa9bqt@+4t7l`@u5RQsF|sGm=G4I?(*O@^mt{r|1+3P@0cqRw zZKxk)Cj}ZwYHtIYG20r2P&La?oVV%>e#;&3TTUa_OM_*I$oFoZqfUdm9o}aInv@BW zpc$+t8iNUZ09bi)7N!%%-98E%0Q$&G0w09ry$EH1-9Mo@zelW}LD@ExR_T<-2NYw~ z1eUteqxQyXd(-G$M!4H49tZ$9vd_Y4K-V^mCyL(mXI4d4!>^*-N;DIn{ua+p-0fmJ zJLjKGGos6^EPp)mzsXfP473R`*1G*@n{_Fcs z;TrN*&PrAUc8iVl?~D!i&X^{C;!szgR%iw_^buBi`lMa(rnRRIC>vAOgTp`?NAEKT z*)Y>PkVU_JV8xZkodDPWF-X=;EV&r(&Nf-7NWS>=+H5;H+iQ2tO{2;w>+FFWp}0DB z@4^WBU0-RZe3ztKRI8$e&!|rHvDOA`#j?-}zy}-3T?LGIbAzLMdE$pJt?di*GG&kd zTDQRoEN9!=jZa$%!FV$eegActqD3pES-uGzJ)K-x?21y_qrl!9dT{ki%b=}AVk)J#A4asdp zaCKw4t++#dk`Whv4VVdCo>6f}a>EZw<8{UOFj1-COk1C2LHNr7 zoi|{>9u@{Iw^p(u$E01uZB4s(?)sF{wwmhA8$j(JrbdWv?MfC`nRKw8fdZKCq||#A z-7_M(Rw6OsPuL4dmjv77+HXzWW%0d!Ey7l`6k*tc+XA$j(V`s`-xpKAzNf!?jFq$r z8Xe#=fcz+_kVtQjGb4S0>O{m9cFQ+363Y;HaA*xj{usJMf=&~&uw-+gTWfF29Ep;P zG$e!t`6`JbWh7`{sNsX95bZbEevZj-xB=F%72W8SGF)IdTi#?Ss0nwIT#|8(3#7ES z;Y{y5LF4&~*!%+lFMhWNj`c4#;vLA&Qgnf}gsCC0-wtA=V@dAa&c_cu&I?5DL7~G1t3oVPHQM^*RekApWFLMiX<3(LZMrd2o zg@tzKg7X1zA_MG}`xy`jl1Sx!z-O=zLJ27^S`DO9GhzjFy$S;H{RoY9t@`xv3M%9b z8j|Qg7AQrGByA}m%#P3oZwwwzdlR_^dbe8Kj%~<#CaaR9*9Fr&DEOcqAFwQsq_k`p z0ABjbRQcB5!C6-&)Ct#u@xd3?CmtJBEqm&ntT286_z)1YY=ts{_@@5`hoY9?_QA$x zGAaMpFs&$?_M%So1fw4ajY5eINI;fq&rH6W%?5N79Irs5((9#Z7_^iDx2^1i?=*p* zE8_IB_@Mok=&+ukZ-m<+D6HM3VJZ5#I0hThbnu1k@xs3riZXoZw z8brU4gf&(0!QSQ8jBlLBU|udo%B#$)?aG?5u~A*93R{JqP5Shpyi=|YN7U9f-@fvhPf7~9s+bLCTNoOrM^0azAi z8K{ST_j6p^vtPRZv;-8T7$=8kv%asn)?VH2R6$#sCf{$nvB$*fDSK9N1PJ6~FND?LZ7Xb@ZOSPN=R^yY ziBPXl%n{a)V8UVyFNV3~kDUbONV`AUt5GKEI8qHH&Rckk5pVvr?yk`FiAyB&k&di8fuPLa764q)-I6fq975=Lj_Q&cyk@&4-Mc$+x(|nOoe|oz8VEz6Ul+ zjimwzc`=w;?&3DSCXHtP2fAJ(zp4-c&vkvyDE^7#&5S)foO92&mHw^#{xn=NBH4rS*l6=O!=cj%8dxbW z`?U71yj_i@ zP6RCE-vHGlxvfu<+22FT5!&L;k-@DlMgvQY@Y-1f=Rmhun`TxMnR&%>HPV5Sj^sJ{p%n7m7>}`< zw@W@D;7rSl*8)DA$di1fYs>@P-ll*IsfVfJhwdV&)!-tjhJ|kRV9d2hT>vpz@u0Aj zu)Z;5A{o_I6NX{_lUt>Pgu zX((z?OdO>{l3-&WatCdp0hmUVn*5lAn(r~q>UBm7R&)m_Yl~7PUd}v474z%dIVV;) zis)5+ldX(7R(&cV_OZM7>cI%1hVusA6)!|%R5g`66@qx-WyEJvc}ET9D%dUOua{J= zbjY6pnGFx_1KA~>Qsm(Nhifu&NqeqPL(%=xvSAiDsJSa4Lw)ZhcLd)OOuOW^Lg#j} z5rFP<`m#!f*#>ymbndps#g!mIN5swD`)f;9^|w7~Ay()+=D1d&ZZK*7zCp8;2Ge%x@cW+O<6OFVW>*=&1y#3`cC#B71WdwZSFvv={2&J8~7XfUEA;JFYEy z5zKt46_O+tD5{3y>3m1lAArb@yWd!!4Bzb~E}pLFF^?GU3b5I=v(!d|l2a7(f7*Y3-C!`CYHOy-xd9mS%7U0~6(vuqX-zcU;AAu0WL;W4{^sXn}6 zEt^zQH2j2~?ip=}W%MFjy4>lYmJ~N|_6k+jq|xYEJZiR*?QVC5qkvjUt^Z@tR5iU%V0->ZFybMv)V{ zF-n_j4&*!dd|X1l<<^D7XiE`XDV?t_C!>c7QWd(9%2E>PLQ&WLuN;(C(lUDHDXSVM zyT{6mh7_9aB44F_rE@{&K)@xV`MtLS3}t=%QKBAIy&#Q92h z%3weAs<6!X(7??D&&fVrjfp9sJipI;2mS#M9t5Oo6q4LcGiTIKmAl-K8j{@a=nhCX zz>}=1%Di!OB!Eg}mqs8}R|%%hZP%PUC&weh>7F{t>*it=6y(HuX(-V~&w@dZDrpmT z2Ql_@kL(I>kKMw1@rl3I-8SiyR(Wy&ZM zwp;pLa1N{Kxjx8kUK>ed{2eu&B7gXISTlA&BpnnU_eWN{zIyJ9A;6NJCiZpS9)H7&P`KojSw%*?OKjadue5`LZY)g7*R-VUG|uzM_10B zY|RNqqPPA~;IX{39tK<1M^OGr^3jT}t?ipUR9KM<8%Bp9AT z`|`=)ueRXZImWQAyo>dk3s&KXxA1@lme#eOBG;~vJF~0cT-j4NAG!uxV5&Q-_woi5 zuJN0}!!j}%RK~;9t=T6E72(Du?v6l%ZBKsOn&{i|_@Bo9gO2qn_AQFefHu?0>ZCsBc| z2IYM_X!fx{UVEf{7MlPGoE?6|AT0FT8AE3y<$viN294$h!s+aLHPn zQj`(Dc*pLIvFU5>J_5*b?XcQSkfKVQOBOUAvJSI`x>#y6tJ$;k5qRsgt7ct&Lvc9e z6R0_F@^z+Rr;3Eu7(G91sv7Dt?UY_!(Vw^V3a}d~%jCpYD*vkLU9(dM71uucino2+ z&%3SxxyS?g*xi0YOnQFttWxQuGk;%3}JQ zW4?!^oKqi++AdIJv+v|eaQ>ENp!GiIz73}hjP^yw0?kOQW zVU|FrSRNMyo@N7%DrtI^S})%Xj~{q2UKokxKmQdFkau-Ryz5hMK0XYzUnVnczH?L8 zy~=(dJ8?JfE)B=>)Cyd20Ol}}EJNJRF8JgB^ueS$wbTAbBRd_s{#IQ#sV9ba^k~(BYS7mOZPkNj+?%G=jMfPtMPUT zPtr@Qgae>N`i@Wiz+NxA(aF@1Ir2#~(;LFs^72@~&EAP_LEeUTk!G~t3&_*BpJ3Kc z(q-6;+)w9YfszzZ-?RE{9z0vt&`L;H^Ht{lifFNjF0K2hISZ%C&c(Otu+1)Z&;|`_;PD1> zDO9Tka`yxBcW^4w+E>69y^!v%;d!3Gnpk}a7$3m<8H%5=Vv>s9UpKm$h8axmIa=d7 z>X=fF0%`NUKKUaRSY_j^@$iBIk!~A>P?ki>b=`zYH5w&)MuE^f?;f0w3*4~UeS)eQ z52XD;b2W2o5Ix}Z)&D}wq1q}YvqD?{zzu0<=f{!khTe)j{|<3j+2i!4rm^Oe`BSn} z*RO#`CAxK9{MLsRc_aMMQn zi&TYMr(Y0a0?eL_%%%Gt)w^$v3?rGsv`OkU`pKpnh-0FdQW$@tycu?f~MYRV4Fse z5r9I!YiKVVK)AI4 literal 0 HcmV?d00001 diff --git a/src/main/resources/static/images/original/pen2.jpg b/src/main/resources/static/images/original/pen2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..666c88da581c1da1c2c5af74b4e8444351f693e3 GIT binary patch literal 132316 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ℑ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%0Ap-f{zZVUAK5>H0ro?)qWwVjx!}?pNmGr-vpbOHk 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 V{tpZN|Ns0?ZTs)TVf!=ve*oSG!lM8H literal 0 HcmV?d00001 diff --git a/src/main/resources/static/images/original/rpi3.jpg b/src/main/resources/static/images/original/rpi3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..264b0ad35a971c6e56179049ed1ca05a1a0fc870 GIT binary patch literal 30398 zcmb??1y~);vf#l94#7Q0Ai>=^NYH}>f;+(>xVvj`4IYAfu!Fn1OK^90XAl4V?|paQ zzPI1*emkdTy1J*k=hSphRdrSM%iPN<07F__N*n+M1qIN9`~WY{06tMgF<~WnMP70f zLk4pjBNK8b7Di@rT1R^`D-&`lX$f-a&tekfPMoYC=*evz^}m@pxRMKy^Dra5EC56S zFwoGi06AbG0EY+%2MY^_gn$5#h=PQIf{cWWjEaVZfr^HShK!7Xi-GwT8wUpm1sx9` z7aJc78wdNf6DSx+8(6qEaBy$1QIS!x|F4giHUK6flpNG03={6zKNKl5wr8=G6(JG*=PXXh7}SJyYUclWP!K>=X?LDs)0 z`%iRXLg<2qg@u7dc%=&p+8J`fV8X(^V}ZvKRzT3VeM`aWi-;`}lU33FhLTP36z8km zI1(-u`x^DxD`|gG_J2m0-~SV3|03)^=$Z$hz(7F;4+awe1UxBjOhgKNp#2H=U#E`+ zP%f9*QPR@1|KCz?B<{n3CI|2 zqtOMsoH%C2pr5gA_oO7Y{_Y;>f1=~`pHKOpQy`Kw@FPICBdQ}dYQP8YH2X9s`}`-| zBkkh{;73|0Z=}Bx)0`K80PX7u<<0v6I4TVRfX4rV&}KhgLf|J{&ff@hVjQG|YzG^l zIN_ZU4*`IJ#N8eQgy69ME~r-g8~N|6cxO~AJi9^QGnB;L!QUMq+#QIK?c_oL0O_ha zyd7ak=zhlNxf!)g88PMsAPty^6$=IN!6_`JbWeGRP{Qf)UoKjp-KZs=_0h|ph z@Fu~ z&YA2HZ8{n7d1;yh-=;?eOeD*qL%DVW?lKQ@Avv_%c*+HxCF#R@SHF9i1}Ohl5n;t5 zXNYsyLqdw?xZ+-7rP#Lp?U?a)VS%OwIAUWIwL!wnqnLe+W=Ukl{TaH~|HNPC&(8y= z=XVpUEj6Cw18m{v`E`P;v&s00YANHtgunGy4Nz_^gd33lI8s}Fa|WA<#xHlTd>F8Y zr^|0wza}C3=ZYBqy8SBWavFZ8VO+9=82(EFzaQVk3m_xD>-A;*cVqF-!TGm$OSV(` z7yR|2|Iah8qx%_33>$Jn8eszzKz9?bc|ri~uP^{@Zq85Wun(qCe`Q_^ennl(_#n~# z@g4fCL_gaWVuaj#>!%Ley>L2;MI9OxDnv${7^vd5`*&bq zWfEV~Zsuu17@EZLdj)b@zVe>PD>fqvuAX`euD5(`oZe}m*B->>p%OwbEE&fV{M1pK{oSCUtSSK`Ojbi8pz|!#o;2k_u4Y7Qr$(1SqnRt3+C34hG zmg=mV7>vOw+^3L1(`tSO*PCox zTaO{y2#aPje5-O3Tt@#WW%`UdYyGR~jF`E3sij~yIyAKo5gplo-(|ao-+lu*0v;s5 zCjQ$~wTm!l&BCHD6nev|4f(SVsiTYQ+|P7O7goSEifSCb_1b~qM5O&x6_N^v?XC{^uBo*eKn=D%hsz47O(kg-RW%SrK1-B!s!)D3#Hf8ELRe0&Mj-l`uScvw4}ib zCDc>_*+i43&~1_}$8pL1@HXRn?b4^Lx^H@3hLikZ}Zl6n!sO^`dBJ@Mmoj*`gavx|phj@ryKMmyj&c3g& zJBd~gMNay*%4I!M)bCaT+KHL3rwmp|7)e&LUTO)RegRaW_b`ElUjT^Lh1^^!dk^{c zL%$1N0Atx?Dc<#?6FWrB!UV9YTh|HeM5V|oHB;YcOc^aVvBW4clp+&uX4}caa5FKQ zm@Fyc!yKO$+B2^dq2kCU$ygyh$2`7ooS9GVQ60OCw)wHQZ{E@yf683HZ#JtaM!Lc( zl=bXZ&-TrMY3=#svD9i;((d?1b20Dhu!3-(t>2~~)z0*(4 zkk5_7jef#MBlati?y5!)++Ks%x=3HOy>-s7fcT4y8ecA`e+Vc7Rdx~|5eNnrRS%V( zQh~9yu(B@g&#|7 z7nb}_fSnXSfQQCci#p*ZtS0lVaIub-cZa~*9E>Y3S7N!NYmCoDTnzp(rt4MvdVzaJ z=wDx^Dpe-dW#+Bq>bTJbd3^#5T^~S1iX3I91=X<{@gJHE?N6A$^caX-`hP2U6=NT~ zk>ood5)GnB(E>*AhOrfHU%zGuFByMj7Nyu;kROD7yt0}9xOMwCDn=Fvz%~w}1wcqQ zeLer`CY!xAko^8Xy1{cMcmIPzJFj;pMtV5CCzPm-svMmnW!VYjh6_ONys1 z(K3Y=`XqJCtXN!ZeVRNy$I$n7cDB`KrJE8oY|RqhgU2rbw(?u=GgY-oFN!_E_tPeL zQn2lsN9rs&CP54B?NFh81fyjZ#|P*ktdCk}^lsjr5AMRh%+eroqyfA_#PS7v+nW z_NUt@lS98KPcLubb&0&5lpM2SoM#~I`D01p2UVdi%pVQ>p3!`!UE8f2j(Wx**o*!M zI)p;`l+QXOFH{6fZo4U`Y^?yt=r>gaeefE3@QIb@FhLSOJY|-!-L+rf*fy#zQpoOC z6<<2EneDP)*P#e&!ih6l2@`xHu9W=rKEeOGk1B=KdNyKXUg8_ zeVAWqeMDB11ghJlk_;5bv-T1qk2)dV33pm%n@!cs;Ea+3Pab{!cIUMAcpu16u&0H z^S<0gVx6&dbxCLbM0}cb1TKLp1&&xNUT+}(Da{X!XP>RV7ij$gc-uHf&PwF|feO)x ze5=y4Q6)d3iH^qK5#NCNF)19==Ch^kf{6h4BO+xD)y&XtmBO~euh=)X3Wn?=@_k*AdEf_SFYxYeiSUUEy{8AqQfS<+$V8NB@F^~T`d()hq5j*B z`;ccZBYR2^jLjrK37|g4b}HL3bfzAR|AoL!8~4NL*Vq65BkMS7!V1F1mVsaukeb# zE>2CePa&N9-)ceD6j6|s?cWXl!AxH}fHVM-%|!LQa%n>O-Ydvje+DC5<$emZj6oLY1v(K{6UTYHq2?4;@QXr)8@grSh9X-RcdvYw|XQK@9HnIp; zn(p$b#AWCS`f|Nb4>)UlOgS-vyZim5&RjZg0B)=H(oZP)D$JA4f2`a}pNlQ?CI+_=0QcUA6qHuYk;>HOBio6l1HW z5eb21VTtoy_SH#*73o8<`R~41IWZ}WnQRfKrEHfoS=WFD4WU7?N=!^crr9v%VmM>5 zAW<>XVg}5~C6|5&S^F>6Z$R!jd$WA&ku<3e8B))9dhi>!whI{+@m1i)S&DQ;E}1H^ zZI%xIQSzIswo(DQP7%$W`WTs#)pzq<;>8ffh*Vw%Dl)I(!IF`CJ5(7*(lcwlWFk1kDRZ~fvth6f(>vGhQriO{0v(dD0y2KvTaJRr+l&6!zZT!ntZrB6r!f!G3wUd>-}->kc)> ziOSBqzFvfK>F?`!0SxoUBa`Bj&mHfb31$60F72yU27QVWs!BYA^0K_h!P9o@=wP$1@hFwRB32DdAAMy zJC%O;Wd<4B0IJ%sKhDSDv_Kb>Q2YFB2i!Yh7lcX*!6JYRG)3oAY z*$aSqu}>0U+kVik({hHQGVkD&qMfqvD-dX!gw@FXnK(Qg?kfx&&%z`}S@hUWF}`A@ zM9TgQnQ4rb<=iJt`u!$La>KJ-@80_6M}x|xPGmI zeZweETTescsWz2(|4pUKFqDc!&O4WIda;E#?2XEj?9!&#(f8Fr?QWTfqv$rbX!A7Q z1i9*cuf1lzxzS2L0Y+hBYvMRbW-g2@*M}i@2G4{CJP%=$Q~rCg>8q+m>V7s+)P_&` zi$dW^_^gGSR#u{V4iqgoT+}Hd69h)l$FW~-(p~_dqUl|nW+5sCL6kFf0i}muYYWZND+sNZ_8zJ zJ(zo`kY)=YmbDEOPHo;R5n62zZo zp>7_0Tb)HlSzgzNdgMRfe57gT$1J>wx!k04(hk0l4Ajr&NiQvl!CKmkZYshy;1Q4_ z7@e9eH*-4E*aQD=JECIgDGDF1i$;LWxO^u7Qi3Sz>|X3$#N!aAwoIFCc|wy4|gqmp}yk_2$O#rGW(lunJM=%_U4B&Cl&Ph=YYUCa;{vAfE;hYlC2~ zr5oZ!yO-jj5oUISTkFipTwTQ;7Z5~`@;G`BX~Sn{L$|{e0j$Y?q{v{f6r@WBs?`K> z7?_#8JO3UnM`b6d2ag7zoE>|#-S7@`tBt79+#|uApWjwV?W-lC6sL+6DJL1-cAusl z(2?x8`e=Dv-usMjRdLDG?Y#g`hH-2DAmt9%I{n^J-;VeWgI3R}$Ts80Aew~2$oPfj zNeD-IC~tFV&2xc5UW~zobv^}tm2a$fpafZxy~6UXuKdI!i++i>wfeF-o?@j`u6R_- zlF-P`SLn2}j=0$}J2)m%4~f)nJPnT|+-uyg^N5FQnnaREV}YYoMxVyl2aGJRET@lM=+f$}Waq zR%%I}3aTf{Ylu#m^({p<7;}!TuRXn*`HUM%i8^i6;a%F_@(d0LEy}Nrxuegd#)>P` zi6ijk-WqQxR*6k1eInY9W#4MHeIDJH$aU0E3C106QOu#l4~2)izX3*A?ll-J#|P04 z4m`ps3_HwQ2Y7Yrb8P3V55IeuIY%v9V)0*~^b(jPku_d$=HHu%KmNMcz+PKL-CXUy zrGHM|Hu}31-(l{jpHUq$PMfkz4!xI+gb?5)ZS&rd1oc6)xLL7>h>lxu{F;kZ!U=v7 z%OtH<**ktV{UzsbJ`h;;or!c~MNByh*Eo3eB?lD+0BFE?&&7^2fB_@^ElqjVtO%`ZtET@)IJn!M7vmbv!#+_$Mh<`HQ&$A${dkvVpO*i-ig9 zS(F)WU*coNRk5}w!>V{1`4|`nB}J{U=9fh)^ljcJ>?qXH3JG`GHI8a+kbK;(EgUXO zstT5r+>|UD)VZxvw>6ekLBG6zK&@ePlAiLtB8?| zjzk;xF?XR9OW`yK>4!R7a-ZeNTP6`S3>hjZV=X}!-8I)-(zTO9dHYpNvFqOZe%B&F zt>?3Yk+D<5O&2O(`+;-bz92!=mz1s6v7D5{5)eN5F)}^^oE;BO|30%t?{N)XYHlRY ziia)CZ#`(J{vNjtsxDkA5ajOuEefdcqs!fBY7Mb0zK^O}1n)&;@^ z9NoVYm3=VuJfaQs+`~;G5h;ELC@Dv&l)Y0;VwY5?>OWGUh%etzeiw0ZaHL9EtG7hw zFc?r4C$>ddez>_H$F!a&I)7&38-~ASd#ppriztD#i96e~tZ6X%HjLiC+$D z;KzfoT%`7A7l_8sh7EOesZBbpY7CdFWedCg@uU(3oCB#x))OClPo5 zByam&0R(+tnNu2{YGBYZ5qRto_%)Fe1HB=efzsL8s-(A`qp)CqX8vmw&jqFDT)a{0 zF0gPty@W5xn-|FIHv-XMaMkWfe@04F6t<2^f5nX&`KN3F^8QQm?EQ@ad38r1=HuMI zgwW&ef92-W9eEX45E1on)~J81!DxTNLfV;`{+)Z=g@UZcKA8T!2K)81so7t?*6i3= z?VV29As}0y^H*8_3t&`Z;0!&CeH3X94>33Rs-`9*9+WsvFNSRTf2|DbUjc8+QwGr@rn!@bh~b$Z)dy^9;!pA(Y9tNoH8 zL0NW|mtDMAFsa}%s=5T3VIETcl5Wh!xyscBx`54GK&jjawue z>#65_m7;n$H6Mvu`=B;RJr((>GzO~`Q2-geGwWogw7QmfU!1V&9qB-L#t^pUEYb0r) zkhRaNfKC5F)J61bDH`swSgPhTl6g^*Vq}*uH`1YfRBvN#SS5Al`Vn9_&@|Y>N=?Rp zsLVhKZDfAwFa3^6G~($+)7sG!n4X4T}>t;6_Bj0rO6Aww;Z{2|_GlZz?i9HW@ znsuibFLjZHG5ml>BvNs3gZgh{-*D3)kQc%f@SxDeSgP!NRu>y8`D!fTg+O0ijpb?M zDsVSq4xSEmZvb1Hxh*b};9>0LHWlVby_1rYQ8YNHzM`bE_pw35&zO~Y_*R7~ZI9C- zBBRS}bNCa`*xv?lKMVij@KDP4WqkM-;@76YTKfE;IDt@}Q9S^OoYYmyta_YUq<|on zstTC$@LcWyUqz9(Ivjcxn#DI3Z#i%H*yu#AuO^=!4|j6!noyy2Di0-Ag5L1XETe4E zlF~n>t!*bx>7)s9Ud#5bN4eg&RyzbC8BD=tC4*vMB?m%@7KdMUsvgC&KwYy~AQ8Mc zwAWsuas%fUNT(i|IMGstl%H^7YjL5#3v?TsflCP2Jz4iHhIt2BWQ)vyNE*dseKEH0 z@9RiAcjY#Bwir8hh|NDPu98=)Ib8|nXYvHUaTIXUgG(joY^!K^IvRkdjtG)_gJ45i zv*UIX#W9T4V`)r#qC>-)iDEW)^OrjIf2kqdd09o zsS1XoYv694k_sm7F%s&1$!+DatbO~;?0tuXV}S(S-VLeJc*s_W<0?s)e-MJ14y!Ya zpKd~4%w%vZxPf}|iXVqDV|y*X(YVf-s*24p?PgfZLM{BmL*?hqAcfhp$0Af+vAE8L z&?=LQ(j|{U^KHm3578qJDAId%CMQE+Ci_>MzT@|0p;<13UHRW;N_b@g?@xm zr7+`oW*#au+v%1(Fk^cd{P`3#yi*1u>FO*W9s9RjRZ9L$>7e?UbaV3@%c*+oSW)iG zclPaajlm*_$A|?C)e#i4T{D&DTzF2rsC_oG80603N8GT^^WFA~krEmQ4i><}Vmbz^ z`SlM>il3Kd+T{l$2ineAd3t#I_B6Pb;abidr&|BGd3LJpQw=_sf<@XgfA9g&ct*H4 zqomvUOh-RLROiL@%O6=&3GZqYD0h&)6wit>1(Ei=PdvGi9{uuWtX~4*O?KJ>#+^}T1S9- z=WrisK9ZR~=i)3KG%DfH^uIl50l2UM9KZuOrmN>K2j5y>xR>IA08ZoL(kTaBa71=p@G z^Wc}Tt07@DAc-BJHxOsiUvU*Fw7C%J3%Tsk0&*d4D|v{86e73(c3(lFbu<9Fe=RWM z9CY7*tmg~@X?_$x(eRtJC zvTEx{K?=n8APWh92^jisb1c1e2e)ans4|vF_DX59Y!^IqstMf7X~da{gAkXe%$5B2 z7eIAyuovE*9SHYG<-|MoI|556vm{)DQ#tNg>k)Yd_9-}XgT#36xC!J5r`4Yr=+<|Pt0%ovomToSKhe6>cau!4V~d4lK8WaXWAvb}ceS$TKk zl0ny7v4R6+z=POTmjZiCTYe)3vyXkG4_cby%I-7T#51Xec3Gjj{f1OoRI+hJK@Hf) z&?u61$fXC3_sOE=cJM4%c$}X<6IGCKi=V;VdtJY918e^x+-UA<4iTSh4C(G3z50Oj zB8gO!#}Hopj@XWsrGIbEV3((?>$tpPVqP<~h4D6_%*9{kx8L>i!RMMu3S6*)^j1^I zpy$-++AV+=O082o<9;1CCda4u!jckY)4zuo>LBhCzF`#2g@lA2m-)Dk$jE8%7}lia zZ9zX3igSCnGfjue^}WZqWT-WBoL-cv2^!~FV=<|n$XT@?0uQ$BNKJKU&n_XwqBJ=; zWbVo*?Ea=zz<Q3Nqi_br2hGx zR33W)IcK%gyaIN|*!vFUlw~tqVJb~+gO1h8E96)k+epbHb?`F#RAAVjH(d(i(5^)+ z@5K1xO`hV$A|-@Z1fz@ubDa@_Pnx)hxn`p1)CO^Lu8-`Dfu5puC`#F7oTt2)2R)C{ zr(1bR1@zadDmU+FGDfyaDOuhna#1=B0UF~AJ09y%ql7t~Eb;&3%ng%X(^MtCPh{bS z^`{i)vT1}`7NTp%A0_f_?>5{|>DpuHj!2*MHVIA7mh4Be@9}iSC%!J}V<7#eXQ}%| zgKJ(ZMJ#rZUL43nEIt|@%Zhl-bM(cX_;ElmPvM;=!jAVb)0IFW{xLyxME0+!24GJz zV1dxrHyleq42u{VaW$$5!Rt}^8=HKm{&7vn#QfpB43EU;&A2~8I&$6#Orh(wEj51X z*+H|4Uk~ifEYd@(eZtX2)!;nX^XvX$iujhlqXo4n{sT1^V{xsUL zVo^s5{M_M&^#l2i&^F(2{=1wyzP`hh7vwjQzIR~=ih3c{I z1A=s5n#L)n0tDZI{#?c-XM@b%sO7_KIY%M5>?5wOHC&fyo9Irm50lQ%3`)~^QhdGM z-|`3kAoIm1v(b0IxM1eN=P=@+rL3r!W{3XeoX9OnAP zOH629R1-OGjoG=8SnDY_k4h&6PMBGq|6^y_P7F_jV77V$6P*K%uA|{jg9UN|SBmP> z#Yfqt|J>jc2I{a)d2!@$Xv%V~@8wKp^UCa2b__yihYp1MY_Vcv-72#9pt%q<-RCYh zf)9mgCM}U_x_^3(v`1r=w||tWbBf}c+jRyvUmwlTA%3@`+V+OumY17^Bjfu zn?$>%4rZlR7AN<(GGBI*f&YhXlcwf7p0<%4%2)(Nc^TsZty}FG&4QTW?xzX{TNEbZ z=n#>u)FE^~2^awB(rxYs&g!}3b>h~b7NZD85)uyq&g^x*CGi3EoCx-DxB}B0t=i-Z z768C094)Z9*hJ&DW<9y=a*0UMxU#ycGH8I$WgYV^VR)e)!ZP`ezyW%@6S%>DIA8k? zGZ^yX_OS1)i1?gYkcztOGes9?f-3ToncmNa<7S#m^(N={zO~dY;$qQpDs#j7!?S^3 zLehXgS&n2WWj$4R25cj8un>^l_T#$~SDAD^(cypFihl@{?`Uf5+@ml@1_Tc^M+b(n zq}2nR0d6VRaHqN3t?P(n3cl6I6zy?COH@TA@MxL{WYL${w~rsJS6485NY{}qMS5f_ zwcyaIm`+)1xmPbah#w0svv58}%741PFrnlqO;5Y%_BQ)4WjUING{pbQ&Thd*ihF}R zYA1aK_BI0uXGTi(JJQt3vgW%{Ev6K~g#ol!+!hI|)6u95VZ}y-vWM#W;F5Yr92=eq z4APKVMXwyZt%BJ+Ya>;y=~<8XW;hDJ|CAe3>sCs!y%^U|ch@h4w89@K$bx_fS1Tmu z-_hdon-@FbR&qY0tJ=3cH&^MJKfZtZQ4NH_x4uf0byoX~h|;=ynt84Cv~j!=T{7zT z0>EivZQu<4*<*Q`n!HrHQ5D3gHZ;%}x-`iMv0}uELZzwJQRU;qZj34C(JClR?+>E^ zdLS{zs0w01$6m>WHXkE`VUEP#{3KMg6$0SrN`6u8>U0TMo!2?^k3z=m9z{)!5QAdpZx z0E6O8S;{D=KEb~J^Tt6~{j-}A-b}~wpLI&UAeIC5sYd^;#gSij{tAnmmo`?VrP(4d z(p>hv9;S@qf zlXEE_(FY-At8jy-LAzIc%*vYCh!eZ97FC*=>6tZ59hawG^=K7&#>>lleJ)8MT}`AC z*#-!c1V_63OZzk`QvsNogVOsAJE=q+UX*=aGskQ<&h*$A-c8pJ6V(i3aTz5qn~yVl=HH*LsU&&+4I z=epRvv$dsar!rIZ($R~tR31IUtXp+AJcTMtm7Z{zjVQOOt(jsKp{R)jUY*5yv^RMU z0a(J%-E6gue}Xv^?cr9OjAD6?-lfPMm>>8ZRoie~QX*ts;aGv*yl1%$n;mB9>po69 zQn}DhwS^MLaD(aVqi9|>h;-b@iEHF}0ic-ENY!g^O$#p~6?_e@0IZTto|0nx zB$}3VSK}s*=UiwnvkHxouO(8g3_!0q3L9i()EKoY&@L5QInI9GZQ+(0jmzKVFNsALT|jS!U#cxx%K+y z)+d4Awr#A*UUN%a=y34{%3(SPF}CnZ{4d?$Gx!?mCz4= z7N}FV3~JL>14%w+_%cRV8dw)dkvGK*RCe5cMCT!r>@|X|=phLq&{%0`Or$HI%CNf+ z46q=H2=&!j{5Fb8fd6f+mgO^Rdoi*Te}P^1!xBo!+s>`8Q3|0~bf#c=jM(?J4;n#4 z)6(IwLnU14od6q_UWx2md5trM<#LWiCqW`!$IzCV@ngydw!t?`wf*$XN-XdC4{9OS zIBUi$x~S?w!RA64r#f(gP^kK>T}klAH#FA7s7rFT+Jg1#zU7^;DU;^BCE!HK2G79W zfdc}1Qo2HLA)mAfpf=^4 z_=Kwdo%aep0S-zAMasnXuo1>!p~yM)cy(>WJD2t$BLgJt--E;(V|rhcbM^=WE(8Kg zj}qd|2TnMqGStB;dPIo?9hKqHZwCAXHo?snAW$h&$I;HV<)j7EH!MXw9<@*@{U zE|1cF__*1rVY==Wu|=z>0y8ezqB$*1D%{$=he8mnix#o(Hd!5SX8hYUG&kZo*}TxT zh>ty^cwAt%rpiHq9BWJ+fKyD1vCInq8GucuW1;f`08M;z_@lqFvn-vxEka}g)80n~ z)hlFwVc%CIh|Tg#r`yq+p|rFMo`*6#n(?j8droraHp*~Aq|_BrLdSZ~h24R3(+i8= zeTl#228t%K+l~E4l0#U#CTIZ^jE9bwC#uKnhy$7&rPW`Ifvf{F{ag~UqS*7oW-NZW zX}-Olb;X>5jFlA@-_^e+&}TDH|5S@Vj0?vg;=|)V8=a~05G(aI7h`CSiIb~s&}RXh zIN5L}GK#zI_}KOrZG-H#w5z_KiK?63r`Ie;d2WGdFN|vJx=S}v$A1(MHN1_48g?W@ z^03diS!#q_O=?-IVQaRq%Jv+gt2nSh$!dWrg8s3Czz z6#;(&M~c?SZiws$drI(`dE6&|4VK~Gj9>#D36IvkS|GZ&lYVj?jBj*!E(7?NnsD* zm{(O1u)GXF77s?o7g%bbeUjI+$Q|<_1b?C4&Zcc@(NR#sM4@>~IQE_g27S;nk%dJ3 zzbX|h$Wkf)^nm>BTmMfxl^}bUVAvrM{|Z8I1i8O_u);K?A$wK+LTDl8m7JewUwW4b zwe3N6K5taFRW3O$uBM+GtPLlQcIqvBqrv+_>LJfKFwLH710<4^*8<&zaL5@M8nCx&GxPkdce7_y#TP5v=FfuJ{7$HO#2ilNU?o=xZCkz!X5cl zvk-eQrTHA#N(0m+dt++x?p^@x{9Z?0vofU}aNI8dV7hKiQ$0wRX4wAQ3g>Xw2g-U9 zHu*#t#{Oviih*bKQfp+6logPLN741{=V}nSGQ-<6i~+S(J0AX1c><1xSy5_6qpwhF zJI{UElGWB|!bXZLq*8#l8BKP4hHf+3bDta++VyW$w$nX4xQd!{7c^_){asV!Fq5La zJac?p6@{La<6OR5dKh?rR7*PvQioPd1`t8gRIY<{ZnTWkTn}vcNxMye`!@Z$D9P z=GNU4Imr(t70ViIGs4QPzbj#&@m?cNZntOpD%Fx(jN!4=)t%jaz2=M0TYK~$kQn}v z!;eve6!qE$x-HX9HT8nZ4Hwv$Wph)ctIoh9;<&|`%m@#lqb*7EHO7*(Vag)K5hGXh z_$rE>GY(A4+M_6O8kfj1wvE&VK23g&gK(bPtq~rn6=Yw~;YlMfh)(tMgTQ=FNFhwM z{v=p&N;O8x!MH9(t8Yk(V3oA)1%RYcTj0RpV)5nN2zSKAi_&23-jl9*+%dRv zN<}s1d8CW#mg@LB`4N94H?g4!X~O2Bf6Pq76M_<6VmB2}GCa%EiTA~w(g^3&Ig7)$ zryMVnd~@E=-(Y{4u{HJOL)QSxP_&a|DcV+ADmJ&rTo*Wd<$SOp@uyn6!6FN1wYn7S zFBF;>WHxa&F90=G`wWEPv~a?T)!O7HzOs3+CcWfi6Gr+wopqWOjYQyI;WKlYs8sz0Ip(Bg|51S1lQv&CrnW>l(3aT+6mq+A3lip;{K0ZI$?yZXP)O9jo? zE)1lqEC#!K(QLRW&-hiI8*|0h`6M@lB3ueet-!a$J1FIIZzJc3D%zK{ znR=M~XI}uQk1F4D{hiI+KX9^aY=3ksJaoDgoTKsA(#bC!%#-I#C_pa7-G-CeGBT{w zOdkwn4*dKU2FY$`HkL&d&k|)VxFA(!F4vmux(iPQ3}*XKr9jD*(2;>toA#JZ1uf?W z)1x+d`Jh(9A+@$-g4ziud^Wj3&s6;&f3(Hcymp zmA?4PnqrP00@%5&_O$Qz<6a1>5{+c1h1XrS;9r}Gs?(#jS%82+fZzDu+PIHnIY z>d+P(h-cm-@$<6CqDX*tKQi&An<&BZC|-i_Mqzf}eM%+C8avdsskm_9H~)4eiiO3+ zaKuxzy_{MZ&AZJdVw0czZxu@->l$}Gbx+-|{aPB&;L=+|m~br_UjT!Z7t$Y7K`kO| z7(D911OgJD2={Z z4~2Xexw%Diyiiz==n^mEd$g-hBp6mUJohR!t$}${S!AY(AjuzopFH@`A&MxPr`r=< z@-5F9rO<7#z`5Dl{QhLDAxy#*S^kbrA;`{vdsv6QIL}NaMc~(hdRw#zPsbHaJxw9a z)VcXIWLs+W0NUm2roMmd{Db6QwTy&#C8NkyzD<~AgTI!z67sYfrA&_(6lwO?B3XyWpmr^g zHxgs=7F~GFn2z})#IXd2erLI2*TQL%**()|&9=OV)N)=V~PY4Ovin1NPTe7h2X z-t+Ppej}rj`ThFH7svQ!(GabX+E5p@mcQU$&F8Y>$(<_|GTkrmR zhZlg4%guKW=4BF>L6k6kmDE$m?RxrC1tglJK4~WY3zOakQ6Vh^H8UK#aGls@ zWrBMfQv`t6RRGr~d2Zy0Hj{^5|8A!*DTPGYsZ6mw>N-oK0%u%p@*x>WrvnGPzZgsP zot(^h8JZ&KA8gMFh~@ z88f*nTs}UEchDdo#7=kc0tPm{tXl*oJ?^49Ac#U$UsbRNn1K=X0Pxm`5$SC&??%qeB+ACEi8miKw(u4}q}- zJZAg$^3Rm}Gq5i(u%2%(&oAiCfC9pnt#D~Wwyv4seh{0OawGWh&Zy*6-MS46_Pe6Y zD<4xNI@d(5WvjF^5OO*RviP6ZqCmzPNprXKWZB{kKD}HAmkpFdKMdufBk66C+|apd zLmY4G_v=tk__X0oS$E5C;G5X_uJQLEHgRP&XaIrMs$uvI&MNP6nnPnxz0SLY3TBu9 z`|;i?uK-eiOHc9)s^8<*8}(C$+8}8QNz2VKNrs^F&uO@8N}Tu@c9Jm5O)FXx2%$fl z>LxFFu;yWn>p^xWgdLI(T|3smE;%+oK)0DYUpo7~JI~@eySC_I1#iD#A1m2c^yDXB z61K(Z5G$IGBZ*@RbkL0xOsTM>0XxLbHzkM@vZN1(v7C?StZyWHf26l!`XL?)lN8JF zC*?$U(DvWOW5#KkUJ2Cob2w1Nl{VmSAlWZ^M+mc1nGD&sF67@`7S0nn*^KOQvk7Tn)7HGU97FO!FF*E!$U9!Pw1qpejv{xx^%Af`WIJ= z!iBj?ehb_^Dl_On{q%g;$Hi*`nhfsJR(uUJ@Vpl1wcdhuF>_s*_~Mg|D27uwjsT#~ zXrr*4GSPYBq#ukWe(N|Sp-=AL5`3!u1~Zf$gMhd^+52@u>J0s|pH zg1g%QgS$(x39bnc+}+)s5Fj|gEf9S036_77_xt|)om1!Bx>dJoc2)1*-D~#D?!CHK zuk}2OnY&?bkJI0(0%l;;)AIr68SzIMpUEH- zpx0ys+4dkv9be;qDg)ISAKrKk8z{`z6za+HUH(uFR}?Y2*YkWtkXB0y95bO|f%$Fg zf*tpyzTaXKSh9qyc)=Eb{su(xQ$63#2|eXslVv??{H#EiAT2DR6%iDzi0lWMT&EDZZ*@! zsP)4R^fnr(M#8(99#p$${FTbr`cU(eUhot6NCxyde{qXX3D^bzPDffrZEt~$d2C9h znd>BB{ed=-1&iXE3!>rIePPGVpmqrfq>q;_?4bs}`xL5#g1+uQ{0)lif-t-3k0c2e zrKmeL?=d9BN#;Ha zfMeXO?Q=*3f})?upeMyuFWR72>he}E6eMRGc3p37a|JL1HUGN7^)w zbwNz&iqPZN&VmkUP&6RVKAGoky-(|=g}8ZVx6+SqPSrL1zjE#+ee{LYI}99MG2Zo# z?#GEP*1@Q3V9{ImD`mQ?ayHK<3SDV<1s%54dxj!LMHo=pdaDhFsc~9#iEWz=IxUWM zh4xdqbUBkMe@xr zM_NSS8!XZ&V^I#Hh$CSs4S#|oxG4(J}SG{%jt5$J7A%z9JYL@TxIdrJ!&h{M=X;e?lT%19I0(*|@kk~fJHzydwntQ6%~xJ!?wa&ppon4b;2VEYYlxIGzicVlXW+Q>E#OX?Q%LH7b;{SzAc=lGv63jc;J5GVaB#uSkkT^w@m6x)MGd^6ufq5B))L&_K|d2ts2 zyr==e#k^?Fv!Qxy7@+;q5+tX)P*~nKlpQFBfej{kZNjB-Su=F|y!lhJO*fu}pN2Ryr9J^g_qi{0e*I#@P-OtE){kx9A{-*JagG+Wd=B96U;r)1)*rR;K$ z4g)cTk`H9^YCEO6@Xs4BQ>XH#ehv9|Y~!Ko8ghoO3hfVyPCQmRm^LLaih2r`lBld{y@+Fp#pg!Ew_+^PiTTz&)c3&z?l<1zC_)Dh3a7Qda2 z4ujgQOC3$Izh4rbhzA^dRR{H@-RRsVRo$-|Y`pT1Z)h)fOt7R(zI9%jl-}`@i@D>9 z-tou_D4imzJ2t*rPjs{eW2&^NXqC(LotL1)Yhv&T10(G`>|YhZ-iuizONs z>i3(YF1l*y8@+7EwgYJH6=-Y0dU9vcOFQ;ZZnXkaT)$v%vMC`mkNx0!$LN%kRG!d6 zkL`}Jd_6ivJsAQv7O!r3S4qYh%Z4`c_m~FxhWRnO&d52233%OjVzFQ}FrG4&{`zio z_dHSU<2RI63AclV^5JBYuVv(ovqJLkrr_HSehcA|5nMI-J~3QG^?=EHSJ~{yY2dv| z$U(+h3!JNhDMo=s6CBIbt*a{2CvrHz5Vsy$)j^fY&dOduyeO;bKlLG6c+f7$vjmRg zCD|HjtAOSNub!bB&l!| zHta0#0E>N)a3jvaO~-awBf?@V{|YJCT`~|EH?8#t@bcoaGp~qeq*_Vn&DwS&%yzOA zzO1WQ*A-Z*)#ek4FKt92bDN>uElJpIY{rl}#*Xts&%>eh&_UzuI()gVXpm&`(W zicIXc&AdLENGzz8YF0%*)5e0far9MQKL+bAI=&7b>li2d(lXIyREzf&9eJ;=vBJn{ zn>a5pLp@eVWx2s*RlGdyJjSdjwHA%BZkTTjsYno*8gusC(AM)#Tu|^yvpvfZFVmqT z{}hWv{PO^4WpV~@ZA|~-j0gngH{TD5|qxG|?f$H>^il zHsJ6>XGP*DsCWHE2Q;Dw>;V=DpB|_{iY*Mv(you^{dWDl?k?!w-~q)c&ID(jQ{ZbL z{VYaX-GG_R&R%$j|3IDu1r>t8FV~7vZyL?!u9z`<59HPts*6C4(Q9OUn2SlJNyGjy zmI)*qwI!r zf^z_=fW=TC%Y))M+ORH%01d&$NLe)J^70qq-gnR55QIxlJ|uh>ne-NaMg`5hQH7#tSwQvjQ4KM1$Zxgm1^p%Dy>H=8uR=M&7g!cA#%#?Oc zqx5#%@1v&A5^N|Krk+@$*0qxkbMEu1_-fJVo(SoQ6)HW@03HebU zF3jLOiQ@xnoqW4je7v}=X{PFQ3)vr$de(^5<}^d`@r}@^5YVL~((Hi&0FXed3ADHG z>!vm6;*hxGRYUkrJB&nA)3bkK+;VQxU$TnaA>;j>YsB&8>< zH5kiQbIlHtV@o>k%E1>ow$IUw?qA?LQ2N(Fkx~E-ex|rvW5heCYjfEx;eGZs956x{ zXlh1~OZlR-7ip#g9GHP3>cQeAI1{u`%o5^HWwCkmjyMx>gpSlNl=lp_=wfB9Y~Jg?=Ni}qqN;;H>N!B?#{dM#&toNkwpCFb>2@=x#qf(^yFR+!il}P^ z{1EMgSz9dH={Fi`h5zC_`4@c~eBb5o2fhLGZyJ;Tvvly85L&6`T`=D>j`Kj10}Dl2vLkm9Kf3 zK=DEvCv1#i@6IuCOkQUbpW}wJ`h5tXMzLqt4Sx0ZB5(P=h0sae$C|_bnq(_y5X`>) z8xX?3K?uSXuSi`Hr>I}J#OtB(3;Pv{=ld`Uei0D(1qaoDB34;vdIcOAd9^}^t&u@?`qp5H`)cIG9FuC-4P;a)2dlRN=UP`A{ndd!U(cu z=#u^n-e>C1qKOqK>RbvQG%ZrSHc+W(w81kxgQ%-6*|!;kE@eZVyXV|Uxo&;G0rqI0 z=YMn)o)^VFXkV@kSG`amd}FbyfKIy!RY2wTqcJlnHD-nGWp1CK-Yd@K!pD`;oT;r< z%tgJz044tQD8mxup%7LCT~vR}31r#uwuW^L!(#?|X3vVm4Gnnu?;T0|C|&U^^oK5O zzt-_fG`g=*1y*d2dDw?`TXTdtDvqtY9U4$(J>v`MrB2cHwhpkDS@d8n4&mhg5i`dB zRbk)rmxU_sp0LG1uuruKup!f+v!%JVIb(0n75UvtnWx(^n!v#_(Fa>{;-W1zqRMs3 z=6QXwOyz@wTBYsLU;Vqsbfb)xWqm`G?Q7Y1%JIAEh>nx&mSe9V zv53PE(^#clG>%O$Wj01{4Xx{W`PcV_<@*+K1+-UEv0k%O8e6_jv*JnxYkj2*LlRx@ z`wytl)CBaL-IC*W(2CT9Na5@=#4YI=+SvE#}mA zKB0ac_Ck{=55@g^&gl($?(t_jk(eXcijG2vl8zB2bId{w`r}UgD;$J!){Jz9OQn+?m1V zjdm;oK!xvcO^F@8fx(iVxo6C)x|A=)dLMIlTudi|SK8hpj7`|u8%3YN$gQ41uq|r=TbH_-R_knrkDMtU@E2F5ocPh zi&akRD%itGpjiweD`^omKIGUBVRZ_x!&)eHOe*|kn_&TFUS^)|ocgzu-_1&Xx`c-~ zZ2U+QS@O^^dASNGPU=*`NE2Ed4=rTGd(%CpD*T;mkwj)otzJ^Nvl2L>w#4!6eafrLnT9$qZUo- zU$vMLt}yeWjFpgG*~JD0U5rPN+hfKG55dnJn(Qq|vZKn&>7{u>E`CHKpIU^qBy9|H zb5`m+k%v2RsQ-F(p@v{mFDCllmSNS4+pHB4%Yo4XbADoiL5Y#LR#~vX&&iW|>aF?S z?#s1u$d{2|S5&@M@FY)|FXtr8Y{qb&O#P_eH=@GHKXh3dobsv9kk@oGRCL!ZaWU+t z9Su4N9;&sxqtMlnM4^msmB^?Y1>uV@Kb4*YO8g={YGk`{0{G)Bo^s&URVWij7OuvO zNes3QT4bHvPh|JvC*UfgDBTHdk%agQZEav4-e{8}RaISm&9R@;?Oc3EM8iY+Hl*#B zrbS#yl}gf_d+mkmqTDXpW6Cv6R1dCGr+tx~sN2TJ+wZpeZ{9R-=|mdVOXMf}0_QAjXPim|)yDJWiEiX0ARD{Z<4p!iGOI|WYV zK;!JIa&Y7!qfO!sRY1Z5pr@Ql0tZW=3YruHIkD1+qMh^n#;KpKY;^RK+ zH_-9yo_7xw*9@v%(@)Ia0-dAVJu^-0ZiG;&7eB`%G+^WpuOM*u-TO4b7n(m*0yge( z{oOyEF+iJkI%}r}+2<;7U&E(H4HFRJqTF^5*+KK2TCBjDZ4rD>bQ zB%r1u$YLsNoqn#SQHt^)khYJ$B1`H?fjdT8J?tHQ-C7@X+RP8qYUTY_)A#&&_Cqhz4h_5i|KxnCHo|FD? zEGJ2xW<%~0_Yvspzo<_p^8I^GrSODXpu~B4q(9!)(T6jF^#OZR&Ehc;P&ADTNyYP@ z?0u4)Ps?{S0~3;9KKYAI;5O^<06#cWcaoPZN`!Ot3%2Pl0gnlZcjk6YlqCJpj^5%m zTaA;DwZugDdmCE%IKlunICG`)(p?58aS+7G^{8m|=Q71tmAbBxW#;(OFL>>NB{N+X zy&D){cP!K9v~fo~onfQy;?k$D-7gwp@tZ>(spxaZOERvnw{&-Yn5`s;P(?}98K0rl z=Wk+TZWctuVtpsrED}=JZ;1L0c&{ki`4XfdkM7dk(cnPpUdlK-cT?RUm-;~!Q&bDa zalYK75-~fI)x0!9c#Pr=KD>Ijot0=_@~Xs?ihS-T8>EST22s8QVh-^xM4W~PaQus} z@edUv@W+35*!)A&D2+8iIpYF^v+Pb!un@ZZ52w?^AmLn;y*Q9?0R&(S!nNHFlSY@< z>S~C4T2^E-nr`i@P{@!+v^)Iz@c39MiK(_#Wvt?*8lFbK(T&eXYw8=S8P*gbv)@*e z?XP4(61CNotP)EuRzHOo>F#A)#qWca@6?(k6Vs}y3N$xBLc5L}>Beh3j|+DJxuIve z60NL7mcaZL_gaRyP$!@zgY6N?Wkru0;anRN+5MB7(k*ZDI`b#Of=Mr7cbGp~>fuwz zP>DZ|ljRczc=tZYWEXDy;`#?r^Fz;J0o6u@8GDIjqW(n}FF6;V^upGXTgrFti#yJi z(>FP2D7&f0L5_(-+eX|?3(2m%F3ciPIj5}v8d<`dnkiDprn5+6zLuU@M>_b^ikG#_ z8p`djva!c}fnt-2OZj=lKm<*^jzc~W^1$*~?vHbBH~uEtL%4AY-;kd14%}-wI1*ad zMq&7T7EMBU!o%r|VFlP1g!rIE9a4U%|FX`>1>`>iv=RKl#!Elh1Nsp2>@_=HZ`}3T z5jEPvgH|O&qpw6srgK`ey>%H?XX#M<$8KGwR86a_%NUzP2%KutF(;UWoVkW%NDbTI z!QYu`}3j7VwwZNW!b=!^+`#^@#a8=RE5c{gKa1Yek{3gF5Mz&x5 zs3PzcfQ`tmb(6X}FefU{%e(4phYIfUcJJg%rnatlPEj9k2-75BBU|?xiAn-i74Uq( z<&barIpcA|7kYgCVX79&6GI!Ocr<`3Lf;foga<_c>W%PM5F%sn2m|7U)EhyUkg-QR z%0;z2yPIZm$-DwmaO2~x4mKvFGR)I6V@GbHr@J~-kjBln+ zL>~p%GF9AT^JjNDRLMa5FFxy`C}6KXBk_5@FUQm{8dZ!h;P`5-cgVDG=bUPGfbHU*sQFgpQOvM);rQf) zeojBY_zOPAbB<^mFd;oN$h?p4!#?2I>gM@+vetq_H5j?weUbU_#6SMnj|jdn%>E%* zUrOOQ97)TLcyp?1Wi#5*GZ4l@)?t~zj$H?w!PNY;*3n?w_nMhcao zXx}Frw$DCyjP%Jf)LnfAZam=Ji8Jt1wj`L~ajtHdU{=&xiBAzi4(Lm=*HBsvoG=r* z=_Db~63o*VfQLgd2BQK--TKkSw2pm7t1JT4g`D>S_l*|KPs5?zCS*#fi3q!n)ZqHr_5gF!nVD5$KOHhbP3Z zSq=M{5*>xbm6?cmD{t;~<-gZVV)x*@JJ;OJa`?K>grj#?w<9)% z7msm>v#kV9mrX-8NOtd4n6B+ZyYre-wZGUOgpLK3+lBQn#99;^Oz`%V8L`FLr{a3n zhuta}b)Ls9)f8p+KQY5nZsMyCHS7{sN_7deRhi9ng84aV2B>KoXZe+NkB?2? zmQh;Nl(Do)j8*pwZ0b;L*^_bP$}?v9E?POd76>HExW4V4J4xB(Q$sAYWPSmPsN9Zu zi{kVmh51E5qr;F`@Q}VQm_NNG~<81eWv1hE) zGemNc;bf>UZTI4A|FWXG0r>&e5RrcerOZthhxMO8nTIn)&$@uhz>{8A{0SYxb6g}EcJKYhs3f48eH=jSk6&B$hIGTstc zBqYRG^ClG7R@2;LUlWpS(73#pRvqp<^9$&B{=M}fzGtDEYQ8bOOM^l-(XjZH6QP-_ z9~%YVFE30($9sJ{6_?XU1L>w4b>L_4$+ul3#b-*CvQ4?gp}$3@ zNyQZwVL`^p@M@P}G3J@|^yW+}0d*e@bklc4NEp2Ne1bFRimluPNmDq*l_GC>S$Sd5 z2QE~-c+5nah;gB#LPcArl8CkTzU-6blnt;SBw3iYYq_YLD(TM=+pjF-LK0aOMdSri zc=?(1xz9A_;K1OU1-;83yUu;NmU8t@v|srPGb`S{Xf&7qf-pwqHi=qaHjXu_{=WRa z)*#z$%PGoB^eox~E5Mqx>Z~NSSS$9Gt#15B6jFdqf)w8CpI48L1HI~YzTsV;*S=gmqb-1d>4#m%H@DyV3YBLv#vmr zPsKuXu6l4`He1&PcG+}2VLHKOya^;iwaVCt`Y4oDUVX{)O=AA`C5GD7cm)SzdPCogAM=^%QasvKF8 zc}F#q-f|i4&}M-(8bkRq_A+;<=9_cML7wW$_C@O`+77WZV24mN$B#Q%)B)^52GF9& z5Bz>$pz6GQYVl_{d|@TYP_|len=Zmt@HYUDGFb6UNwVa#I6slGR;5bIxj<}9^p(>y zL)+=qpS-ILO(mIo99xn)>TaJ0=(-&&Qzg(@GGU(z4818d60b7*Jo4vq1T^! zvUS}{OXy5pr96-ECSq(*(y`HG@#Gemh>IK}ATPqVrVr!JHm3%agTk}fn*4Nfbf>S; z-;3^I3ij28e6fMe?S{d0R@+UY80u$sg9NU{ESrSV+*V%RbhfOdz7Xqi@Ll}TG+gCz zQ(K6o740A9nB(r7bvtFaxUf;*GGtrhZXbkt*z%;cJZYlP-YSg69yCt*8{h#|5F?PV zE6ixH@eob-w5dM)4WMS28F}BS2ckFh7h7<%@$x0CTn-ozWbhH$;w2*u!XTTH4gl#Y z=A}evjMDCsL)X+~r`_2f?Zyo;tf2Qpl~B9diHqXoGHUU!SFaL6F5UHr)F?_HGdq1#4)C6^Eh$)pcerR(^h%RSmdKtq#-~!nb_OfK;s0-d8siQZE?P!twCTIse7BddHvsIeu zmeDS)x7I9alDo-<8xa5J_S-75RO$=ZqXW0`@o9zu3%9ghS3`~(-i*INW5a(VTr$RhTT&tP)~Qp6e{_3}p`#Mw}D)svj~GsIb+ zN739oov;{QNKJYSCUYTzx;eDFjWz)qB8S z{SLR=DDS4HssLoa0U`xb`}}S|$wq+9!ybh1Odde_Zs_0j0Jz--ua5Z*$ohsbMENH` z4=x=5x6}S55wIP{3ZFUtw9iF?2>+1F))8NqqPF;f@1O_v)P*~*%!Qt=x`xoP@S@SB`&l*6pXL^B;)a9aVND?ctqw?~@FdmGS$f?k1H3p2C-SI53X- zc9>ghC{2{9t_RhM4Wl?;V!Jhdxc|s3j^Ddn)cm}W5}VS+I0P>eP84&xsPQ=jpN9Z- zWe?lthq>_R!3Yb{p(ot)9^3>sV1vmegRP(kxw9q~STaD!YO$?|iMNt$&RxdjSkO&=bUA+|#X`{}JhfuR?$F zi?5HNZp7}mQz%~|gQ8f$RdqPiiA;P)qTT(bA|Bc^XPWq3N5m~=^u!Jojf^SN%MaZCutu+#$JtXkHR?rvIMOB~JTo>R4ixp&YI zyo_X;6Af5?%s=&3UTK!re&38PHeVN4kr=Okxxe5j&_hb*PvhiPpyEo|=LGijD&@)H z(N;@2VemrBqIBD!*5Pz?)p&o7uhIpPB!jv5?Q~G7`msj^&KC972Yl*&9Mofq@BSv4 z>xVfsvu^NVTvz35*zxIx4V&OlNQ+g}?dIjtkrClHJ91>_Lw$`^z3-!$7M=-YuXjLP zap>k07kA{t(3Vhvczo~ROmxdEv0q7FaOdT+PC2}ZUTDv}S^lg$#Ofir0dw0Kmx8Qg zwTV`~J0uUUYHeJs+%9_MWqmvd3-4@jy-_Qe5<(O$h5aS0M60AVj?tSbBB27!YT|{1kQ4 zVD5Ps&#-2TZUVk4ZDrV)EEfnxp?y^^GBYHVq> zO^tA*BS6ts@2Gp+opf91c7$zg8S!GcXFd|Z72y#Sn8@MK45bYIicaBq?GUqzdJL%f z7T~4yL4UTWIRU%&ml9cDO?)@KKW#(0QM&5<8P~Dv42PQS7jbaI#fZUfE#u z3D=&rsZU*adFQvZ}H>*)) zD4)rksq1!)gx6#Xc^DAwk|a1XP-$Aa?*vQuFlvtsZD81m61~q5EQ2S~=vUi%uP`g1 zK+jVFYU{67+S85hHB8b>-M1AO1wp;12GbA%zdR{zj+2{x3g9yi9n^Tw#bW78(9|QR zZ=WpQ&_1?D=vq1H_HDcFl)v@b790G`M~3kQ+Za-E?@_N*s#g$>IL}Sj8<^+mHYcZ( z&T~WKvVQvOeyHvRIvLWBu>%u1nA&Dsd;yGnUl-b;v@Q0bUPm>@-=3ae6m?J7Bqh&T zc(Xn$)IL>s;=c0Yz>G;M$aeL7Dl7+Kdrsh|={fPoR~p=L%g>$Z-gjH-=$K+9RhIQ5 za`z^OO*P3u6-@BG<#eI*E${Q8*QxnDO+B4$T>OiH5HxBv7Bu1e5=wmI`OO;K)t~yr zpQ+0^tQTmT4SZg5>HNx4jEY zSmtbw1vGZe?%0x_e)Df2a@Bs5^RZcPZr5Gw#N^e(YnVk1Y^QHID4MJBH=zFL#+I%} zQ|mWCkrGchWR!uFff5QNve?QwzH}=eBf2T2B0+-V7>+1|RD~<4Zh#;2jFe{M)~238 zZTdH!d6z436mr~X7*a$w$08PpoGww~-2l~OOjKbEoBZU&iP*eANXqdIOf;#Sgn(rb;iaNH z;MIKZgF5t;G0Ti)s*K(@%ld$=xR^gs1{t$=qBa7&kcij*kW=5Zg1@S&b&Qx5n&SHw6YK=CZ*n0$LK}@COvnZZW97yccl^ z_!)2S${fONI((53uKUeHcr)JD|K{Q{^$^EjQc`EAKaFkqb5)7+m$lb{3t89MX_xU2 zxIGMmlJpOJVVbixCLAlq@}KKj2MYYONshP9OWr_lqhEHSmFa$FRi=9}&gT7T#3iTQ z*ID#Y#c$&SL+HJKln8sM;;{XW8nHLuyDnImWI<6`l)Q7jJU6AI$s6B$&k1*{)D(No zJThZ;Yfp>v@)rd5dhU|F3j$muwmn4dqo&bKPB?bN6BI+_jIkGyGM2@jh=I~_-m@g zuiw72p^C9yFsRks#<$fp#AE_R=MAsN16*e{wIilztj)scj%aVLh+6C&6NeF50q%&c zHRv!`W%Nan2m8*JcsuNQ2{^3DC)Jh9E6!SLsi|3g#uw_yDz1w&HWKg4AEtbchzL449EG^sB^tN?iEX$(BU z7Fhv5z~bPKtA`Nq&**0Q_&a$39a$l}YJM==`gf*XyysVDa~^05ojv+c>x!Z^@piXom9APku0mUL zI@RU{Nkj>z+pRphFLawg1=&@k^9>y;4hu2RC3hn?1}$+e^Qz0)G?pc`1GtP0Z@m6R7+$% zGVs>G!VUqZBUhhAh@4%WZ%xc`^F zt>`Ze>;F^trx}{>e@|WXhl%Ac1>AoZ@jpoY|5gPL9Y)EIc`FZ3q^7_MfYX%|rT`k@ ze=i~Yp!xi-$Q=xM_3`d|!)wLr_)(xxfV=Ww0WESaacqr#urpMnuJxp}1USKrk_^26)c06qFd A>Hq)$ literal 0 HcmV?d00001 diff --git a/src/main/resources/static/images/original/wbp.png b/src/main/resources/static/images/original/wbp.png new file mode 100644 index 0000000000000000000000000000000000000000..50c2f153dfcf9996e0be385e6a2f15bcf230b71e GIT binary patch literal 130308 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 ~_-O0*NRjs%dj+MdIh>2id7Nlz;X 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
`sm05hoj9N%-Sj^`Ja-6jX za(Q}Y@Z_?i`<%76z|j1;QV2>lZ-3hg7i0_>p{b6spbM6*Y@Y}0){w3JmfB1*=}NsSA!llOO1lpz$WfxkMwSax z=$&c(gp^dJLScAlcw%B=_xO0JSPC{2Te5M;X+UcaIdTruvonU})atd)At!cHJKU~1 zJ;!?MO6P5U9$2j!)HW8D#OQs5f}^NueE~4af|IBbdG#S&)Nq!RxOViuGN}Nxf<>LI z*^I!fV7#osO|AvrKyT)cNJ0+hDZtPkEePbW_Auck2UzQvPIM-1Am_m3Qd&m>AB6WDn>*$0}nhciB7k`tUb#KxOPyZ z?oT@TvUaiLIxvvvskkS@4dfW_Tnjnq&qT)$5*>>wsow(R2xAyr*8@nC;$s9nPkoBl zezXl>5(`f1F&z<|_GgWCl6*YOv<@7Y{Q5V(cFRBx18X*AIVQnAWjV3zlQ(qm;Jn5lgrB>7Oe2m1#aBIH+HrIz z?Tm3E(v6n-Y#6=V9S0`A@r`dDKQ1Asu>OvFvBe-KRxFu9PLC(p@8+8HAt$XV$kEZD zlIYCL&B?!&O2x=+0qT0L6UxbZrc@}7j_evAA0I3aO85yjdfRLeayqFB3Xs#7nw~y) z?%V|lIn8G0_jeL(+B-V07e&_PQN7+JYIk0c;D&)HO`{D51TR&~UceoIBVmD`C%u_k zpW5C#06!!LOdNH@TC^k9vHQ~dRCL%wC#UNW1yc`50xC}oRYT5!Z$0@f1v%P%V5iGp zRIFjvFA6z`HwZa9D2`-P%hHFOv=-@do2%8z((=;W!u;Ia+~VS*6yH>gXvcwEsaPBy z8Xg-R9UK_Uhxts9+3-!X9guTldit54{`A6y3-VLy9@G9TZit{VO4WUJi?6f+w)M8o zd(cmO0E-Gyn1LZJ1ag>jY~nmF7u);GL6jlxT3U>GE#r#+HgDGPSz9S5HJ&Qm9j-)&gVEg*lBEC(xB(lq->ac+Srue~OH$VqF)oFgUnN_BN{ zX>oQ=p^hXv&B(-PsA|)S-xQ03gM%Z(BSV8jg)pyFYMTkC-8RU1=fZ_%$B@I;QmMHK zbjb$OMaP77cyePB6!bwhkOR&I0=0En%G!)(<(Ji<X=kJdY_P>hTMNaSa^So3;KA=c{hbph?k;Y~mUFY@b?QAv1K?9DSJJXBh&O%6 zxt*JY90@ShdTn`id46GGc6Qd3qt+%I#cztm;=sVbki?vUfkM8J4YC_nshPH2kV9-a zv8P3JP@f}taMGJ#18A{z)}8gC4*bZ*>~I1gxK-!g@jQ{;2Vlyz$l{E>XiSh?W1v;* zMBmkhC?uccw4XDInWF8%Y|9`=c=F+;%&)pwLwdL$YaU6pjTDg*z zb>Tf<)1{kh(ubTD%@UnPqf)CZE-x+2FDxxD)f;tHX(gL0V618A#?P*b0w;jdi;|t5Pf=or5p5?g>*7Wz`=l2dvs6%VCa_iBUFg;6;kzVpxze)xlX z@3~j*=2{)Rvsw~z5O~l_?Y7dYu|DLqZL0WT)RZu@TCJ?ewz?_>wY)pRY$*3(rD9Qn zjifu0^lXyfn6~wh)6kIf)1O{=S1H!k^jPbB7^yDKTL(hxHTHBEi)uwDk)@nuoM#k= z5SY@gyYR~eF$+2H0TYl9&33{}wgVFN9~0s+vPBBAKo2(EfQLFsBV6Z;L+~km@zB?A z?LeF~S4KKDfTeuVyTnswdOH5x25XVXbDRMo7;!tus-CpZNgTu zXf~SliWcBHNR-=4bnbg8s91-=G58o5YDe((;4YEA{iy#B6R|D#D!$FaZ=vOdDClRco68BP-r=+ z4>@uy6ebh13DQ;iJcawGMbJ+yeiN4kE0d*TmFEwg7y!*zZ6cI1oS!^-;>SP!@v-A4 z3;C9DIXg=($A}K14h5Ur3U62+ayn=>fjw+gjUFW6_@sBOZ9U{P8&fmW&;In>+wZ(n z*R~wCo{fL1*KbUXM)9VNVlC!tkaRsr^~R2YS$mJ|ZeAFgznC*{EFjg-QWnQEz59?u z*$k1#n5lsNGF6njWxxfeB|Kf{{&?cIE7ij#%HyP){k_*P*fk+1=`Y|N8K{g5cE{e^)B2Fa6@h zU!OleJ3E)lg*Gm}OQ|`N!;5v&=BqYIba?ArIPIObyLMrG(+vlIHgZ60;<3#6WL$Q+ zsl|musx}57&vhFz$e6AjddEwAmsgX)EWBQ6={QqIKDeq-+he zEUwk+hwi-N)1Ucg-~0X#vzhFz6o*eiB^7CInVELFAbrT`nYQJSV^HVa|Ml)K|I6RJ z`pT*$Na$9aW)~hgUrM931Up|Vkyw11tw!Z5=xw1dvxAM`;H@JpQM>1q<6v6}w7s1SE%y%kZz_ zfs~B0rRt+*L{N!=VVprR7_%ET7)XH5f{;!2tlme)$-{w?5EQu3<5}ox(fUOnKT zCIaNNu1cY#u30cD=z*UB#o@+H-iI889JaK9(A`GXJbv|KANv8fR(1hbvt_0a$YU`E*$#NNn`1K39pzW}-m07q>7M_oD|!Pz)) zRTE+q=>kD;k66ZMKCrR&JSY^4`z9yPJpAz4M;@7&*q_bjl;ggxj@cK@w{Yu2PVcmB zVmYe5DPtL(;8u3hRQ}&hs|#XKS4=pkD&e2f4cFgx(?PjIsOWH8diw(MlffQ5W^-mN z_DSk6uxBB>W7?RSte7RlDCHPJ*&GFgA26TB(ElfsYo%Z}ry#3>7BM!p`ciz%?OY^Li+*As#*Yy#J0%LSw0ZE94?0+Bb9a$+mI`N}QcOM! zb2_1NXfTEbtgPL2zwPAKhn(JN8!ypjAji-e#G6?50W6)(T00rX+cZ_IW(1W zA8&4l)`y&)YMX)_*$lv-VvX8z4C=5x*pRlarD!D(Z`Jke5CBpW9pT&5(qx9^+@1w7 z`>o%4s;wJxn11FBoHU>z(TPD0x)0p!Y4%F%3goP}pPkY=2Y^&1Eyma-w$V`fVH91|i2N&0-z|h&QI8Vr?hN$DKIl+qT6ryTl*|@rG*E`d$P5)^9hZZ4h!O z(J|^ZwBp1()@}{m+D;$;t=(d|lamFQCFIbWn0-gJe(SfJ)iw?}NOY*{8d4nUKF~&9 z_eD8tYn)iuZ`ak@Bs|^b)-BPGPH40UrctJ$qZ+Nj+=rZg>$mN18;2ZpBA`YcwBn#G z2Wx=t2z1#IgY3c9NnY?R9RRwk(NdUM(qbyLzVAT4_1jHp8-X0=6CDFNsANN5wV3>nNElqgCZmKlD4S{4c z%DN7_-AwDc#HSU>VyJ`08#LkcDNeuj+s$elgdFCp*C^vj;?4F*{M!&$+O*hebW6f^ zagnzIb&%*#;4#?46J?nDt>5}>``e}nqdx zt>1d8bq8`xyOn6oP9Oj6){=}F6Nb7@5zx7+MweCYszx7+c r^;^I7TWae=PQUeAzx7+cZBzUI8Ubz`n%cOd00000NkvXXu0mjfdO+;z literal 0 HcmV?d00001 diff --git a/src/main/resources/static/images/thumbnail/pen.jpg b/src/main/resources/static/images/thumbnail/pen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5315ccbdafba967ed220313c93437a0bb1ef6cf4 GIT binary patch literal 7494 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 V@o7#*%*5_LUHSjjrgl31zW^OS`iTGl literal 0 HcmV?d00001 diff --git a/src/main/resources/static/images/thumbnail/rpi3.jpg b/src/main/resources/static/images/thumbnail/rpi3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2c542ed1e5c9039748c58f1e05bcaffc109ac43 GIT binary patch literal 3216 zcmbW0c{J4j8ppq5Fk_n3*s{+E*%D<}Swl!7C3|6hvJ6AXo~Q_A4N=NAc2f2k4B1NA zh6ZCF{VIf!Ffq&>zxzA)o^$`Y_r5=$&pFRI&+~jf&+B>4hdIWa1rD1Tn;HWk5D2)= zS^#qnIBFE^`3C@4SOD?>06b7Z&Y-x^wb` zGDHP1a(LKl-zNYf8Y%t&)XrWvnVZP7{HtW3;{L}Xn+4LFb8;F zob2pi4hSa%vVWjl2e_b67!(459fZLSz*&NDaUVJe=iayXFWFDu&th#j6aw9k_}|2A z0}xQa0B{F`jsk255Eubsb^=HiDF>?``z`rfAT}^N2Pdl}*a22R-CvrIspx}_u`wt$*#6F6PPfdH8 zo{{-1D?7iS5LZ-OQd;)5rnauWp|J`7uA{T7yXXCfUefT$XY%OSIAxAH|K-oG-@Y#_ zuKis9wXwNH|GmA>1p>hT#QGQ6e{dmKTx_fvutWB_Kx{#*14giONSx&4(YJ!!@aH{x zDhkSHkdpVNol8>1n#S)MFa#5jQk|1t+eiD0?7stx{=dln1@><)3IGR#Si=J&09|00 z&hX@#uawbWF!|jDuMss^bXJm54EV<2?%DJppEqGvJ%;%M$%m58P}OW zG$CA$Ce!7B1b@emXp<{T9CLJ>?D-EBEZ9NBREOrZTNakgapZVI{}7(zvErq+>*GK7yc@EM#}qy`XjpM612W?B%y zu3CIzc_5$Cky~4-TlV-!8r+jAAv?9OjV#vX+>@PPm<>vGb+vSDL?I?sPY7$ZOG)*b z&{~IkTm|7zD#F;#E_J9TB&^;G3Qfd?+zvM?S<^oK5(7L*^&<%g(C;w#^SV1 zRb^g?#Bm`eBv4OC)&1nQ(+)^=Ry&-SfHyIL2v?hen9^F`xS?lf1jZaoEyTarEgd!$ zwAjOZ6gXK$J#zcJpk%M|TPV(@UkMy8=`etx47@%^d72TV7#86!W=)2E5XlPC`F%|5 z3jEI($z_&i1CU3!xT13FpoEDciqD3ozu?&L(CUQw%Z8mxtcOkSD&3vF?C6gHsU^~8V|bpyf!2fu%VQ6f@FKAtHS3yp52POOyFw(QD9}h zI-1&ZHCuPt{E=k*X78u0A(%#=(kf&!99tN}VF{KR&FP!3G`C!Kg&+2-%_?ZF z#W$eL(%xMmoo~Bz_*j?E!Orx_se7BNan78zYhToPbhF$deA`{K#?HOfyV4*5fj#0L z1$!+|w_)|GAa=BiNq%z^Q%LK^pErh9*sBM`s`dIBn}Waj@Wc2Dz%ADf8)Qfi%h^eh zMt*cq<+{2`y|##%8@nnSnVZPn233~{mAQ=PerlUJMf9)d?ME*U9VPtqoerM&2*C_F zp-4mQmx38MWy7E}ZAEqKI z>3*Hv_NjamqlER{FED|3&6X77p*oEE;(TYnShHHm^B4#35S!+TA~l$^E3WsWoF=r4 zA6t00#3<~~>Oj|uVk|ZUQsu4razjhKYQVWqsA2%Rlo}js7(+cjt?rkeaN=_svb(h` z^ggL}ZQ16Mm1&w0ASXUD)3#^Rs8f4=dl1s&Lc5|nUTm?Z(Y|Zx9Bb0xd2qy5#kqq= z3Lj4N$0bMMuem!a95WuJwEgt|U9)CuKud}~BSZV3doyib=}=D@#ezF$Q}EMA z?4Z+FUUFmVO(7vP@}0ZE`;zY>TaleQ$Tw?$L`C2hGpbz{@aY7~l*5JR1&whdqoIVlC1j2rKzt!QR6J~AbnE9+MbmC%< z<74MBGhdQNyoU6H%NVyh8W`Adxe4*woY>7#3`|%K*p|JK_Cv!e^N#<+CtGsX5G{`S z$Jf81fXVv{_6;3!m38G9aF?*z%~n*yv878+_MfTv`bOgvCxL@FccbSD&$bHlrEXKi z8g$ME=mL|U$XK;W<%>SOlavZ_hR=kc<-L#motQUvLif+Ll{4CGy-Ndo`|Zc#`=bjq zLtM5O16Y3{&4VUMeYhMO-;B(o*R*RlCRvcHuAZe-WkGUMB8ttRHi120U$Q%F9IjBl zTNKWVjM|fN48CjraTQ6S=T8sV(k>186s9n)c-$r_*7a3*3h`>6mvngaQ~EOY4i}G_ z{kFqw4})jef=;e)Jw-1KLN?}Dl6rW1;)915 zsI3J4&2VQNvkiUg{);9U&@9ag6{uXl#sCZvNRQDX)EU85O zv@R-Fhg%uT=Ca-MH#TVz68{C*ChSck-_*zMVD|>>8=^Nb^;=byI_V{#^)V+7lxX4| zO=+>Pa`9QjGJ8^}G38yF?bV|=HO)qIH(L4ppNTDVNsqFPQ>ar0>(@rlDCQmFwuHnX z`~(E&d+iI47bcxTwtU5`ANbTHQHToA(WINK@jB3Qdg5PKY~W}Y(gtqiPD^KwEw4T( z*-7sD%7%E_bbO`%2e+_6m(*_7ZZ6Sn2F|#?_CQCvk+zaq>Gi>D6YVGBkxB5CF>arb z|6$d5eOXjoYlwc5cEp($8>8xUx-0wZb7~Q(;IedQy->yqTA|*sx!Qn$h||M;nUM_d z*L#-}(qCA5@t`bj^>+Hso%(@o;*rm2X%8huLLf1Fhfpv}9D~e_c3VDR0`MO*o#MRY zs@Cqe4#7?i9F{*S+X7q~CO8KwwMnw(BFW5`gBfR7lAIJ1->MWKpv`2DX zqfJ_5^rur?sqq?zLVa(7My$a`z-hX!@U^7(vibMK;uH1Tx0!&MY%YWwtvasR$9IX% m3>%506)^UmTIoT#?L0x$cv%n$Ic=@AZ*<`Jtn`q~@qYkG)8fwn literal 0 HcmV?d00001 diff --git a/src/main/resources/static/images/thumbnail/wbp.png b/src/main/resources/static/images/thumbnail/wbp.png new file mode 100644 index 0000000000000000000000000000000000000000..d2bf511308b8e2afc76966c1b13fa85ce547166a GIT binary patch literal 9480 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 + + + + 관리자 페이지 + + + + +
+ +
+ +
+ + + diff --git a/src/main/resources/templates/admin/adminOrderDetail.html b/src/main/resources/templates/admin/adminOrderDetail.html new file mode 100644 index 0000000..4a66c84 --- /dev/null +++ b/src/main/resources/templates/admin/adminOrderDetail.html @@ -0,0 +1,103 @@ + + + + + + + + + +
+ +
+ + +

주문 상세

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
주문번호
상태
주문자이름
받는사람이름
연락처
주소 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
상품가격개수
총합총합
+ + +
+ +
+ +
+ +
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/admin/adminOrderLockFail.html b/src/main/resources/templates/admin/adminOrderLockFail.html new file mode 100644 index 0000000..feec52b --- /dev/null +++ b/src/main/resources/templates/admin/adminOrderLockFail.html @@ -0,0 +1,33 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + + + + + 관리자 주문 배송 처리 실패 : ${order.number} + + + + + + +
+ + + + + 주문 내역 보기 +
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/admin/adminOrderShipped.html b/src/main/resources/templates/admin/adminOrderShipped.html new file mode 100644 index 0000000..93cc694 --- /dev/null +++ b/src/main/resources/templates/admin/adminOrderShipped.html @@ -0,0 +1,33 @@ +<%@ page contentType="text/html; charset=utf-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + + + + + 관리자 주문 배송 처리 : ${order.number} + + + + + + +
+ + + + + 주문 내역 보기 +
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/admin/adminOrders.html b/src/main/resources/templates/admin/adminOrders.html new file mode 100644 index 0000000..899e404 --- /dev/null +++ b/src/main/resources/templates/admin/adminOrders.html @@ -0,0 +1,64 @@ + + + + + 관리자 : 주문 목록 + + + + +
+ +
+ + +

주문 목록

+ + + + + + + + + + + + + + + + + + + +
주문번호금액상태상품
주문번호구매금액상태[[${order.productName}]] 등
+ + +
+ +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/category/categoryList.html b/src/main/resources/templates/category/categoryList.html new file mode 100644 index 0000000..b6309d6 --- /dev/null +++ b/src/main/resources/templates/category/categoryList.html @@ -0,0 +1,24 @@ + + + + + 카테고리 목록 + + + + +
+ +
+

카테고리 목록

+
    +
  • + +
  • +
+
+ +
+ + + diff --git a/src/main/resources/templates/category/productDetail.html b/src/main/resources/templates/category/productDetail.html new file mode 100644 index 0000000..c441da2 --- /dev/null +++ b/src/main/resources/templates/category/productDetail.html @@ -0,0 +1,57 @@ + + + + + 제품 상세 + + + + +
+ +
+
+
+
+
+
+
제품명
+

+ 가격 : +
+ 상세 : +

+ +
+
+
+
+ + +
+ + + + + +
+ + +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/category/productList.html b/src/main/resources/templates/category/productList.html new file mode 100644 index 0000000..15cbaa4 --- /dev/null +++ b/src/main/resources/templates/category/productList.html @@ -0,0 +1,38 @@ + + + + + 제품 목록 + + + + +
+ +
+

카테고리

+ + 상품이 없습니다. + +
+
+
+ + + +
+
+
+
이름
+

가격 : [[${product.price}]]

+
+
+
+
+
+ +
+ + + diff --git a/src/main/resources/templates/fragments/layout.html b/src/main/resources/templates/fragments/layout.html new file mode 100644 index 0000000..c95bcc4 --- /dev/null +++ b/src/main/resources/templates/fragments/layout.html @@ -0,0 +1,42 @@ + + + + + Title + + + + + + + + + + +
+

도메인 구현 시작하기, 문의: madvirus@madvirus.net

+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000..64d1b15 --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,22 @@ + + + + + 마이샵 + + + + +
+ +
+
+

오늘의 특가

+

라즈베리파이 3

+ 상품 보기 +
+
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/loggedOut.html b/src/main/resources/templates/loggedOut.html new file mode 100644 index 0000000..7af7b10 --- /dev/null +++ b/src/main/resources/templates/loggedOut.html @@ -0,0 +1,20 @@ + + + + + 마이샵 + + + + +
+ +
+ +
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..2603ffd --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,29 @@ + + + + + 로그인 + + + + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/my/myMain.html b/src/main/resources/templates/my/myMain.html new file mode 100644 index 0000000..eb2141c --- /dev/null +++ b/src/main/resources/templates/my/myMain.html @@ -0,0 +1,22 @@ + + + + + 마이샵 + + + + +
+ +
+

user

+ +
+ +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/my/noOrder.html b/src/main/resources/templates/my/noOrder.html new file mode 100644 index 0000000..5a45b22 --- /dev/null +++ b/src/main/resources/templates/my/noOrder.html @@ -0,0 +1,21 @@ + + + + + 내 주문 + + + + +
+ +
+ +
+ +
+ + + diff --git a/src/main/resources/templates/my/notYourOrder.html b/src/main/resources/templates/my/notYourOrder.html new file mode 100644 index 0000000..7127bc8 --- /dev/null +++ b/src/main/resources/templates/my/notYourOrder.html @@ -0,0 +1,21 @@ + + + + + 내 주문 + + + + +
+ +
+ +
+ +
+ + + diff --git a/src/main/resources/templates/my/orderCanceled.html b/src/main/resources/templates/my/orderCanceled.html new file mode 100644 index 0000000..6efd018 --- /dev/null +++ b/src/main/resources/templates/my/orderCanceled.html @@ -0,0 +1,25 @@ + + + + + 마이샵 + + + + +
+ +
+ + + 주문 내역 보기 + 주문 목록 보기 + 첫 화면으로 이동하기 +
+ +
+ + + diff --git a/src/main/resources/templates/my/orderDetail.html b/src/main/resources/templates/my/orderDetail.html new file mode 100644 index 0000000..8a23134 --- /dev/null +++ b/src/main/resources/templates/my/orderDetail.html @@ -0,0 +1,99 @@ + + + + + 주문 상세 + + + + +
+ +
+

주문 상세

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
주문번호
상태
주문자이름
받는사람이름
연락처
주소 + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
상품가격개수
총합총합
+ + + + + 주문 목록 보기 + 첫 화면으로 이동하기 +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/my/orders.html b/src/main/resources/templates/my/orders.html new file mode 100644 index 0000000..645a18b --- /dev/null +++ b/src/main/resources/templates/my/orders.html @@ -0,0 +1,42 @@ + + + + + 마이샵 + + + + +
+ +
+

주문 목록

+ + + + + + + + + + + + + + + + + + + + +
주문번호금액상태상품
주문번호금액상태제품명
+
+ +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/order/confirm.html b/src/main/resources/templates/order/confirm.html new file mode 100644 index 0000000..2359074 --- /dev/null +++ b/src/main/resources/templates/order/confirm.html @@ -0,0 +1,138 @@ + + + + + 주문 확인 + + + + +
+ +
+
+
+
+
주문자
+
+ +
+ +
+
+
+
+ +
+
+
주문 상품
+ + + + + + + + + + + + + + + + + + + + + + + +
상품가격개수
제품명10001 + + + 금액
총합총합
+
+
+ +
+
+
받는 사람
+
+ +
+ +
+ 입력 오류 메시지 +
+
+
+
+ +
+ +
+ 입력 오류 메시지 +
+
+
+
+ +
+ +
+ 입력 오류 메시지 +
+
+
+
+ +
+ +
+ 입력 오류 메시지 +
+
+
+
+ +
+ +
+ 입력 오류 메시지 +
+
+
+
+
+ + +
+
+ +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/order/noProduct.html b/src/main/resources/templates/order/noProduct.html new file mode 100644 index 0000000..ab020b8 --- /dev/null +++ b/src/main/resources/templates/order/noProduct.html @@ -0,0 +1,21 @@ + + + + + 마이샵 + + + + +
+ +
+ +
+ +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/order/orderComplete.html b/src/main/resources/templates/order/orderComplete.html new file mode 100644 index 0000000..da225d0 --- /dev/null +++ b/src/main/resources/templates/order/orderComplete.html @@ -0,0 +1,24 @@ + + + + + 마이샵 + + + + +
+ +
+ + + 주문 내역 보기 + 첫 화면으로 이동하기 +
+ +
+ + + \ No newline at end of file diff --git a/src/sql/ddl.sql b/src/sql/ddl.sql new file mode 100644 index 0000000..986ea1e --- /dev/null +++ b/src/sql/ddl.sql @@ -0,0 +1,106 @@ +create database shop character set utf8mb4 collate utf8mb4_general_ci; + +CREATE USER 'shopuser'@'localhost' IDENTIFIED BY 'shoppass'; +CREATE USER 'shopuser'@'%' IDENTIFIED BY 'shoppass'; + +GRANT ALL PRIVILEGES ON shop.* TO 'shopuser'@'localhost'; +GRANT ALL PRIVILEGES ON shop.* TO 'shopuser'@'%'; + +use shop; + +create table shop.purchase_order ( + order_number varchar(50) not null primary key, + version bigint, + orderer_id varchar(50), + orderer_name varchar(50), + total_amounts int, + shipping_zip_code varchar(6), + shipping_addr1 varchar(100), + shipping_addr2 varchar(100), + shipping_message varchar(200), + receiver_name varchar(50), + receiver_phone varchar(50), + state varchar(20), + order_date datetime +) character set utf8mb4; + +create table shop.order_line ( + order_number varchar(50) not null, + line_idx int not null, + product_id varchar(50) not null, + price int, + quantity int, + amounts int +) character set utf8mb4; + +create index order_line_idx ON order_line (order_number, line_idx); + +create table shop.category ( + category_id bigint not null primary key, + name varchar(100) +) character set utf8mb4; + +create table shop.product ( + product_id varchar(50) not null primary key, + name varchar(100), + price int, + detail text +) character set utf8mb4; + +create table shop.product_category ( + product_id varchar(50) not null, + category_id bigint not null, + constraint primary key (product_id, category_id) +) character set utf8mb4; + +create table shop.image ( + image_id int not null auto_increment primary key, + product_id varchar(50), + list_idx int, + image_type varchar(10), + image_path varchar(255), + upload_time datetime +) character set utf8mb4; + +create table shop.member ( + member_id varchar(50) not null primary key, + name varchar(50), + password varchar(255), + blocked boolean, + emails varchar(200) +) character set utf8mb4; + +create table shop.member_authorities ( + member_id varchar(50) not null, + authority varchar(50) not null, + primary key (member_id, authority) +) character set utf8mb4; + +create table shop.article ( + id int not null auto_increment primary key, + title varchar(255) +) character set utf8mb4; + +create table shop.article_content ( + id int not null primary key, + content varchar(255), + content_type varchar(255) +) character set utf8mb4; + +create table shop.evententry ( + id int not null AUTO_INCREMENT PRIMARY KEY, + `type` varchar(255), + `content_type` varchar(255), + payload MEDIUMTEXT, + `timestamp` datetime +) character set utf8mb4; + +create table shop.locks ( + `type` varchar(255), + id varchar(255), + lockid varchar(255), + expiration_time datetime, + primary key (`type`, id) +) character set utf8mb4; + +create unique index locks_idx ON shop.locks (lockid); \ No newline at end of file diff --git a/src/sql/init.sql b/src/sql/init.sql new file mode 100644 index 0000000..a7ad61b --- /dev/null +++ b/src/sql/init.sql @@ -0,0 +1,46 @@ +use shop; + +truncate table purchase_order; +truncate table order_line; +truncate table category; +truncate table product_category; +truncate table product; +truncate table image; +truncate table member; +truncate table member_authorities; +truncate table article; +truncate table article_content; +truncate table evententry; + +insert into member (member_id, name, password, blocked) values ('user1', '사용자1', '1234', false); +insert into member (member_id, name, password, blocked) values ('user2', '사용자2', '5678', false); +insert into member (member_id, name, password, blocked) values ('admin', '운영자', 'admin1234', false); +insert into member_authorities values ('user1', 'ROLE_USER'); +insert into member_authorities values ('user2', 'ROLE_USER'); +insert into member_authorities values ('admin', 'ROLE_ADMIN'); + +insert into category values (1001, '전자제품'); +insert into category values (2001, '필기구'); + +insert into product values ('prod-001', '라즈베리파이3 모델B', 56000, '모델B'); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-001', 0, 'II', 'rpi3.jpg', now()); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-001', 1, 'EI', 'http://external/image/path', now()); + +insert into product_category values ('prod-001', 1001); + +insert into product values ('prod-002', '어프로치 휴대용 화이트보드 세트', 11920, '화이트보드'); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-002', 0, 'II', 'wbp.png', now()); + +insert into product_category values ('prod-002', 2001); + +insert into product values ('prod-003', '볼펜 겸용 터치펜', 9000, '볼펜과 터치펜을 하나로!'); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-003', 0, 'II', 'pen.jpg', now()); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-003', 1, 'II', 'pen2.jpg', now()); + +insert into product_category values ('prod-003', 1001); +insert into product_category values ('prod-003', 2001); \ No newline at end of file diff --git a/src/test/java/com/myshop/ShopApplicationTests.java b/src/test/java/com/myshop/ShopApplicationTests.java new file mode 100644 index 0000000..7f537a2 --- /dev/null +++ b/src/test/java/com/myshop/ShopApplicationTests.java @@ -0,0 +1,13 @@ +package com.myshop; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ShopApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/src/test/java/com/myshop/board/domain/ArticleRepositoryIT.java b/src/test/java/com/myshop/board/domain/ArticleRepositoryIT.java new file mode 100644 index 0000000..ca1108f --- /dev/null +++ b/src/test/java/com/myshop/board/domain/ArticleRepositoryIT.java @@ -0,0 +1,70 @@ +package com.myshop.board.domain; + +import com.myshop.helper.DbHelper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +public class ArticleRepositoryIT { + @Autowired + private ArticleRepository articleRepository; + @Autowired + private JdbcTemplate jdbcTemplate; + + private DbHelper dbHelper; + + @BeforeEach + void setUp() { + dbHelper = new DbHelper(jdbcTemplate); + dbHelper.clear(); + } + + @Test + void save() { + Article aritcle = new Article("title", + new ArticleContent("content", "type") + ); + articleRepository.save(aritcle); + + SqlRowSet rsArticle = jdbcTemplate.queryForRowSet( + "select * from article where id = ?", + aritcle.getId()); + assertThat(rsArticle.next()).isTrue(); + assertThat(rsArticle.getString("title")).isEqualTo("title"); + + SqlRowSet rsContent = jdbcTemplate.queryForRowSet( + "select * from article_content where id = ?", + aritcle.getId()); + assertThat(rsContent.next()).isTrue(); + assertThat(rsContent.getString("content")).isEqualTo("content"); + assertThat(rsContent.getString("content_type")).isEqualTo("type"); + } + + @Test + void findByIdNoData() { + assertThat(articleRepository.findById(0L)).isEmpty(); + } + + @Test + void findById() { + jdbcTemplate.update("insert into article values (100, 'title')"); + jdbcTemplate.update("insert into article_content values (100, 'content', 'type')"); + + Optional
articleOpt = articleRepository.findById(100L); + assertThat(articleOpt).isPresent(); + Article article = articleOpt.get(); + assertThat(article.getTitle()).isEqualTo("title"); + assertThat(article.getContent().getContent()).isEqualTo("content"); + assertThat(article.getContent().getContentType()).isEqualTo("type"); + } +} diff --git a/src/test/java/com/myshop/catalog/command/domain/product/ProductRepositoryIT.java b/src/test/java/com/myshop/catalog/command/domain/product/ProductRepositoryIT.java new file mode 100644 index 0000000..bace421 --- /dev/null +++ b/src/test/java/com/myshop/catalog/command/domain/product/ProductRepositoryIT.java @@ -0,0 +1,72 @@ +package com.myshop.catalog.command.domain.product; + +import com.myshop.common.model.Money; +import com.myshop.helper.DbHelper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class ProductRepositoryIT { + @Autowired + private ProductRepository productRepository; + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private DbHelper dbHelper; + + @BeforeEach + void setUp() { + dbHelper.clear(); + } + + @Test + void save() { + List images = new ArrayList<>(); + images.add(new ExternalImage("https://extern.image.com/some-img.png")); + images.add(new InternalImage("internal-img.png")); + Product product = new Product( + ProductId.of("PRD-01"), + "제품-01", + new Money(9000), + "상세 내용", + images); + productRepository.save(product); + + SqlRowSet rsProd = jdbcTemplate.queryForRowSet("select * from product where product_id = ?", "PRD-01"); + assertThat(rsProd.next()).isTrue(); + assertThat(rsProd.getInt("price")).isEqualTo(9000); + + SqlRowSet rsImg = jdbcTemplate.queryForRowSet("select * from image where product_id = ? order by list_idx", "PRD-01"); + assertThat(rsImg.next()).isTrue(); + assertThat(rsImg.getString("image_type")).isEqualTo("EI"); + } + + @Transactional + @Test + void updateImages() { + jdbcTemplate.update("insert into product values (?,?,?,?)", "PROD-02", "PRD 2", 10000, "상세"); + jdbcTemplate.update("insert into image values (?,?,?,?,?,?)", + 1, "PROD-02", 0, "EI", "http://images.img/img.01.png", LocalDateTime.now()); + jdbcTemplate.update("insert into image values (?,?,?,?,?,?)", + 2, "PROD-02", 1, "EI", "http://images.img/img.02.png", LocalDateTime.now()); + + Product product = productRepository.findById(ProductId.of("PROD-02")).get(); + product.changeImages(List.of( + new InternalImage("/path01.png"), + new InternalImage("/path02.png") + )); + productRepository.flush(); + } +} \ No newline at end of file diff --git a/src/test/java/com/myshop/catalog/domain/category/CategoryRepositoryIT.java b/src/test/java/com/myshop/catalog/domain/category/CategoryRepositoryIT.java new file mode 100644 index 0000000..2729180 --- /dev/null +++ b/src/test/java/com/myshop/catalog/domain/category/CategoryRepositoryIT.java @@ -0,0 +1,45 @@ +package com.myshop.catalog.domain.category; + +import com.myshop.catalog.command.domain.category.Category; +import com.myshop.catalog.command.domain.category.CategoryId; +import com.myshop.catalog.command.domain.category.CategoryRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +class CategoryRepositoryIT { + @Autowired + private CategoryRepository categoryRepository; + @Autowired + private JdbcTemplate jdbcTemplate; + + @BeforeEach + void setUp() { + jdbcTemplate.update("truncate table category"); + jdbcTemplate.update("insert into category values (1, 'cat1')"); + jdbcTemplate.update("insert into category values (2, 'cat2')"); + } + + @Test + void findAll() { + List categories = categoryRepository.findAll(); + assertThat(categories).hasSize(2); + } + + @Test + void findById() { + Optional catOpt = categoryRepository.findById(CategoryId.of(2L)); + assertThat(catOpt).isPresent(); + assertThat(catOpt.get().getName()).isEqualTo("cat2"); + } +} \ No newline at end of file diff --git a/src/test/java/com/myshop/catalog/domain/product/ProductRepositoryIT.java b/src/test/java/com/myshop/catalog/domain/product/ProductRepositoryIT.java new file mode 100644 index 0000000..a152818 --- /dev/null +++ b/src/test/java/com/myshop/catalog/domain/product/ProductRepositoryIT.java @@ -0,0 +1,13 @@ +package com.myshop.catalog.domain.product; + +import com.myshop.catalog.command.domain.product.ProductRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ProductRepositoryIT { + @Autowired + private ProductRepository productRepository; + + +} \ No newline at end of file diff --git a/src/test/java/com/myshop/catalog/query/product/ProductDataDaoIT.java b/src/test/java/com/myshop/catalog/query/product/ProductDataDaoIT.java new file mode 100644 index 0000000..4b6d5ae --- /dev/null +++ b/src/test/java/com/myshop/catalog/query/product/ProductDataDaoIT.java @@ -0,0 +1,60 @@ +package com.myshop.catalog.query.product; + +import com.myshop.catalog.command.domain.category.CategoryId; +import com.myshop.catalog.command.domain.product.ProductId; +import com.myshop.helper.DbHelper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.time.LocalDateTime; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class ProductDataDaoIT { + @Autowired + private ProductDataDao productDataDao; + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private DbHelper dbHelper; + + @BeforeEach + void setUp() { + dbHelper.clear(); + } + + @Test + void findByCategoryIds() { + jdbcTemplate.update("insert into product values (?,?,?,?)", "PROD-01", "PRD 1", 10000, "상세"); + jdbcTemplate.update("insert into image values (?,?,?,?,?,?)", + 1, "PROD-02", 0, "EI", "http://images.img/img.01.png", LocalDateTime.now()); + jdbcTemplate.update("insert into product_category values (?, ?)", "PROD-01", 1); + jdbcTemplate.update("insert into product_category values (?, ?)", "PROD-01", 2); + + jdbcTemplate.update("insert into product values (?,?,?,?)", "PROD-02", "PRD 2", 10000, "상세"); + jdbcTemplate.update("insert into product_category values (?, ?)", "PROD-02", 2); + jdbcTemplate.update("insert into product_category values (?, ?)", "PROD-02", 3); + + jdbcTemplate.update("insert into product values (?,?,?,?)", "PROD-03", "PRD 3", 10000, "상세"); + jdbcTemplate.update("insert into product_category values (?, ?)", "PROD-03", 2); + jdbcTemplate.update("insert into product_category values (?, ?)", "PROD-03", 3); + + jdbcTemplate.update("insert into product values (?,?,?,?)", "PROD-04", "PRD 4", 10000, "상세"); + jdbcTemplate.update("insert into product_category values (?, ?)", "PROD-04", 1); + jdbcTemplate.update("insert into product_category values (?, ?)", "PROD-04", 3); + + PageRequest pageRequest = PageRequest.of(0, 2, Sort.by(Sort.Direction.DESC, "id")); + Page products = productDataDao.findByCategoryIdsContains(CategoryId.of(2L), pageRequest); + assertThat(products.getNumberOfElements()).isEqualTo(2); + assertThat(products.getContent()).hasSize(2); + assertThat(products.getContent().get(0).getId()).isEqualTo(ProductId.of("PROD-03")); + assertThat(products.getContent().get(1).getId()).isEqualTo(ProductId.of("PROD-02")); + } +} \ No newline at end of file diff --git a/src/test/java/com/myshop/helper/DbHelper.java b/src/test/java/com/myshop/helper/DbHelper.java new file mode 100644 index 0000000..f77ed62 --- /dev/null +++ b/src/test/java/com/myshop/helper/DbHelper.java @@ -0,0 +1,25 @@ +package com.myshop.helper; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +@Component +public class DbHelper { + private JdbcTemplate jdbcTemplate; + + public DbHelper(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public void clear() { + jdbcTemplate.update("truncate table member"); + jdbcTemplate.update("truncate table article"); + jdbcTemplate.update("truncate table article_content"); + jdbcTemplate.update("truncate table purchase_order"); + jdbcTemplate.update("truncate table order_line"); + jdbcTemplate.update("truncate table product"); + jdbcTemplate.update("truncate table image"); + jdbcTemplate.update("truncate table category"); + jdbcTemplate.update("truncate table product_category"); + } +} diff --git a/src/test/java/com/myshop/member/command/domain/MemberRepositoryIT.java b/src/test/java/com/myshop/member/command/domain/MemberRepositoryIT.java new file mode 100644 index 0000000..2d95df1 --- /dev/null +++ b/src/test/java/com/myshop/member/command/domain/MemberRepositoryIT.java @@ -0,0 +1,71 @@ +package com.myshop.member.command.domain; + +import com.myshop.common.model.Email; +import com.myshop.helper.DbHelper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.rowset.SqlRowSet; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.LockModeType; +import java.util.Optional; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class MemberRepositoryIT { + @Autowired + private MemberRepository memberRepository; + @Autowired + private DbHelper dbHelper; + @Autowired + private JdbcTemplate jdbcTemplate; + + @BeforeEach + void setUp() { + dbHelper.clear(); + } + + @Test + void findById() { + jdbcTemplate.update( + """ + insert into member values (?, ?, ?, ?, ?) + """, + "member1", "이름", "p1", false, "email1@email.com,email2@email.com" + ); + Optional memOpt = memberRepository.findById(MemberId.of("member1")); + assertThat(memOpt).isPresent(); + Member member = memOpt.get(); + assertThat(member.getEmails().getEmails()).contains( + Email.of("email1@email.com"), Email.of("email2@email.com") + ); + } + + @Test + void save() { + Member member = new Member(MemberId.of("id1"), "이름2"); + member.changeEmails(Set.of(Email.of("mail1@mail.com"), Email.of("mail2@mail.com"))); + memberRepository.save(member); + + SqlRowSet rs = jdbcTemplate.queryForRowSet("select * from member where member_id = ?", "id1"); + assertThat(rs.next()).isTrue(); + assertThat(rs.getString("emails")).contains("mail1@mail.com", "mail2@mail.com"); + } + + @Transactional + @Test + void findByIdForUpdate() { + jdbcTemplate.update( + """ + insert into member values (?, ?, ?, ?, ?) + """, + "member1", "이름", "p1", false, "email1@email.com,email2@email.com" + ); + Optional member1 = memberRepository.findByIdForUpdate(MemberId.of("member1")); + } +} \ No newline at end of file diff --git a/src/test/java/com/myshop/member/query/MemberDataDaoIT.java b/src/test/java/com/myshop/member/query/MemberDataDaoIT.java new file mode 100644 index 0000000..b03f5d2 --- /dev/null +++ b/src/test/java/com/myshop/member/query/MemberDataDaoIT.java @@ -0,0 +1,106 @@ +package com.myshop.member.query; + +import com.myshop.common.jpa.Rangeable; +import com.myshop.common.jpa.SpecBuilder; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Optional; + +@SpringBootTest +@Sql("classpath:shop-init-test.sql") +class MemberDataDaoIT { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private MemberDataDao memberDataDao; + + @Test + void findByBlocked() { + Page page = memberDataDao.findByBlocked(false, PageRequest.of(2, 3)); + logger.info("blocked result: {}", page.getContent().size()); + List content = page.getContent(); + long totalElements = page.getTotalElements(); + int totalPages = page.getTotalPages(); + int number = page.getNumber(); + int numberOfElements = page.getNumberOfElements(); + int size = page.getSize(); + logger.info("content.size()={}, totalElements={}, totalPages={}, number={}, numberOfElements={}", + content.size(), totalElements, totalPages, number, numberOfElements); + } + + @Test + void findByNameLike() { + Sort sort = Sort.by("name").descending(); + PageRequest pageReq = PageRequest.of(1, 2, sort); + List user = memberDataDao.findByNameLike("사용자%", pageReq); + logger.info("name llike result: {}", user.size()); + } + + @Test + void findAll() { + Specification spec = MemberDataSpecs.nonBlocked(); + List result = memberDataDao.findAll(spec, PageRequest.of(1, 2)); + logger.info("spec result: {}", result.size()); + } + + @Test + void getRange() { + Specification spec = MemberDataSpecs.nonBlocked(); + List result = memberDataDao.getRange(spec, Rangeable.of(2, 4)); + logger.info("spec result: {}", result.size()); + } + + @Test + void findFirst() { + List result = memberDataDao.findFirst3ByNameLikeOrderByName("사용자%"); + logger.info("result: {}", result.size()); + + Optional member = memberDataDao.findFirstByNameLikeOrderByName("없음"); + logger.info("result: {}", member); + MemberData data = memberDataDao.findFirstByBlockedOrderById(false); + logger.info("result: {}", data); + } + + + @Test + void compositeSpec() { + SearchRequest searchRequest = new SearchRequest(); + Specification spec = Specification.where(null); + if (searchRequest.isOnlyNotBlocked()) { + spec = spec.and(MemberDataSpecs.nonBlocked()); + } + if (StringUtils.hasText(searchRequest.getName())) { + spec = spec.and(MemberDataSpecs.nameLike(searchRequest.getName())); + } + List result = memberDataDao.findAll(spec, PageRequest.of(0, 5)); + logger.info("result: {}", result.size()); + } + + @Test + void specBuilder() { + SearchRequest searchRequest = new SearchRequest(); + searchRequest.setOnlyNotBlocked(true); + Specification spec = SpecBuilder.builder(MemberData.class) + .ifTrue( + searchRequest.isOnlyNotBlocked(), + () -> MemberDataSpecs.nonBlocked()) + .ifHasText( + searchRequest.getName(), + name -> MemberDataSpecs.nameLike(searchRequest.getName())) + .toSpec(); + List result = memberDataDao.findAll(spec, PageRequest.of(0, 5)); + logger.info("result: {}", result.size()); + } + +} \ No newline at end of file diff --git a/src/test/java/com/myshop/member/query/SearchRequest.java b/src/test/java/com/myshop/member/query/SearchRequest.java new file mode 100644 index 0000000..45436de --- /dev/null +++ b/src/test/java/com/myshop/member/query/SearchRequest.java @@ -0,0 +1,22 @@ +package com.myshop.member.query; + +public class SearchRequest { + private boolean onlyNotBlocked; + private String name; + + public boolean isOnlyNotBlocked() { + return onlyNotBlocked; + } + + public void setOnlyNotBlocked(boolean onlyNotBlocked) { + this.onlyNotBlocked = onlyNotBlocked; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/test/java/com/myshop/order/command/application/CancelOrderServiceIT.java b/src/test/java/com/myshop/order/command/application/CancelOrderServiceIT.java new file mode 100644 index 0000000..f18ff87 --- /dev/null +++ b/src/test/java/com/myshop/order/command/application/CancelOrderServiceIT.java @@ -0,0 +1,20 @@ +package com.myshop.order.command.application; + +import com.myshop.order.command.domain.Canceller; +import com.myshop.order.command.domain.OrderNo; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; + +@SpringBootTest +@Sql("classpath:shop-init-test.sql") +class CancelOrderServiceIT { + @Autowired + private CancelOrderService cancelOrderService; + + @Test + void cancel() { + cancelOrderService.cancel(OrderNo.of("ORDER-001"), Canceller.of("user1")); + } +} \ No newline at end of file diff --git a/src/test/java/com/myshop/order/command/domain/OrderRepositoryIT.java b/src/test/java/com/myshop/order/command/domain/OrderRepositoryIT.java new file mode 100644 index 0000000..d78bd2d --- /dev/null +++ b/src/test/java/com/myshop/order/command/domain/OrderRepositoryIT.java @@ -0,0 +1,80 @@ +package com.myshop.order.command.domain; + +import com.myshop.catalog.command.domain.product.ProductId; +import com.myshop.common.model.Address; +import com.myshop.common.model.Money; +import com.myshop.helper.DbHelper; +import com.myshop.member.command.domain.MemberId; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class OrderRepositoryIT { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private OrderRepository orderRepository; + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private DbHelper dbHelper; + + @BeforeEach + void setUp() { + dbHelper.clear(); + } + + @Test + void save() { + orderRepository.save(new Order( + OrderNo.of("ORD1234"), + new Orderer(MemberId.of("member"), "name"), + List.of(new OrderLine(ProductId.of("PRDID"), new Money(1000), 2)), + new ShippingInfo(new Address("12345", "addr1", "addr2"), "집앞", + new Receiver("아무개", "010-0000-0000")), + OrderState.PAYMENT_WAITING + )); + } + + @Test + void findById() { + jdbcTemplate.update( + """ + insert into purchase_order + values (?,?,?,?,?,?,?,?,?,?,?,?,?) + """, + "ORD1234", 1, "user1", "사용자1", 5000, + "11122", "주소1", "주소2", "1층", + "받는사람", "010-1234-5689", + OrderState.PAYMENT_WAITING.name(), LocalDateTime.now() + ); + jdbcTemplate.update( + """ + insert into order_line + values (?,?,?,?,?,?) + """, + "ORD1234", 0, "PROD1", 1000, 5, 5000 + ); + Optional ordOpt = orderRepository.findById(OrderNo.of("ORD1234")); + assertThat(ordOpt).isPresent(); + Order order = ordOpt.get(); + assertThat(order.getOrderLines()).hasSize(1); + } + + @Test + void nextOrderNo() { + OrderNo orderNo = orderRepository.nextOrderNo(); + logger.info("nextOrderNo: {}", orderNo.getNumber()); + } +} \ No newline at end of file diff --git a/src/test/java/com/myshop/order/query/dao/OrderSummaryDaoIT.java b/src/test/java/com/myshop/order/query/dao/OrderSummaryDaoIT.java new file mode 100644 index 0000000..ac83689 --- /dev/null +++ b/src/test/java/com/myshop/order/query/dao/OrderSummaryDaoIT.java @@ -0,0 +1,90 @@ +package com.myshop.order.query.dao; + +import com.myshop.order.query.dto.OrderSummary; +import com.myshop.order.query.dto.OrderView; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.test.context.jdbc.Sql; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@Sql("classpath:shop-init-test.sql") +class OrderSummaryDaoIT { + @Autowired + private OrderSummaryDao orderSummaryDao; + + @Test + void findAllSpec() { + LocalDateTime from = LocalDateTime.of(2022, 1, 1, 0, 0, 0); + LocalDateTime to = LocalDateTime.of(2022, 1, 2, 0, 0, 0); + + Specification spec = OrderSummarySpecs.ordererId("user1") + .and(OrderSummarySpecs.orderDateBetween(from, to)); + + List results = orderSummaryDao.findAll(spec); + assertThat(results).hasSize(1); + } + + @Test + void findAllSpecSort() { + LocalDateTime from = LocalDateTime.of(2022, 1, 1, 0, 0, 0); + LocalDateTime to = LocalDateTime.of(2022, 1, 2, 0, 0, 0); + + Specification spec = OrderSummarySpecs.ordererId("user1") + .and(OrderSummarySpecs.orderDateBetween(from, to)); + + Sort sort = Sort.by("number").ascending().and(Sort.by("orderDate").descending()); + + List results = orderSummaryDao.findAll(spec, sort); + assertThat(results).hasSize(1); + } + + @Test + void findAllSpecPageable() { + LocalDateTime from = LocalDateTime.of(2022, 1, 1, 0, 0, 0); + LocalDateTime to = LocalDateTime.of(2023, 1, 2, 0, 0, 0); + + Specification spec = OrderSummarySpecs.orderDateBetween(from, to); + + Pageable pageable = PageRequest.of(1, 1); + List results = orderSummaryDao.findAll(spec, pageable); + assertThat(results).hasSize(2); + } + + @Test + void findByOrdererIdOrderByNumberDesc() { + List results = orderSummaryDao.findByOrdererIdOrderByNumberDesc("user1"); + assertThat(results.get(0).getNumber()).isEqualTo("ORDER-002"); + assertThat(results.get(1).getNumber()).isEqualTo("ORDER-001"); + } + + @Test + void findByOrdererIdSort() { + Sort sort = Sort.by("number").ascending(); + List results = orderSummaryDao.findByOrdererId("user1", sort); + assertThat(results.get(0).getNumber()).isEqualTo("ORDER-001"); + assertThat(results.get(1).getNumber()).isEqualTo("ORDER-002"); + } + + @Test + void findByOrdererIdPageable() { + Pageable pageable = PageRequest.of(1, 1); + List results = orderSummaryDao.findByOrdererId("user1", pageable); + assertThat(results.get(0).getNumber()).isEqualTo("ORDER-001"); + assertThat(results.get(1).getNumber()).isEqualTo("ORDER-002"); + } + + @Test + void findOrderView() { + List result = orderSummaryDao.findOrderView("user1"); + } +} \ No newline at end of file diff --git a/src/test/resources/shop-init-test.sql b/src/test/resources/shop-init-test.sql new file mode 100644 index 0000000..7a80c99 --- /dev/null +++ b/src/test/resources/shop-init-test.sql @@ -0,0 +1,85 @@ +truncate table purchase_order; +truncate table order_line; +truncate table category; +truncate table product_category; +truncate table product; +truncate table image; +truncate table member; +truncate table member_authorities; +truncate table article; +truncate table article_content; +truncate table evententry; + +insert into member (member_id, name, password, blocked) values ('user1', '사용자1', '1234', false); +insert into member (member_id, name, password, blocked) values ('user2', '사용자2', '5678', false); +insert into member (member_id, name, password, blocked) values ('user3', '사용자3', '5678', true); +insert into member (member_id, name, password, blocked) values ('user4', '사용자4', '5678', true); +insert into member (member_id, name, password, blocked) values ('user5', '사용자5', '5678', false); +insert into member (member_id, name, password, blocked) values ('user6', '사용자6', '5678', false); +insert into member (member_id, name, password, blocked) values ('user7', '사용자7', '5678', false); +insert into member (member_id, name, password, blocked) values ('user8', '사용자8', '5678', false); +insert into member (member_id, name, password, blocked) values ('admin', '운영자', 'admin1234', false); +insert into member_authorities values ('user1', 'ROLE_USER'); +insert into member_authorities values ('user2', 'ROLE_USER'); +insert into member_authorities values ('admin', 'ROLE_ADMIN'); + +insert into category values (1001, '전자제품'); +insert into category values (2001, '필기구'); + +insert into product values ('prod-001', '라즈베리파이3 모델B', 56000, '모델B'); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-001', 0, 'II', 'rpi3.jpg', now()); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-001', 1, 'EI', 'http://external/image/path', now()); + +insert into product_category values ('prod-001', 1001); + +insert into product values ('prod-002', '어프로치 휴대용 화이트보드 세트', 11920, '화이트보드'); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-002', 0, 'II', 'wbp.png', now()); + +insert into product_category values ('prod-002', 2001); + +insert into product values ('prod-003', '볼펜 겸용 터치펜', 9000, '볼펜과 터치펜을 하나로!'); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-003', 0, 'II', 'pen.jpg', now()); +insert into image (product_id, list_idx, image_type, image_path, upload_time) values + ('prod-003', 1, 'II', 'pen2.jpg', now()); + +insert into product_category values ('prod-003', 1001); +insert into product_category values ('prod-003', 2001); + +insert into purchase_order values ( +'ORDER-001', 1, 'user1', '사용자1', 4000, +'123456', '서울시', '관악구', '메시지', +'사용자1', '010-1234-5678', 'PREPARING', '2022-01-01 15:30:00' +); + +insert into order_line values ('ORDER-001', 0, 'prod-001', 1000, 2, 2000); +insert into order_line values ('ORDER-001', 1, 'prod-002', 2000, 1, 2000); + +insert into purchase_order values ( +'ORDER-002', 2, 'user1', '사용자1', 5000, +'123456', '서울시', '관악구', '메시지', +'사용자1', '010-1234-5678', 'PREPARING', '2022-01-02 09:18:21' +); +insert into order_line values ('ORDER-002', 0, 'prod-001', 1000, 5, 5000); + +insert into purchase_order values ( +'ORDER-003', 3, 'user2', '사용자2', 5000, +'123456', '서울시', '관악구', '메시지', +'사용자1', '010-1234-5678', 'SHIPPED', '2016-01-03 09:00:00' +); +insert into order_line values ('ORDER-003', 0, 'prod-001', 1000, 5, 5000); + +insert into article (title) values ('제목'); +insert into article_content values (1, 'content', 'type'); + +insert into evententry (type, content_type, payload, timestamp) values + ('com.myshop.eventstore.infra.SampleEvent', 'application/json', '{"name": "name1", "value": 11}', now()); +insert into evententry (type, content_type, payload, timestamp) values + ('com.myshop.eventstore.infra.SampleEvent', 'application/json', '{"name": "name2", "value": 12}', now()); +insert into evententry (type, content_type, payload, timestamp) values + ('com.myshop.eventstore.infra.SampleEvent', 'application/json', '{"name": "name3", "value": 13}', now()); +insert into evententry (type, content_type, payload, timestamp) values + ('com.myshop.eventstore.infra.SampleEvent', 'application/json', '{"name": "name4", "value": 14}', now());