From ce2e5f75d85c97ef6533d5925a8581e7cb4f110c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 12 Apr 2025 15:09:24 +0300 Subject: [PATCH] docs: update backpressure description --- backpressure/README.md | 139 +++++------------- .../etc/backpressure-sequence-diagram.png | Bin 0 -> 66791 bytes backpressure/pom.xml | 26 ++++ .../com/iluwatar/backpressure/Publisher.java | 2 + bloc/README.md | 4 - clean-architecture/README.md | 1 - facade/README.md | 2 +- function-composition/README.md | 5 - map-reduce/README.md | 5 +- mediator/README.md | 2 +- .../README.md | 9 +- microservices-distributed-tracing/README.md | 7 +- microservices-idempotent-consumer/README.md | 5 +- money/README.md | 8 - monolithic-architecture/README.md | 4 - observer/README.md | 2 +- prototype/README.md | 2 +- proxy/README.md | 2 +- publish-subscribe/README.md | 3 - service-stub/README.md | 3 - session-facade/README.md | 6 - table-inheritance/README.md | 13 +- 22 files changed, 77 insertions(+), 173 deletions(-) create mode 100644 backpressure/etc/backpressure-sequence-diagram.png diff --git a/backpressure/README.md b/backpressure/README.md index 51a0307e1..d0734ad1f 100644 --- a/backpressure/README.md +++ b/backpressure/README.md @@ -1,65 +1,46 @@ --- -title: "Backpressure Pattern in Java: controlling data streams from producers to consumer inorder to prevent overwhelming the consumer" +title: "Backpressure Pattern in Java: Gracefully regulate producer-to-consumer data flow to prevent overload." shortTitle: Backpressure -description: "Explore the Backpressure design pattern in Java with detailed examples. Learn how it helps by preventing system overload, ensuring stability and optimal performance by matching data flow to the consumer’s processing capability." +description: "Dive into the Backpressure design pattern in Java through practical examples, discovering how it prevents overload while ensuring stability and peak performance by aligning data flow with consumer capacity." category: Concurrency language: en tag: - - Decoupling + - Asynchronous - Event-driven - Reactive + - Resilience --- +## Also known as + +* Flow Control +* Rate Limiting Mechanism + ## Intent of the Backpressure Design Pattern -The Backpressure Design Pattern is a strategy used in software systems (especially in data streaming, reactive programming, and distributed systems) -to handle situations where a fast producer overwhelms a slow consumer. The intent is to prevent system instability, resource exhaustion, or crashes by managing the flow of data between components. +Control the rate of data production so downstream consumers are not overwhelmed by excessive load. ## Detailed Explanation of Backpressure Pattern with Real-World Examples -### Real-world examples +Real-world example -#### 1. Real-Time Data Streaming (Reactive Systems) -- **Stock Market Data** - - High-frequency trading systems generate millions of price updates per second, but analytics engines can't process them all in real time. - - Backpressure mechanisms (e.g., in RxJava, Akka, Reactor) throttle or drop excess data to avoid overwhelming downstream systems. -- **IoT Sensor DataQ** - - Thousands of IoT devices (e.g., smart factories, wearables) send continuous telemetry, but cloud processing has limited capacity. - - Reactive frameworks apply backpressure to buffer, drop, or slow down data emission. +> Imagine a busy coffee shop where multiple baristas brew drinks (producers), and a single barista is responsible for carefully crafting latte art (consumer). If drinks are brewed faster than the latte-art barista can decorate them, they pile up, risking quality issues or discarded drinks. By introducing a pacing system—only sending new cups once the latte-art barista is ready—everyone stays synchronized, ensuring minimal waste and a consistently enjoyable customer experience. -#### 2. Message Queues (Kafka, RabbitMQ) -- **E-Commerce Order Processing** - - During flash sales (e.g., Black Friday), order requests spike, but payment and inventory systems can’t keep up. - - Message queues like Kafka and RabbitMQ use, Limited queue sizes to drop or reject messages when full or Consumer acknowledgments to slow producers if consumers lag. -- **Log Aggregation** - - Microservices generate massive logs, but centralized logging (E.g.: ELK Stack) can’t ingest them all at once. - - Kafka applies backpressure by pausing producers when consumers are slow. +In plain words -#### 3. Stream Processing (Apache Flink, Spark) -- **Social Media Trends (Twitter, TikTok)** - - Viral posts create sudden spikes in data, but trend analysis is computationally expensive. - - Backpressure in Spark Streaming prioritizes recent data and discards older, less relevant updates. -- **Fraud Detection in Banking** - - Millions of transactions flow in, but fraud detection models take time to analyze each one. - - slow down ingestion if processing lags (Throttling), save progress to recover from backpressure-induced delays (Checkpointing). +> The Backpressure design pattern is a flow control mechanism that prevents overwhelming a system by regulating data production based on the consumer’s processing capacity. -### In plain words +Wikipedia says -The Backpressure design pattern is a flow control mechanism that prevents overwhelming a system by regulating data production based on the consumer’s processing capacity. +> Back pressure (or backpressure) is the term for a resistance to the desired flow of fluid through pipes. Obstructions or tight bends create backpressure via friction loss and pressure drop. In distributed systems in particular event-driven architecture, back pressure is a technique to regulate flow of data, ensuring that components do not become overwhelmed. -### Wikipedia says +Sequence diagram -Back pressure (or backpressure) is the term for a resistance to the desired flow of fluid through pipes. Obstructions or tight bends create backpressure via friction loss and pressure drop. - -In distributed systems in particular event-driven architecture, back pressure is a technique to regulate flow of data, ensuring that components do not become overwhelmed. - -### Architectural Diagram -![backpressure](./etc/backpressure.png) +![Backpressure sequence diagram](./etc/backpressure-sequence-diagram.png) ## Programmatic Example of Backpressure Pattern in Java -First we will create a publisher that generates a data stream. -This publisher can generate a stream of integers. +This example demonstrates how backpressure can be implemented using Project Reactor. We begin by creating a simple publisher that emits a stream of integers, introducing a small delay to mimic a slower production rate: ```java public class Publisher { @@ -69,11 +50,7 @@ public class Publisher { } ``` -Then we can create a custom subscriber based on reactor BaseSubscriber. -It will take 500ms to process one item to simulate slow processing. -This subscriber will override following methods to apply backpressure on the publisher. -- hookOnSubscribe method and initially request for 10 items -- hookOnNext method which will process 5 items and request for 5 more items +Next, we define a custom subscriber by extending Reactor’s BaseSubscriber. It simulates slow processing by sleeping for 500ms per item. Initially, the subscriber requests ten items; for every five items processed, it requests five more: ```java public class Subscriber extends BaseSubscriber { @@ -111,7 +88,7 @@ public class Subscriber extends BaseSubscriber { } ``` -Then we can create the stream using the publisher and subscribe to that stream. +Finally, in the `main` method, we publish a range of integers and subscribe using the custom subscriber. A short sleep in the main thread allows the emission, backpressure requests, and processing to be fully observed: ```java public static void main(String[] args) throws InterruptedException { @@ -122,7 +99,7 @@ public static void main(String[] args) throws InterruptedException { } ``` -Program output: +Below is an example of the program’s output. It shows the subscriber’s log entries, including when it requests more data and when each integer is processed: ``` 23:09:55.746 [main] DEBUG reactor.util.Loggers -- Using Slf4j logging framework @@ -149,73 +126,31 @@ Program output: 23:10:01.437 [parallel-8] INFO reactor.Flux.ConcatMapNoPrefetch.1 -- onComplete() ``` -## When to Use the Backpressure Pattern +## When to Use the Backpressure Pattern In Java -- Producers Are Faster Than Consumers - - If a producer generates data at a much faster rate than the consumer can handle, backpressure prevents resource overload. - - Example: A server emitting events 10x faster than the client can process. - -- There’s Limited Memory or Resource Capacity - - Without flow control, queues or buffers can grow indefinitely, leading to out-of-memory errors or system crashes. - - Example: Streaming large datasets into a low-memory microservice. - -- Building Reactive or Event-Driven Architectures - - Reactive systems thrive on non-blocking, asynchronous flows—and backpressure is a core component of the Reactive Streams specification. - - Example: Using RxJava, Project Reactor, Akka Streams, or Node.js streams. - -- Unpredictable Workloads - - If the rate of data production or consumption can vary, backpressure helps adapt dynamically. - - Example: APIs receiving unpredictable spikes in traffic. - -- Need to Avoid Data Loss or Overflow - - Instead of dropping data arbitrarily, backpressure lets you control flow intentionally. - - Example: Video or audio processing pipelines where dropping frames is costly. - -## When to avoid the Backpressure Pattern - -- For batch processing or simple linear flows with well-matched speeds. -- If data loss is acceptable and simpler strategies like buffering or throttling are easier to manage. -- When using fire-and-forget patterns (e.g., log shipping with retries instead of slowing the producer). +* Use in Java systems where data is produced at high velocity and consumers risk overload. +* Applicable in reactive or event-driven architectures to maintain stability under varying load conditions. ## Benefits and Trade-offs of Backpressure Pattern -### Benefits: +Benefits: -- Improved System Stability - - Prevents overload by controlling data flow. - - Reduces chances of out-of-memory errors, thread exhaustion, or service crashes. -- Efficient Resource Usage - - Avoids excessive buffering and unnecessary computation. - - Enables systems to do only the work they can handle. -- Better Responsiveness - - Keeps queues short, which improves latency and throughput. - - More consistent performance under load. -- Graceful Degradation - - If the system can't keep up, it slows down cleanly rather than failing unpredictably. - - Consumers get a chance to control the pace, leading to predictable behavior. -- Fits Reactive Programming - - It's essential in Reactive Streams, RxJava, Project Reactor, and Akka Streams. - - Enables composing async streams safely and effectively. +* Protects consumers from saturation and resource exhaustion. -### Trade-offs: +Trade-offs: -- Complexity in Debugging - - Adds logic for flow control, demand signaling, and failure handling. - - More state to manage (e.g., request counts, pause/resume, buffer sizes). -- Harder Debugging & Testing - - Asynchronous flow + demand coordination = trickier to test and debug. - - Race conditions or deadlocks may occur if not handled carefully. -- Potential for Bottlenecks - - A slow consumer can throttle the entire system, even if other parts are fast. - - Needs smart handling (e.g., buffer + drop + retry strategies). +* Introduces possible delays if production must slow down to match consumer capacity. +* Requires careful orchestration in complex systems with multiple concurrent data sources. ## Related Java Design Patterns -* [Publish-Subscribe Pattern](https://github.com/sanurah/java-design-patterns/blob/master/publish-subscribe/): Pub-Sub pattern decouples producers from consumers so they can communicate without knowing about each other. Backpressure manages flow control between producer and consumer to avoid overwhelming the consumer. -* [Observer Pattern](https://github.com/sanurah/java-design-patterns/blob/master/observer/): Both involve a producer (subject/publisher) notifying consumers (observers/subscribers). Observer is synchronous & tightly coupled (observers know the subject). Pub-Sub is asynchronous & decoupled (via a message broker). -* [Mediator Pattern](https://github.com/sanurah/java-design-patterns/blob/master/mediator/): A mediator centralizes communication between components (like a message broker in Pub-Sub). Mediator focuses on reducing direct dependencies between objects. Pub-Sub focuses on broadcasting events to unknown subscribers. + +* [Observer Pattern](https://java-design-patterns.com/patterns/observer/): Both patterns involve a producer notifying consumers. Observer is synchronous and tightly coupled (observers know the subject). +* [Publish-Subscribe Pattern](https://java-design-patterns.com/patterns/publish-subscribe/): Both patterns deal with asynchronous data flow and can work together to manage message distribution and consumption effectively. ## References and Credits +* [Backpressure Explained (RedHat Developers Blog)](https://developers.redhat.com/articles/backpressure-explained) +* [Hands-On Reactive Programming in Spring 5](https://amzn.to/3YuYfyO) +* [Reactive Programming with RxJava: Creating Asynchronous, Event-Based Applications](https://amzn.to/42negbf) +* [Reactive Streams in Java](https://amzn.to/3RJjUzA) * [Reactive Streams Specification](https://www.reactive-streams.org/) -* [Reactive Programming with RxJava by Tomasz Nurkiewicz & Ben Christensen](https://www.oreilly.com/library/view/reactive-programming-with/9781491931646/) -* [RedHat Developers Blog](https://developers.redhat.com/articles/backpressure-explained) diff --git a/backpressure/etc/backpressure-sequence-diagram.png b/backpressure/etc/backpressure-sequence-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..b74a5d2a53621ce425c5ba5aac00c84ec83f08b7 GIT binary patch literal 66791 zcmeFZWmsIxwy=wIumHh=OJl(`xJ%>i?h@Rc;O_4379hdh-95N_a0w1yXYH(g&iDV` zU-vfid8n>gvqt%-@s64uCNC?7gn)|x0Re#|Ar4Z6fPg}RfPglIg8|35Yd1B6{{g-T z$_PS0{D^t~Z14{J9cU!3C<6iE@d*OLHxL5i5gg@v2m#^D2mx`d4*|iI3ITy-m)WAg z1HK_|qAp=7BLhJV4#Pn}L83uGgF}$uKZp=>2*5vK2ncXa;16^zd)Ib$IYD=Bq)xS&t716*H*F~GuG1HCfb&wXez(iqvON* zLj1kzgn%7M*BnStK#0FrI0Oiq9)JP?`OoF&3n#z=2!ziTfB^jG0^-^s{r7PI2qK>t zD18C=@AK2Xmj9*{00N;t$xsWJu zp%5Tpfz(a-zj6g2@*#izo6=W6006{=>H*08H#ZcdCYb*g5{d+38U^K(8`OVl0g2*k z*2Vg74S^^qkfFi8jNRz}Z3hr^)xRkr{@<;#INXpLHc#`~8DpV8nEaBTN)HidtO_8jUI$ano6Eo^uAyDV2zBz4F^c^ z^;o^QoLLLc@^AJ^<$(#Kd-*jw^>sF?@YY(|5=D4f z#?@D$)GDH0cd%t$p)dd;p)NMkM)Le@n;wn1dtQKxYQI9(tUMD_*E^9qWIwkKr&_c%3=En zNTPWHw%ueDzY5`#7hmd?M?Df{NDr=0r=X#!bKHl9*sY(amcg%iA6AA2UE#v={?I3) z+YnYZa#hF*80tP1SI1?q@D<_AkM@NN0olmKH}ek5h82+B8|==6W!-tg#kr7aTT7^e z0y>(bR^m@pSazzi>P}a1%d0WwF`RFM5d8$?;X>UGS*g-w-E!GYoaHXpFPI;J^xEv6 z@(Ac#;*r*&ClUIK4b{P~yd{|nDNSYTI9rG$?kI4mkPGh;(?BfEDN$9~nZle$66L3% zSluWC4P;~I<`>d(99goDuSsi!-SUv#DEXF%)1vT@p7j|G^rb~a8;dfs-p|gCVkO+2 zl*9Q)HF@_;Vy(Rr)i3g*mf^(M(rRHtb{TNrMT^6^^3NN%k1|;IBpEB71Y~YQ&da!W z^99+Xv+2tGldYMuZ7v5~aHaVTAp}DrN;Qru?N(J4 zrQSE9b518Zr81C&dP6y+r8sIa8x;glTO8vBLVuWJ|AB>Q%_&5Wi(7k+Bbm6>H?Mb6 zP)-uU9B9Q8!;A8r&F{F~M)O4lwYe!|mc6-N3O{{@%4Id0Ba=S;w-osgPH23%K14_? znvfo9cCXg5<*DdEIo1#{7Rryi3c?o14)#c#i-)Ml0K;$yy{n9U)$eApNAS`LbtPx@ zi}96_EMGgJ!}ECYQ3qB5eN(PSRa~qyK(BIX9k*9_uVx`?+%|T%-pq(so%W3P@Bu|r zKj{@ixuEt|bh3#>ytQMW1T#Ar^66_85{bu$Tw5E1D|44a=UpDJyKGGRJ-lpeBE!#a4mx5g0!CPZhus5PG6=jvg~PiA)o!haZl8$CEJO+kg0R4i z#|-KGfu)YPTm~LJGByIn*^=EHpJ@iAxJ86nL0Z7Zt(o0P47*<=YT}#3=b1vCun8*? zH6V&4R14B&F>0_U$!>nP7WTRVdvhWhxRp~O&H|#<_(XBJCQz8veSH%Urs4+hNcAuOj>!-KJRalIy-zCjmXnBMCRT?a;2cQ|xd0+E&gi4%bXXR=yBII{^cHQ=@ z;p28rMp+fLQ`W=o#(_eN0#4n1k&d$3nene{ModBpux6~w5YRN_Y5!^fxo7ez_GGZu zH+7LBi9UNO%;v2vHu?0Mwd*Pz9F#RN#Pk%VCc#Zcra{3j3*PwSxl4J4ouZ*64}qN< z@-1$b;12y*(KcOu-C>Z9aW&F-LVzT{4laIy)scQ43O+ypSO|!>vUi$A)iJkgG^Vb0 zoU!CjoXSRk&0=GY5Zx`BYNt4u-LthW;!Vo)+=MfSL~Sku?+rk?Egcz};z^#T7=vDS zJqNBc(>_$WVOR&#rL(Owch%?Xax9_zJ_S(B^QaRsKJ|%MQOr|3@6b}B(X~)QRiJQ& zFP*sF2YS2~KIZVROLU%8?M(Wkk8h}p++}7;QNdrXCZD_kfs-&-1_cY5fmY*MKyOVc zv79?BHQ)nMUrgZ+15y^O)ruTMe%{N;GC@st3Gf&<8^OZ8Z!5)|oaLQDY!xI+6Yc$K$1v_@Mq{!^F%92%o0rWqAKQf_sS=lk+0hh{ z+|ihV@0_iG5VkWG0wcd3%M!lBF?zr93ui4}nTKl!y4ZNO?Cy5~>qg?#m{@~*|Hyn! zB$<{Xe!JZSwJl#r&Rkk?s0_@30&eNdY5mQ56kh4!Ph4`%79`1{1e=BoR z+2<11sgcQu;U)bF``a(1RB_i@-4EkL>7tkL_9MwVx1$Re7&2y}YEBwI-a&pwL*Wiq z;8jXwT&%0kPQLOwFq4Pk9@V)?iE&ln*@z)$MONWK#cm`@krH+!M^rFr&nT{>DmlPB zRXRX#rsMeH#Fpiyk6cOpEidk&EHNEhjMar*Mn_SIh>k(&wQ%+{-lhN#`IjW=q8wKv zEOLj4$akLB@2Lw|^9qcz+cWXoM>!O`ijyaxmdCYIWtH=MXt%&! zy^{Ue1vGBw9S(BcFiRB!I$plUP#b=}6c1NPWrCN1ZI8$E)%H3Y+xBp|*I|RFsFmnb z*??y0VYYm)dD+LWD(~7ajl!-HvJ4BpOq_}!XCKq;#HIS_B-~$LgZOQ#^SC>1c1Q7W zT)3pc-QEkwjp-K}2#>XQr5qF`c~6p34J_U#lW&A9v#Lw20)gmOhzgA_wM|O^XJ$J` z&n2)_D}Zf0;bP_*4UqVOUQ1=Pw@HB{Qz=i(%MC$J89>-MEC6A^*g>0?w+VHIzT^wD zGdD0vvSFdj>E?2kxGb@cy7uz? zGIvg;<-Rci0eK{MgNNBSoNaz;;-iYBdZ=$4b5m2~ZwvM!e#DXK-BL`GekBmFV8$>@Uo?C;9`JrM| zB5*$UY}h!$k%mcea+^4aNZey@s25ZFJ3QE^$S{Mrd^t-Z-rdEc@Ux}HVU6X-+qiIC zT*&Jf**jW%5Ea*-f4vIooSN86!eEetE<)zo9r-$fmo2;ZO!jsaR3QQAC-xaCp;Eie zRXRJ8n#^p87X!|e4GuZYmp-2d?kOv%%Xv|lOmoJ3C^W`|UJmn(RTy{6sSx0@Hxlz+ z_IfEre;=9SMrJf1yfSAtpum2Y-;QVDwjm?7p)JrHFl+WyBk6Ild@Bhj-9{D@-BN~? z_1XpDv2~)NYY!}Vf1R^hX2lKy4pRoMO=%D`C1O(_QOLj(blTt{`RYo>$|-?eu`wsY~I{hke9p zk}Tq4JjH6|$AJtU)-*}iyRnktFS0S*Rp!n8Argp>v$59TsiKUzm9X=1wwn-~U zxB8%0zIqUGf)?00aEKRM3NxvHFY;ExHsZWAU8himx%1rU)y0KSyK@=t_pZ3rk;FK_ zUdHkdsxh)D$v|6aC<=Q1RHHEPlv=WqSRK(ZYNPi+Y+uyJ}s&%W!rVMct)V{ z#cy~g)Xq5tORLV$1ym4zsf zMhpFTl7O=D=y|b&1%7XvN5LW)73MGNT#xQr&aKIABW56j<^a`;#J~g}aaabD{OAKJ zU3Kkm6DoEd8@6S|q{u_L5?-@r{Z*Q{dYe=UiGrf!eJ0mKfq}m=lLgXNF)b*RXwPZs z3Yam4?ea*$hACHrw^1^x|FKs#r}&X})-y<6Y5#)99uGGpe9gt-f^!d-t!xSY_|rzO z+`|lK1p4&WZnH3+oaInKpfu!AgVh&;Ck5TaCV3Z()59`!4YMZBN(;iHsc!Pl<>9$7 z79PVP&XYoV-3n?{_7Q=INpp%lRHnk6=|QmSKv~T3U8Sg}9ou`2CwBFbortLPy=O2s z$USE`${bzNrA!c`+iSx_nh86nG&1N$4d1Y)CF~0u58ybO%F&PqHU4PtE+wR5Ney{3 zDJ)1V0c30RjrJ}T=hDgY(W~|th%kmGG?ni`hWS)6TrDziEKN2jVlsWzJ)t$e$whDE zWe#E{;SVZNZmIZAg5GyuJF#WVWUNF=;~bwFdK(jt3b;9wHMaL5fD!cd)c_cu79z9 zy!qVuW1z4k8Zc9ggKl<_L-e7=qHVfzj*G^{Kvjf)FdCMnX(Z|KU^xa9TnZW zGFA8}dn~7tz~Bs%L;EaoQD}>~_Zh2ou157&1(8H}xQH5Qann(BiAby+Mrmz9ip404 zn>F1Vp-L@RHzBJdQL>^R$ugMZffdw!66uDFR1F{EDKvgB85zS=<|s*4xU+^no7_p} z@%~zBN*G0eg#u2wKwU`_)4=ZzcUpQtt$f-o72l;##Nust^M-8yD(F|kdLN|5G^Erl ztu*9*)YW?3EAjyo)8YL{qDZc+D1Pyc+!w)ZLqB<0xiOmj48G;E<&QW&V( #Y5KTi!vt?5G(Rf?7NZA!P<4OAbz z4+&2Dj_k_i249&>t;WN=0vFLj=>itvzimZp74sP5l(b>XS`q9r35ddZn-DXHo&wkJ zb!;)oUA!Sb;yE{FgDf@V4@~NeAUh-SQ%A{6vPNwCo|8(L`{Zl%Qa~oK_GdI&P~q>h z{l&U2R&mST&btM>p@v%j|ApBDQ+>rT0JuO3MXwABJwbU2vNh zGrvZqVUy>w%}04ae{b#Y8ucGag0g4?W3R@EdFdk2983+$TG7fy6mfW&((U(LKfF*V zKG)Vzn8f`wj<7?qcNoh>)FqFXPU0b_Hpk17yBSbg{6ON@G&7R^Vo5I!KlE;MTeoN2 z2btmnIVXM_SC^nt%*vP)3?9;vf1>uB7^xIZKU=O979NmwResz=Gg)sWA{E4=d^J^g zjz@&5d=}NnA9$aF>ToTpP5Q;2 z);*~{6j>vlYS2U_0Qbvog^(^>(JUsk^pCj1(E|ARx0zFCRRo)MMKs?&qC?qhnoctaqdX6fDw`K}obg zmHsR2Nbw4qxm+QE{gs|`dw}<~>I&i&S8PxyOj3xe`xim36`EZ;vGpwO1LwAM!TnpQ zCgJ(0CTSX{{p)wn(NOMG@sUD9bHUy@0euO>0|Dl%1Il)TGzHk(ZV-a-h)3T{iu~^r zT&avNR}!!8bv`twg^h?S=<3lO4SRmmzIR(b%SzoF7dU6zp`S zDSaPN&FVwqR(P!>CHC@VRPQF4A9;GJgF4!ITEFlUL9jIO&_z2xMFY~doG6g%csC0v zK06ZsK0=nuMS)&Z+KFX+zeftKWtD(I#gQuYAa%~V5Cm<7JLZ^mlA@$hzLah$130{R zyq$e)?6kIg<=HO0{rV6=GzexInxBAj=N>l`Ig|Rha3kR`=LoR;@C{`8&j9ml15{d% zk%DnQRG=9^e-?!$F%<4EC;uh`k>9<18!_`2s|!s1A^1q-B>%E-OLQ0O*08wBPKP68>@)zTS`5G9_xOc}64oBaG@P*R-Ne2K4 zbaE=$LL>ZxCq@hDdh%z49%DRR zGEBtm&|Ymo;gfWd+GjStsE|qs0}Lc2lWn0-m#%S(!SDFr~A2@TF#mGC;6BQ5N8E73x%t0TX< z%-=y4S0FO2QNNVON4by^(2P1U&JTDhF6C3XtuV+u|6n;u7nC3e;fj|k*^Vrg8;H@V zZ3hLQ71N)>8BUxhP2+BcfgC5lS-ptT8vV!xc!y@%LWeVy6HD}SjnH2ig&Yn<;fK*+ z!tt$ZJO@wiCLG2~PCVK<1Fd{DM49E#pT&mvT@CrN*-ZUf*{nWZ|0Uded^q(ifdd13 zmWOn0N%3t<-44%ra9DYHyz*3yf{k*X&dO$2fWu{&ubPCu)!95OT#f2lg zl*|+MUrc2R65La18J`;S%-?}DP#EQJEswnrqac-u(9Tdb0uY8U$>KL~) zP4cE7E--+|jGj41+A9IOw`8U*h_GiuF0V?>Z+0EfIG&u_aCu1xX@D`8M=Lud5@4*m zaU#hQYNtQF>2M{p0VKq~l`XG!iEU4gS<*0W;t3b*>3$dD8%tYh@1Wzho$#KSA}M4< zm_PkvCR8dAbM12U7*5L&f90f4$$@L-jO;?@loXS3d8z~9)>;b0g8eRVZL1L1M(!A& ze)~;jg_J6f&Yb9cUr6Gb);f&CoXS43lKP%}>e$Aqp-(W<_v$eo6n0k6F%aw3@hD#Nw zwGOLecupB286W>Zp{ZZ$(pz#QpoPYG{KCVm8Scp5K@{-Ba-5E{P-Wc7llCGIVGaL2 z#4X!@%37?g#w1i*3oSW48E^FvH%M4`XXHTV(k46wFRStRb$?>qGw0W!krCOVEjr|f z(UwmJXy|Clq$|5X@477Ctw&WuU!$pkXot#Q$g&$ZBXYvn8=eKHVS}o0db%xi)6yn* zlczzEd_&*UweMs^ai)@;?)|p}4PAm80yFOV0{f5$Bj8efZLk0^=c95zG~{Wjc8NjJ zIE11%&gYlwbva2!d3FY%jS?tvl+;0lCTxfMLm+ zc}CD_Fx^Fpgo1PmeT+VGx12mXfVbRKJ^29g%drM-j%w*_m`N=Qe23QEnUfD-hjKrO zZ2-`70KQgRht2CjWg9>u2x6ojBWZ$ z3Fz%qS_foUob(qz9LJB^){&=+QZ~wn1n@)%umlD-b_{5(1b@2SH$rMPi?uR?;F5YY z{n?rEYx9QFYDFxUvzU2|+{dn)T)(a3Ng^Xo2>Str; z%T(bB|3YXeOcnttz)QN}H5%_lztb9!Xm-J*H-*`39Rc65A_Vc%LCdUuqndx>HM)_X zJTUT$(QWa>=gIXOZ0~m&0(IJ>s2`C;OQ)gwQYmOouMwxbWm5y5yw&Zxb^&%WA)Qd& zJkMjKNhAZsq#}ez{{QhW`woLuX6m<|Se?HbFBAjpFcyy!Yx%1(^_jsc^HT+*G1gzD zOCkdHgDdXF(f?JMsgV$%fMIIHC9uW)$D{2h4)%42Vz?KA8PPv(=ucn{pkIR^>;l&F zfAlU;5v+7c{{JHUKi>)h{=-)hC;q-=a7}AAN_#&M(xM_FYK55OVNgOP!QH5!K{u3` z1}{JfYWV&2K^O#T;EQdk2M+-C3OMN(5GY^x)1B>HB4H!~0`G%&L3l-E-&G<6NTd;qo5Q~%mA$$3$&9c0*T=16<-V|XOs^?XfY>3F3F%ZQR z-_%N;lEn9y*Q#ESYxT|WofqF|qyHRA5l{mAnT#+HA89|B_VmMnXDxP_83y{_S;{2| z_7)TXPznEjHw=WZ!Zj?+R~S3|1jKyVc&m%_*0`fdN>Y*c)^){YF6EEH=i>Ob@#EgT z-(tDNiz3TuH7>Dh!v=1SZqIJT#jeR{1(Sa2ev5$xaD06FtiZr+@})576J(zSCwOEf zS14i(Spo2oVP9UdL(EP}Jqp~ok zs3F37d$OKp#fHcy=3Xzt-1UUMkPHj((7a+4b-`1HN5RUwc7v|L1LNE8*!|2El0?VtL16-lj0t%HdC`OmS z6IA7ZdKNtlDaVP;KaQf8ed8^0pW!uo;rmN(szUG4m{N2BDRSEGY2t?48+tmYEoxSe z3w(|@Yl8P$UC;m#OZcnP{CSz2pq#A}bNJ=zT;p6_Xe1-P_YkOjQz01ad-VLB#BSd0 z%3rfsR?v%_EuJ*bD&ybWB(3NDIfU=k5VumJGY&+LadRwqkZq5aWj|woTt9&}=*s^x z#(?iQ{gHjO=TbU%l%7ZIMb)4)^9+8}@4biQVgl#M51Em~WXc(Wlo8*$=~r80xMMW4wQP5=ol$1kZ82=Tk7EihdmkH{ z^O8`5a2zqGpkw%Cf;__yySD!LbVSU{sGhdmZcjfP9i`}&Kze!3CJyhI4a?CSwi5Xi zQxLXA48-7+&8*j%;JtizdRM7lAMCMzpkSd%9TD1pa~fa7@@tlzikwrU|LJ@%r>NT9 zBiFN$p2bXn|8YBGNqM|?j*hdLjPUvV^N2Tbqm~-(Tqltirx%-?3=7i1Ht~6iu8&$+ zfDtl32tHpU6PC)zXQCC`Ej&xq!7yI3N>1>@@l12Vva9$a`?@9KXxK!0XX@*1D#b~u zL4elCw)X*9hqIOoEB=O0olz$QlVg{RY)%S&XlU$Fc>EQ$32>>xQw_7m53g?ku?3r+ z5+sbM=ItnwLNPEiVli*W;z~I9jQ+iOr^%7*R{3<}=j#_)j$_8<@Al~J58YpGF3=|{ zP+@S)Q#ou9UyhEY%Gmi$B33#oVzb>JkZ{>{Av|u@SEx8S!(2X|6oj!oD7^3bbMN!1jF zyp{+@1U2s>#)nswMy2?I(9G0bC`t+5lW&oF0+>}6a_-|ZvP z--x)(fYxh2BG{~!M@WTKSib8KX*L?5&(E=WC7qj7;0tpuX&j#~_Lh_yR%*5iS~ps) z2;RDI6ZqWZ%_Zere4d##pS$R0@p~sCWm6ltL+&wHJEgG2?9`+n<1ZmLmr+7W_R`+} z#8It9S#Pjg*p@H(AR{Yj`h+y8WQ7|O9NL6J(eMF{jhiOnH|D94U$21@PXYa2Qug-| z(pPwRNcL;2%ZfhC3Ru*ycEDVC{X)TnE>+Yaaj9Zyo38$J+-+hWtRSa&=8sIlDQY9= z^|M>b!EtierT&WyLp6PVFHhwvNbv=({IC9ENX4F?DS`u;Yvh%*Mrr62+Xo%pmjzqT zba(Y1o;k%{d$u; zpz-PZ1bcL3ZZ+hF(LSz($zS~}f+nv7i8dPaC8ugVWHUqcAoJu?SRan6>iwgPqG+;{n_f%b5YygfSyf$no=0eJ ztNY`il9jzxMnYQhw!5uxuedxgbBlrvyzlB0tq?jiUbjQ-|@p zfY88NSx!I2#Rh@ach5BxIJjrswjmg5Q=j!%&uDx!O1KQ$TMSPh^;GT!lJ$<89GALe zRvX(^ul;Lfl?=b=nNz*gSrz@BIZ+kG22prD^-elLMqt_ZlNZ%FJy6%5KMao3ur(+W zFl@D6WX_sjH3cNL_p&=;;y$~%+}?m#WAsB`0^pE8CZ`yNbENmV5X?-Uuh#2#eupH| zXQE)Bi+95n3GmKF=D-|vce?yZ)!vIx?qpw{Z9HsJa^iIB&oufG_uVlgcvFH*3IYJ9 zyrEiM&hxNzJ=KubI{OO{u3(1f+sgIfI~6_XR;Y$%b3@^ePGEkY3)i3ts-ivbO+1-x z3l^Av*|K@u9mP5Bm#^k~fn$I48*V4I!eZL>ePywoMr%1;7c;x)@@Db+{gt}9)anPL zFf7uh9W=-49sZd?{juRPtsKYXY&jsM?YBw+Lv_b3WYV?ekGtgs>tr^U{DwpN zCb905y>e4W6ogVC()hoSxWT&PK52QcuC+9E{oyd;lffmaH~<96#=#_zl)_z9@=58d zk;(DwqQ5Wr}NC1hrKr)@I*P{Vp^jm1omD)7ctSObBzU!j-{idMPS`yYQJbPUw{~}x?6cN) zywZ9TsWP*slLh{S4{hZJjC4Ci>93EG#=2GRla=h#8|OZO9h*hTvuOJY49M*9y_L@< zl?W6Dd*mtyncgH`eKc&zm6{cRK7|n3d;;$G5(gq9PP+yPX47~47xA+}s~SZ!i4r@? zi?wpRetg^PhV)v^!K0hSq{Y&TP!b`xn26j2B*4+YqK=uR;$pG8i4pH^y){=#Vn74p zAD;kjz(SpLvpfp4Ukd^jFOxave4=1tjdq+83@6Eqe1icxn}j1e9OG^d6_(AiCy+8?;#rug9EX`@+)>kvYWZzr0FQIS z$(hYh6qmgY0LB^pW@-_?F;M|7&&l!-<@zysE;}5;1%i$rJPy)adY3sl85R4-Q3ob^ z6YkrVJfsB}9YpQ%?%o;;slyEb!&0DJmS2-VkA!qhq$0ro>klPFtNyUl;Ax4a&+bdb zi4xpY1-p8xiMt1mICwo*f~W6RfGDvOx~ft|*F?pn{tzsp`CvOJE?kspTu^{ZI-_pC zl4Eajp`}wbU!g=LWIDPO3jSyE)%`x})c2093vN58o+bhnA~&cDb51Bf4H=E9MM{*v z7QL^47T9>IOTvB*_zxryh(rTt?iVg69aZp+@c9;$vwX%3Oxo6m#(`FY2#13rpa9Nd zm%(4o(G{2%5EnDHJ2K9$+4t;+LRL_WDaa8_m^g=JE!ZsYy`Ut~j^gnEb7mZNmBt97 z`AkXS29Cp0gRqMIjc!2~0;Ay(UMeoVYQnrk*m%nfIWq}gvnBmgXbrjS}to3Eb^${`%&LsKGK3xW?qqF_XZk|o0* zD!{bw>4x*;QW2s3{yM^yyacK{p~bHAy;u`v(G$l9NP|z0b@wHOd=n#rq{DZj_~^wM z8HJDY@XM<`3JHpm94;^zY-X4>kt|@70tw=?gQv0*o)?~&f=Q{vEsbqgW5UOX(SiDk ze_&80hcWjf++p;v8V^WM)`&)|Mc1%mj*{+w<~wjB|3i~D!9x#@Uak-3 zZ{Pg2sYSZ~_9n0i++hBr=s*7YfP78BV^_VwLV@uw&;pAH4c@#0S^W#NH2&DDm6{lc ze@$b5DKOCb|6mc|lj(2}Fh2uUZCu9^KfYt-_iJk6xWY?(4F&Fyv`1nI~*xj~<(Ahs`L(51R&XMh{nfF0N%j$B>W+JLak?uMDvZJ*w!|4iX!+ zta=PzT0JIS17$>Q6Js0x=K8MKEyA(5ZT);;9(>DcQ^cH4`xigeJB9THOXF&BpnL~F zYELGY4yaQD{*fjzTAtH&vryPC&>)zr0cE)1YuT#7!hszG9w+(V6=TW4h!UGbU!588 z5=HpdW+q>VCADrl*81P!!VVrTcIaXrrzE}<-(3uZfq!nmQA5%;BT`QsMvm<{%~~E* z74^)|@4B#d@Y){Q31HIvgezXPq$I6PLM+db(Y^eTQxc0=Sko;HJK;bzxRAw^; zsH-LgBiGqtG;TZ_HcV#v2^q_~1$M%&>>_x5kDi(NUsRbj6E@{obMWjj0$qQmfj}-` zweO8})(RVj5jqOtRT>O~x(h#sSpB=6H-YC!UjpGbM5V1ECSYWKX|w1r6R#b(jI?XVuCf809Qa~kTi zpKG^Fu_KRg0?*9+Oy6eBSIQ9cy_5NQZnLK|!}7}N5?PI-#Gm!(KGrkfH_2X2&xAZ) z)?$W_Sk%28e($xviQzMcojtE0C8ovMJW?kzyNnDMCq(n+3n$<6)9H!a@!XKToaeO~ zDYAripB~ra{jumxlf@KuUB4kRzKr`p0sf#8c}7j{`0#SvOcewd$on*6 zju*qYhzAfBM?)|wEC~LPH@q`A)%|?8@>wn~$X5N5_4#uLX(Z01`< zV?ys19Otxt%2Mir2sr;g<3w&r47O&;5IvgH3_1aKPA$x=BB7SUfXl z7Ckv;xrK!U*DOcGS1so364G7AzDrt+zDU9SU$ZlcWpnV{XxiS4L6{=DY* z9XrIww=AZ+c8}v_gR|2i1Y=t~Tv}WaYU{7QrenGSoi^*DJEAd#@J1gBHLkIyWqxYQ z!q#x0y6#0a&XjHmAH}FWPdvdJ!?Sz78nWKx#3dI$fBbm9!@^(G{Jyh*pcUchp7cY( z^#oT^Ff#6Dmg!=9V=CW^1R4eeK z(`CI+F^#t?A%V+9psA(JUb^$m{0%2d!nKy7=72lC5LTuaE&-c6iR0xP?T>J4VZQql zOO*-S4z>x-7qXVa)!7G$w$^Rec^RLQ4lss@?$jLdL71j z+9*x`yu?_u%uI2Q=qz!@W19^O5Vhyc6bK<=R-lNXgZrx;8(!X3l-1V02%&}%1Yq+& zdPla@<%f^ZRIKC(a0^SydK|bEE1xX|T<*6?p6M5%SMAmy5;2FO;T3->1{*=VYqc!n_oKKN*}Hzc0`pr`PvU>tG`U0 zh-}QjR`cxDQ#I{X!5$ratT>t)-Z8(Q60~^BqsT7khJKt9gpDqIUDb#<92yzhl&xYg zF)?PL!T$Y2{QiaLt(zwgsDT|FXjWCL+h{6oZBmA4Rv);P|C8UiF)PC@(NY&}&x|DVif(>eeA+cGQm{$Mge#0DD@gi7g%_j)uT(U2q*f3jRKx~& z2@VY3m|)Cfvw~$AGc|5QQ-7D-r*ISHMnUCZ?wgwccS&yQ{4Vym>!sc--w#Q2ANi>_${m)3M(Ae5jDs+29$qW&O66OWKjfs^=V^qT__D<2`MwLg6}M&p(aSxGuwRt@Nl@{RX{a zG*>&NE(^rhgXr)xi$MNycp3$zte25T!+B9 zefkW1j>q$~1&isHEC1C{kD`g%D6p&C`@a6cJX+oTtL(8XtjY&&m$TvxU3*^M`;C$#FHG6^j?ni@uV<^DkEjXhVu_IVGvYI8r_T?J z>!eqG+z>2g7Ma3RzQxCN{;FyUtZF_X8QJ~Ff_AWQ%6-I+rB`r*P0x2OjXO$mvbz&) z%+!?ReYdhPC1~{%xVP43oq>i(l5V_9?6v-b{X$d}21`&HZM)c{;ye}b;ZP3G9YG(-_4|{glsSZJA9%%=oM}!@ zOj0s8=Oo}TEIrOudXT7hERl5@xfF9RVOUn|nqU1fVkQhJ$NuffIYIKXRPai3Lj0EF z(VU`UygM9kNOGliW%lack;`D!8nxbxeVCN&6_35t!|u__28-|{Ve`lvc+$;q6L|?r zsXYs+&|<>g&|UER_qsp$1?N8v^uc!Efv%=V6*sZUUmgm0K-NVB%UzM%3t zFv6BkAJ`U;q)D+)D{NyX0RCJFj?z*WUtIEagovmbFMlrD+Y7JEOki9Ndn0ul5t>Oh zC&!U7A09@?0Xt(<9ws*Dnc{u;Kwv~WSEPjeK3!6CwBTcrc8PE^*;QoDAw9mb1*q zUDpx<&+xMBkmY`flKxXG<))WG-sR-V*4J}UTqdjU$FU3@`;*6ONX#LX8?*8%I=!eZ z^O+A%Io^A8jo8>D3GHJ(QWR7KhIjNjbIL)x0{26TgTL*{OTQ_akD!VDsGpL}z8Rr$ zTTG`Bh-9^GKEiD|%??R2i+vvXF-;mgz1Fy1n!V`Uw9vroxjS3`oJgm{7{mJ#kH$s9 zGQn}A{y6Ha#>TzMV4r+lmnhANt(NLEafzs-rs^L2v-L;R5QjHH4%3%BH1%22aU~b{ zk}Nkw8Kb8dqNU``R-zQDA9iFbp`jJV`!mF&4%3bN&(Z`5ma>s3MFCj*9&;e?yRAD5 zz&1#Kh$R?Pi7V3XWp~u}FzSvE>>QK!N0!+a4C8O&&nH@CQ5~E5;}t$F5Lh=DA3Dmp_C-b$xD~^c(-k^ z(?eqO-F+#GrEG?IM8YNej%7FSlox3xT8e_sr)(I$yjKCoe31XDk6x~9hEwmgbz^4Z z+$*)X&#-p2viAh37 zX}RW!Ag)*OC3+Qzau&J$y@$mZbra9@FCKhW6K1d5vr&saqrnLwlW!CaaOYmnMd`Y6 zvdkzHavRKa_5;I%mu4fXY~`!6L|#l$>o523x%>|fKWtH4?`KBp4jo2L&o9iE=SUzG z;KzsTxFHCMk{e?f(R7kY&fu~?3b1N2JFXjMhd+cFla+i(QPH+gtSRB6=Sqp*L4_|s zkE1Mr8lWOXOtp^(Ntw-6_C5AV4jJ>vhyre2sq5f|QX+8Ak;r zA&iLJFMjU(`ZAX@789`<>&Us1@ zzDj-Mr&!#M?0$lhu}RCHttlnf+M`P7hDFu07^FNnLO;)7*`N}!$gcguhkWR@KLU~*PVP2mdAtCHiKuYw6`t4 z*0uWUZ?SN9A2z<*#LjAue7P;~&vbB&vsrs_=}UaUdrwdGE6ggzetTMMYN{JL)e=VT zGj_+_SlFUEKHR(o`Bf^sUOwH=xp(ow zp)f?g*8U$RRmptgU}zRBVn>X3U`S)=N=)i|Cfdn)cs3S^VW`4FMM(#A48PvTz!Dav zY<$fjY}%=|BAv>J=AQZd<~_S{u24bla=Km+Tw7%H^=0X;)Zp;i-F^EP56J7K^3C}D z<8WR0yS_V~6PvFj$vwl*t&2k19%~zihr%CB4KCNbuh%IqSMc=Qe|eecH@e!Q9^`$X zGg%3G;0d?eTKX~-rKVRN{QJD^4V8K`&;976=JRLs1*n*{F0+Qpsi>#I9|iL@eXvA6 z!QPHnmm`Z)SXZQS?E*EAM)7UchCSFd*VH%~qExb~|A)M@e#&EM;yo_GAy{zt;Pyb! z;O_1a+}+)R26qVV1P|`+65NBkyWHix=iI9MH{7cI1!|w&*_rN{*-wAF*CZ@HT7Jc` zs-2>T*NHs&q6T4H;jH%eL-f;uG+{xk3KdJ{WPJ95++GRN$>nA9Mct4*2kmq4Uw(0! z;UU$>ANxZ#uH zqkX}uf?}iJ@)(P186=TM_;V*ZQY(TYWW|Ece|5o9KLrnDr0wC0Mc zmOLNKwYZrK`1AHv2l8ceNIhgf&h~&lSP6E<0T_W^qoRv0f$ebd*@=$e*hN=GVdQF* zf&MRwZnt3c5UXaloHI+EwVPX<3K(PCE1@^5C!f}gUNPd*tH&zQ?993v>)wUKhzYO9 zhU(RI;{KDYup7axwiNRZ-oCQu%SwL9Vp{?z1y<1$QO=; z-+2MM^nqsh)XSux>e+hJWolJEpUt!Fv*rlWQ`2$q_fYFg=cQt#BQS=Ou!4E@nW;bY z24vom=rMaG0k*sJ`BimUaOjeoB?kgOMZ zXk4sAzunh4vTywGlh^&bwZGG3T=YGoQF?H0u6M#j&wWi2f3TRg6D;*+pQ7&W{as>$ zf{zVn)^3X2B`L9ccF#{zPrFG9=}rx=^A{42al2Wh?)<=e zu|}NwF%^YmTGq;NY;)^}mfyb6Soo#^8b;}jJ)ox0Yf(<-fkYwA6`^bDhW@I zYaOeCqX?^roEkDMJ6&$jg0v{P8b0HmsDjb=B$;3xG)(6>>HcR^YgzIy9i7@SQl1-n zdxd>nlIX8-DP06Qe5di*Oqtw-BUVOM|Fsq_CdfaO{uez???IDh+6e6s6LY@0@ z(>~JVM2@0zkp5{zx$bD_XGvcl7~lf{rlm{wMRceX`e_V);$ zcpt02D&I1KY+ol+mC4%BG_iTPKccqN55w85FAAW_-Af90ahZDe6UNBRoAzx9MC={L zcs)b%wEQMe;^k2GMTw9oG|Rm$Q-_gYHygI>w8VB*&T#frxZXpJnWOADO_omltgAp8 zUHWYJGxXuCRQAufvvY(9hQ0%=ZL`sX1vBu%>Q zE9g>7G!Vjm?2q2>t54#5o3KzqK$Zi^Y!I67C~B-4ddK;F$Nfz=gfjjg6LO9IZVH&B8l!YaVeUjV~@nHcCD zM898nH-Lko-lzm2egKb=Kab?V3ExM9`^$VBD8Pon^c~9gX)42ao1p<{a<9uvdg-+$ zmw4e#d-W8%ib3pR3gw39>f>v)ITy8;GSHi0hlhf@Uhw<69@|dYb+@g;n05?<;8c6az%fv-oK0n80jq-b~E}@Md^#4YcQh>Ccz(othhyOInaPO+o|NojG5U|J+`5Yj? zhGy5YI+Z}MO#udBZ*LENAAk)+MRtL1W)p)R_{UQ|Fmy6^(X2lPhA{~ikVGg513hX{ z3V|E$0?}M6A^A(eK@p;Fz{rJh>8QNm8KBXn0L9L1L`7!!(anu&Mh^JOAcQCJMzS9k z;!rq;q=YOfqTQ2-Ng4)xgIi4jxstOrK~SK%1rlx)8#phmNHa`qdkI`VIfW2YN@>65 zczFsZIfX}7W*w6iH`I85fYrMZo;->jKoaNhV3_d3k~M>crH({I6{R{6991+)`mF>A z+yhS#6vM7q0|qWFrJjTC{e6S7-0wm#ARA~1U;=tse3*-?-q5&#Dw-R{H$^BP$-+EPRy2ZaPfoQ~Z+vN(&3?M_qW2=>Sse1^42g!>70v zv!*876|D^i%-+aaM`)d$b$~aXqqF}(^$!h{d-tbFC?>rkiQZnUToTGs++e7GZ{2mFi~5KRAbLL?RhW}?dV=HASHXttW$y3m5=T7%8H1d-P*`^lQt_RZtX zs5_hWT&v&TbC_OaI2^dyxy6#Y++jPY7UD@3z;lxxHt6A?5Gj#PK}1#@qwBw07Y zO}E^mNs^#NJwrwH&t%my!b3#%jVc4}FeW)*J%SM7W&%0v5X&yd`H5xoijAK$7t7KC z$~f~C?moo!fFbxj-jV5b{DS};>2=H1UTn+h6V}#~@u(gbk?qrq6-`EmV^(V&y>2gx zHV-^od5+<#fb$LVQmYZl30;|$sWBWD0@Qg{h9TLTc%^dUe>+`nNxsx-tqQ8_*!c`P2{PJmG|ei965Y%qeGIdv{dWGbx1V9T z*tLq#=@gf02A7IR>cHIm`o6Ymvir|X?(eK?h0H-Y{lg9%>Al)J&6HA=3u@Z zh2%TFhd9-$)g0a0#iAT49k+2@r*U(tI6Jqkhmtz8p_uQB!D?&bVuUVCI^G8lw74__ z??D_#Y#%W|XJ!EI{87j5)|}005^UXS!xaIlmB`v!o#SAGv;TBSONiasc{WdL4>^1q zE3S_Q12A+Z`<-CYBNpW*#|b`wypa^iiD7=f9{p(Q<%KVU&zz%!RKhFa`@F-MkP%l7 zTAuO!l9ZMHh~@qEcf#qO1f$Kq{ccF@dKRHd!BCMD2vYG@=yd$RvZwldW9U>iS6-B` zZ5)%bk~&Ffo|t0Hv$mw1Oo1fF0zTh0*x^t|-+LJA@hJ07$w!wH^mL6;QdgJJ{`?I& z@%;8-;PkHFcBQ1EtZ0XB{(OHJU_AHyGBf&@W2U?KRG}otL_qY2Ib2ihd#_Nl+ z32K8}UYPrsOfeOo#X44j^|{Mko^CRLp4P`*T3{i&9FE;&CWLYJYnILNsD26yiN2`S z-XAX2q&4dDBUyhbn=4vhTNg$UQ?1aE({lINy2gn4sZ6NBbvj66wQ zU$oHIUSZeO;dT6QGEV*}+s!|?FHawf?q+q%CeYRPUuE6hbF=O@_HB{j`x^jKFloE?o$cRYXXQ!28C*?N9VB$0OS@G8iCo{(Z;D!f+b%yYxAUvNndU1x7v$v>A6tA9m! z*5i|JbnNVJR(yqClrq-8!DMTJsd<@XhkFu`BVvB5d#Q*FR` zh3a&sh+{?I1^6`U441XaN9&A-CFNA|kg6ZA|LD5Bb}tejKc3f`TaXJT$yI9Bs=8yQ zL*Y)Pc9_9udae9W9=IA@!BccSm3AIrAaty$eHK~W{pA6KOV#DtBEGJr4zvmnK z5HFVH;qlD|PoiBt88MKtCUoTqR8Yt4kMloY zmEthI%wXV{nDNLXgaRq&b~_D4W|toq=o%5;>Z$5(y3IDpwGIZOGTn0ubS`Hc8qhA( z^GBXg>M**9FMRmCu`&k<91MkWEvlv5d%N~6EG?t>wN|ROXy8sPEI!@cRQI4{iP!S^ zWCG%I$z|75Qf8ZsT7BlWt0`=!8TMpz+b3&Qmg$2o-xVQXDPy)??jnPO^=Oy%ZE%G#k`HyBsV2u)Dzy()36T@Uq$O%S%l^a7@l>Xsu8OqUs#E&y+_5T% z4Yxx4*W!LS>{%`#Je7GKnw8ViAst|^(~F_JSt+?!u&CB?>_UfGQ6f4fOPJbeUnI0{|&qC@y!YbdtgS%{$17LJT4mp4-?XD z#3=x53BUsaI8n_|z?u1;y_Vm)W5#!!EdqbX`+!8f)yXpSg$etY#e& zplI-dn2gqhcJ_#~awl!B!wf9o_ue(brkNh31U~0bk1x)?d0(D|N@wn0P-}V})HZEA zlEtXDOFC@NvOs2?%OtIAilE203&|fkMaP?eh(xY$#j-i!88essdqQb@29{5sQ1*79 zKmlrL8D7so>X^63?GC3oHbPQ6eXoypLx5T;eSy>jPlQeD?w!n5S4=0|pkz`&Yo&IP z1dIlry88Wh0-!IdmFB6LBz?`*va0ZTsL2KdJ*iwXK6VIN6MF>=p{xMdZ3+LA+`M*&$zEJ2P9oE;TrmGk&&ax^z!j=s^Yj zHj3s7GCurUZK_vDwTP;iA^jsvraO2qqta)DU(DVEq2tNFh@m~NJQ5M)Fih@ox$ZjU zo9!OHe!-N<_qv65yHlv!+Wfat%Vt}a@(2xrXa+zg44lET@k ze7hms3#XntSVc*f8PT@zBAho8xt=X!x+qH*QO)$M?tCSzDgD2RU>wV@5sBow%pX4H zbqB!&vbvi%Im@u4yd^8dtejfRcJ8>?@1<{K8u2|RToo(Ha(Le#&aBC*PM21esLViL zMnk5qCmT(>TW%6}P_%7rq5GKFG3;EH!r(GY?m27hM8&FDVUQ5Gee-Ch?ZA&`^1S`1 z1e$PnJ(!h<%DDeP0$uK(nr|YlmmOcxOGR`ZSCaa?Vv{g>mU+J2_#^Rr%Ke8M3m4)7%snv>)=~(cm>K zQitRoqB4`k7KX4H`$Th7)bJy5K!Z5a&gZxX=0N(^dcPf?+(TUUc0Rd}MEstJMAQYR zD8<0nPGd*Hx|spvZNaZW3%cT_Q*rT3?Ix^`$;i5@Az`aQoJ4#Ne-1ufk=hU1 zl-;EPhJP%WHAA(<|Na6g&)1c_Ji6!iiMSU5yyd7c{h2URufs`W+c7GVwP^?{F)A|z zu)^aI@cPjEvXbgW!Q{+Ds;dwipoU2R4#g~g;uHEq%MIENQJ>iat;P8uckK|aT7USE z)w?h~)6B>y^jl1NdmXiaBS2Ep@(inuB&^Q4j_YLWOhmYwG6;M4XtuyH90!wvx+GXt z8pXhJ$48Y-Rfo#7oi%7UK(~I%OUkq7TTC{x==V44p@`==#hL}>)S>+oiFRKYmc zp-$bmE7_YDNSYM&Bb0-Qbx!f_;qW9{&GPHMAyv?ELuHm3jZH=bGDLN=M{e7-`< zgTm%RmiV^Hm+2%nFHnBl6lsP8oPK^6Ip&`!tA46p1>Sj%4hmK7)YPy6oi&AWI1~tG zF#%O%JT;WEb)*x?(XOyA2qRir7&-zGfFu1Q555Ho;F_VZ2Z8_lHx2+EPy-XAN&k~N zdICtGF7#7(FFE*wB8Ar1e&fXoZL?&#OhfLnL`yuABWmFFFdF@v$SSIW@InaOGHqK(Yf2GMj~_dgjX zK!Rb=jWSJbPPCNjeOweK!$IQ z|9jzjXjC&u@H{&+VJ5dI76?sp@rLX6HBk-K9|Wjjw1AZ;s1OWF*P%}u3SJiRU{914 z;ALy(v7Zg9T|qg08P@pgbJcGD5lTP+=%5V{m_Hc&ezb^hjL;i06IZJU4fw24f+}JS zX5xFZYBXa@%m7WdF`((*eI~V)fyX(jI>3Df>g<@kSIn^tvLl4jB=$othUVgeh9K7G zhHz_&-zohF{cj~6|4Cq+;E>dMft2Zgh(gjk^LtO3_)o^o2HZ!e2ebM==C=bhOTAK3 z;UD?!y8`z=MEf7}`!DVIzhXc_?}Um?8;$NiC3!ReeEvUd0x=2O6saoeJ`Q-}@@h34 z>L)0A0pib}#~}&?(8>WW+9g?Uepw?xoze>N<0S`!X$=DvRS+lvvJ3#8p9GVr$bm2O7>FVYBz_C9Ybxu7B}(~&z+J_v;|DT*3OrtUZJGJu+C>eUsgg3i(0Ti z1wtQUh`{lI;~I#|O6FfDe5I(|$?}K%zvUpxveKZ00~oTl{@T-Q#ew-J!2!ZA+h;a5`XebM66qmWQuSfqu!)Z>$~! zGlB8HMeY1DLudhqK@S*v7iqZLyD0(r6OjR3zlpYt(Z0aB0dumOf$Rm-8>y_FBm9=C9kL*G}%kT)mQf)#jU|(LT=Kd2=#0 z6U2dcZeKXTG{3r`i0Z?3lR!-VAcw09^b^))+p%)HoZNgcb#9w@r+Oo3VUwM8J6vhC z0>3B5G;9ai;l5&kx8|^U2~fR+ zhEs9bW__jg%8HtzUoIWZ?_&j>CW{RWyxDKmSa%iCeTg;(Y2pLYY@D5uyf4PAJ~?!P z0Z>PNA!=Pn!!?ZO63XJ}SXoO=j$7m4#{{B-{s&-W3X3U?Yq%j?LIZ8uPju62&v_g` zcwJ}I+> z9PsOf7uU)8vkoD~FBilFzS}=rX?tZ-adE+2YX}&M7ZO4YF~b^EcDCw(bQ?Idt=GOV#d~rBp*8O|x5W%m_^EM~kNUSVmay^+< z2fu%v+h{JI+1i}J%W}_I+y8Oq)dbHhC25${zHVFd!}6M41^J>?o&Po&D*u@1+IZmW zy(>8p0sQi~ArxUGW1>e(Acyt3%)_cfv7^hk4TDYALSU}#Rd&`Y`xVYHv7@D-Qz44w zbdaBScXE7(b&^*Cpf%RL&(FTMx2*r#dO!jnV`=$_hKi;f8|@dM{>$L)qi5AZ zUuE&LwYmT_nh3qR0L^s1I0n=~o3I&4+n#53la&K@^ftQU=f;WsYS)%pC7;?w_uEX@ zZzdD%kSsZ_u1&9pBl*^4tjYphyOCcWkIO`ZW~;Qce6rc)kiUwJOiD2(dD^xp^)!X@jmQ^t{WG8$Yq_4`RQAQAXoD-=Q%qvn>-@hO8(h%to(GUMqYIo^1PW!{mf;|;k)ttd$)GQNRs*6?Cc zEq*7P{RqkjOQlRXN$T+?;pyzRhLEt3aeoH%<DI&Zd*djgwJlXhVb&bmzIXF!k|SDDE(9FMYQGF~eyDI>*dzxP_-%M^;!dV49AFBel8fP7zM z&U*7~etF$hE)X|YBMdn56-X{wh5=&8+Cx+qJW2>P4PhOncGpEt&^E4CdQaCU{3 zVWDBfE7I7F53e=Q@vs>iSMBN>UXW^@vwclg=9Q#Z#=BOsj zmf>pe<0&^@frduieTO1!+f9SO`cKn2Y^c$e!a<=g6wVK%^Gk@&u zPjfqV_Nw@p$Kz3P(;IA(Pg-tMqN{|L=i)NbEIqhVW5fc&3b`csc0MR@&`7xEOp0 zs2|WaH*3z%Fj)*P*l9~kaTFYQDMiyb&B+}O@6yD$SEM*{jrB5@v_t}QKOEKH$b zhS`ix^%iqUX6_ry6^a(r3GzbC{KOY)yo=~(uS1cW7HC68uBy^wbr4|&|5@9MXlkC^zIU@8vFn;wW_T#nV_EP{ ztE_2D#<; zRnkvBpg*j*k1$=4qxhds7vD*LQLEBn%&fQJxjRmrP-b%CIm3TAANx_r%5TS{38Tla zt?Rxg{NOxo`i%n~XEg09nb%{&y6_ZLpcpo2h@)PgP4NN>d~ff}R$cwZz7Yxe150KT zduuQkPQS;Ne@i4LIUC#T?91WE=On4h2Y!tfgFNoFk{%6~Vqe?E+Y6f}_XYXPrkVZ( zgQv>XLKzaUx4We)O&I>gJk=aJ+a@txqL=DtE`!Jx!-PXV5tB;RWa(O0L)E_9HrN7* z7fp2hl&8B*^kjZ3F~8{82FuF;+6?O=dg?T6d=z+ij@=8Q>)j`ynn-GqLdqU?*@5@D zbK}S-?^4mwI{Rgp+6tB0G|-XtB=QSC{4BDNZSrGXOP|xJsxvX-_@AN$uoL>p@atoj ztcPf1xXh_>E2&; z(>LTBCRQeVVR|*hPsFcj(T)OQAr6%LO#XR%M>S)QK5>`7jw;x{DC|S?!~Zn>bYRt1yLz)2`l8(WcZ&8<Jbn%MWj-J8xk3eQzKBo%-5(_3pe$MMZxtDFa?5Yt{Ju#X*2+H% zVK334E9#_O(t{@`N)0MXcp?z`DbWK%g@o6pj|x|4qvRTbtOLP1@=e%cUDYqcSF zad2-tI=~I=Olowc41Vdl33g^TlQPZ!c5Vs|fjT(<>a2;|n&aJC0{0PVZT6F{JQnYt zIW?ldM|73k0>M3fZ=svj=HKSnVx42HzE!7}JDmK*4{q@XZrwdM{pANeqpNk*MuXkM z2m~ltCYNkM`%xb=-CAcbI1a)01opttE|wf)M!b7$Su&CO7pY`ZX{(|L$slL5!M4b4 z1vDCnR`OaLRX$4hy7$DBt+SZ7b8V3r(u~#&&lT=vp@KrQO;!7J!hU{Z-3Etl%B8a9KwwK9&Hfm?SV+3xHc&;5&>3iM37yk zdpGBbFExV;E&g;|JDxx{i@09uu2fQ1rr*uF&aJC|i&MvnceE0Ha=jvmojU#pgl(Qp ztKSdZofF}K@GL&*Px@jsV5BW;pIjsrB=l@1UsYK$5w}w|YcMnQEoIf7ltY%~hM!Kq zU$`SnXN+k^+BqyJkSfUb?y4naGY6$#mZ@XnOG}&c_W`YQD9f;L!50rHz0CTl-v(b; z=>z&|%fZkvz}A-X!&8Rxz~^!wZ!FRmxun!y)0JS)qoZa(+ul3n+-28q_HBqSv%|Yo z&ZTNU9uL7ZQaU208Mz(l=^*OZ5-{C&JvE^=4v^!S`x`nY8SpPk)yimnEvagS`@n4O zg&7IVvcg~wf8Rl6+Q5enLE>QB&h>K98X6P>Sy9S_EpIMYU-u>aC(V7H`{plC#r_(1 zB>jvV&$?Gt(+$F1`hbejxONxh@s}t;YW6Q-nG&J$-cb1Z3;j<}#LsG%=2M$NYQ}GH zD|fvSg~!ZPvMDs-t<7zsj0!c05RgWo z$Erqri!%0m{I2hQx=iS%IIgxg2J9q{oCZ@xkDr-d$>Q0{(Nfy)$51*-MY`lX_J5&{ zi@o5@mKlM(xoEoI3Vwl)$1|j{aX@@@7F#BHz8uK@EI~r}TPUIJ1^lpG&8GE{r3WeC zTas)W!RsX4!E|*X==AgtNg2P)v+Y3pUYxAPTPHny`3GD=O*d5&9hY4_4=6Kp>MwJn zB{=XK;nqvr6V6yY1&Sg(J&Vn+-T7y}%$b;lLOw4;W~`Yg1aSC^YaaGNPDj%cru_7= zt^-~+s*|-yS9m@gh)J79u|x2spI2m59Wg2w zqmsNX&QMSNFo=Q})lMnoLt>11>{S1Ho*$Wti%GUpb+sH+OK^#5S?J5a z@I@{E6jv&NQ+*g;{pDV!frvn*u?JEde8KMCuQw&)G;e+Fh#5PEPMNbjl=m~y5wPN- z(PcNzIaV|6U}TeX1@Eg($!%3VpU`bzNF|xm>-;!j@|Yi8QiO`A4;7*+@X54n2dW2C zL8VlDd5&R>1P(4EqTzS3D<_>t`*N#w%rwdB4-jGyCWpcur*o6ty(!M|~AJ`*N6J-1HxGsknk>I$`Me(qd?~Lnx4B#E< zHek|olw4x)zkGI9;lip%rX;xG7oTzFMa3tr-uGq4NfTE#9Zi^J(*b8`Y^Aj4d?S7f zv_D{RdiF`qLnWxEg&9u3JNkXRhq6w-@fy9I?rc)wl>!E$mIKkS;^n4rW57a#P7MBjoSQ&=L~37YUUUw`owk;zqK5hBzX^WJ$ikTfE2npC3jK6yQ2R6T zm1$*W!APp1102aJi8^mtla0*XnL}u4*+peUFiKqNyuT^H(Ye^cS7>O1VFpDQx{aSU zSNcXFZZ`8QSVZZhH^V>8bY8U73zoOm{Q#22&{KYV37t?PN5RyVAJ* zt?fs%s3Sm3a_H1D5V23{ZPmZO$$hLpb`u-w&un6)-gsWDvG0=26&Z`!bH@hPOl&Rt zqW$I%2HM|YXcg%&4N{CIY$oDM!#;DJJ5O5SIA+*Hy>QcNbhgoIA$y*Jtg{c^iF zm#SChy5lj?N33_$?a--7Af8)jNPbB-2mlv?CN&I-Bh_EM-^d>VI#8YooC}#XRzL$i z$BbI)ada6~e8!bQy(*Ow9k~4+6wCD)xsKk$xB!HS1klU$2duWjU?_6-;X{uuV)NJ* zXejWpeks^36h--xUWVThkVh2vYU26DbAsUQ?2FK0Mz>cnI+0KcRV^b(zPn`xW)*CK z`+rlvTlqcD2bCe>e?y>k)Z#7vt8ncr(DHQ6o_>?As7Z7*j{eTlc%TTE6!G?I^VcmD zbZQZx@da?{8cpb2iSjvac00X#w-ox}(5PI0T%V>5#zq1F3ZWryn#B!8zv)LX=en0} zB>UBe1Uwym@aZo0u2H7?*OCcvm!FZHtjpREb2715A=;GBq7d%z>b_L&cUPS736$X9 zL#Fe`S}!R!yp;0EjN6OdCMlsZ-YBgUO;l$_;N{ue+#wh1-C8x4>UT73fiAM8>~#Lr z+T^Ux@!xQfz7N+d4*duCSg`lQjTQVmjI9kpQWTW9-}})T1||}S%?=as&yWG5wkG}l z>{_8FWdGPNF*qZsz|@9FR9Ei*t`O_TiIHP=zB^~I_`fTNcSgVgO;IrVMg6ZAY>Yus z|NqZW65~sFP*!Qm~Un5EdFro+%-Qk}h5m2Id}b({HrGvQYX%x3ok~Bw%0(_K-}T zXT$>8oM&dRwx6L-5Y|>e^jhX0v{UKo$CMUbu{%!67xnUO^h!ET}G!J_hE1(N;K$|knqBFpCK}R#@thaV` zzw8Ql#=Wdo4duU{A)gC)hU7;^461*fYn=peE*|Tlv;<~wM0?=#=18|#HM~WhJ|wkt z4oK^16rG_|7Ju$TtvxUwi$;lqx~S1tqy3e{F4VrK(79px0ZZ*S(GL;&e{y z?eE7f*?240FddhZkf51IvFp5}crtv;LTRLogEx#xy@;DHDLEqDndd+9~>=8`b5OucAv7v1Dop$Y-1{m5*Z^g`ClGGrL({2!JzDu z`5WA3^*L%XxwF70p!;{P{*f$^AMN*q>xAfW_H~gk@J%z)KjxoUbggKc%^KG0t z(&A4s3Ei6x-4hDIbkPOq^VI`M!v;!h;?6m|9|c5}_PFi1Z%EpSy{=!o3EIVZevCI4 zrxG6A!Nb$j!A1P~w0X3pF7Cl6{wId0q?;aY0!yOOFawCz6!-%T5=fIdIRSy!Mufjd zITyq!5D<{F=sUK<-wFa5hEI=Cz!lOsQ)|3Qy0U!@L z$VaE-2ZZF|()y!LpEyP2OLK+Ih>5s&eY_-M_*eUd zUp^$U>@B_;gKDI^LruKr(Rt^);EPEb^6K@`qRi><1I>8m-T}bYQ(mN!-pG&+xwnvJ zKp{}Dd%c1!qgfsDuiC%9l9G0(_2zs1R|{Y#z>#NIW?uL6$x@v|g&%B(U1G**{gxod z8m0(izzW?$%lH221SDWiuGu{O(?m&LFuW!#cHN(q#ek@7i#PCR3WZ4TL)4*i{IA%J z4CG2CXJM+861nT->l2FA3I2KBf;SG!=oPy$lm0lrI>nh8liop2;{p(m3s+fv9baCP zi*ba>&?T(NZ45^Kx2VI<8ih1ZdwQN~yU+Dsb@4A^39G(E4-`-I7BVaw|J}7#Y|~6| zvT`l_5bEr3XEZS!6eB7zaBD3?fW@dq5z}#=rd*C=06Ill`qA;W2o*jT{R9+Bjt^NH zvRSLqX@A&MYdRg48spY-IcCY^WAV6OTh4DtqS49T>Uh3|Em5uiK0Eom;+*yiKl0(( zlI#nbJ6)dAX*O?jP~7hCCPL)w_qGI;E51-Gkj{u1dViIjj^^sfv%&mh|kE&MDO?WOdIy_k+u*Rcto2aC*iR6~DD01T6ocmguii2Tvb%0QNG-rfMZ z3>}xGzD$K?{ziW@A{p3gU0l-NmGn`N51j^zMIPXBS}-@BIOtVC(B*gw{ea90u=hD5 z+>{4n8;5T!2=3fk&wkroT5y8QBVD;0H!EU1qO2Cz{}XEc6f%v*IMUCe3UEpYj8_M&Z-P+4;IAIdPh!y`?Re{3^X7XUOOgaTKvjmK; zcautMd_&9aaiZLSFWKt&5jjyC`?NX_@~Yie7^D`RcaWZXd&0HY>KytZgkl%o_c^7J zf|^Ob;beg!kUbicn9t|IyCEYiDzT;RZ^zzSC1(!;QE9>7c*c%~+*FciQ(bqlCXu1W zziX^OiO&RO+}91bhwBkrkoy&F8Inl%Yk_`l+iIV?f=$Gs{dR=wmMh zCUkZm4ppL95)cFf+Z5H4c}o_{BVg9iT-$F0r*5=ogKVFS2f@_D`0QCwr*ueVmaQOaq$Gujh+Su?7O2>)}YD9$Zrk`RoYi=iO+H!W3dynv+G~82hV;# zfZ~&!N0)MY#0Dbl1os@T_4qX!?Q5%{@aKQVm=R3x&)1e!QxnU^en&vW)*m#uY9Lsk zc&WMSKZnlBHyzg@-gB`klH0v8z6}Vb9M_9TPM2-C3*Jj#KYd+n_D&9;DYqBasP?F! zpD|D1Q4wdeTp5Hz=Y2U_Ymt+?VO2#bTZzJ(i@%!q!ow-S(DOM8c5_+{mvqDP3}Ip< zDsMfygdM`!YN_~V3BsjTMGu=yIvd-~Lc3)nH_Eeo6)zy0#D1# zr0Wv{dS;;P8QUIl8x`Sir3!{Xo$;$}*zvxB&)_{6iFCnbF>n=#F6NGMhZ0j8@D%BN z@F+-0g*O(d2H%77KeFnc;gr~|FwvDY)yPI&cF0142#+v6;j8Z>gYUfpw&nMen(o19PDV~pj z!GLy`7wKnnKjd@}SwZbagj%Rf0_Ff(w~(-jz!@Q}&F(%^pR}Xw9Rg@X0TancnXPjj z967#m-EB<5q;5FciM0Fr<}hu2wGnxSB!+LnBmff@0+s-!6b}Q>lwi&}DGAMF7)cxf z4TXsNTL@8X|7PBR18L3#@*fA`kJ`mOBxHomJVjQjKId%$#W{wD0Fa7*0+a*vgk}g~ zX^l>q;Zn0(fj`ORAP?1AH1n0qwzyzBE)0mlThKPngH||HH6%8BP76OE>@uB(H6VlTHXM~z6TOki{V z9(4ESA2@ZHt%+VfJ}&u~sh0J_Mh7$$btv{rBow`U20ELbE&!9Ng8^i&PK3p%MTyweR_&R`)gd# zG`z??KcdDc1oGBEWYj`IMf%e(S$u96Z32O6k7AeK^%f~yK#Q2h6S?m6uMJo;HZyFl z3ZuqMZeOZqqHbV%;Md<+R=*oI{NmN8?BzcM`?Nu%|1C!U8~pIEw+#|_4hRYSF9)WtX&4CH1#<`LTQv9@?KD%qZ{~6?&lOF zW`tU*S={NZ?~YU8h8`pt^y_YC7=i;jRk93p?yH*BnJy-0!rX+-N2=}*Cn(#uu%d8Y z^i0bT?Ff)SP>z+eyp~BAT=*j{u7-v4zKzS@XMb;x!Jr}j54}C9w3HdbJejm0HB;vt zZP!(gHZ~=_0IAQ1G&4@_2b(BgDE3@I%e;#{9|8@c&iLL0H0#YMt+lcZ3KjUSucaJB zYbj}qohSp5t<_iL_kh)BXx;+p{xz8&3Id^?H%Cb&6S8+9?{0;XvF)aP<#r?f5PNzo zEQQF)S)%-e=_>T%uo0ESmG?dYALP(G+Y~itu>KmzB9bab<2hQa4?rzyUjLOA?ahfD zTn-X>8dB-B*@{$F3bahbz?6eP%+Z8yM+XpJ1VYA3B@SY+XjA60qxBLQNr{633QvKo)#- zBFI$|t*|TD_1o}`bJ9*(l0+bA0@jhCayL-m<*^KViJIc$Qt)_8FS_en(Q2n z1Y+`o1vdK&RV{|UQoa4}tU77Xp0d0)Y-&GV{~z|=va61uYyU(J7J@_Y;O?%$-QC^Y z-JRg>PH=Y*nm}-e1PJc#F4Npk?q}u;{O8TgTIbbSE!9=k)xCfF+E-`3v5%xPbT1Sa z?3L$P!N(asA;E{8BniNSL?5Faamo{ct>EL`Z(8!j=q$mo?<&lYK>j1FC0jAD)-d?E!IK}|wJhV>QpVF#ulFiTDa!@N{N{DVbY+dT+Q zJpl?HL<^(rpGU^f#kZs(|L%`hRW1=)zKXPLGS|?K!7UP}oEQP0RTyi<;Z%&X z=ii_F^WFD9OeAM72?=8gOPnjNzx(np9UJI$e8jJ13CxDb>{0tEkl|#EU;6#|uo5)# zmb0d=JqUjkO6KwH+En#psW_N0N-@Uz@&56ELiR(4Gik^UaiQR=GEQX&3cOnT?J*DG z;@U&qqf53iEg{c5gJBmveJD``{hmu*;f@Va2%{@Y57^Ko^v&;rouRKo61~a*?#fLx z;zcD4M5O@J2hmo>VB_~p^p2r-sSEqEo_2|@r}e&*#ugxw9!ceQ2I6oBVufa@qDQ30TA77M?}emO)A)&eLHas^1PlIeYl3_}&yxy9b6?PLg`>?%u(irk^99--Q+vswVcSUgVffq z`u5jcUc)w$Y?kA6EJqOBd@eQSz{2X{;)d>IwtKa|ir^m>L`MT+93zNflm8;UMF9TX zd%-vQeMYHU7W(p8(2(>UDgF`;C?rBcer+NE{{a2e{BSUrzBqa?wbj0p1H6QL+6$(> zHNk4&2V9{y%u2;mJduKragF4-Zzrjm6if7y0HgES(1=u@B0h3a^$5NIOQIJaylaH# zi}!9q=hliigc}h6Fpp|=uV2Iv#ig1b%i*=T3A<5;AS9ZIN2wGO_ept2+*+@ zz(eimCLVJ|0)jS3NmmkNdo^hd)K}L)q7ZH*0@DVqpUi##qSkRkYGJKx*1yOdJ=T4J zg{b=ikk(~=2++DrZ@Y6oNf8V7ldpUCr(<>Rg>=vga7Ks8P;beA5(_=ZcRCaw4u;K>4e>>>^P=CO>^kjKU_Hw|Pn3_JA{nV&rCRyLx zQ#bQuF-E1deJB62*$*k);IL3f-FCLp-;u|r!r@Hd75}c|iiRL@uvL(5Zre&r2`fX=;8gY@FDQdZ*p43TFEstG!s(_l>3?SryJ(1&Z4A0 zajuo+^z6Zh!${_*!>un}&6lU8t5vinWd}UL@?}qC2mdJT0TvLKt6jCzU#TV$dO5_{ z-1r~+CMWeP%*mx=b`3W%dmZ0&lz@!KPwCz?P{;&zO0_tP$v}dQnAZ{PhhK@2iU&#z ziGL+8^te_taJ2vMEEj7?r=+G+CDkm`UQ8d*AJmj%Gq{iQC=1a*y{7>Gvpz|K4Tc&= zU^`95O(&+>){Efz_k6T$I;oRsYjImuzF&rcn=0*t!DX{gVRqFZCSg0%OK1W`t7muR zdA~1xz4(DH_~8=HpR=YU+CoW-FT^%u(-=;_S)Bh=GtK$8IOc-@s+$a^LN56)=hqG7 z{Q5ApQ(UP(K{yyl%TLAwQr1Sgs6SZP85x=G+~NtBO=aI~XULQvG{DdNz-YqyQ7EI1 zIvmJMZ0z5&E3(yn4IT)AtS3J2k39Z2KJ9l4%LmU#+CRNTmu%B7M}B1^eY1^Ng{!j0{Mr>ZSMGiQd-(9M&cf*(fmWX^849--DvS{{LR(3tSmR@dZp8+P) z2u0uBRDQO5OePo)nI4A>i$!O9-)eGMBAu?O^ZZ-@gsnyP{q!YT8_j#d^xYB@2M(z! zu~jNE<&S>M85-BJq8eRV<}D{&W&H)2-Q_HtdyiMX5LJeTz+(?R6>IB>HxOw^mURF` zlINo_!QUEO&&q12p>L%Ymsmb)E>#?f;e^!-5l93-q|uS*_6UxOj-Kp1`xAkSi%j)= z$%OY$v3b!^QuZJ`;z+%kiB)!TGI|pEjFgldll%xWnMb7EY(;xWSV;O-?6nf>cQA1; z9DH+ z)&bAe1yO=WmdnJVqYQE+gg2;p?EbW|kC|p)1M0BHS-)wnMoqIqOzoE?MP4-zjT$LL zjX#&DR1n1j4!DaE;$-I~#~qHSxIlQpi$p?y&zmiyd}Yproi!*p1vb~{q8{Q>11M*f zdDwB!XtgLOB_-XTwc~F;I2Ve>zTdjgKNGk{b{dHb8yIM(a=tkVP8 z%g$p#TBa}O-6D45&fOpQ?K6zZBE6hUr-J}Lr-6B4)@sJe3VQ81?>`l6mrrBu%=Q<| z5z_@J?A2Po>S!2JqP%o1WLDb3koUZAm^9j4in;uM_4+Z(Tvh8Y*27NKZ!tM_HXN+f ze`n@2I1Fk!d+EX5sTgHQt+OcznRwb;Gao_fc_wNJ~Y-`ZQ21AP-vnZZqJus zx97@yv)X!=zw&f{h58AH8uIZP88!r1T~!zCSBZ_qd+7VDECoH;?N-hB&KLKK2ACbp zLbj+5nV(Cnqwk;GPoO<-=iOzszIWy^Fb&E7Dn;vVjx=sT#zi*GLZER~n_siQ{K&SU zEGQ~6bZbsUBdZ^t(fithTf;7d@FaFvr|jX8etj}6i*Il@nm$Q^(}#tNd6pPQ!A~f} ze!6ldsZtvSnE;u}bhs5?)fjeoMAM}5yE zPbmVxj1x#MsABtFH8TUk{h4ppn6np{$^0`}H?!)13hY#PTD)itgJZ;}*=?oZKy&vk zdrbZUDrbO&8mpq>Y%nBlZJ~*nOg9Y)|FswP!R5KtY1}lpC^a&@%kbzn$87P&N>gAc zwt=s(n_$S;2te)~1kqUr+$ZvDzN$;jmc{srCBVm37c);uGp-hm4%Rxoh=vmDSCY_~O+4dp#z3F*Rd}Wal_B|NC+xBio^g!*OqjI{HM=Lf8 zg#{GgInp)ls-Mb2L51L!F>kjNEG8Eh%M9hB`?SiZJafd2UMF7iiSB5nU&-k?s8X)! zZK+8fbuNcjGqMv)1~9^l-UZ^>=A1)heEz>91^V2@v^NY)9XkioJ5M0(vY|qnk2s_> zG`?P|+51)|^=u|ajoryUf?_6SKfHLk%@f5%?o#-WXtmnVza6*;?s2N=$hTnL9Fiws zG|pBkju(YrZtrS1P^Z@i%A++`tVj3{NBV=5c@0ek--+_F2#^P{riD`W%cajNzuN5z zl{VeW^`%Grdcnh<#_-fm*w^y)Cq)|1cB$gni^dehigVfyYP{wAQTh`QYikB z>H5G?&~Nzhx}J6?-FT)gNs?hkYSF#v6NKQYsz$cCw(FWRC=f}?q(S*Ic z>?h&ozg2V;+2j9`PbMwpTwu|7IP<^EbGw`X7bc*x%5}p$oU5QhTJ?13uJAFJ zc|PZ9+b-0*JSMr5qWmFbl=#5Qxk;8r8c&~1UmZZr`J3~0-JMN2%~lQF6;&4FyrFGN zpbe4312tZ6p4uP}A6<)0)_SxhCl-H60*l-+Bd5@jm?n4i<40)`tv_Bzp9UOZk)7Le z9ma#OHNp>QBOj?Z*H=abAOKMYbQGvH3@mr^aG{FYb(9LJGKn>(a{;^-jKK!b)3(?w z$nA*OWUItQGIJ;wq1494!njiA7sS48S)%*Foa6seNa}vv%CgzqWP;8$&21Qu6?zTM za(4tZkpz9?jYZGtF_yO|8B=-KFu6QAt5F@w_;T>p40izuJxz@x1Y3W!s1RZd@CtbJ-&T{;4=-1wzC&nLPJZt z?s}F415=X|FVki@(BiY!@TLzDJrmavRmkM7)+%hSlqXJ1{Ac6}_dFHui{Zs2fwSa{ zb@uWsY!1<}eM1yKa7%eL5cL*+hSanj(6f-oAy(aBkB{3xr(Y+zj*w>GnT_k3d|u2v zIEJf4yDbt}U>!%Ruiu4RL*>uSKBAY~5WEMpg+N)+tQa-+rKd2QZ|?U*iqK{5deP?9qRamC|WHR zMzjb#Dk>_;R=(OdO^{B4sas~QLw4k&_`VGsp&p)cLYt-K(!mr8Z>QD zsM{cIl77h~-`}FqpAX0Z?SiF0p&yT`BB+&W$$vBmi|l^h<3L?Mh65sa2h_l(D!4t+Q-|DDb&G*iyu)Qje870wmc>=>gi@KS+w!2)_^q6p-fzxpK+vJYam9uC$<3BW4Sz<+Z80KZ`aXKzhzPmM(PUZX%8rHiBxM z)Hu^6Ns^;lFT+UY1f)K9b-u#U^cI{?XxDJaUnZ427an1ZA!|qu`k$vp)dpe^9IWv_ zo3-CO7IaAMe%gZNdR-5+{5EVj)_;w&lGsz#^(j(U!pKlMc5Da zemG7I^7$ag`&|vjY!7gVkF39bhk_TsQ6C!94o6@c^7Z8~y(K|~;3#g#oxxse^m%tLZT@>)Z2T);}o;BXUQv;Nt z=Fo)U*<1zl7-8{{ASNRCe134o8o@#k_v-#GjZz4;3jeHH+|W7j`ApbPqZPt-qpPrZ z2riqLSnbD;cz837d^D&=%+>q6vAH`9nR|<5>~7AV<#z7IWqTpqsKW86)TwO!C*wq{KCJr>z06@CKRF4K`1*O4;vu@+W1K*Yvs$x`bi4u)^| z#rJWNVSRW(YlpGNBNtD2Pe~^T{6Ub?Akst-{N|c8*O{9WhK1_G2UqL8$=dv@>aAb3 ze)vOHi3{Dce}&HJrr3x+dp(-!Vs2_}eXBRR(Q2F!lf|GI&t&EOOWSqp<8tdU3F7-m zx=sZ=2;?Q1J_9n-Nt6JI0SL7ioH>?J1@l8BbtvdsgEg5(K8-W62!d z2mV<@F1oiH0|bfuuYmsqBfQyV+nsCX38L#9uYs9Y_H>oxM3Azm%o1OzW56<>Z8cl5 zMV+8?<&DmBu!|4dWW2Kgl;M;yi-L}F){%_=HM?+^#UB@ohk{v$eFk+gj@6g9_Ix)l$N1y zGC*pF4d3ps{A`AReBOR8X|Ii%bjI<2!~zFEb3ODIRae4Kz>BE)rwc(mTB}(=N1W$< zW9vAX%ZVX>N)f1xLdnobA*cEpbi3ypMPb&^WHXk52IY8_vehIHeEp^2^E=vn2k!mv za0-ht>A%7^{deIT4c)NUKUJv!+`DSfuvaD*pfGwMPRMBhbG0rhvHq_9X{(}t6={A2 z4TGzisY>Szk;+n|ifpeVv_y^DN~)j%5UfzL!FxT~-UsNIv*C^wztyZZb@hNynnjR9 z^+u+1H{z&ksD{Toy*^^y2Jg@776jw4b%vCe{hjt>X!w3JIQqyI1MB41C6ySJ9!SITzQC9A%GNVYX$94qClL62uGOw z5V4i*MTHA6@NI2rfgTun!ULvQp0$!1EQq$=z;`HB4O+o~k_uvixbMMRa%adzGN1OH zK0&$eYEpx$a9ei<3|{C{#xf#o;m)}mZD*GYH_;JVEX=&sXCBDy;9$Mc3{Rqx0zi`y7A9&5|44IWFmTJo^e)1_181!ijXYxH^Q$YGeofv`kPo143O;M0vsSZ!K>iRb z7nCDfu<>vY*S;7Qr=C1d66gagGuu(&Fed_FYN25M{BQ_}iTMJrlD`Ya;g!X)a%N^` z$++lrnOPb`f*KgFu@)C$&k+x-=|&#WBf&tyhfw9npZX{A6}FGjuu0JS1OusQUl zR2{|@IDePEXez5ixP-Xu^y#w`8$8f~ph0zLb&8#s%@yF_uY<&)SJl>~WtJDbsFbz9 z9X?_`TEFsBETG%&XV}ahTA_B)BnK0X1{jcCf&jayvq!DVMX#>5Ur21GhJ)xblM14q zrDb^EPg=S@8<=aRa=n_2oc;_~LG@sy3R0kbSWT(?QSL0-o5u+$%;B+L^bsRJt7Kk2 zD=d&1zXCh#Lu__F4_yWanfxj{-3BHt|I>}Vv zbJ-ke`8>DIGvx8Z;sk{#kIr+Iu_LO4x@+BmLq`=)c9vCqMcDbs!Au!-XOa$e_ft&u zai?vTa${4GOoq?wr-(Q;TG$RAnV4 zGDb!L{x02Y2sHPk09)8|dV{PIdN0vwN7CY=VL%;8M#d%!;KTT(`O5t+8*jP!CJ8^j z3!Xo1uAL$xA?7^_xc$_^*u^6!zzd}Nic57!s`G}!u}8Ge!#I)?p!q5SLZIpjXK4sh zgZFGMyRC%b5h$pF(Nb)4wxY>^N9YPfxD^7^{K)zUT)j1MQ5&+g1# ztVwKz-E1fNeIL0|`1wwUvm;4hNq|N5dx$0z>UlbFI}Mc`V=|GjC>O>Jj!dID`c&%k zjjx@Kr9K{R6QX?stQ}@Ve)j*3`@-N4s9iAcPBNU$oTMU)ii?jZWP@1!z9L>|>}e(> zCMlDu#+90zNYo+1fDUOgQ21$C$3CJ6w2_gM9kvtE?~#|)&4xmf67!BpjT8kIgsL?A z7{~_3uNx$lHugYW_BkfgC@Ln@@jNz*jk|X2l9#t2MWodDRX8+?D&ILOy2``?Uv;)S#i`4!J5N5FI4Z3setg+Y zDoc&d$iTF;9cwSOLFw8Gkbwu{3 zSZhy;O4U94>b0dCT(Slw(F5lVD5n=yVW)|xn5ZO2eP4=qQSx%KZYO)S$*-TjG3hi_ zanMVsW3*9Onk(hJZwQ209CA$6f|-1DS5zDSWB{c91wIj=+z++e=N{lWw!C^`D!Ew<5XFtqG>J{K`E*_VJ6 zuBKYY`zKk0#R30im)kE48j6w!=q$?S3iUJ^=sOM>!1djdmJuLoDVZJqqp>;6&J+4U zk1=l+$y8rJ5Qpi>$u@^&!_o~}GIeKD8zg1~+^6ysJ~aBWuafkcb28ojdLr z0tknT3Al&)X0*u0d~aIaFBcpKg{Eh78?>7DcONi>z7;ElM$R;9VdFV~^cu{yfhA6P2m&M7RAsq?lkx$ye7>bw5clew9jP!92WbtAPJ`dwRkut7P3L^ZY>V;RQj;{@hZty&x_#1(VU=I&t+BSE94IFoy;^E zyKZf~d@VI<46U>Usms{?735`oltf_JG zbCa6`_4>ovp;6;W?A#t9z*HPL&#IYrf*E-M#Qse67fR(uP|n9KxV5R4jk{9s62=@3 zee>I$JNY3u+wI1;?{-*(FGL(GM1V1oi3sE&?5OZw?1}8-{ymFJ`wZ}5*inA#1#HCx z{iTT^LKVOk!T!>7=RmwT=ut=Dx)DC20{@$D$mi2tha+Lx18RK39|jNtxgXJE zC-%}amx*we4jB9Q0VQIEDs|Rx4<&I5wOThi78QdGZ`}Q+F#v8#6(ULtIFOQ&4MXj@ zjWN9qU>X?YeQxlZRpV&i?Xi9t95>q)tI`tubPx|K^z$n$$!B0DnfeV}BU$&y^}HI6 ztQD5aVN`2t1Dw@-MEf@)#sv)0zBRX#Nq}Lz8eJy#bns(e9@qfK*H-s8LBM3Ew%%;M zMpgJ0pVQ=-dVOF+a*DJ_c67JF@JbDv>+s7!wOe)OOqC;KbY8|~Fb~Kc|1VM{41`&0 z08iLg!Vv}kFl96W?T1IhB|r{B^m5 znu_?BfEp#P8BSKMp$pIn{kE>khm&nQgC+59`R}|Vo~0|uo~QLs>-Nb)JQ zf2#?_K={R>fO&TL642x5A5n!>5?kEFeDCM&ttT7_J*oMJ+)P6vp0!3>_*RS{36Pb| zW^g743sb7pU=g`mC7-$CL}LXJ&d8U^rHSmhb`*FuQ?{#(ujTo_(vH1Mp>Yy#W^kV!RG3K8UF;N`aM+DYtVA-Fl z14{4jLqJqn6rp=K|-K?z;mI5}aQA{_O=r z;rWB6yp-e(#MqR1!)8Ws&xOdyU+ZAOTQd;|i!jf`pi#<1KTVaMuJu(87ypyYW&K5L zEEDS1AU9sU+Rz;!W+jKhqh(4WzKhTvlS)b-X|wnvB`E%(C$yN`8C-jBs>GD#st94P zk2+Ib)zwX8=%p4h+@OL2!pwbab^-_AVsuxw2=F|M@rR7X=k$QZW${J9C&6PdL~)>x zidcV+yS;AQeJO?@pH3ziK&tBip3nmyWs52exO}$LvDNl{Hy+H=^Nm6sw$3fdg6Z2N zNrsSt#c4>sh(p~xo)hLHi^0MVKT{29I&uf6uAL>Cc`qehH_L8V1XnDGD#jZ&ozlYo zLln*OAZ(nzYek^kIitQses zicx^PLjCQ%AmL59)-U=5X`$5fqx{O-HoVj6pOa?g*whT?H)ecFGlX8x%haQ=!{`9} z?QRNvm7xJ=)9>5@{ds-u-@?H5f1k>{7a6R4vli?{+KA)2(%sB=0cf-o&$;O3SmoKT z-qpWQso_vjY2}1mCft)Xx)V$+EC!mKjq}(Y4$3@|(z0o5E*&HbUKX`}*swQqLqru; zrpj)~Te)wY8_DwfScHA7lS8hL=E^7cZ`nN(4K9w18XCxT?EQbZzdP;pybZ(T`4%@) z6h^Q2MWfLKP#j{`s0Cdl`NjJ_Ay&-)l;5TQg@Hgh^f@Q-@mFJQne(?Eot4s3N4yvL z7tTV}WT2pG9JZiD7ALd(8&FS|@|5c#7%HmGQn@|(5LG;&S-o?0x7O6KlM0|3VF++} zzMC=l&x58-PEv#@YLT$B#YM`lWyI2p zkg(ISWOL>+jac6XA%sH_8n6GNWoTwFACC}OK~I{(iud!o9InOcdb^GXN6Es3O)%@N zEdy-MzoVp=eD=U~wmgVLoY$sAm)L&HsW<5=YHOSl;@xKb`uimAwL)81wvq}q20 z2jg*2QFuXoAEei4PAekIL9Z5|R8`HKh@7{M_6Q)$mmU3N#TJnSBnehNQW!Xr%Pfmz z9sxq={0~*quC`E|@@|Jy6IHs3n!YTAZf<4vKN|dB*(?opBTh%IFP_42Hz46ZEVOVI z46xFuSF@>QLxv+Bsf=E2KMWBtF2E=c3q2=Aiq_?4vjwp5xqY}O&tTqJTQMYofl2s4 z^y;L_GgKFo+?q%Yl+BbLTFrdtmc85v#VDw*VLwptXNRH#mEkZvZV1!~!nLfd!d*8t zn?Jo*`MGWHwYeyDsv;Yt4`hD!thf~Zx{i;P${@Vzp^IGOQt4nfj< z3^xET?gAewIcgdk()SQv_1}UzD41n2lnji6F_YOwICt%(Mf;eRT_M8>6B}74Wbms` zms_oa5_2I!K+6-KshSgOx7SF?HQCz`)3sry_Y)tVCATVipIsq1{?EQP7i@07p7Nd> zBp2oC$Ux?uLGA^5JKuDH4T4%9Ea=Kqe!#}`14E?|C3oO?9b+@rHvP>pJ=s0GfC@Ug zf#*4?fs}EpxlXZAdJkSV4=~4k;xr5V0{n2OR;ImYUayHn2k_-SlZ~eZlw(vC>-@}aI zcQ-$=;iw5!C>Bbr zci~$;Aw-+9%1nkDX6uKvlj(MbD)>37`aO4nNws9G=o53CRmmT;!?Iki`gur3}@v zJOFpT`gqJigJ!PTMl&Ayz+FB7ygwGK2BGU4$(N_^Xs4SF1aQ9t!4@s+glQUMA5aCt zk!$UfKhCGoIAU-6DE_(1*CQx@9GoEab!~I5qg9=Fy3Yam0J7-d+E&J+y;Q)&NaI`I z(q_sU+;DkfO0v=B7FO_gIL;`DBc7H8ckfxllM^W*>Z_rf^y)+w5I2Z`O@n+kw1!9( z_|@6WhOV}{00iwef1ht_x*8S!Q&oQ=`?b0C2ZTiSArDnTK+gLRmN#oICc$#T!{8Me zaKa^=xN}B9_5ONVz72rwReRrmex<642SSZPpl>}E@lF#|b@bzLoDS}H0?<%=?HpG( z>E3qbfB>M%W6wH>6&QFCN*oW2_yAmpW7-vg4Ip&@zKjOY;+7r|?0<#Iyub*pV^a(g z|0`-=ewS0fkO_eOqsQymz|c%`GJX0tg1>WtlbtYtLjc3}pWh_VbdSM^`uBPEuEM;1 zZ>c{V@_#HVfV;`#U4zXc7cKfvaM?lu$gZEH1Hk^f0}C+5xq$Ki{~QkWf3?^DlY9_> z$OQ}w&ZE(c6aMFj0Ve=7{r!qc2=;G>^Jt(&=GjG%)ag*@*yiphdh} zKQ#Vbk%2dG!vB}MfN-kO0_Xvt^fD#Iv`4COkPGzu{Or_y1rMa70A3GS3j#76y@%Al zEw{mqXY-O{0d}UgOb7IRt47a-|1Iq|T>j zGhtvtA!8x;mP+8Z^pvV1!k%-aQvPVI!Iqyi2T9LNX_~dEff; z_a7`~(4_04pndXFz%U|F6kx)MW2`7PvI^clC0@Zt3Ve|7v&=&VtTq06Y-Qi?QP-Yq zFoV;bq33}b=n8#X%{{LJg6lrEh)2oP=;IzYet!S*#AH&}CDE_`0lwna4?p&O3eI`p zw&e+R=leQ@Eicy$#d%k_f*=}5S(#-sRpCe8Og`Vh0T;zL9sQtAOh=_$veKfu`E6F0 zxTX>X&?MW_01gwjcKHqt?X>sbz#!W6j@$GgZIXvjS$3xN<0LYZiu=|WgiFpiiS>2W zJHecIkKq9eAmCax1n`+zM3|N2W0Olb!1{6m0%!L<5aI)10JjUqVnf<~s&#dzjw8O( zf#*YGU{3l}32Ng1o5Vnx2+(qirXD2zo8@sR`SQVWY?PJCULeMnoa{s=r7&=AGBQR& zh39&9HsJzT6B82&z~3PR1Vh8`&td}_)Tn2n{2J>P8gw9NqBDS{alUtG_Ib((9jH85 zcNKsTC5Dd`OS*P(#TiBfUz(n;&;;~G*2FhQbE)eFZZ4m)f?D=_TTWK!{OL65 zU!GjjI-0GdbaaAb9!xu$tfplq`0tK`64x(;kQG)E)3Yo3IaI0Dqo)oQS$Q!b@@&5W zDZiEj&5K#G`1o|ncN<(@1oh~z$gbs!%?!){U7qKq>bc(zo~c~+^kQkbJ5KI*&}+2& z*2S~yOoIAe;yGkwWO596Bu5HjDzc(O7r{6Z%@oGv#D^4_aG~Up0`e6mhP{TZF=V7M z3W>7+dI2~vNwEX-L+=BrLnde`ds+wZltVNYij$UzCmVfb`t%h>EIOHs-=D78N`-$M z@7R-@yB2tfF$Kz`r2*o60#^`X9Rsy$;27ZWyPiQSR5)2=e_4;KNv(f<)Dd`8@3dWL zxSSEbo3u9B&I>_6;`_@1WqjH|+-$nJUEbhz0)4R9nE8+spH6C7ZW-kG6wnI>p!b9i zRt0sr$D5m5WOQ`G6>1THLtE9S3%CfSdZ7?LDDE(BW@ctGz`gTcxu~=_%V%Ifh)jlG zO{>m>um}AHMq-w8W5aM4Em?Ok`{Sig;9I~0X)#tF#K&5Zknl==!P9DDE-ukTWO*K( zdu&4eB70AVBCCw8rm+GdBJwwtYUligR;8aGxOLEu6G;xko)wU`cX;Q5zm_dR-CQ+_c4iQe{5!gl+?@i(0oz8P20miW`!|QkN!6;`?R_e#xtV~lA;BvHBZ5&2( zOTb$+Y&QI^dpH95AC2Ns=qi;|~3TV~~YbR#A&fRSqQ8@o+vEx#v+xrFgS z0?HtLH&oq8>MevY}om)FdRC*87ei~`(M*u8pQxDKg+@F3$JFEO9~)upV#>KUKNU= zpzDl>LzKve$D#O%R*U-G7QDq)i;80rDk%1IRKhX=4pADyF$IUNcj&=&Pv&#dGt(Z! z!CGb3GoN?&@yd7g2|M?a73XDy8O2s)Ig8-xW%rRGeYwP+qi>3ipX?5i(VT^tRXBaF z7bM(aFaL&LP1O?E+8wSl@0CSGkY@x&#)bi^1F-VbKsm0Z z$!GC-S9=c-&K!QrIS2IQ@l-(dg1Rqpt&bU*v7rZm^i7^>zRa|Wt2d*E3^!>yn@%^R zTn+$Aw{OrlRol8P@NarVBx^qMOHDTPtvc?-*_E;g@P!z zyN&%J(?w^V>83lsXS)YK`*EeGRSQ{Eljn8d7@9`r8l|`^j=kYDcqm#grx~lUAvhtCgmvM;Fwc zu(&bVqes=yUh>daWZ1H!2u=-WK;kn_*}Mbv_ z(ZI>Zl|D-nMSM?aEQQ5DAc)3O;jj{H_C{64UI1j=d|jW=Qgmo zdKgUwtTG$yk2l!Oe!@&pP#`j}TI(<_bvvfp-srSf4If1|7UOfdFFU|;e2wOUZ$kTP z61(OwzcUE>tBlY5cJ@lK6D7Ge3V)b?aJu0*P*P3)^zNBI0ayxP3-!%*vUMZC&q;sd zQz%eY9qf8Z6j7@vBW4jk^}N>108H4A!VwdexSfA|K!zcR#i2@9WcGd)@;on3yD9fi zK|x6OWOmy$Dc9jr8uaIs0tzmejrMlEKdX-ZV5f;twoBN>=g_5jbAM6gUP+>|?|!TI z0n!-Ms0)>BJ9wJ4t^jz6aXE6T@j2g(DnT5bTY`lC*bZ{|n`a{VYc->AK&lf-L^|oQ znY1myuzCgkVfrr$N^)B5_SNtDN=^-HM4m08Sq+gtcnH?!qjt-3g19+Jgk;-F*B{G*KW zuxx-7E3;0>HU}r7(sb|i3s)idrz}A2Id;LczfvC@(T)9J9ncm87W4)Kf`m9+=y7+C z6A8|X4CDLDz_=$k=W?=QD%vmy^X&ZeO$`$dJohYEz z64~nu#^UcnxSQ=S_!cUuhPJNIJi?kcJ|N@+tVC{NW6hG}v@aRw$31q&G`1VEY= zcEe$$hHr4_8kZyzpZZ(<4EWi{WsnMacz{QolZ`+!R|?kGV9>{f+V_VDMORtRjXW{S z9~m|yz2B zcHjD4eQ8Eepn@=8r7wuGo@1^|Fb2oi=qpvK#W9_tF)fqWHG#4HbQ#th;fJ7r09c8$ z@3eK_7vJu3JDu-Ncj&cGTQWQ+uU5X_P2_MncdupST;-nm?0tm$9S?>hwh}*-&A2ia zu%F)-fDG+$^HlQM5lLz{lm0zECyNF<;}5fYAMxzI<`Yq`eTx?aA$f=EfypK$Vn8PA(4XW8c^FrD?Gw9_Gg$< zg8Co^?r=c+mSus#`V#p>Al@&sD>iYdkJqP`B_w{=2R5@F#3x_n)I~VC!ga zzWe)0l``cT;moov#eXZcDTZ3}qlkOHIYX_DxhaC%8e4(^?6R01V!s%MtnQ1JvdK;5 z_r`6napNV{T%dh-F)Si*aqB~}<~XeST7DUIRMXUO)jgnn-n%t9(t^)pS~zHI@Mjm& z>v(K(R{}G~b4uA57un~&Q(uSSj{ml4#c46vX++X^Z0c7P!)_)9BNG{`C?sz6wsltX zxYv*u3jch19Hzdnwx91FBu-L(UlcVVyX~^!iP0)u!vYWcqu=eRjw;MO!rsYjWv7nE zDf)v(X}sR!Y*q|{w+gSp*FfWIJuAKR^J@`t(K3yxKd6rrA`s0$)Ls_zu{B8mAH;|k zIRBZa$=ZER4_jyFZiQX<_4%6L1$KjFYk`2xDc$kNd%@zIH8>sTepz3SV)AGS>I##d zsej!kM=ioYjJ7VsrGkB5v~`7)q3bfWMv-w5Hd4VBwsxi&oqnb`b=si6@;rW!W6Wd6 zR`c>jO0(cIG%c~~I0ojCO>jAQb^j8Azwdoq35tGxZtR(QO#(8$kYI-0>^yz-Mo1%h zp3#EJy+~>DMCO-8)_!4_+rd(cfRmZx309+qmBN!;E4{DiKYXCe$CPJ*16qOS2bhHEMJdAtP_=}fcz zhpDoNv9c-*LGhx1*>{*RLe8oqG{!1BKgPd)6Zfa>Bpet{N<}@=g%fLY6IUtr1KYDmdg@WhA=S?;=!^y7- zj18vqW;+Gn6N4m>>5q)p)Z{YTCz)!;N#eLKqOk^*kdu*GtcZl#%r%qLJpZvbnfc*( zdHwB&!RPm@p%My9^m$Q~MZz z=@pTMjC#*@%>ABVm>?C94`w+^QEL{2*q`1Qj&UWsZoA;t5(-Yq%=Br}9kbtm;b1kS zw$SYhsw)nc8@7oAF+lU8$!0L-Tp=Ox*%^`5wB7SI9^Z_~@1#5z?)leoytoxDGEU+1O@?K>7eIun_-51I@6$puzOrGtJ~T7>p|BQ715!y zqJs)YN8xV)P6ILu8ud@83RIuhK9a4vU-9r@QzGi9y~uKzawtEe$}M3-sAl)ik*Q|c zK3AE9ak=0o@c`tkEkBpUNZ540_{8K1Nt0W?=P~c)w_-W!=V5<0OdSZ;1W*up0FS7V zOIbD#rCJMKncgceFRjSnZMmK&%RU-YF#CH=@RG|7tL{eKF<-KKWH)4n6wPte%?19KgdMkPjy-b8R2S^e_nI~tt=Zg;Th*f z{DWwC@BY6i^AaTgC|&*oK;2mRjdS~;LC4(+aR|tbUjd$m_)d8Oq>AABQ1T66WAm0{ zcW*XZa7w>-zw-^t^G3jA6ann>q|TSxAFfyy4)`FMDI5H!b8}P&NFZS6m}9oBN)oWt zY@eW|s=W{y=0@5?tRV#JQz)6t?v087t;hkY-?o+2K?PuLa*pXuf|$)8#Be@JHma; zFaUM|w_xnE1#@?$f_YLxq3Pbr08j;NzF?gQs31Oo4EcFYG7PlxZlyckEWi9+58A&^ z;G#Eb02Q84aoJpn7`zo&+Z?oGW>-mI6@axZ1h)eAJ`&32@=Z>GbRDpDN3g4OT*8eH zn8%tLKt_%`;?PSu(+a$OWd6)8Sha z!E~p)p#OtX;{aEQOUVA(f8bI8A`mzLXt%%mfB$%Y>3a@12aKHm2O9|(0A~+uclh5w z0tkR^<|llX`bS?$kpU5%umSzb|NgNq4qPY_Y|lUN1or=E$iJiBzXRC+?=}PZvj*ra__B153cY%DVXbI3E6TY6IL6Vs_cku(tWt8VJu+*wvL_m7=Ox`KJf{NDJ&~;s3nvDNb9;$#aYGH87Ai zsjwc--w{*HL`5Y1Cl%fFmOP~^z*Oxe_+~!+#kX*&z^s~tOM(15WtswkV6G}o$eNmn z&EY-B5jKKhzmh}+bPMbJ2DY7UE@D9pBm{V$)^y^KI)K6kR|BTVaB&TrC267Ij7ptpFjeq{io4JZ<@Z``TCb?Y3K8g-j*c$2 zsYxAvpI3WjfeM+}e-H4cnAA2VjJNv=!;kq6b7cKW#yeN9B%iWRdcXMHfOy!0s*aFQ z&f`g+8oO@Y=U5C3=uah|-QQtiOWW%Ha;H&mm7{ZWb(u3A}~YD?JX;sq7@r;8oItWBHY`v@b8e3TUeS{;hQ3W;b=W< z6`D^xv={Xdk2c=hX@36gJtP&z;wC6?YE&=4Zx5BiY(75|BXEn+M{fl>aWF!hU zSK+IelvGJ?S*rjEzb+{mS=%uhc5FsmSq-{auvO&Sn;;8oQALL^C!k^<8si1F-zlLY zV`pFTl!I#$31KB?;1K_{z1?<4vIq6hLmP0pnSSozz%Gh3uA*N5{ufhjULLvPWoTq1 z+wS1d80(#hvFT8k2<~)_cPXdu2FfDJeh>Gi1vNcA>#mfP9LqUj9|c8hlAiuB6cN$G zw$tv^VZER|?{MHnE*-NbmY(<>G_<9sf1T1w54#HpUK@pQoUMmy5Ch(XS%hZz&3-Sc zw3Bi?ITeNESDF=qc3VXhG&D3*Eo+%b?(zG;OMF{RBKtG@h>EVU<)l;KzXA~uk2dsZ zV!zw3zhYUI;xY|_DK=9F5Mot@^VD*qp!=^^JOb$FX-V5!wh$Ut3zh}@`Yhk%;qLD3 zrR_4H(l!G}_}wp`Vs;-?tc-o{NpRT>leL}xq&QwQDXzoVKa8(kJdW56#_rNOYn&qB zayx~RllKml*5mI~;L4|oyIreY?(Q}|)64VUN`MWoCWB?j0j;*}1+)RNh-JVWaw zn=KCIo&KKL#T@6xFp7uQ!|Xfmr}#MI)aU34Nim+ftE`u2c`W)TxkLs%6TCs8r-$JL zrHLeQ5vz!Q0N;^#M@=^H|Dy<8TT97F4YHm;lX`#4OzI}}qNhKNM^B$JI7V#Vb_ zz=1@*GT9?j2Ios|N!i4n7kyRx!+ZC`tyWnL`^_$qkh$wtlfyf+Ar(zq?LfP>n;fs} zU9S|cVYig0IjE(dRxwBiu94cVa|IqxiG%o>^Rj7;(uTrqOD@kEaVqI~xCg2aM*@+i42-V=dPYVOl0b#|0 z|A`NEkh8msJ+vN(i}$EzizmYR?X(BB2h(kd9(+8l8_1Q1=PbfF8|=FA>@;&EA=2S~ z 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 + diff --git a/backpressure/src/main/java/com/iluwatar/backpressure/Publisher.java b/backpressure/src/main/java/com/iluwatar/backpressure/Publisher.java index 20fbd31f6..1d39a070a 100644 --- a/backpressure/src/main/java/com/iluwatar/backpressure/Publisher.java +++ b/backpressure/src/main/java/com/iluwatar/backpressure/Publisher.java @@ -30,6 +30,8 @@ import reactor.core.publisher.Flux; /** This class is the publisher that generates the data stream. */ public class Publisher { + private Publisher() {} + /** * On message method will trigger when the subscribed event is published. * diff --git a/bloc/README.md b/bloc/README.md index da494dba3..73e9da916 100644 --- a/bloc/README.md +++ b/bloc/README.md @@ -5,11 +5,7 @@ description: "Learn how the Bloc pattern helps manage state changes in Java appl category: Structural language: en tag: - - State Management - Event-driven - - Listener Management - - Object Composition - - Dynamic Behavior --- ## Also known as diff --git a/clean-architecture/README.md b/clean-architecture/README.md index 0e2e7f5da..a9a3e4964 100644 --- a/clean-architecture/README.md +++ b/clean-architecture/README.md @@ -6,7 +6,6 @@ category: Behavioral language: en tag: - Decoupling - - Architectural Style --- ## Also known as diff --git a/facade/README.md b/facade/README.md index b0dec75b8..e9f3daf0c 100644 --- a/facade/README.md +++ b/facade/README.md @@ -10,7 +10,7 @@ tag: - Code simplification - Decoupling - Encapsulation - - Gang Of Four + - Gang of Four - Interface - Object composition --- diff --git a/function-composition/README.md b/function-composition/README.md index 5bfef09d2..77f597164 100644 --- a/function-composition/README.md +++ b/function-composition/README.md @@ -5,12 +5,7 @@ description: "Learn about the Function Composition design pattern in Java. Disco category: Functional language: en tag: - - Code simplification - Composition - - Decoupling - - Functional decomposition - - Lambda - - Reusability --- ## Also known as diff --git a/map-reduce/README.md b/map-reduce/README.md index 2b0b15003..d73f513fc 100644 --- a/map-reduce/README.md +++ b/map-reduce/README.md @@ -2,13 +2,10 @@ title: "MapReduce Pattern in Java" shortTitle: MapReduce description: "Learn the MapReduce pattern in Java with real-world examples, class diagrams, and tutorials. Understand its intent, applicability, benefits, and known uses to enhance your design pattern knowledge." -category: Performance optimization +category: Structural language: en tag: - - Data processing - - Code simplification - Delegation - - Performance --- ## Also known as diff --git a/mediator/README.md b/mediator/README.md index f9650d3f1..bcf64f022 100644 --- a/mediator/README.md +++ b/mediator/README.md @@ -6,7 +6,7 @@ category: Behavioral language: en tag: - Decoupling - - Gang Of Four + - Gang of Four - Messaging - Object composition --- diff --git a/microservices-client-side-ui-composition/README.md b/microservices-client-side-ui-composition/README.md index c11b79903..f77bf70d8 100644 --- a/microservices-client-side-ui-composition/README.md +++ b/microservices-client-side-ui-composition/README.md @@ -2,15 +2,10 @@ title: "Client-Side UI Composition Pattern: Assembling Modular UIs in Microservices Architecture" shortTitle: Client-Side UI Composition Pattern description: "Learn how the Client-Side UI Composition pattern allows the assembly of modular UIs on the client side, enabling independent teams to develop, deploy, and scale UI components in a microservices architecture. Discover the benefits, implementation examples, and best practices." -category: User Interface +category: Structural language: en tag: - - Micro Frontends - - API Gateway - - Asynchronous Data Fetching - - UI Integration - - Microservices Architecture - - Scalability + - Asynchronous --- ## **Intent of Client-Side UI Composition Design Pattern** diff --git a/microservices-distributed-tracing/README.md b/microservices-distributed-tracing/README.md index 14b34726f..2ceb06bfb 100644 --- a/microservices-distributed-tracing/README.md +++ b/microservices-distributed-tracing/README.md @@ -2,15 +2,10 @@ title: "Microservices Distributed Tracing Pattern: Enhancing Visibility in Service Communication" shortTitle: Distributed Tracing in Microservices description: "Learn how the Distributed Tracing pattern enhances visibility into service communication across microservices. Discover its benefits, implementation examples, and best practices." -category: Integration +category: Structural language: en tag: - - Distributed tracing - - Microservices architecture - - Service communication - - Performance monitoring - Scalability - - Observability --- ## Intent of Microservices Distributed Tracing Design Pattern diff --git a/microservices-idempotent-consumer/README.md b/microservices-idempotent-consumer/README.md index 794eb6e64..a3065861a 100644 --- a/microservices-idempotent-consumer/README.md +++ b/microservices-idempotent-consumer/README.md @@ -2,13 +2,10 @@ title: "Idempotent Consumer Pattern in Java: Ensuring Reliable Message Processing" shortTitle: Idempotent Consumer description: "Learn about the Idempotent Consumer pattern in Java. Discover how it ensures reliable and consistent message processing, even in cases of duplicate messages." -category: Messaging +category: Structural language: en tag: - - Messaging - - Fault tolerance - Event-driven - - Reliability --- ## Also known as diff --git a/money/README.md b/money/README.md index ca64d68fe..55e6c2f69 100644 --- a/money/README.md +++ b/money/README.md @@ -6,14 +6,6 @@ category: Behavioral language: en tag: - Encapsulation - - Precision handling - - Currency safety - - Value Object - - Financial operations - - Currency - - Financial - - Immutable - - Value Object --- ## Also known as diff --git a/monolithic-architecture/README.md b/monolithic-architecture/README.md index fd288dab3..6704cee7c 100644 --- a/monolithic-architecture/README.md +++ b/monolithic-architecture/README.md @@ -6,10 +6,6 @@ category: Architectural language: en tag: - Cohesion - - Simplicity - - Scalability - - Deployment - - Maintainability --- ## Monolithic-Ecommerce App diff --git a/observer/README.md b/observer/README.md index f5402181a..6b8a70077 100644 --- a/observer/README.md +++ b/observer/README.md @@ -7,7 +7,7 @@ language: en tag: - Decoupling - Event-driven - - Gang Of Four + - Gang of Four - Publish/subscribe --- diff --git a/prototype/README.md b/prototype/README.md index 0293a588b..48f10868a 100644 --- a/prototype/README.md +++ b/prototype/README.md @@ -5,7 +5,7 @@ description: "Explore the Prototype design pattern in Java with a comprehensive category: Creational language: en tag: - - Gang Of Four + - Gang of Four - Instantiation - Object composition - Polymorphism diff --git a/proxy/README.md b/proxy/README.md index a63069bd0..5e5109348 100644 --- a/proxy/README.md +++ b/proxy/README.md @@ -7,7 +7,7 @@ language: en tag: - Decoupling - Encapsulation - - Gang Of Four + - Gang of Four - Lazy initialization - Proxy - Security diff --git a/publish-subscribe/README.md b/publish-subscribe/README.md index 4e88cf2e8..8ff29f2c6 100644 --- a/publish-subscribe/README.md +++ b/publish-subscribe/README.md @@ -6,9 +6,6 @@ category: Behavioral language: en tag: - Decoupling - - Event-driven - - Gang Of Four - - Publish/subscribe --- ## Intent of the Publish-Subscribe Design Pattern diff --git a/service-stub/README.md b/service-stub/README.md index 73b0be059..980e3561d 100644 --- a/service-stub/README.md +++ b/service-stub/README.md @@ -5,10 +5,7 @@ description: "Explore the Service Stub design pattern in Java using a Sentiment category: Structural language: en tag: - - Testing - Decoupling - - Dummy Services - - Dependency Injection --- ## Also known as diff --git a/session-facade/README.md b/session-facade/README.md index 2709e9fc6..4724afcfb 100644 --- a/session-facade/README.md +++ b/session-facade/README.md @@ -6,12 +6,6 @@ category: Structural language: en tag: - Abstraction - - API design - - Code simplification - - Decoupling - - Encapsulation - - Gang Of Four - - Interface --- ## Also known as diff --git a/table-inheritance/README.md b/table-inheritance/README.md index 3e3ad4f53..53e9b2ce0 100644 --- a/table-inheritance/README.md +++ b/table-inheritance/README.md @@ -2,19 +2,10 @@ title: "Table Inheritance Pattern in Java: Modeling Hierarchical Data in Relational Databases" shortTitle: Table Inheritance description: "Explore the Table Inheritance pattern in Java with real-world examples, database schema, and tutorials. Learn how to model class hierarchies elegantly in relational databases." -category: Data Access Pattern, Structural Pattern +category: Structural language: en tag: -- Decoupling -- Inheritance -- Polymorphism -- Object Mapping -- Persistence -- Data Transformation ---- - -## Also Known As -- Class Table Inheritance + - Decoupling --- ## Intent of Table Inheritance Pattern