(* ::Package:: *) (* ::SlideShowNavigationBar:: *) (**) (* ::Title::GrayLevel[0]:: *) (*Optimizations for Digital Forensics Application Development under Linux (using Mathematica)*) (* ::Subtitle::RGBColor[1., 0., 0.4980392156862745]:: *) (*By: Richard Carbone*) (*(Defence R&D Canada)*) (* ::Subtitle::RGBColor[1., 0., 0.4980392156862745]:: *) (*Date: October 14, 2021*) (* ::Abstract::RGBColor[1., 0., 0.4980392156862745]:: *) (*APPROVED FOR PUBLIC RELEASE*) (* ::Affiliation::RGBColor[1., 0., 0.4980392156862745]:: *) (*\[Copyright] Her Majesty the Queen in Right of Canada, Department of National Defence, 2021*) (*\[Copyright] Sa Majest\[EAcute] la Reine du chef du Canada, minist\[EGrave]re de la D\[EAcute]fense nationale, 2021*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*The Who & What*) (* ::Subsection::GrayLevel[0]:: *) (*Digital Forensic Analyst & Researcher*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*What is Digital/Cyber Forensics?*) (* ::Item:: *) (*Many definitions abound*) (* ::Item:: *) (*Here's my definition*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*IT Background*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*FOSS*) (* ::Item::GrayLevel[0]:: *) (*Co-authored seminal report GoC FOSS report*) (* ::Item::GrayLevel[0]:: *) (*FOSS forensics expert*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*System Administrator*) (* ::Item::GrayLevel[0]:: *) (*3 yrs. mainframe (S/390 w/ OS/390)*) (* ::Item::GrayLevel[0]:: *) (*3 yrs. VAX w/ VMS*) (* ::Item::GrayLevel[0]:: *) (*7 yrs. small SGI supercomputers w/ IRIX*) (* ::Item::GrayLevel[0]:: *) (*6 yrs. SUN Solaris (SUN data center systems and UNIX park w/ Solaris & Trusted Solaris)*) (* ::Item::GrayLevel[0]:: *) (*2 yrs. HP MPe*) (* ::Item::GrayLevel[0]:: *) (*22 yrs. Linux*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Programming*) (* ::Item::GrayLevel[0]:: *) (*25 yrs. C (intermittent)*) (* ::Item::GrayLevel[0]:: *) (*4 yrs. COBOL*) (* ::Item::GrayLevel[0]:: *) (*Some OpenMP and a bit of MPI and PVM*) (* ::Item::GrayLevel[0]:: *) (*>20 yrs UNIX shell scripting*) (* ::Item::GrayLevel[0]:: *) (*3 yrs. VAX assembly*) (* ::Item::GrayLevel[0]:: *) (*11 yrs. WDL/Mathematica*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Forensics*) (* ::Item::GrayLevel[0]:: *) (*>15 yrs.*) (* ::Item::GrayLevel[0]:: *) (*Assisted LE*) (* ::Item::GrayLevel[0]:: *) (*Work has helped LE with successful prosecutions*) (* ::Item::GrayLevel[0]:: *) (*Investigated APTs*) (* ::Item::GrayLevel[0]:: *) (*Some malware reverse engineering*) (* ::Item::GrayLevel[0]:: *) (*Cyber incident handler & responder*) (* ::Item::GrayLevel[0]:: *) (*Write and publish in various outlets*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Why use WDL/MMA for Forensics?*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*There is an incredible amount of MATHEMATICS behind the scene in forensics*) (* ::Item::GrayLevel[0]:: *) (*Especially linear algebra*) (* ::Item::GrayLevel[0]:: *) (*Lots of symbolic-type computations too*) (* ::Subsection::GrayLevel[0]:: *) (*Incredible functionality & continuously improving*) (* ::Subsection::GrayLevel[0]:: *) (*Interoperable & multi-platform*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Superior to most any other data analysis & visualization product*) (* ::Item::GrayLevel[0]:: *) (*No serious FOSS rivals*) (* ::Item::GrayLevel[0]:: *) (*Use competitor product or program it oneself*) (* ::Subsection::GrayLevel[0]:: *) (*Suitability: Depends*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Excellent system for BLACK BOX TESTING (BBT)*) (* ::Item:: *) (*BBT is where we infer properties about some system based on its behaviour*) (* ::Item::Closed:: *) (*WDL/MMA can be used to test the accuracy of other systems*) (* ::Subitem:: *) (*Then we can infer features/properties without Reverse Engineering*) (* ::Subitem::Closed:: *) (*Used WDL/MMA to BBT various commercial forensic systems and suites*) (* ::Subsubitem:: *) (*Image analysis*) (* ::Subsubitem:: *) (*OCR extraction*) (* ::Subsubitem:: *) (*Link analysis*) (* ::Subsubitem:: *) (*Date/time analysis*) (* ::Item:: *) (*Some businesses actively pursue anyone who mentions details about their software without approval*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Completed Forensics && Incident Response-Specific Projects using WDL/MMA*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Can Talk About These*) (* ::Item::GrayLevel[0]:: *) (*Parallelized File Hash Comparison App.*) (* ::Item::GrayLevel[0]:: *) (*SGI Irix Partition Validation/Extraction App.*) (* ::Item::GrayLevel[0]:: *) (*CAN Bus (vehicle network) 2.0A/B Protocol Analyser (Big&Little Endian) App.*) (* ::Item::GrayLevel[0]:: *) (*Signal Analysis Visualizer App.*) (* ::Item::GrayLevel[0]:: *) (*Forensic Image Analysis/Enhancement System*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*In Progress (Partial List)*) (* ::Item::GrayLevel[0]:: *) (*In Progress: MBR (PC) Complete Partition Validation/Extraction Prototype*) (* ::Item::GrayLevel[0]:: *) (*In Progress: File Format Reverse Engineering Prototype*) (* ::Item::GrayLevel[0]:: *) (*In Progress: Massive Date/Time Correlation && Visualization Engine*) (* ::Item::GrayLevel[0]:: *) (*In Progress: APT Correlation System*) (* ::Item::GrayLevel[0]:: *) (*In Progress: Massive OCR Extraction System*) (* ::Item::GrayLevel[0]:: *) (*In Progress: Email Correlation System*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Others*) (* ::Item::GrayLevel[0]:: *) (*Not suitable for public venue -> Possible direct LE and military application*) (* ::Item::GrayLevel[0]:: *) (*Functional but unstable prototypes*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Workshop? Another Presentation*) (* ::Item::GrayLevel[0]:: *) (*In another year*) (* ::Item::GrayLevel[0]:: *) (*If there is enough interest in my work...*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*To make most of this presentation*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Good to know*) (* ::Item::GrayLevel[0]:: *) (*Computing hardware *) (* ::Item::GrayLevel[0]:: *) (*Parallelization concepts (SMP, NUMA, cache coherency, clustering)*) (* ::Item::GrayLevel[0]:: *) (*2nd (Assembly) && 3rd Generation (C, Fortran, COBOL) Programming Languages*) (* ::Item::GrayLevel[0]:: *) (*Linux*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*If only we had more time...*) (* ::Item::GrayLevel[0]::Closed:: *) (*Issues relating to Compile[]*) (* ::Subitem::GrayLevel[0]:: *) (*Optimizations*) (* ::Subitem::GrayLevel[0]:: *) (*Bugs*) (* ::Item::GrayLevel[0]::Closed:: *) (*Disk Reading and Writing*) (* ::Subitem::GrayLevel[0]:: *) (*RAW DISK && DEVICE READS && WRITES*) (* ::Subitem::GrayLevel[0]:: *) (*Best methods of getting reads into memory*) (* ::Subitem::GrayLevel[0]:: *) (*Fastest ways to write data to disk*) (* ::Item::GrayLevel[0]:: *) (*Packed Arrays*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*There is lots of material to cover in 30 min.*) (* ::Item::GrayLevel[0]:: *) (*Might not be able to answer questions now...*) (* ::Item::GrayLevel[0]:: *) (*Write me at richard.carbone@drdc-rddc.gc.ca*) (* ::Item::GrayLevel[0]::Closed:: *) (*For the calculations and timings*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*EACH SET OF CALCULATIONS RUN IN THIS NOTEBOOK RELIES ON*) (* ::Subsubitem::GrayLevel[0]:: *) (*$HistoryLength=0;*) (* ::Subsubitem::GrayLevel[0]:: *) (*Share[];*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Q&A*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Will respond to:*) (* ::Item::GrayLevel[0]:: *) (*Pertinent technical questions*) (* ::Item::GrayLevel[0]:: *) (*Some general technical comments*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Will not respond to:*) (* ::Item::GrayLevel[0]:: *) (*Anything political or business-related*) (* ::Item::GrayLevel[0]:: *) (*Anything operational or sensitive*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Why Optimize?*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*Too much data, not enough time, not enough*) (* ::Item::Bold:: *) (*And too few computational resources*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Maximize ROI on hardware & software*) (* ::Item:: *) (*Computer clusters are expensive ($$$-$$$$$)*) (* ::Item:: *) (*High-end GPUs are expensive ($$-$$$)*) (* ::Item:: *) (*Scientific/Data analysis software can be expensive ($$-$$$$)*) (* ::Item:: *) (*Programmers are expensive ($$$-$$$$$)*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*WDL/MMA make it easy to do all this from one place*) (* ::Item:: *) (*Even a single well-equipped workstation can do large amounts of work*) (* ::Item:: *) (*Even more so on a cluster*) (* ::Item:: *) (*Even more so a massive SMP Shared Memory System*) (* ::Item::Closed:: *) (*Integrate with other languages*) (* ::Subitem:: *) (*Python, PERL, JAVA, C, ...*) (* ::Item::Closed:: *) (*Operating system commands and pipes*) (* ::Subitem:: *) (*External commands*) (* ::Item::Closed:: *) (*Read/Write RAW*) (* ::Subitem:: *) (*Network socket*) (* ::Subitem::Closed:: *) (*Raw input device*) (* ::Subsubitem:: *) (*Disks*) (* ::Subsubitem:: *) (*Camera*) (* ::Subsubitem:: *) (*Other I/O*) (* ::Subsubitem:: *) (*I/O REDIRECTION TO PIPE*) (* ::Item::Closed:: *) (*THERE IS A RIGHT WAY TO DO THESE,*) (* ::Subitem:: *) (*OFTEN PLATFORM/ARCHITECTURE SPECIFIC*) (* ::Subitem:: *) (*OFTEN OPERATING SYSTEM SPECIFIC*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Lots of hardware and choices*) (* ::Item::GrayLevel[0]:: *) (*Local workstations underutilized -> Clustering*) (* ::Item::GrayLevel[0]:: *) (*Cheap hardware is abundant*) (* ::Item::GrayLevel[0]:: *) (*Used computational systems available*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Start by Considering Optimization of Data (Processing) Flow*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold::Closed:: *) (*Optimization is always about the flow of data*) (* ::Subitem::GrayLevel[0]::Bold:: *) (*Data starts as some form of input*) (* ::Subitem::GrayLevel[0]::Bold:: *) (*Then is transformed*) (* ::Subitem::GrayLevel[0]::Bold:: *) (*Then results can be used*) (* ::Item::GrayLevel[0]::Bold:: *) (*Many technologies can be used to assist in speeding along this transformation*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*(1) CPU technologies - Parallelization & Multi-threading*) (* ::Item::GrayLevel[0]::Closed:: *) (*Multi-core (SMT)*) (* ::Subitem::GrayLevel[0]:: *) (*Single physical CPU/multiple core*) (* ::Item::GrayLevel[0]::Closed:: *) (*SMP*) (* ::Subitem::GrayLevel[0]:: *) (*Multi-socket CPU*) (* ::Subitem::GrayLevel[0]:: *) (*NUMA & ccNUMA*) (* ::Subitem::GrayLevel[0]:: *) (*Distributed Shared Memory (ex. SGI Origin 2000&NUMALink)*) (* ::Item::GrayLevel[0]::Closed:: *) (*MPP*) (* ::Subitem::GrayLevel[0]:: *) (*Clusters*) (* ::Subitem::GrayLevel[0]:: *) (*Grids*) (* ::Subitem::GrayLevel[0]:: *) (*Hybrids & High-Speed Interconnects*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*(2) Memory *) (* ::Item::GrayLevel[0]:: *) (*I/O data flow to/from memory efficiently?*) (* ::Item::GrayLevel[0]:: *) (*Preload as much as possible*) (* ::Item::GrayLevel[0]:: *) (*Store compactly*) (* ::Item::GrayLevel[0]:: *) (*Data type conversion*) (* ::Item::GrayLevel[0]:: *) (*Clear it when done*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*(3) Storage I/O*) (* ::Item::GrayLevel[0]:: *) (*Read data/store results*) (* ::Item::GrayLevel[0]::Closed:: *) (*Identify needs:*) (* ::Subitem::GrayLevel[0]:: *) (*Type of storage -> Raw or Managed*) (* ::Subitem::GrayLevel[0]:: *) (*Type of workload -> Read or Write*) (* ::Item::GrayLevel[0]::Closed:: *) (*Maximize throughput:*) (* ::Subitem::GrayLevel[0]:: *) (*Read from one disk*) (* ::Subitem::GrayLevel[0]:: *) (*Write to another*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*File system needs to keep up*) (* ::Subsubitem::GrayLevel[0]:: *) (*Which one to choose -> so much choices*) (* ::Subsubitem::GrayLevel[0]:: *) (*Need to consider the pros & cons of each*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*(4) Divide & Conquer*) (* ::Item::GrayLevel[0]::Closed:: *) (*Local system approach*) (* ::Subitem::GrayLevel[0]:: *) (*Send work to CPUs in parallel*) (* ::Item::GrayLevel[0]::Closed:: *) (*Network approach*) (* ::Subitem::GrayLevel[0]:: *) (*Hardware uniformity is key*) (* ::Subitem::GrayLevel[0]:: *) (*Avoid mix and match (i.e., Beowulf)*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*(5) Networking *) (* ::Item::GrayLevel[0]:: *) (*Copper, fibre, WiFi*) (* ::Item::GrayLevel[0]:: *) (*From 10 Mbps to 100 Gbps*) (* ::Item::GrayLevel[0]::Closed:: *) (*High & low latencies interconnect technologies*) (* ::Subitem::GrayLevel[0]:: *) (*Suitable for NUMA && ccNUMA*) (* ::Item::GrayLevel[0]:: *) (*NFS, SMB, and parallel filesystems (network and disk)*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*(6) Baseline your hardware*) (* ::Item::GrayLevel[0]:: *) (*Without, how will you know if you need more*) (* ::Item::GrayLevel[0]::Closed:: *) (*My baselines:*) (* ::Subitem::GrayLevel[0]:: *) (*Supermicro X10DRi & X10DAL workstations*) (* ::Subitem::GrayLevel[0]:: *) (*2x-Xeon 2680v3 2.5 GHz (24/48) & 2x-Xeon 2630v3 2.4 GHz (16/32)*) (* ::Subitem::GrayLevel[0]:: *) (*512 & 256 GiB RAM DDR4 1866 MHz*) (* ::Subitem::GrayLevel[0]:: *) (*2x-256 GiB NVMe swap*) (* ::Subitem::GrayLevel[0]:: *) (*18x-1 TB 7200 RPM -> RAID 60 (3x-RAID6 Striped as RAID0)*) (* ::Subitem::GrayLevel[0]:: *) (*6x-1 Gbps Ethernet*) (* ::Subitem::GrayLevel[0]:: *) (*XFS for parallelized IO*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*(7) Programming Options*) (* ::Item::GrayLevel[0]:: *) (*WDL/Mathematica*) (* ::Item::GrayLevel[0]:: *) (*SMT or SMP w/ C (MPI / PVM / OpenMP / Threads)*) (* ::Item::GrayLevel[0]:: *) (*Other languages too*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*To Consider When Optimizing*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold:: *) (*Optimizing needs to take into account hardware and software*) (* ::Item::GrayLevel[0]::Bold:: *) (*Some optimizations are straightforward, others less*) (* ::Item::GrayLevel[0]::Bold:: *) (*Some optimizations are costly*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Determine what is most important?*) (* ::Item::GrayLevel[0]:: *) (*Program/Application requirements*) (* ::Item::GrayLevel[0]:: *) (*Programming abilities*) (* ::Item::GrayLevel[0]:: *) (*Available hardware*) (* ::Item::GrayLevel[0]:: *) (*Fixing/Improving these can be costly ($$-$$$$$)*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Move on to hardware considerations*) (* ::Item::GrayLevel[0]:: *) (*CPUs -> Multi-core/multi-socket*) (* ::Item::GrayLevel[0]:: *) (*RAM -> >128 GiB DDR3/DDR4*) (* ::Item::GrayLevel[0]:: *) (*Very fast swap -> SSD*) (* ::Item::GrayLevel[0]:: *) (*Fast disk I/O -> SSD & scaled (HDD RAID 5+1 / RAID6/7(ZFS)+1)*) (* ::Item::GrayLevel[0]::Closed:: *) (*Multi-node work -> SSH or RSH*) (* ::Subitem::GrayLevel[0]:: *) (*Requires multiple (or Cluster/Grid) Wolfram license(s)*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Adopt Hardware-Oriented Programming Style*) (* ::Item::GrayLevel[0]:: *) (*Be aware of your hardware and its limits*) (* ::Item::GrayLevel[0]::Closed:: *) (*Mindset critical*) (* ::Subitem::GrayLevel[0]:: *) (*See it as a flow of data*) (* ::Item::GrayLevel[0]:: *) (*Functional programming great for staying hardware agnostic*) (* ::Item::GrayLevel[0]:: *) (*Function-oriented and procedural can better tuned to hardware realities*) (* ::Item::GrayLevel[0]:: *) (*WDL && MMA support many programming styles, which can be combined*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Incorporate Checkpointing & Diagnostic Reporting functionality*) (* ::Item::GrayLevel[0]:: *) (*Checkpointing allows recovery without redoing all past processing*) (* ::Item::GrayLevel[0]:: *) (*Diagnostic Reporting can greatly assist with debugging and tuning*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*CPU - Technologies to Leverage - Part 1*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold:: *) (*GPUs offer incredible performance, at the cost of their low-level programming*) (* ::Item::GrayLevel[0]::Bold:: *) (*CPUs are rarely used to their fullest*) (* ::Item::GrayLevel[0]::Bold:: *) (*SMT, SMP and vectorization can help improve program scalability and performance*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Why not start with GPUs?*) (* ::Item::GrayLevel[0]:: *) (*More complicated to program*) (* ::Item::GrayLevel[0]:: *) (*Typically best GPU performance achieved using C*) (* ::Item::GrayLevel[0]:: *) (*Not as straightforward*) (* ::Item::GrayLevel[0]::Closed:: *) (*Two main technologies*) (* ::Subitem::GrayLevel[0]:: *) (*CUDA*) (* ::Subitem::GrayLevel[0]:: *) (*OpenCL*) (* ::Subitem::GrayLevel[0]:: *) (*Each has pros and cons*) (* ::Item::GrayLevel[0]:: *) (*For uninitiated they are difficult to program*) (* ::Item::GrayLevel[0]:: *) (*CPU Optimization techniques also apply to GPUs*) (* ::Item::GrayLevel[0]:: *) (*GPUs are for vectorized calculations*) (* ::Item::GrayLevel[0]::Closed:: *) (*CPUs are all-purpose && have some vectorized capabilities*) (* ::Subitem::GrayLevel[0]:: *) (*Vectorization capabilities depend on CPU architecture*) (* ::Subitem::GrayLevel[0]:: *) (*State of the art technology*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Why talk about CPUs?*) (* ::Item::GrayLevel[0]:: *) (*Basis for computing*) (* ::Item::GrayLevel[0]:: *) (*Computational resources are finite -> squeeze as much out as possible*) (* ::Item::GrayLevel[0]:: *) (*Too often underutilized*) (* ::Item::GrayLevel[0]:: *) (*Too often capabilities not fully exploited*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*SMT -> Multi-core*) (* ::Item::GrayLevel[0]:: *) (*Multiple simultaneous threads per CPU Socket*) (* ::Item::GrayLevel[0]:: *) (*Typically >1 thread/core*) (* ::Item::GrayLevel[0]::Closed:: *) (*Modern multi-core CPUs use SMP-technologies internally*) (* ::Subitem::GrayLevel[0]:: *) (*Helps improve Multi-Threading*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*With HT (or equivalent) multiple threads per physical core*) (* ::Item::GrayLevel[0]:: *) (*HT -> 2 logical/physical core*) (* ::Item::GrayLevel[0]:: *) (*Requires OS support*) (* ::Item::GrayLevel[0]:: *) (*Must be enabled at BIOS and CPU must support too*) (* ::Item::GrayLevel[0]::Closed:: *) (*Does not necessarily translate into improved performance*) (* ::Subitem::GrayLevel[0]:: *) (*WHY? Cache & memory bandwidth & competing resource access with other threads*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*SMP -> Multi-socket*) (* ::Item::GrayLevel[0]:: *) (*>=2 Physical CPUs*) (* ::Item::GrayLevel[0]:: *) (*SMP implies SMT*) (* ::Item:: *) (*Large SMP systems limited by RAM && cache bandwidth && consistency*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Clusters*) (* ::Item::GrayLevel[0]:: *) (*Many types -> SM, DSM, MPP, Hybrid*) (* ::Item::GrayLevel[0]:: *) (*Fast interconnects*) (* ::Item::GrayLevel[0]:: *) (*Advanced supercomputing architectures*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*GPU & ARM -> This is likely the future of supercomputing*) (* ::Item::Closed:: *) (*Low-end supercomputing is achievable in home office*) (* ::Subitem:: *) (*With proper hardware*) (* ::Subitem:: *) (*Detailed analysis of problem*) (* ::Subitem:: *) (*Excellent programming skills*) (* ::Item::Closed:: *) (*GPUs are nice to have and use*) (* ::Subitem:: *) (*Can be extremely efficient*) (* ::Subitem::Closed:: *) (*Data sent and data returned can be performance bottleneck*) (* ::Subsubitem:: *) (*Size of data sent to GPU*) (* ::Subsubitem:: *) (*Size of data returned from GPU*) (* ::Subsubitem:: *) (*Data sent/received goes through CPU and PCIe bus*) (* ::Subsubitem:: *) (*IRQ Balancing can help, somewhat*) (* ::Subsubitem:: *) (*Faster CPUs, RAM and PCIe all help improve performance before thinking about actual GPU capabilities*) (* ::Subitem::Closed:: *) (*GPU Kernel programming is difficult*) (* ::Subsubitem:: *) (*CUDA vs. OpenCL*) (* ::Subsubitem:: *) (*Some C Compilers help, somewhat*) (* ::Subitem::Closed:: *) (*PC limited by number of available PCIe lanes*) (* ::Subsubitem:: *) (*Some support >18 GPU capable lanes (used for bit-mining)*) (* ::Subitem::Closed:: *) (*High-end supercomputers scale GPU*) (* ::Subsubitem:: *) (*Combine compute-nodes across high-speed interconnect*) (* ::Subsubitem:: *) (*Forms massive SMP Distributed Shared Memory system with CPUs in between*) (* ::Item::Closed:: *) (*ARM is RISC-based*) (* ::Subitem:: *) (*Low-power & efficient*) (* ::Subitem:: *) (*x86 more capable computationally*) (* ::Subitem:: *) (*ARM can be scaled in SMP and Shared-Memory fashion*) (* ::Subitem:: *) (*ARM code compilers still need work*) (* ::Subitem:: *) (*Useful as coprocessor system (think GPU and Xeon Phi)*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*x86 CPU*) (* ::Item::GrayLevel[0]::Closed:: *) (*VECTORIZATION (VZ)*) (* ::Subitem::GrayLevel[0]:: *) (*Vector processing offers incredible number crunching compared to non-VZ*) (* ::Subitem::GrayLevel[0]:: *) (*SIMD (SSE, AVX & AMD Equivalents)*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*MMA uses Intel MKL C Libraries*) (* ::Subsubitem::GrayLevel[0]:: *) (*Automatically makes use of vectorization*) (* ::Subsubitem::GrayLevel[0]:: *) (*If problem statement correctly formulated*) (* ::Subsubitem::GrayLevel[0]:: *) (*Translates down to MMA Compile[] generated programs*) (* ::Item::GrayLevel[0]::Closed:: *) (*Overclocking (OC)*) (* ::Subitem::GrayLevel[0]:: *) (*CPU runs faster (and HOTTER)*) (* ::Subitem::GrayLevel[0]:: *) (*Faster memory transfers (and HOTTER)*) (* ::Subitem::GrayLevel[0]:: *) (*Speed-ups from 5% - 100%, sometimes more*) (* ::Subitem::GrayLevel[0]:: *) (*2x clock speed != 2x performance -> 40-75% gains*) (* ::Subitem::GrayLevel[0]:: *) (*Alternative to costly workstation & server CPUs*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*MOBO & CPU must support OC*) (* ::Subsubitem::GrayLevel[0]:: *) (*Timings and settings can be EXTREMELY DIFFICULT TO SET*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Example Benchmark*) (* ::Subsubitem::GrayLevel[0]:: *) (*ASUS Formula III & Intel i7 980X (6 cores, 12 threads), base speed 3.33 GHZ / RAM 1033 MHz*) (* ::Subsubitem::GrayLevel[0]:: *) (*OC at 5.4 GHz / RAM 1933 MHz -> 38% Mathematica improvement calculating*) (* ::Subsubitem::GrayLevel[0]:: *) (*N[ Pi, 50000000];//AbsoluteTiming*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Most Xeons can be minimally overclocked*) (* ::Subsubitem::GrayLevel[0]:: *) (*Requires MOBO support*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*AMD server CPUs tend to be more over-clockable*) (* ::Subsubitem::GrayLevel[0]:: *) (*Varies*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*CPU - Linux && WDL/MMA - Part 2*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold::Closed:: *) (*Linux provides many mechanisms to schedule and prioritize work, threads and jobs*) (* ::Subitem::GrayLevel[0]::Bold:: *) (*Many programming languages and libraries provide these abilities*) (* ::Item::GrayLevel[0]::Bold:: *) (*Most mechanisms can be done from command line*) (* ::Item::GrayLevel[0]::Bold:: *) (*Some require making kernel changes*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Specifics*) (* ::Item::Closed:: *) (*Fully supports SMT, SMP and HT (and AMD Equivalent)*) (* ::Subitem:: *) (*Kernel 5.13 supports 8,192 cores/CPUs*) (* ::Item::Closed:: *) (*Completely Fair Scheduler is default kernel scheduler*) (* ::Subitem::Closed:: *) (*Others available*) (* ::Subsubitem:: *) (*Typically requires kernel recompile && installation && reboot*) (* ::Subitem:: *) (*CFS provides best all-around performance*) (* ::Subitem::Closed:: *) (*Very specific workloads may benefit from different scheduler*) (* ::Subsubitem:: *) (*Not trivial to set up and test*) (* ::Subitem:: *) (*Modifiable settings (at your peril)*) (* ::Item::Closed:: *) (*Scheduling occurs at thread level, uses time slices (a.k.a., quantum)*) (* ::Subitem:: *) (*Not new, dates back to 70s (i.e., VAX, S/360, others)*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Best use of underlying capabilities typically achieved through low-level programming language*) (* ::Item::GrayLevel[0]:: *) (*Support many high-performance languages*) (* ::Item::GrayLevel[0]::Closed:: *) (*Many compilers available*) (* ::Subitem::GrayLevel[0]:: *) (*Most open-source*) (* ::Subitem::GrayLevel[0]:: *) (*Some commercial ones too*) (* ::Item::GrayLevel[0]::Closed:: *) (*Some interpreted systems can achieve very high-performance levels*) (* ::Subitem::GrayLevel[0]:: *) (*WDL & MMA*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Application thread management*) (* ::Item::GrayLevel[0]::Closed:: *) (*C/C++*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Standard C Library*) (* ::Subsubitem::GrayLevel[0]:: *) (*fork, pthreads*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Other*) (* ::Subsubitem::GrayLevel[0]:: *) (*MPI, OpenMP, PVM, others*) (* ::Item::GrayLevel[0]:: *) (*WDL & MMA*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Memory && CPU Management*) (* ::Item::GrayLevel[0]::Closed:: *) (*Limit & Set CPU & RAM resources through C/C++*) (* ::Subitem::GrayLevel[0]:: *) (*CPUSET (see kernel C documentation/See Michael Kerrisk's THE LINUX PROGRAMMING INTERFACE)*) (* ::Item::GrayLevel[0]:: *) (*OpenMP*) (* ::Item::GrayLevel[0]:: *) (*NUMA*) (* ::Item::GrayLevel[0]:: *) (*Command line programs, tools and system interfaces*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*User Resource Management*) (* ::Item::GrayLevel[0]::Closed:: *) (*System commands*) (* ::Subitem::GrayLevel[0]:: *) (*nice, renice, ionice*) (* ::Item::GrayLevel[0]::Closed:: *) (*Interact with scheduler*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Use sysctl to get/set scheduler parameters (REMOVE QUOTES)*) (* ::Code::Initialization::GrayLevel[0]:: *) # sudo sysctl - A | grep "sched" | grep - v "domain" "kernel.sched_autogroup _enabled = 1" "kernel.sched_cfs _bandwidth _slice _us = 5000" "kernel.sched_child _runs _first = 0" "kernel.sched_deadline _period _max _us = 4194304" "kernel.sched_deadline _period _min _us = 100" "kernel.sched_energy _aware = 1" "kernel.sched_rr _timeslice _ms = 100" "kernel.sched_rt _period _us = 1000000" "kernel.sched_rt _runtime _us = 950000" "kernel.sched_schedstats = 0" (* ::Item::GrayLevel[0]::Closed:: *) (*Process attributes*) (* ::Subitem::GrayLevel[0]:: *) (*command chrt to change real-time scheduling attributes*) (* ::Item::GrayLevel[0]::Closed:: *) (*CPU sets:*) (* ::Subitem::GrayLevel[0]:: *) (*taskset & cpuset*) (* ::Subitem::GrayLevel[0]:: *) (*cgroups (and associated commands)*) (* ::Item::GrayLevel[0]::Closed:: *) (*Change CPU state*) (* ::Subitem::GrayLevel[0]:: *) (*Enable, disable and modify hypervisor(s)*) (* ::Subitem::GrayLevel[0]:: *) (*command chcpu*) (* ::Item::GrayLevel[0]::Closed:: *) (*Finally, NUMA, which is largely automatic*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Only a few commands to use for fine-tuning*) (* ::Subsubitem::GrayLevel[0]:: *) (*numad, numactl, numastat & numatop*) (* ::Subitem::GrayLevel[0]:: *) (*Can be controlled at application level using C and associated library functions*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Other SMT/SMP libraries like OpenMP fully support NUMA*) (* ::Subsubitem::GrayLevel[0]:: *) (*Using C & OpenMP, leveraging NUMA can be made largely automatic*) (* ::Item::GrayLevel[0]::Closed:: *) (*/proc*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Directly modify processes*) (* ::Subsubitem::GrayLevel[0]:: *) (*CPU sets*) (* ::Subsubitem::GrayLevel[0]:: *) (*Affinity*) (* ::Subsubitem::GrayLevel[0]:: *) (*Scheduling priority*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*CPU - Examples - Part 3*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold:: *) (*WDL/MMA Supports Threads, Vectorization and Hyper-Threading*) (* ::Item::GrayLevel[0]::Bold:: *) (*HT must be enabled in BIOS*) (* ::Item::GrayLevel[0]::Bold:: *) (*SYSTEM SCHEDULER determines which threads run where*) (* ::Item::GrayLevel[0]::Bold:: *) (*HT means 2 logical cores(or threads)/physical core*) (* ::Item::GrayLevel[0]::Bold:: *) (*Take-Away - there often is a better way to parallelize mathematical operations*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Examples*) (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPE 1. MINIMAL HYPER-THREADING*) (* ::Subitem::GrayLevel[0]:: *) (*MINIMIZES USE OF HYPER-THREADING WITHOUT DISABLING IT IN BIOS*) (* ::Subitem::GrayLevel[0]:: *) (*Example of Vectorization Vs. SMT/SMP*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*SET # Parallel Threads == # Physical Cores*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->24 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->24 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[{ AbsoluteTiming[ l2 = l1*5*10*15*20*25; ][[1]], AbsoluteTiming[ l2 = (((((l1)*10)*15)*20)*25); ][[1]] }, { i, 1, 30 }]; Print@((Total[ l3[[All, 1]] ]/30)//N); Print@((Total[ l3[[All, 2]] ]/30)//N); ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.758337 6.557020 (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPE 2. HYPER-THREADING*) (* ::Subitem::GrayLevel[0]:: *) (*USES HYPER-THREADING*) (* ::Subitem::GrayLevel[0]:: *) (*Example of HT Vs. Vectorization && SMT/SMP*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*SET # Parallel Threads == 2x # Physical Cores/# Logical Cores*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[{ AbsoluteTiming[ l2 = l1*5*10*15*20*25; ][[1]], AbsoluteTiming[ l2 = (((((l1)*10)*15)*20)*25); ][[1]] }, { i, 1, 30 }]; Print@((Total[ l3[[All, 1]] ]/30)//N); Print@((Total[ l3[[All, 2]] ]/30)//N); ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.454600 5.584748 (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPE 3. LOTS OF THREADS*) (* ::Subitem::GrayLevel[0]:: *) (*SET Parallel Threads set to 3X Physical Cores*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*A NOTICEABLE SLOWDOWN WOULD BE EXPECTED BECAUSE THIS MANY THREADS WILL CAUSE CONTENTION OF CPU && CACHE*) (* ::Code::Initialization::GrayLevel[0]:: *) $HistoryLength=0; Share[]; SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->72 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->72 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[{ AbsoluteTiming[ l2 = l1*5*10*15*20*25; ][[1]], AbsoluteTiming[ l2 = (((((l1)*10)*15)*20)*25); ][[1]] }, { i, 1, 30 }]; Print@((Total[ l3[[All, 1]] ]/30)//N); Print@((Total[ l3[[All, 2]] ]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.430177 5.686476 (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPE 4. EVEN MORE THREADS*) (* ::Subitem::GrayLevel[0]:: *) (*SET Parallel Threads set to 4X Physical Cores*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*EVEN MORE SLOWDOWN WOULD BE EXPECTED*) (* ::Code::Initialization::GrayLevel[0]:: *) $HistoryLength=0; Share[]; SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->96 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->96 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[{ AbsoluteTiming[ l2 = l1*5*10*15*20*25; ][[1]], AbsoluteTiming[ l2 = (((((l1)*10)*15)*20)*25); ][[1]] }, { i, 1, 30 }]; Print@((Total[ l3[[All, 1]] ]/30)//N); Print@((Total[ l3[[All, 2]] ]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.461210 5.810502 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Bonus Example*) (* ::Item::GrayLevel[0]::Closed:: *) (*Sqrt[] is typically very slow*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ results }, Table[ AbsoluteTiming[ results = Sqrt[ Range[ 10^i ]]; ][[1]], { i, 1, 7 }] ] (* ::Subitem::Closed:: *) (*Timings*) 0.000116 0.0007 0.007797 0.172295 1.035009 10.164583 111.782101 (* ::Item::GrayLevel[0]::Closed:: *) (*BUT IT CAN BE VECTORIZED*) (* ::Subitem::Bold::Closed:: *) (*BE VERY CARFEUL SETTING i GREATER THAN 9 OTHERWISE YOU MAY RUN OUR OF MEMORY*) Module[{ results }, Table[ AbsoluteTiming[ results = Sqrt[ Range[10^i]^1.0]; ][[1]], { i, 1, 9 }] ] (* ::Subitem::Closed:: *) (*Timings*) 0.000058 0.000032 0.000048 0.000365 0.000686 0.00445 0.069582 0.625339 5.041054 (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Enhancements for Some Common Operations*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold:: *) (*KEY TAKE AWAY - OFTEN, A LITTLE LESS PRECISION WILL YIELD FASTER *) (* ::Subsection::GrayLevel[0]::Closed:: *) (*PERFORMANCE VS. DATA TYPE (INTEGER OR FLOATING POINT) && (ORDER OF OPERATION)*) (* ::Item::GrayLevel[0]::Closed:: *) (*Multiplication*) (* ::Subitem::GrayLevel[0]:: *) (*SINGLE Constant Vectorized Multiplication (*)*) (* ::Subitem::GrayLevel[0]:: *) (*MULTI-Constant Vectorized Multiplication (*)*) (* ::Item::GrayLevel[0]::Closed:: *) (*Addition && Subtraction*) (* ::Subitem::GrayLevel[0]:: *) (*Summation (Total[])*) (* ::Subitem::GrayLevel[0]:: *) (*Differencing (Difference[])*) (* ::Item::GrayLevel[0]::Closed:: *) (*Visualizations*) (* ::Subitem::GrayLevel[0]:: *) (*ListPlot[]*) (* ::Subitem::GrayLevel[0]:: *) (*MatrixPlot[] && ReliefPlot[]*) (* ::Subitem::GrayLevel[0]:: *) (*Spectrogram[]*) (* ::Item::GrayLevel[0]::Closed:: *) (*List Modification*) (* ::Subitem::GrayLevel[0]:: *) (*Sorting (Sort[])*) (* ::Subitem::GrayLevel[0]:: *) (*Tallying (Tally[])*) (* ::Item::GrayLevel[0]::Closed:: *) (*Data Partitioning && Reshaping*) (* ::Subitem::GrayLevel[0]:: *) (*ArrayReshape[]*) (* ::Subitem::GrayLevel[0]:: *) (*Partition[]*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*SINGLE Constant Vectorized Multiplication*) (* ::Item::GrayLevel[0]::Bold:: *) (*FOR SINGLE CONSTANT VECTORIZED MULTIPLICATION - INTEGER-ONLY MULTIPLICATION IS FASTER*) (* ::Item::GrayLevel[0]::Bold:: *) (*FOR SINGLE CONSTANT VECTORIZED MULTIPLICATION - INTEGER-ONLY (CONSTANT * ARRAY) IS EVEN FASTER*) (* ::Subsubsection::GrayLevel[0]:: *) (*Operands: Array * Constant*) (* ::Item::GrayLevel[0]:: *) (*Integer Array * Integer Constant*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions["ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2]; SetSystemOptions["ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = l1*1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.133333*^-6 (* ::Item::GrayLevel[0]:: *) (*Integer Array * Floating Point Constant*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions["ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2]; SetSystemOptions["ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = l1*1.1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.511010 (* ::Item::GrayLevel[0]:: *) (* Floating Point Array * Integer Constant*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions["ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2]; SetSystemOptions["ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2]; Module[{ l1, l2, l3 }, l1 = 1.1*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = l1*1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.166667*^-6 (* ::Item::GrayLevel[0]:: *) (*Integer Constant * Floating Point Array*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions["ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2]; SetSystemOptions["ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = l1*1.1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.471502 (* ::Subsubsection::GrayLevel[0]:: *) (*Operands: Constant * Array*) (* ::Item::GrayLevel[0]:: *) (*Integer Constant * Integer Array*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions["ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2]; SetSystemOptions["ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = 1*l1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 7.333333*^-7 (* ::Item::GrayLevel[0]:: *) (*Floating Point Constant * Integer Array*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions["ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2]; SetSystemOptions["ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = 1.1*l1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.439361 (* ::Item::GrayLevel[0]:: *) (*Integer Constant * Floating Point Array*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions["ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2]; SetSystemOptions["ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2]; Module[{ l1, l2, l3 }, l1 = 1.1*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = 1.1*l1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.409064 (* ::Item::GrayLevel[0]:: *) (*Floating Point Constant * Floating Point Array*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions["ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2]; SetSystemOptions["ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2]; Module[{ l1, l2, l3 }, l1 = 1.1*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = 1.1*l1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.393932 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Multi-Constant Vectorized Multiplication*) (* ::Item::Bold:: *) (*FOR MULTI - CONSTANT VECTORIZED MULTIPLICATION - INTEGER - ONLY MULTIPLICATION IS FASTER*) (* ::Item::Bold:: *) (*FOR MULTI - CONSTANT VECTORIZED MULTIPLICATION - INTEGER - ONLY (CONSTANT * ARRAY) IS EVEN FASTER*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Operands: Array * Constants*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based Array * Integer Constants*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = l1*5*10*15*20*25; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.339529 (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based Array Variable * Floating Point Constants*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = l1*5.0*10.0*15.0*20.0*25.0; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.364595 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Array * Integer Constants*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = 1.1*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = l1*5*10*15*20*25; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.401562 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Array * Floating Point Constants*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = l1*5.0*10.0*15.0*20.0*25.0; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.382725 (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Operands: Constants * Arrays*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer Constants * Integer-based Array*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = 5*10*15*20*25*l1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.385230 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Constants * Integer-based Array Variable*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = 5.0*10.0*15.0*20.0*25.0*l1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.448549 (* ::Item::GrayLevel[0]::Closed:: *) (*Integer Constants * Floating Point Array*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = 1.1*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = 5*10*15*20*25*l1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.423182 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Constants * Floating Point Array*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = 5.0*10.0*15.0*20.0*25.0*l1; ][[1]], { i, 1, 30 }]; Print@(Total[l3]/30)//N; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.4168834 (* ::Subsection::GrayLevel[0]::Closed:: *) (*ListPlot[]*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - FLOATING POINT PLOT IS FASTER*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based ListPlot[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, plot, list2 }, list = RandomInteger[ 255, 500000 ]; list2 = Table[ AbsoluteTiming[ ListPlot[ list, ColorFunction->"TemperatureMap" ]; ][[1]], { i, 1, 30 }]; Print@((Total[list2]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 9.471063 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point ListPlot[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, plot, list2 }, list = 1.0*RandomInteger[ 255, 500000 ]; list2 = Table[ AbsoluteTiming[ ListPlot[ list, ColorFunction->"TemperatureMap" ]; ][[1]], { i, 1, 30 }]; Print@((Total[list2]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 7.251167 (* ::Subsection::GrayLevel[0]::Closed:: *) (*MatrixPlot[] && ReliefPlot[]*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - MATRIX INTEGER-BASED PLOTTING IS FASTER*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based ListPlot[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, plot, list2 }, list = RandomInteger[ 255, 25000000 ]; list2 = Table[ AbsoluteTiming[ plot = ReliefPlot[ Partition[ list, Floor@Sqrt[ Length@list ]], ColorFunction->"TemperatureMap" ]; ][[1]], { i, 1, 30 }]; Print@((Total[list2]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 32.501200 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point ListPlot[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, plot, list2 }, list = 1.0*RandomInteger[ 255, 25000000 ]; list2 = Table[ AbsoluteTiming[ plot = ReliefPlot[ Partition[ list, Floor@Sqrt[ Length@list ]], ColorFunction->"TemperatureMap" ]; ][[1]], { i, 1, 30 }]; Print@((Total[list2]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 34.121263 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Spectrogram[]*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - INTEGER-BASED SPECTROGRAM IS FASTER*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based Spectrogram[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, spectrogram, list2 }, list = RandomInteger[ 255, 50000000 ]; list2 = Table[ AbsoluteTiming[ spectrogram = Spectrogram[ list, 100, ColorFunction->"TemperatureMap" ]; ][[1]], { i, 1, 30 }]; Print@((Total[list2]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 18.000324 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Spectrogram[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, spectrogram, list2 }, list = 1.0*RandomInteger[ 255, 50000000 ]; list2 = Table[ AbsoluteTiming[ spectrogram = Spectrogram[ list, 100, ColorFunction->"TemperatureMap" ]; ][[1]], { i, 1, 30 }]; Print@((Total[list2]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 21.919740 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Summation*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - FLOATING POINT SUMMATION IS FASTER*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based Total[]*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = Total@l1; ][[1]], { i, 1, 60 }]; Print@((Total[l3]/60)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 0.170806 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Total[]*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = Total@l1; ][[1]], { i, 1, 60 }]; Print@((Total[l3]/60)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 0.095589 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Differencing*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - FLOATING POINT DIFFERENCING IS FASTER*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based Differences[]*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = Differences@l1; ][[1]], { i, 1, 30 }]; Print@((Total[l3]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.459267 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Difference[]*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->$ProcessorCount*2 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->$ProcessorCount*2 ]; Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = Differences@l1; ][[1]], { i, 1, 30 }]; Print@((Total[l3]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 1.322656 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Sorting*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - INTEGER SORTING IS FASTER*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based Sort[]*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->24 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->24 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = Sort@l1; ][[1]], { i, 1, 60 }]; Print@((Total[l3]/60)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 6.781206 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Sort[]*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->24 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->24 ]; Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = Sort@l1; ][[1]], { i, 1, 60 }]; Print@((Total[l3]/60)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 7.177310 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Tallying*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - INTEGER TALLYING IS MAGNITUDES FASTER THAN FOR FLOATING POINT*) (* ::Item::GrayLevel[0]::Closed:: *) (*Integer-based Tally[]*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->24 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->24 ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = Tally@l1; ][[1]], { i, 1, 60 }]; Print@((Total[l3]/60)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 2.954482 (* ::Item::GrayLevel[0]::Closed:: *) (*Floating Point Tally[]*) (* ::Code::Initialization::GrayLevel[0]:: *) SetSystemOptions[ "ParallelOptions"->"ParallelThreadNumber"->24 ]; SetSystemOptions[ "ParallelOptions"->"MKLThreadNumber"->24 ]; Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, 1000000000 ]; l3 = Table[ AbsoluteTiming[ l2 = Tally@l1; ][[1]], { i, 1, 60 }]; Print@((Total[l3]/60)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) 86.749991 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Partition[] && ArrayReshape[]*) (* ::Item::Bold:: *) (*TAKE AWAY - RESHAPING MUCH FASTER THAN PARTITIONING*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Partition[]*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - INTEGER PARTITIONING SIGNIFICANTLY FASTER THAN FLOATING POINT*) (* ::Item::GrayLevel[0]::Closed:: *) (*INTEGER*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, (1024^2)*256 ]; l3 = Table[ AbsoluteTiming[ l2 = Partition[ l1, 10 ];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, (1024^2)*512 ]; l3 = Table[ AbsoluteTiming[ l2 = Partition[ l1, 10 ];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1024^3 ]; l3 = Table[ AbsoluteTiming[ l2 = Partition[ l1, 10 ];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Results*) (* ::Code::Initialization::GrayLevel[0]:: *) {26843545,10} 3.921399 {53687091,10} 7.402106 {107374182,10} 15.153602 (* ::Item::GrayLevel[0]::Closed:: *) (*FLOATING POINT*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, (1024^2)*256 ]; l3 = Table[ AbsoluteTiming[ l2 = Partition[ l1, 10 ];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, (1024^2)*512 ]; l3 = Table[ AbsoluteTiming[ l2 = Partition[ l1, 10 ];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, 1024^3 ]; l3 = Table[ AbsoluteTiming[ l2 = Partition[ l1, 10 ];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Results*) (* ::Code::Initialization::GrayLevel[0]:: *) {26843545,10} 5.045775 {53687091,10} 9.705159 {107374182,10} 20.713863` (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*ArrayReshape[]*) (* ::Item::GrayLevel[0]::Bold:: *) (*TAKE AWAY - INTEGER RESHAPING MOSTLY FASTER THAN FLOATING POINT*) (* ::Item::GrayLevel[0]::Closed:: *) (*INTEGER*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, (1024^2)*256 ]; l3 = Table[ AbsoluteTiming[ l2 = ArrayReshape[ l1, { Floor@(((1024^2)*256)/10), 10 }];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, (1024^2)*512 ]; l3 = Table[ AbsoluteTiming[ l2 = ArrayReshape[ l1, { Floor@(((1024^2)*512)/10), 10 }];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; Module[{ l1, l2, l3 }, l1 = RandomInteger[ 1024, 1024^3 ]; l3 = Table[ AbsoluteTiming[ l2 = ArrayReshape[ l1, { Floor@((1024^3)/10), 10 }];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Results*) (* ::Code::Initialization::GrayLevel[0]:: *) {26843545,10} 0.515491 {53687091,10} 0.927418 {107374182,10} 1.630613 (* ::Item::GrayLevel[0]::Closed:: *) (*FLOATING POINT*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, (1024^2)*256 ]; l3 = Table[ AbsoluteTiming[ l2 = ArrayReshape[ l1, { Floor@(((1024^2)*256)/10), 10 }];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, (1024^2)*512 ]; l3 = Table[ AbsoluteTiming[ l2 = ArrayReshape[ l1, { Floor@(((1024^2)*512)/10), 10 }];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; Module[{ l1, l2, l3 }, l1 = 1.0*RandomInteger[ 1024, 1024^3 ]; l3 = Table[ AbsoluteTiming[ l2 = ArrayReshape[ l1, { Floor@((1024^3)/10), 10 }];][[1]], { i, 1, 30 }]; Print@Dimensions@l2; Print@((Total[l3]/30)//N); ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Results*) {26843545,10} 0.463996 {53687091,10} 0.957453 {107374182,10} 1.893119 (* ::Subsection::GrayLevel[0]::Bold:: *) (**MORE TO BE SEEN IN DATA CONVERSIONS - SLIDE 27*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Linux, SMP & SMT*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*Linux provides multiple SCHEDULERS*) (* ::Item::Bold:: *) (*Fully supports HT, SMT & SMP*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Symmetric Multi-Processing*) (* ::Item:: *) (*Fully supported by Linux, supports >128 cores*) (* ::Item:: *) (*If multiple cores/CPU available, then SMT is used too*) (* ::Item:: *) (*Large SMP systems limited by inter & intra-cache && memory bandwidth*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Symmetric Multi-Threading*) (* ::Item::Closed:: *) (*Modern multi-core CPUs use SMP-technologies within CPU*) (* ::Subitem:: *) (*Helps improve Multi-Threading*) (* ::Item:: *) (*Multiple threads per CPU*) (* ::Item::Closed:: *) (*With HT (or equivalent) multiple threads per physical core*) (* ::Subitem:: *) (*HT -> 2 logical/physical core*) (* ::Subitem:: *) (*Requires OS support*) (* ::Subitem:: *) (*Must be enabled at BIOS and CPU must support too*) (* ::Subitem::Closed:: *) (*Does not necessarily translate into improved performance*) (* ::Subsubitem:: *) (*WHY? Cache & memory bandwidth & competing resource access with other threads*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Linux*) (* ::Item:: *) (*Fully supports SMT, SMP and HT (and AMD Equivalent)*) (* ::Item:: *) (*Completely Fair Scheduler is default kernel scheduler*) (* ::Item::Closed:: *) (*Scheduling occurs at thread level, uses time slices (a.k.a., quantum of time)*) (* ::Subitem:: *) (*Not new idea, dates back to 70s (i.e., VAX, S/360, others)*) (* ::Item::Closed:: *) (*Best use of underlying capabilities achieved through C programming*) (* ::Subitem:: *) (*At Kernel Level -> SCHED,*) (* ::Subitem:: *) (*CPUSET (see kernel C documentation/See Michael Kerrisk's THE LINUX PROGRAMMING INTERFACE)*) (* ::Subitem:: *) (*fork, pthreads, MPI, OpenMP, PVM, others (see C programming manuals or specific implementation documentation)*) (* ::Item::Closed:: *) (*Readily available system commands*) (* ::Subitem:: *) (**WE SAW THESE ON SLIDE 10*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*NUMA && ccNUMA - Part 1*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*Those with SMP machines enable NUMA and ccNUMA*) (* ::Item::Bold:: *) (*Those without SMP machines enable Aggressive Processor Cache settings*) (* ::Item::Bold:: *) (*Disable OS NUMA support*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*NUMA and ccNUMA*) (* ::Item::GrayLevel[0]::Closed:: *) (*Shared Memory (SM)*) (* ::Subitem::GrayLevel[0]:: *) (*Been around a very long time*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*x86 finally in the same ballpark supercomputers were 15 yrs. ago*) (* ::Subsubitem::GrayLevel[0]:: *) (*IBM SP/2, SGI Origin*) (* ::Subsubitem::GrayLevel[0]:: *) (*Been there for about 10 years*) (* ::Item::GrayLevel[0]::Closed:: *) (*Distributed Shared Memory (DSM)*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*The basis for modern supercomputers*) (* ::Subsubitem::GrayLevel[0]:: *) (*Individual nodes have just enough capability to connect to the whole*) (* ::Subsubitem::GrayLevel[0]:: *) (*Then wait to receive and process*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Configured through software*) (* ::Subsubitem::GrayLevel[0]:: *) (*C/C++/Fortran with MPI, PVM*) (* ::Subsubitem::GrayLevel[0]:: *) (*OpenMP can be integrated too*) (* ::Subsubitem::GrayLevel[0]:: *) (*GPUs too*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Bound through high-speed low-latency interconnects*) (* ::Subsubitem::GrayLevel[0]:: *) (*Myrinet, InfiniBand, NUMAlink, ultra high-speed Ethernet*) (* ::Subsubitem::GrayLevel[0]:: *) (*Binds CPU cache and memory banks together, usually through high-speed routing system*) (* ::Subsubitem::GrayLevel[0]:: *) (*Used by multi-node SMP systems*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*What Does it Take to Use it?*) (* ::Item:: *) (*OS Support*) (* ::Item:: *) (*Hardware BIOS Support*) (* ::Item:: *) (*>1 Physical CPU Socket*) (* ::Item::Closed:: *) (*Activate Linux NUMA Support*) (* ::Subitem:: *) (*1. # systemctl start numad.service (check config file for specifics)*) (* ::Subitem:: *) (*2. # numad -i 15 -H 250 (-i scan interval in sec / -H hugemempages in ms)*) (* ::Item::Closed:: *) (*NUMA is largely automatic*) (* ::Subitem::Closed:: *) (*Only a few commands to use for fine-tuning*) (* ::Subsubitem:: *) (*numad, numactl, numastat & numatop*) (* ::Subitem:: *) (*Can be controlled at application level using C and associated library functions*) (* ::Subitem::Closed:: *) (*Other SMT/SMP libraries like OpenMP fully support NUMA*) (* ::Subsubitem:: *) (*Using C & OpenMP, leveraging NUMA can be made largely automatic*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Why Use it?*) (* ::Item:: *) (*Prolonged Number-Crunching*) (* ::Item:: *) (*Helps minimize distance for memory-to-CPU && cache-to-CPU*) (* ::Item::Closed:: *) (*Often enabled by default when two physical CPUs are detected by BIOS*) (* ::Subitem:: *) (*SMP-only systems*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Example Benchmarks*) (* ::Item::Closed:: *) (*Benchmark*) Module[{ list, list2, results }, Print[ AbsoluteTiming[ list = RandomInteger[ 10, 100000000 ]; ][[1]] ]; Print@ByteCount@list; list2 = Table[ AbsoluteTiming[ results = ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->10000000 ]; ][[1]], { i, 30 } ]; Print@(Total[ list2 ]/30)//N; ]; (* ::Item::Closed:: *) (*Specifics*) (* ::Subitem:: *) (*BIOS - NUMA set to ON && numad command run*) (* ::Subitem::Closed:: *) (*BIOS - NUMA set to OFF && (same) numad command run*) numad -i 5 -H 100 numad -i 5 -H 250 numad -i 5 -H 500 numad -i 5 -H 1000 numad -i 10 -H 100 numad -i 10 -H 250 numad -i 10 -H 500 numad -i 10 -H 1000 numad -i 15 -H 100 numad -i 15 -H 250 numad -i 15 -H 500 numad -i 15 -H 1000 numad -i 30 -H 100 numad -i 30 -H 250 numad -i 30 -H 500 numad -i 30 -H 1000 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Results - Is it Worth Using?*) (* ::Item:: *) (*FOR SMP MACHINE -> Performance >5-6% with Hardware NUMA && ccNUMA ON && numad off*) (* ::Item::Closed:: *) (*Significance -> NUMA support is built-in to WDL/Mathematica*) (* ::Subitem:: *) (*MMA relies heavily on built-in OpenMP functionality*) (* ::Subitem:: *) (*OpenMP is NUMA aware*) (* ::Subitem:: *) (*OpenMP works best with NUMA scheduler off*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*NUMA && ccNUMA - Auto-Compilation and Parallelization - Part 2*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*Automatic Compilation Helps*) (* ::Item::Bold:: *) (*Further Augments NUMA*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Automatic Compilation*) (* ::Item::Closed:: *) (*Table & ParallelTable*) (* ::Subitem:: *) (*DEFAULT - ON: SetSystemOptions[ "CompileOptions" -> "TableCompileLength" -> 250 ]*) (* ::Subitem:: *) (*OFF: SetSystemOptions[ "CompileOptions" -> "TableCompileLength" -> Infinity ]*) (* ::Item::Closed:: *) (*Map and ParallelMap*) (* ::Subitem:: *) (*DEFAULT - ON: SetSystemOptions[ "CompileOptions" -> "MapCompileLength" -> 100 ]*) (* ::Subitem:: *) (*OFF: SetSystemOptions[ "CompileOptions" -> "MapCompileLength" -> Infinity ]*) (* ::Item:: *) (*Also SystemOptions[] for Sums, Fold, Nests, Products*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Use Case*) (* ::Item:: *) (*Prolonged Number-Crunching*) (* ::Item:: *) (*Benefits SMT & SMP*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Tests*) (* ::Item::Closed:: *) (*Specifics (OS NUMA OFF FOR ALL TESTS)*) (* ::Subitem:: *) (*Auto-Compile OFF / HARDWARE NUMA OFF*) (* ::Subitem:: *) (*Auto-Compile OFF / HARDWARE NUMA ON*) (* ::Subitem:: *) (*Auto-Compile ON / HARDWARE NUMA OFF*) (* ::Subitem:: *) (*Auto-Compile ON / HARDWARE NUMA ON*) (* ::Subitem:: *) (*Auto-Compile OFF / CPU SOCKET 2 DISABLED (NO NUMA)*) (* ::Subitem:: *) (*Auto-Compile ON / CPU SOCKET 2 DISABLED (NO NUMA)*) (* ::Item::Closed:: *) (*Code*) SetSystemOptions[ "CompileOptions" -> "TableCompileLength"-> 250 ]; Module[{ list, list2, results }, Print[ AbsoluteTiming[ list = RandomInteger[ 10, 100000000 ]; ][[1]] ]; list2 = Table[ AbsoluteTiming[ results = ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->10000000 ]; ][[1]], { i, 30 } ]; Print@(Total[ list2 ]/30)//N; ]; SetSystemOptions[ "CompileOptions" -> "TableCompileLength"-> Infinity ]; Module[{ list, list2, results }, Print[ AbsoluteTiming[ list = RandomInteger[ 10, 100000000 ]; ][[1]] ]; list2 = Table[ AbsoluteTiming[ results = ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->10000000 ]; ][[1]], { i, 30 } ]; Print@(Total[ list2 ]/30)//N; ]; (* ::Subsection::GrayLevel[0]::Closed:: *) (*Results*) (* ::Item::Closed:: *) (*2-SOCKETS && NUMA ON && AUTO COMPILE ON ~10% FASTER THAN 2-SOCKETS && NUMA OFF && AUTO COMPILE OFF*) (* ::Subitem:: *) (*AUTO COMPILE HAS IMPACT, BUT NUMA MORE SO*) (* ::Item::Closed:: *) (*1 CPU SOCKET (DISABLED 1 OF 2 CPUs -> NO NUMA && AUTO COMPILE OFF ~5% WORSE PERFORMANCE THAN 2-SOCKETS && NUMA OFF && AUTO COMPILE OFF*) (* ::Subitem:: *) (*WHY? Half of Memory is physically further away (2 sockets == 2 physically divided memory banks)*) (* ::Subitem::Closed:: *) (*Actually, test system BIOS defines 4 NUMA NODES*) (* ::Subsubitem:: *) (*4x - 12 logical cores/64 GiB RAM*) (* ::Item::Closed:: *) (*RESULTS FROM SINGLE SOCKET i7 980X (not overclocked)*) (* ::Subitem:: *) (*AUTO COMPILE ~5-7% IMPROVEMENT*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Parallelization - Listable Functions - Part 1*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*Listability is not guarantee of Multi - Threaded Performance*) (* ::Item::Bold:: *) (*Not all PARALLELIZATION FUNCTIONS EQUAL*) (* ::Item::Bold::Closed:: *) (*SOMETIMES TABLE && MAP WILL BE FASTER THAN PARALLELTABLE && PARALLELMAP*) (* ::Subitem::Bold:: *) (*SO MANY FACTORS & VARIABLES TO CONSIDER*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Use Built-in Functionality*) (* ::Item::GrayLevel[0]::Closed:: *) (*We run it and at the same and keep open a system resource monitor*) (* ::Code::Initialization::GrayLevel[0]::Plain:: *) Module[{ list1, list2, list3, list4, results, range }, (* NOT ESPECIALLY MULTI-THREADED FUNCTION BUT NONTHELESS FAST. *) Print[ AbsoluteTiming[ list1 = RandomInteger[ 1024, 1000000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ list2 = RandomInteger[ 255, 1000000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ list3 = RandomInteger[ 1024, 250000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ list4 = RandomInteger[ 512, 250000000 ]; ][[1]] ]; (* MULTI-THREADED FUNCTIONS. *) Print[ AbsoluteTiming[ results = Sort@list1; ][[1]] ]; Print[ AbsoluteTiming[ results = Tally@list1; ][[1]] ]; Print[ AbsoluteTiming[ results = Intersection[ list1, list2 ]; ][[1]] ]; (* MULTI-THREADED FUNCTIONS. *) Print[ AbsoluteTiming[ results = Join[ list3, list4 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = list3*list4; ][[1]] ]; Print[ AbsoluteTiming[ results = list3 . list4; ][[1]] ]; Print[ AbsoluteTiming[ range = Range[ 1000000000 ]; ][[1]] ]; ]; (* ::Item::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 22.3045 0.005209 5.57581 5.5754 7.17832 5.21543 8.76913 1.04336 0.900078 0.361232 0.849959 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Listability Helps*) (* ::Item::GrayLevel[0]:: *) (*Not a guarantee of Multi-Threaded capability*) (* ::Item::GrayLevel[0]::Closed:: *) (*However, many non-Listable functions are Multi-Threaded*) (* ::Code::Initialization::GrayLevel[0]:: *) IsListable[f_]:= Attributes[f]; IsListable@RandomInteger IsListable@Sort IsListable@Tally IsListable@Intersection IsListable@Join IsListable@Times IsListable@Dot IsListable@IntegerDigits (* AS WE WILL SEE THIS IS NOT ESPECIALLY MULTI-THREADED OR FAST. *) IsListable@FromDigits (* AS WE WILL SEE THIS IS NOT ESPECIALLY MULTI-THREADED OR FAST. *) IsListable@PrimeQ (* AS WE WILL SEE THIS IS NOT ESPECIALLY MULTI-THREADED OR FAST. *) IsListable@Sqrt (* AS WE WILL SEE THIS FUNCTION'S SPEED IS BASED ENTIRELY ON HOW IT IS USED. *) IsListable@Surd (* AS WE WILL SEE THIS FUNCTION'S SPEED IS BASED ENTIRELY ON HOW IT IS USED. *) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Results*) {Protected} {Protected} {Protected} {Flat,OneIdentity,Protected,ReadProtected} {Flat,OneIdentity,Protected} {Flat,Listable,NumericFunction,OneIdentity,Orderless,Protected} {Flat,OneIdentity,Protected,ReadProtected} {Listable,Protected} {Protected} {Listable,Protected} {Listable,NumericFunction,Protected} {Listable,NumericFunction,Protected,ReadProtected} (* ::Subsection::GrayLevel[0]::Closed:: *) (*Listable != Multi-Threaded (some are marginally Multi-Threaded)*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*We will look at functions that are not especially fast or are dependent on conditions*) (* ::Item::GrayLevel[0]:: *) (*I use these functions regularly*) (* ::Item::GrayLevel[0]::Closed:: *) (*Example 1. PrimeQ[]*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*1A. PrimeQ[] and Range[]*) (* ::Code::Initialization::GrayLevel[0]:: *) PrimeQ[Range[1000000]];//AbsoluteTiming PrimeQ[Range[10000000]];//AbsoluteTiming PrimeQ[Range[100000000]];//AbsoluteTiming (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 0.54714 6.546699 69.823905 (* ::Subitem::GrayLevel[0]::Closed:: *) (*1B. PrimeQ[] Using Map[] & Table && Auto-Parallelization*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ results }, Print[ AbsoluteTiming[ results = Map[ PrimeQ[#]&, Range[100000000] ]; ][[1]] ]; ]; Module[{ results }, Print[ AbsoluteTiming[ results = Table[ PrimeQ[Range[100000000]], {i,1} ]; ][[1]] ]; ]; (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 99.798616 76.964085 (* ::Item::GrayLevel[0]::Closed:: *) (*Example 2. IntegerDigits[]*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Extremely memory hungry function*) (* ::Code::Initialization::GrayLevel[0]::Plain:: *) Module[{ list, results }, list = RandomInteger[ 255, 1000000000 ]; Print[ AbsoluteTiming[ results = IntegerDigits[ list[[1;;100]], 2, 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = IntegerDigits[ list[[1;;100000]], 2, 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = IntegerDigits[ list[[1;;10000000]], 2, 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = IntegerDigits[ list[[1;;1000000000]], 2, 8 ]; ][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 0.114127 1.175206 11.859945 126.163096 (* ::Item::GrayLevel[0]::Closed:: *) (*Example 3. Sqrt[], CubeRoot[] & Surd[]*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Extremely memory hungry functions*) (* ::Code::Initialization::GrayLevel[0]::Plain:: *) Module[{ results }, Print[ AbsoluteTiming[ results = Sqrt[Range[100000000]^1.0]; ][[1]] ]; Print[ AbsoluteTiming[ results = Sqrt[Range[100000000]]; ][[1]] ]; Print[ AbsoluteTiming[ results = CubeRoot[Range[100000000]^1.0]; ][[1]] ]; Print[ AbsoluteTiming[ results = CubeRoot[Range[100000000]]; ][[1]] ]; Print[ AbsoluteTiming[ results = Surd[Range[100000000]^1.0, 4]; ][[1]] ]; Print[ AbsoluteTiming[ results = Surd[Range[100000000], 4]; ][[1]] ]; Print[ AbsoluteTiming[ results = Surd[Range[100000000]^1.0, 5]; ][[1]] ]; Print[ AbsoluteTiming[ results = Surd[Range[100000000], 5]; ][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 0.538416 1308.572440 1.155333 1370.381644 1.136757 1385.930852 1.248640 1380.148153 (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Parallelization - Parallel*[]-based Functions - Part 2*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*Many ways to Parallelize*) (* ::Item::Bold:: *) (*Sometimes Parallelization is slower*) (* ::Item::Bold:: *) (*Sometimes Vectorization is possible*) (* ::Item::Bold:: *) (*Vectorization typically provides major performance boost*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Which Parallelizing function to use? So many to choose from.*) (* ::Item::GrayLevel[0]:: *) (*ParallelTable*) (* ::Item::GrayLevel[0]:: *) (*ParallelMap*) (* ::Item::GrayLevel[0]:: *) (*ParallelDo*) (* ::Item::GrayLevel[0]:: *) (*ParallelSum*) (* ::Item::GrayLevel[0]:: *) (*ParallelEvaluate*) (* ::Item::GrayLevel[0]:: *) (*Parallelize*) (* ::Item::GrayLevel[0]:: *) (*ParallelTry*) (* ::Item::GrayLevel[0]:: *) (*ParallelCombine*) (* ::Item::GrayLevel[0]:: *) (*ParallelArray*) (* ::Item::GrayLevel[0]:: *) (*ParallelProduct*) (* ::Item::GrayLevel[0]:: *) (*ParallelSubmit*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Most functions can (to some extent) be PARALLELIZED*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Ex. 1: PrimeQ*) (* ::Item::GrayLevel[0]:: *) (*PrimeQ is NOT Compilable (Compile[]) so that route is unavailable*) (* ::Item::GrayLevel[0]::Closed:: *) (*Parallelized PrimeQ[] - Method 1*) (* ::Subitem::GrayLevel[0]:: *) (*Performance is WORSE than non-Parallelized attempt*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Performance is Worse due to Kernel Worker memory distribution*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, results }, list = Range[ 100000000 ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->2500000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->5000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->10000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->15000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->20000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->25000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->30000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->35000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->40000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->45000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, list, Method->"ItemsPerEvaluation"->50000000 ]; ][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 143.14404 129.773169 130.415583 130.958373 131.924411 131.649842 132.387769 132.279089 132.378942 132.526389 130.598281 (* ::Item::GrayLevel[0]::Closed:: *) (*Parallelized PrimeQ[] - Method 2*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Performance is MARGINALLY BETTER than non-Parallelized attempt*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ results }, Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000] ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 2500000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 5000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 10000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 15000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 20000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 25000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 30000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 35000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 40000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 45000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Range[100000000], Method->"ItemsPerEvaluation" -> 50000000 ];][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 53.896457 55.155466 56.799753 56.951279 56.758829 56.977055 56.855368 56.871783 56.929758 56.914715 57.089641 56.80722 (* ::Item::GrayLevel[0]::Closed:: *) (*Parallelized PrimeQ[] - Method 3*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*ParallelTable[] == About the same Performance as Method 2*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, results }, list = Range[100000000]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 } ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 2500000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 5000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 10000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 15000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 20000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 25000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 30000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 35000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 40000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 45000000 ];][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[i]] ], {i, 1, 100000000 }, Method->"ItemsPerEvaluation" -> 50000000 ];][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 91.539233 55.161361 57.453827 57.532913 57.649354 57.463441 57.880815 57.583657 57.485576 57.564921 57.458881 58.094693 (* ::Item::GrayLevel[0]::Closed:: *) (*Parallelized PrimeQ[] - Method 4*) (* ::Subitem::GrayLevel[0]:: *) (*Performance is a bit better*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*A. What we're doing here is optimizing data/memory flow between parallel kernel workers*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, results }, list = Range[100000000]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"CoarsestGrained" ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 1 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 2 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 4 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 12 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 16 ]; ][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 79.955838 50.719636 50.758123 50.313593 49.445784 49.058516 49.756598 49.368419 (* ::Item::GrayLevel[0]::Closed:: *) (*Refine interval i*) (* ::Subitem::GrayLevel[0]:: *) (*Sometimes marginal improvement*) (* ::Subitem::GrayLevel[0]:: *) (*Sometimes improvement is significant*) (* ::Subitem::GrayLevel[0]:: *) (*Can be implemented algorithmically*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Finding i can be time-consuming*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, results }, list = Range[100000000]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+24999 ]] ], { i, 1, 100000000, 25000 }]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+24999 ]] ], { i, 1, 100000000, 25000 }, Method->"CoarsestGrained" ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+24999 ]] ], { i, 1, 100000000, 25000 }, Method->"EvaluationsPerKernel" -> 1 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+24999 ]] ], { i, 1, 100000000, 25000 }, Method->"EvaluationsPerKernel" -> 2 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+24999 ]] ], { i, 1, 100000000, 25000 }, Method->"EvaluationsPerKernel" -> 4 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+24999 ]] ], { i, 1, 100000000, 25000 }, Method->"EvaluationsPerKernel" -> 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+24999 ]] ], { i, 1, 100000000, 25000 }, Method->"EvaluationsPerKernel" -> 12 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+24999 ]] ], { i, 1, 100000000, 25000 }, Method->"EvaluationsPerKernel" -> 16 ]; ][[1]] ]; ]; Module[{ list, results }, list = Range[100000000]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+9999 ]] ], { i, 1, 100000000, 10000 }]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+9999 ]] ], { i, 1, 100000000, 10000 }, Method->"CoarsestGrained" ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+9999 ]] ], { i, 1, 100000000, 10000 }, Method->"EvaluationsPerKernel" -> 1 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+9999 ]] ], { i, 1, 100000000, 10000 }, Method->"EvaluationsPerKernel" -> 2 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+9999 ]] ], { i, 1, 100000000, 10000 }, Method->"EvaluationsPerKernel" -> 4 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+9999 ]] ], { i, 1, 100000000, 10000 }, Method->"EvaluationsPerKernel" -> 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+9999 ]] ], { i, 1, 100000000, 10000 }, Method->"EvaluationsPerKernel" -> 12 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+9999 ]] ], { i, 1, 100000000, 10000 }, Method->"EvaluationsPerKernel" -> 16 ]; ][[1]] ]; ]; Module[{ list, results }, list = Range[100000000]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }, Method->"CoarsestGrained" ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }, Method->"EvaluationsPerKernel" -> 1 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }, Method->"EvaluationsPerKernel" -> 2 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }, Method->"EvaluationsPerKernel" -> 4 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }, Method->"EvaluationsPerKernel" -> 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }, Method->"EvaluationsPerKernel" -> 12 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ PrimeQ[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }, Method->"EvaluationsPerKernel" -> 16 ]; ][[1]] ]; ]; Module[{ results }, Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Partition[ Range[100000000], 10000 ]]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Partition[ Range[100000000], 25000 ]]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Partition[ Range[100000000], 50000 ]]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Partition[ Range[100000000], 100000 ]]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Partition[ Range[100000000], 150000 ]]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Partition[ Range[100000000], 200000 ]]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Partition[ Range[100000000], 250000 ]]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[ PrimeQ[#]&, Partition[ Range[100000000], 500000 ]]; ][[1]] ]; ]; Module[{ results }, Print[ AbsoluteTiming[ results = Map[ PrimeQ[#]&, Range[100000000] ]; ][[1]] ]; ]; Module[{ results }, Print[ AbsoluteTiming[ results = Table[ PrimeQ[Range[100000000]], {i,1} ]; ][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Comparative Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) (* ParallelTable ParallelTable ParallelTable ParallelMap Map Table *) 78.492346 78.662458 78.492676 75.588714 99.798616 76.964085 49.904345 50.302219 50.107017 73.022326 49.659712 49.011213 50.084821 72.193461 49.175265 48.918609 50.331045 72.271212 48.98176 48.073743 49.772966 73.073051 49.620544 48.519192 49.389334 72.747496 50.170132 48.921407 49.176895 72.422277 49.177223 48.465836 49.339186 74.458266 (* ::Item::GrayLevel[0]::Bold:: *) (*THERE IS ANOTHER WAY THAT MORE THAN DOUBLES CURRENT PERFORMANCE - WE WILL SEE IT LATER IN DATA CONVERSIONS - SLIDE 27*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Ex. 2: IntegerDigits*) (* ::Item::GrayLevel[0]::Closed:: *) (*Parallelized IntegerDigits[]*) (* ::Code::Initialization::GrayLevel[0]::Plain:: *) Module[{ list, results }, list=RandomInteger[ 255, 100000000 ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->2500000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->5000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->10000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->15000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->20000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->25000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->30000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->35000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->40000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->45000000 ]; ][[1]] ]; Print[ AbsoluteTiming[ results=ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"ItemsPerEvaluation"->50000000 ]; ][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 41.798306 10.578101 10.818704 11.211062 11.072694 11.315444 10.37864 10.842884 11.277903 10.925666 10.639049 (* ::Item::GrayLevel[0]::Closed:: *) (*There are other ways to speed even this up*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Use a Compile[] with IntegerDigits[] and distribute the workload*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ cf, list, results }, cf = Compile[{{x, _Integer, 0}}, IntegerDigits[ x, 2, 8 ], RuntimeAttributes->{Listable}, RuntimeOptions->"Speed" ]; list = RandomInteger[ 255, 100000000 ]; Print[ AbsoluteTiming[ results = ParallelTable[ cf[ list[[ i;;i+99999 ]] ], { i, 1, 100000000, 100000 }]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ cf[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"CoarsestGrained" ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ cf[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 1 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ cf[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 2 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ cf[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 4 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ cf[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ cf[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 12 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ cf[ list[[ i;;i+49999 ]] ], { i, 1, 100000000, 50000 }, Method->"EvaluationsPerKernel" -> 16 ]; ][[1]] ]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Comparative Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 37.867142 8.81542 11.172842 7.251277 7.115861 6.971322 7.308471 7.173022 (* ::Subitem:: *) (*A really fast way*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Ex. 3: Sqrt[] && Surd[]*) (* ::Item::GrayLevel[0]::Closed:: *) (*Parallelized Sqrt[], CubeRoot[] & Surd[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ results }, Print[ AbsoluteTiming[ results = ParallelTable[{ Sqrt[i^1.0], CubeRoot[i^1.0], Surd[i^1.0, 4], Surd[i^1.0, 5] },{i,100000000}]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelMap[{ Sqrt[#^1.0], CubeRoot[#^1.0], Surd[#^1.0, 4], Surd[#^1.0, 5] }&, Range[100000000]]; ][[1]] ]; Print[ AbsoluteTiming[ results = Table[{ Sqrt[i^1.0], CubeRoot[i^1.0], Surd[i^1.0, 4], Surd[i^1.0, 5] }, {i,100000000}]; ][[1]] ]; ]; (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 200.285839 205.466318 462.197225 (* ::Item::GrayLevel[0]::Closed:: *) (*Vectorized Sqrt[], CubeRoot[] & Surd[]*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Sometimes the best parallelization is to avoid parallelizing functions and stick with Vectorization*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ results }, Print[ AbsoluteTiming[ results = Table[{ Sqrt[Range[i]^1.0], CubeRoot[Range[i]^1.0], Surd[Range[i]^1.0, 4], Surd[Range[i]^1.0, 5] }, {i, 100000000, 100000000}]; ][[1]] ]; ]; (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 3.821379 (* ::Subsection::GrayLevel[0]::Closed:: *) (*Caveats to running in Parallel*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Not all equal in speed*) (* ::Item::GrayLevel[0]:: *) (*Ex., ParallelMap@IntegerDigits != ParallelTable@IntegerDigits*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Data Pre-Generation*) (* ::Item::GrayLevel[0]:: *) (*Some won't work due to how problem is phrased*) (* ::Item::GrayLevel[0]::Closed:: *) (*Can speed up non-PARALLELIZED processing*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ range, results, list }, range = Range[10^7]; list = Table[{ AbsoluteTiming[ results = Sqrt[ Range[ 10^7 ]]; ][[1]], AbsoluteTiming[ results = Map[ Sqrt[#]&, Range[ 10^7 ]]; ][[1]], AbsoluteTiming[ results = Map[ Sqrt[#]&, range ]; ][[1]], AbsoluteTiming[ results = Table[ Sqrt[range], { i, 1 } ]; ][[1]], AbsoluteTiming[ results = Table[ Sqrt[i], {i,1,Length@range} ]; ][[1]] }, { i, 1, 10 }]; Table[ Print[ (Total[ list[[All, i]] ]/10)//N ], { i, 1, 5 }]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*In this example, the 1st and 4th processing lines are slowest because Sqrt[] needs to hold the just generated ranges*) (* ::Code::Initialization::GrayLevel[0]:: *) 116.142974 95.336972 95.813393 117.591898 93.689313 (* ::Item::GrayLevel[0]::Closed:: *) (*Can negatively affect PARALLELIZED processing*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ range, results, list }, range = Range[10^7]; list = Table[{ AbsoluteTiming[ results = ParallelMap[ Sqrt[#]&, Range[ 10^7 ]]; ][[1]], AbsoluteTiming[ results = ParallelMap[ Sqrt[#]&, range ]; ][[1]], AbsoluteTiming[ results = ParallelMap[ Sqrt[#]&, Range[ 10^7 ], Method->"EvaluationsPerKernel" -> 16 ]; ][[1]], AbsoluteTiming[ results = ParallelMap[ Sqrt[#]&, range, Method->"EvaluationsPerKernel" -> 16 ]; ][[1]], AbsoluteTiming[ results = ParallelTable[ Sqrt[i], { i, 1, Length@range }]; ][[1]] }, { i, 1, 10 }]; Table[ Print[ (Total[ list[[All, i]] ]/10)//N ], { i, 1, 5 }]; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) (* ::Code::Initialization::GrayLevel[0]:: *) 72.336472 183.310857 72.026018 104.837219 72.301605 (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Inefficient parallel work distribution algorithm*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, results }, list = RandomInteger[ 255, 100000000 ]; results = ParallelTable[ IntegerDigits[ list[[i]], 2, 8 ], { i, 1, 100000000 }, Method->"FinestGrained"];//AbsoluteTiming ]; (* ::Subsection::GrayLevel[0]::Closed:: *) (*DistributeDefinitions[] && ParallelSubmit[]*) (* ::Item::Closed:: *) (*There are many reasons to use distributed definitions*) (* ::Subitem:: *) (*It should be used when you want to Submit work BUT not necessarily run it, yet*) (* ::Item::Closed:: *) (*However, for immediate processing use a different mechanism in lieu of*) (* ::Subitem:: *) (*ParallelTable[]*) (* ::Subitem:: *) (*ParallelMap[]*) (* ::Subitem:: *) (*ParallelEvaluate[] (this one can have too much overhead - watch out with DistributeDefinitions[])*) (* ::Subitem:: *) (*ParallelDo*) (* ::Item::Closed:: *) (*Like LocalSubmit[]*) (* ::Subitem:: *) (*Except getting data returned back from LocalSubmit[] can be problematic*) (* ::Item::Closed:: *) (*Whenever you use a form of DistributeDefinitions && Submit/ParallelSubmit[]*) (* ::Subitem:: *) (*Necessarily there were will be significant kernel IPC overhead*) (* ::Item::Closed:: *) (*Example - Sqrt[], CubeRoot[] and Surd[]*) (* ::Subitem::Closed:: *) (*A very slow way*) f[r_]:=( Table[ Sqrt[i], { i, 1, r }] ) g[r_]:=( Table[ CubeRoot[i], { i, 1, r }] ) h[r_]:=( Table[ Surd[i, 4], { i, 1, r }] ) i[r_]:=( Table[ Surd[i, 5], { i, 1, r }] ) kernel1:=f[10000000]; kernel2:=g[10000000]; kernel3:=h[10000000]; kernel4:=i[10000000]; CloseKernels[]; LaunchKernels[4]; DistributeDefinitions[ kernel1, kernel2, kernel3, kernel4 ]; Print[ AbsoluteTiming[{ e = { ParallelSubmit[kernel1], ParallelSubmit[kernel2], ParallelSubmit[kernel3], ParallelSubmit[kernel4] }; { res1, res2, res3, res4 } = WaitAll[e]; }][[1]] ]; CloseKernels[]; (* ::Subsubitem::Closed:: *) (*Timings*) 640.635907 (* ::Subitem::Closed:: *) (*Better but still slow*) f[r_]:=( Table[ Sqrt[Range[i^1.0]], { i, r, r }] ) g[r_]:=( Table[ CubeRoot[Range[i^1.0]], { i, r, r }] ) h[r_]:=( Table[ Surd[Range[i^1.0], 4], { i, r, r }] ) i[r_]:=( Table[ Surd[Range[i^1.0], 5], { i, r, r }] ) kernel1:=f[1000000]; kernel2:=g[1000000]; kernel3:=h[1000000]; kernel4:=i[1000000]; CloseKernels[]; LaunchKernels[4]; DistributeDefinitions[ kernel1, kernel2, kernel3, kernel4 ]; Print[ AbsoluteTiming[{ e = { ParallelSubmit[kernel1], ParallelSubmit[kernel2], ParallelSubmit[kernel3], ParallelSubmit[kernel4] }; { res1, res2, res3, res4 } = WaitAll[e]; }][[1]] ]; CloseKernels[]; (* ::Subsubitem::Closed:: *) (*Timings*) 55.231853 (* ::Subitem::Closed:: *) (*A much faster way*) f[r_]:=( Table[ Sqrt[i^1.0], { i, 1, r }] ) g[r_]:=( Table[ CubeRoot[i^1.0], { i, 1, r }] ) h[r_]:=( Table[ Surd[i^1.0, 4], { i, 1, r }] ) i[r_]:=( Table[ Surd[i^1.0, 5], { i, 1, r }] ) kernel1:=f[10000000]; kernel2:=g[10000000]; kernel3:=h[10000000]; kernel4:=i[10000000]; CloseKernels[]; LaunchKernels[4]; DistributeDefinitions[ kernel1, kernel2, kernel3, kernel4 ]; Print[ AbsoluteTiming[{ e = { ParallelSubmit[kernel1], ParallelSubmit[kernel2], ParallelSubmit[kernel3], ParallelSubmit[kernel4] }; { res1, res2, res3, res4 } = WaitAll[e]; }][[1]] ]; CloseKernels[]; (* ::Subsubitem::Closed:: *) (*Timings*) 32.178028 (* ::Subsection::GrayLevel[0]::Closed:: *) (*An efficient way to phrase a parallelization problem*) (* ::Item::GrayLevel[0]::Closed:: *) (*Context*) (* ::Subitem::GrayLevel[0]:: *) (*Read in Network Capture File -> PCAP*) (* ::Subitem::GrayLevel[0]:: *) (*Identify BYTE ORDERING from PCAP header (done elsewhere in program)*) (* ::Subitem::GrayLevel[0]:: *) (*Identify MICROSECOND or NANOSECOND time resolution, from PCAP header (done elsewhere in program)*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*BYTES 25 TO END OF PCAP STORED AS NUMERICARRAY (UNSIGNEDINTEGER8)*) (* ::Subsubitem::GrayLevel[0]:: *) (*Dimension == { NUMBERPACKETS, 32 }*) (* ::Subitem::GrayLevel[0]:: *) (*For simplicity, each network packet is 32 bytes long*) (* ::Subitem::GrayLevel[0]:: *) (*BYTES 1 to 4 per packet == UNIX TIME*) (* ::Subitem::GrayLevel[0]:: *) (*BYTES 5 to 8 per packet == FRACTIONAL UNIX TIME*) (* ::Item::GrayLevel[0]::Closed:: *) (*Possible solution*) (* ::Subitem::GrayLevel[0]:: *) (*Benefits from PARALLELIZATION*) (* ::Subitem::GrayLevel[0]:: *) (*Benefits from DATA CONVERSION*) (* ::Subitem::GrayLevel[0]:: *) (*Tallying is much faster because there is only 1 set of numbers, not 4*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Then what needs to be stored in memory for other parts of program*) (* ::Subsubitem::GrayLevel[0]:: *) (*Kept as NumericArray*) (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Memory is then cleared to remove Parallel Kernel memory*) (* ::Code::Initialization::GrayLevel[0]:: *) PcapUnixTimeFUNC[] := Module[{ temp1, temp2 }, { temp1, temp2 } = ParallelMap[ ImportByteArray[ #, "UnsignedInteger32", ByteOrdering->PcapByteOrder ]&, { ByteArray@Flatten@RAWPCAPDATA[[All, 1;;4]], ByteArray@Flatten@RAWPCAPDATA[[All, 5;;8]] }, Method->"FinestGrained" ]; PcapUnixTime = NumericArray[ temp1, "UnsignedInteger32" ]; PcapUnixTimeTally = Tally[ Normal@PcapUnixTime ]; PcapUnixFracTime = NumericArray[ PcapTimeResolution*temp2, "Real32" ]; ClearKernelMemoryFUNC[]; ]; (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Parallelization - External Programs - Part 3*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*External programs improve capabilities*) (* ::Item::Bold:: *) (*Easy to do and use*) (* ::Item::Bold:: *) (*Can be readily parallelized*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*When should External Programs be used?*) (* ::Item:: *) (*Necessary to use external program/command for processing*) (* ::Item::Closed:: *) (*Send/Receive data*) (* ::Subitem:: *) (*Network pipe (think netcat)*) (* ::Item:: *) (*Program written in C linked through WSTP or LibraryLink*) (* ::Item:: *) (*Other language like Python, Java, etc .*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Complex example with GUI selector*) (* ::Item::GrayLevel[0]:: *) (*Goal -> to perform specialized data hashing functions outside MMA*) (* ::Item::GrayLevel[0]::Closed:: *) (*Part 1. Define GUI Selector function*) (* GIVE USER INTERFACE TO CHOOSE HASHING ALGORITHMS. *) HashOptionsFUNC[] := Magnify[ TextCell[ Framed[ CheckboxBar[ Dynamic[hashingcheckboxbar], { "md5sum" ->"MD5", "sha1sum" ->"SHA1", "sha224sum" ->"SHA224", "sha256sum" ->"SHA256", "sha384sum" ->"SHA384", "sha512sum" ->"SHA512", "tigerdeep" ->"TIGER", "whirlpooldeep" ->"WHIRLPOOL" }, BaseStyle->{Small, FontColor->Red}, Appearance->"Vertical" ], RoundingRadius->5, FrameMargins->Large ], Background->LightBlue ], 2 ]; (* ::Item::GrayLevel[0]::Closed:: *) (*Part 2. Define Parallel tasking function*) (* ::Subitem::Closed:: *) (*ParallelMap is extremely versatile for this type of work*) (* HASHING FUNCTIONS PROVIDED BY OPERATING SYSTEM COMMANDS. WE RUN THEM IN PAPALLEL AND AND RECEIVE THEIR OUTPUT IN THE ORDER THE COMMANDS ARE EXECUTED. *) PcapFileHashingFUNC[] := Module[{ sortedhashinglist, hashingcommandlist, hashoutputs, i }, sortedhashinglist = Sort@hashingcheckboxbar; hashingcommandlist = {}; For[ i=1, i<=Length@sortedhashinglist, i++, AppendTo[ hashingcommandlist, StringJoin[ "!", sortedhashinglist[[i]], " ", PcapFileName, " | awk '{print $1}'" ] ] ]; hashoutputs = Flatten@ParallelMap[ ReadList[ #, String, RecordLists->True ]&, hashingcommandlist ]; Print[ "\nHASHES:\n", "=======\n" ]; For[ i=1, i<=Length@sortedhashinglist, i++, Print[ sortedhashinglist[[i]], "\t", hashoutputs[[i]], "\n" ]; ]; ]; (* ::Item::GrayLevel[0]::Closed:: *) (*Part 3. Run predefined functions*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Run in conjunction with Resource Monitor to verify parallelism*) PcapFileName = "/home/chromium/case_SHA1_NAMES.txt"; HashOptionsFUNC[] PcapFileHashingFUNC[] (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Errors & Diagnostics - Part 1*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*If you don't work in modern GUI editor there is a way to conveniently capture error messages*) (* ::Item::Bold:: *) (*Can also be used to pipe away from STDOUT*) (* ::Item::Bold:: *) (*Also generates easy to use log files*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*CAVEAT: WORKBENCH PROVIDES FINE-TUNED APPLICATION PROFILING && DEBUG*) (* ::Item::GrayLevel[0]:: *) (*WON'T TALK ABOUT THIS - IT IS ALREADY DOCUMENTED*) (* ::Item::GrayLevel[0]:: *) (*OFTEN OVERKILL*) (* ::Item::GrayLevel[0]::Closed:: *) (*YOUR MILEAGE WILL VARY*) (* ::Subitem::GrayLevel[0]:: *) (*NEEDS DICTATE LEVEL OR PROFILING/DEBUGGING*) (* ::Item::GrayLevel[0]:: *) (*My primary editor is Frontend, VIM, occasionally VSCode*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Troubleshooting Error Messages (EM)*) (* ::Item::Closed:: *) (*Virtually all major software systems provide some sort of error message(s)*) (* ::Subitem:: *) (*When things go wrong*) (* ::Subitem:: *) (*Minor/Major errors*) (* ::Subitem:: *) (*Catastrophic problems/failures*) (* ::Item::Closed:: *) (*Making sense of WDL/MMA errors sometimes elusive*) (* ::Subitem:: *) (*Many sources of information to help*) (* ::Subsubitem:: *) (*WDL Documentation*) (* ::Subsubitem:: *) (*StackExchange*) (* ::Subsubitem:: *) (*Wolfram Community*) (* ::Subsubitem:: *) (*Books*) (* ::Subsubitem:: *) (*Google -> carefully worded searches help*) (* ::Subsubitem:: *) (*Tech. support*) (* ::Item::Closed:: *) (*Some are just warnings*) (* ::Subitem:: *) (*Sometimes they can be turned off when doing non-standard things*) (* ::Subsubitem:: *) (*Off@ General::openx;*) (* ::Subitem:: *) (*Sometimes just annoying;*) (* ::Subitem:: *) (*Easy to turn back on*) (* ::Subsubitem:: *) (*On@General::openx;*) (* ::Subitem:: *) (*Be consistent in application Off && On*) (* ::Subsubitem:: *) (*Otherwise programs will not emit errors when they should*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Diagnostics File*) (* ::Item::Closed:: *) (*What is a Diagnostics File?*) (* ::Subitem::Closed:: *) (*ESPECIALLY USEFUL WITH LARGE, COMPLEX PROGRAMS*) (* ::Subsubitem:: *) (*One prototype is 40K lines of code*) (* ::Subsubitem:: *) (*Nearly 250 functions*) (* ::Subsubitem:: *) (*Debugging it became impossible*) (* ::Subsubitem:: *) (*Gave me idea about going back to old-school programming techniques*) (* ::Subitem:: *) (*Stores meaningful messages and information generated by program/application*) (* ::Subitem:: *) (*Typically text/ASCII-based*) (* ::Item::Closed:: *) (*When should it be used and what should it include?*) (* ::Subitem::Closed:: *) (*Diagnostic DO's*) (* ::Subsubitem:: *) (*Make it readable*) (* ::Subsubitem:: *) (*Make it concise*) (* ::Subsubitem:: *) (*Include all relevant data file locations*) (* ::Subsubitem:: *) (*Include run times*) (* ::Subsubitem:: *) (*Include dates & times*) (* ::Subsubitem:: *) (*Incorporate message generation into ALL important functions*) (* ::Item::Closed:: *) (*What can it help with?*) (* ::Subitem::Closed:: *) (*Help identify performance bottlenecks*) (* ::Subsubitem:: *) (*Combine with AbsoluteTiming[]*) (* ::Subitem:: *) (*Help keep track of memory usage*) (* ::Subitem::Closed:: *) (*Keep track of user program interaction*) (* ::Subsubitem:: *) (*Track use of buttons and other user application input*) (* ::Subitem:: *) (*CONTEXTUALIZE ERROR MESSAGES*) (* ::Item:: *) (*CAN BE COMBINED WITH CHECKPOINTING*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Consolidate Error Messages & Diagnostics File*) (* ::Item:: *) (*Use a different file name unique to each program/application*) (* ::Item::Closed:: *) (*Store in /tmp*) (* ::Subitem:: *) (*Do not mix with actual data files used for I/O*) (* ::Subitem:: *) (*Easy to make mistakes when cleaning up/deleting*) (* ::Subitem:: *) (*Automatically erased at reboot/poweroff *) (* ::Item::Closed:: *) (*To consolidate, we send EM into DF*) (* ::Subitem:: *) (*Easy to do and straightforward to reverse*) (* ::Subitem:: *) (*Do this near beginning of program/application*) (* ::Subitem:: *) (*Undo at program end or when exited by user*) (* ::Item::Closed:: *) (*Newly instantiated MMA instance has 2 Streams*) (* ::Subitem::Closed:: *) (*STDOUT && STDERR*) OutputStream["stdout", 1] OutputStream["stderr", 2] (* ::Subitem:: *) (*Follows same idea as C*) (* ::Subitem::Closed:: *) (*Rarely will you interact directly with stderr*) (* ::Subsubitem:: *) (*stderr puts error messages to primary output -> CONSOLE or DISPLAY*) (* ::Item::Closed:: *) (*However, there is a third*) (* ::Subitem::Closed:: *) (*$Messages*) OutputStream["stdout", 1] (* ::Subitem:: *) (*Used for interacting and capturing messages and errors concerning the Wolfram system*) (* ::Subitem:: *) (*Can be redirected without breaking system*) (* ::Subitem:: *) (*If STDOUT || STDERR redirected, can break Wolfram system*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*How do we use it?*) (* ::Item::Closed:: *) (*To Redirect Error Messages to Diagnostics File*) (* ::Code::Initialization::GrayLevel[0]:: *) (* VARIABLES SET AT BEGINNING OF PROGRAM. *) messagestream = {}; DiagnosticFILENAME = "diagnostic-messages.txt"; ErrorDiagnosticDIRNAME = StringJoin[ $TemporaryDirectory, "/" ]; DiagnosticsFILE = StringJoin[ ErrorDiagnosticDIRNAME, DiagnosticFILENAME ]; (* NOW PUT IT TOGETHER TO BUILD DIAGNOSTIC/ERROR STREAM FILE. *) Close[ DiagnosticsFILE ]; $Messages = $Messages[[ {1} ]]; messagestream = OpenWrite[ DiagnosticsFILE ]; (* APPEND ALL ERROR MESSAGES TO DIAGNOSTICS FILE: *) $Messages = Append[ $Messages, messagestream ]; WriteString[ messagestream, "System Time is: ", DateString[], "\n\n" ]; (* ::Item::Closed:: *) (*To Reset Error Messages*) $Messages = $Messages[[ {1} ]]; (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Errors & Diagnostics - System Log (SYSLOG/RSYSLOG) - Part 2*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*Unix/Linux system logging captures important system information*) (* ::Item::Bold:: *) (*Can be configured to capture messages & errors on per-program/application basis*) (* ::Item::Bold:: *) (*Logs can be local or sent to remote server*) (* ::Item::Bold:: *) (*MMA generates syslog data*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Mathematica generates system log messages*) (* ::Item:: *) (*Very helpful to technical support*) (* ::Item:: *) (*Less helpful to end-user*) (* ::Item:: *) (*Making most of messages requires knowledge of system libraries*) (* ::Item:: *) (*Non-reversing Debugging techniques can be used*) (* ::Item::Closed:: *) (*Reverse engineering*) (* ::Subitem::Bold:: *) (*DON'T reverse engineer legitimate software that provides technical support*) (* ::Subitem::Bold:: *) (*Copyright and intellectual property to be respected*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*How do we capture these messages?*) (* ::Item::Closed:: *) (*Generally automatic *) (* ::Subitem:: *) (*No special configurations required*) (* ::Subitem:: *) (*However, MMA log messages get added to pile of log messages*) (* ::Subitem:: *) (*As I'll show, there is a better way*) (* ::Item::Closed:: *) (*Under Windows*) (* ::Subitem:: *) (*Event Viewer or other 3rd party tool*) (* ::Subitem:: *) (*Stored in binary format*) (* ::Subitem:: *) (*Windows Event Log uses EVENT IDs*) (* ::Subitem:: *) (*Good luck reading it and making sense of it*) (* ::Item::Closed:: *) (*Linux (and other UNIX-like systems (includes Mac)) makes it easier*) (* ::Subitem::Closed:: *) (*Text-based system logs*) (* ::Subsubitem:: *) (*Can be parsed and searched (awk, grep, sed, cut, paste, etc.)*) (* ::Subitem::Closed:: *) (*Use SYSLOG or RSYSLOG*) (* ::Subsubitem:: *) (*Allows for logs to captured locally or sent to remote logging server*) (* ::Subsubitem:: *) (*Allows for APPLICATION-SPECIFIC logs to be generated*) (* ::Subsubitem:: *) (*I use RSYSLOG so I can only comment on this*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*RSYSLOG specifics*) (* ::Item:: *) (*Often requires system administrator (root user or sudo) privileges to read logs*) (* ::Item::Closed:: *) (*Remote logging server needs to be adequately secured*) (* ::Subitem:: *) (*Lots of available documentation on how to do this*) (* ::Item::Closed:: *) (*By default, logs sent to predefined system log*) (* ::Subitem::Closed:: *) (*Depends on what message capture configuration*) (* ::Subsubitem:: *) (*For me, it goes to /var/log/messages*) (* ::Subsubitem:: *) (*File rsyslog.conf entry*) (* ::Text::Bold:: *) (**. info; mail.none; authpriv.none; cron . none /var/log/messages*) (* ::Subitem::Closed:: *) (*Problem with this approach is message log can be huge*) (* ::Subsubitem:: *) (*Requires parsing for keywords, dates & times*) (* ::Subsubitem:: *) (*Unnecessarily painful*) (* ::Item::Closed:: *) (*Other option -> DEFINE APPLICATION SPECIFIC LOG CAPTURES*) (* ::Subitem:: *) (*I use a central log server and generate logs locally too*) (* ::Subitem:: *) (*File rsyslog.conf entry from central logging server*) (* ::Text:: *) (*# Provides TCP syslog reception*) (*# for parameters see httP://www . rsyslog . com/doc/imtcp . html*) (*module(load="imtcp") # needs to be done just once*) (*input(type="imtcp" port="514")*) (*## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #*) (*# Define who is allowed to send remote syslogs .*) (*#### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #*) (*$AllowedSender TCP, 127.0.0.1*) (* ::Subitem:: *) (*Again, ensure logging daemon is secure*) (* ::Subitem:: *) (*APPLICATION-SPECIFIC LOGGING*) (* ::Text:: *) (*## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #*) (*# Basic remote syslog template.*) (* ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #*) (*$template DynaFile, "/var/log/syslogs/%FROMHOST-IP%/%PROGRAMNAME%.log"*) (**. * -?DynaFile*) (*# & ~*) (* $template PerHostLog, "/var/log/syslogs/%FROMHOST-IP%/SYSLOG.log"*) (**. * -?PerHostLog*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Example of MMA Crash via RSYSLOG*) (* ::Item:: *) (*Often requires system administrator (root user or sudo) privileges to read logs*) (* ::Item:: *) (*Use command sudo cat /var/log/syslogs/127.0.0.1/wolfram-mathematica12.desktop.log*) (* ::Text:: *) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 x4ded52]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/libML64i4 . so (+0 x1628b6)[0 x7fd893c108b6]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/libML64i4 . so (+0 x162ab4)[0 x7fd893c10ab4]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /lib64/libpthread . so .0 (+0 x13a20)[0 x7fd88dec8a20]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5XcbQpa . so .5 (_ZNK14QXcbConnection17getSelectionOwnerEj + 0 x1a)[0 x7fd88804732a]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5XcbQpa . so .5 (+0 x332ef)[0 x7fd8880422ef]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 xb71168]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 xa543c9]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 xa54720]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 xa562ad]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 xa56598]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 x4dec0e]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 xf0827e]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN11QMetaObject8activateEP7QObjectiiPPv + 0 x5e7)[0 x7fd88ca9a437]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN6QTimer7timeoutENS _ 14 QPrivateSignalE + 0 x27)[0 x7fd88caa7047]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN6QTimer10timerEventEP11QTimerEvent + 0 x28)[0 x7fd88caa7328]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN7QObject5eventEP6QEvent + 0 x7b)[0 x7fd88ca9b38b]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Widgets . so5 (_ZN19QApplicationPrivate13notify _helperEP7QObjectP6QEvent + 0 x9c)[0 x7fd88d58235c]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Widgets . so5 (_ZN12QApplication6notifyEP7QObjectP6QEvent + 0 x241)[0 x7fd88d589431]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 xb4d915]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN16QCoreApplication15notifyInternal2EP7QObjectP6QEvent + 0 x108)[0 x7fd88ca6e638]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN14QTimerInfoList14activateTimersEv + 0 x45e)[0 x7fd88cac2a0e]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN20QEventDispatcherUNIX13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 0 x45a)[0 x7fd88cac0a0a]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5XcbQpa . so5 (+0 xaf07d)[0 x7fd8880be07d]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN10QEventLoop4execE6QFlagsINS _ 17 ProcessEventsFlagEE + 0 xea)[0 x7fd88ca6cf8a]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64 /. . /. . /. . /Libraries/Linux - x86 - 64/Qt/lib/libQt5Core . so5 (_ZN16QCoreApplication4execEv + 0 x80)[0 x7fd88ca75a80]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 x4dfa2d]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /lib64/libc . so .6 (__libc _start _main + 0 xd5)[0 x7fd88c2e1b75]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : /usr/local/Wolfram/Mathematica/12.3/SystemFiles/FrontEnd/Binaries/Linux - x86 - 64/Mathematica[0 x4deae7]*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : Mathematica has received the signal : SIGSEGV and has exited .*) (* Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : If possible, please report this problem to support@wolfram . com*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : describing in as much detail as possible what you were doing*) (*Sep 27 20 : 44 : 59 machinename wolfram - mathematica12.desktop[18437] : when the problem occurred, and include the above information :*) (* Sep 27 20 : 45 : 02 machinename wolfram - mathematica12.desktop[18429] : /usr/local/Wolfram/Mathematica/12.3/Executables/Mathematica : line 138 : 18437 Segmentation fault (core dumped) "${MathematicaFE}" $ {MESA_FLAG} - topDirectory "${TopDirectory}" "$@"*) (* ::Item::Closed:: *) (*What was I doing to cause the error*) (* ::Subitem:: *) (*Moving windows around on desktop and clicking profusely within several MMA windows while it was busy generating an output dialog*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Errors & Diagnostics - Example - Part 3*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::Bold:: *) (*Generate information diagnostic log files*) (* ::Item::Bold:: *) (*When appropriate, be verbose*) (* ::Item::Bold:: *) (*When appropriate, incorporate timings*) (* ::Item::Bold:: *) (*Memory consumption details can be taken at any time and stored in log file*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*WITHOUT $Message errors*) (* ::Text::GrayLevel[0]:: *) (*System Time is : Wed 29 Sep 2021 15:45:35*) (*SYSTEM TEST = > System is 64 - bit. Continuing.*) (* SYSTEM TEST = > System has a sufficient number of processors. Continuing.*) (* SYSTEM TEST = > System has enough memory (RAM). Continuing.*) (* Setting Parallel Threads to :: 24*) (*SYSTEM TEST = > A usable C compiler was found. Continuing.*) (* RUNNING PRIMARY DIALOG.*) (* Selecting PCAP File for Processing.*) (* Selecting Output Storage Directory.*) (* === === === === === === === === === === === === === === === === === === === === === === === === === === ==*) (* PCAP File "/SOME-LOCATION/TEST.pcap" began processing at "Wed 29 Sep 2021 15:46:25"*) (**) (*PROCESSING BEGINS.*) (**) (*Input PCAP file: "/SOME - LOCATION/TEST.pcap " was found. Continuing.*) (**) (*Input PCAP file is good size: 992239640 bytes. Continuing.*) (**) (*Output Directory: "/tmp/" was found. Continuing.*) (**) (*READ PCAP HEADER.*) (*--> Getting PCAP HEADER :: Took 0.013555 seconds*) (**) (*TESTING PCAP HEADER.*) (*--> Reading PCAP HEADER :: Took 0.144391 seconds*) (**) (*TESTING PCAP CAN LINK.*) (*--> PCAP is CAN BUS based :: 0.000018 seconds*) (**) (*TIME RESOLUTION.*) (*--> Getting TIME RESOLUTION :: Took 0.000021 seconds*) (**) (*WRITE SUMMARY.*) (*--> Writing PCAP/FILE SUMMARY :: Took 0.004175 seconds*) (**) (*PCAP READ INTO MEMORY.*) (*--> Reading RAW PCAP into Memory :: Took 3.9506 seconds*) (**) (*PCAP MEMORY CONSUMPTION.*) (*--> Memory Consumed :: Takes 992239824 bytes of memory*) (**) (*TESTING & TALLYING.*) (*--> Getting PCAP Frames :: Took 8.73796 seconds*) (*--> PCAP Frame == CAN BUS Frame == 16 Bytes, for ALL PACKETS. Continuing.*) (*--> Tallying PCAP Frames :: 0.000091 seconds*) (**) (*--> OPTION SUMMARY FILE PCAP Hashing Selected. Continuing.*) (*----> SUMMARY File Hashing :: Took 13.371 seconds*) (**) (*--> OPTION PCAP Time Processing Selected. Continuing.*) (*----> Processing PCAP Frame Capture Time :: Took 7.63959 seconds*) (**) (*--> OPTION CAN BUS PAYLOAD Processing Selected. Continuing.*) (*----> Processing CAN BUS Payload Sizes :: Took 1.86009 seconds*) (**) (*--> OPTION CAN BUS Control Bits Processing Selected. Continuing.*) (*----> Processing CAN Control Bits (Byte 17) :: Took 16.9392 seconds*) (**) (*--> OPTION CAN BUS IDs Processing Selected. Continuing.*) (*----> Processing CAN IDs :: Took 38.6138 seconds*) (**) (*--> OPTION CAN Payload Byte Distribution Processing Selected. Continuing.*) (*----> Processing CAN Payload Byte Distribution :: Took 18.5677 seconds*) (**) (*--> OPTION CAN BUS MAGIC RESERVED BYTES Processing Selected. Continuing.*) (*----> Processing CAN BUS Reserved MAGIC :: Took 9.94522 seconds*) (**) (*--> OPTION CAN Error Bit Flags Analysis Processing Selected. Continuing.*) (*----> Processing CAN Error Bit Flags :: Took 62.7576 seconds*) (**) (*--> Option " Date/Time PCAP Events " Plot Selected. Continuing.*) (*----> Processing :: Took 0.729126 seconds*) (**) (*--> Option " Tally - Reserved Bytes " Plot Selected. Continuing.*) (*----> Processing :: Took 0.181626 seconds*) (**) (*--> Option " Tally - Payload Sizes " Plot Selected. Continuing.*) (*----> Processing :: Took 0.055576 seconds*) (**) (*--> Option " Tally - Control Bits " Plot Selected. Continuing.*) (*----> Processing :: Took 0.053944 seconds*) (**) (*--> Option " Tally - IDs " Plot Selected. Continuing.*) (*----> Processing :: Took 0.236961 seconds*) (**) (*--> Option " Tally - Error Flags " Plot Selected. Continuing.*) (*----> Processing :: Took 0.153022 seconds*) (**) (*--> Option " Date/Time - Reserved Bytes " Plot Selected. Continuing.*) (*----> Processing :: Took 1.01635 seconds*) (**) (*--> Option " Date/Time - Payload Sizes " Plot Selected. Continuing.*) (*----> Processing :: Took 1.24077 seconds*) (**) (*--> Option " Date/Time - Control Bits " Plot Selected. Continuing.*) (*----> Processing :: Took 1.15213 seconds*) (**) (*--> Option " Date/Time - IDs " Plot Selected. Continuing.*) (*----> Processing Date List Plot :: Took 4.04647 seconds*) (**) (*--> Option " Spectrograms - Payload Sizes " Plot Selected. Continuing.*) (*----> Processing :: Took 121.771 seconds*) (**) (*PCAP File "/SOME-LOCATION/TEST.pcap" ended processing at "Wed 29 Sep 2021 15:51:39"*) (*=> MEMORY USAGE :: 3117674200 bytes*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*WITH $Message errors*) (* ::Item::Closed:: *) (*Here is an interface that has become hard to read with error messages*) (* ::Subitem::Closed:: *) (*CLICK TO SEE IT*) Image[CompressedData[" 1:eJzs3Wd3FMfi9uv/Ouc8a52XZ629vB1wDphgMBgwIhkMGINJJtkEY3IUQoAQ ygGUM5KQhECBYIL2Z3venE9QT981qqGnVT3TgySQt38vLk9PT4fq6uoec3dN 6bPTxfvP/1//8z//U/L/Bv/Zf6rsxxs3TlUc+P+CN4eully6cPXc2R1Xb567 cO5Gwen/O5j5/wf/+d//63/+5/8Jpu89+o8BAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQ3 MP7CDI+MmfujTwKPg3kTea7/8o2Wt3f0uekdeeb97FZlTXqZ8prbwfvaae2r e/ip+eDDj82P23aaH7b8bO7G7DfO7Y57Ge9XrF732mXpG31hlq1cbTZv32Wq m3sSrxe3Tx1PRUNH3uWIHlPU6UvXzJoNP9rp3QcOm5rWu7PSDpKUf8v23ebQ H6dnZf9J7dz3m3nvgw/T7zsGx83GrTvM2o1bzNFTF1Lzhh7Z9ysLXp2rrTv2 BMttt3X53eq1prHnvn0vC5d8aw6fOGeXm/fRJ3beTzv32vcN3UNmXbCtzT/v NDv3/27n9Y9PmE0/7bD7/Xn3vmkdz4kLReb81VI7vffQMVPV1JXX+qcuFc/o OWnpe2ivT03r2njn3ffs++rm7th1VEd9Y7Nz3+p+8HSynvebC9fK8l5/pusn Ktf1m4+alh7z7Yrvbdtz90aVf/W6jcExnEovl+RabegazGj/SXUOPTbtA2Ov VdbXFW0/07mvx/li/kJ73c5WO3gdSet6pkXbj++7cKbbz1ysfwAAAADAP4fy +qGxp3Zar4Pjz/NYf8Lm/NH5g8E2o8vNVK7f0jNomrsHvJ+5vD7ufZjylpLq xqz7Ul6vHFXTZwqvmyOT+WpS6ybXdaaT61yruG2OnDyf93ozmSUpi3TZaBzl 9V8vXmJa+0dmNa/PRVmLsjnl1rO1D2VIl29U5Mx+w+dAGf3lkko7vWrtBlun 2c7V73+etVlUeJ6yYGVWnfcf21w/etwuZ1q8dLl9PVtUYtuv+3w6xzzdvH6m hfN6Wb6qIOc6qjM9I5mN8lwK2sOZwht2Otz2rpRWm9K6lrdaV0mu33zoWVRt a2/GvFVrNrzRY1J9u/aYb1lfV7T9zEZePxclrevZ9rrfhXP5mAAAAAAAb0dp zxPTMvzCXGl/ZNofRvPs/FzteGTaHqS20R+42DpuzjWPmeudj+28vvH/mD9u j5gbXY9N9+hLu3zctl7l9RNmePSRfS/qay9DY3/Z5QbHntnlUvOemgGb1T82 Dyb75rucX7n8g5HRjH1oXW3bva9paE31f6+qNTWNbXZeU9c9U1F7x9wsrzId 90bsvMq6BnOn/a6d39IzZNr7H9rPpaq+yfQMPzGdg2OmpKzSLlNyqyJjv9ny +tudA+Zf7/w7a34ZzuvbB8bNmh82m56Hz2x/P+VeGzZvs+v/8ushu5yyKten eVfw+u7788yWHbvT/ai/+36NXVbLKSeI26c+V79ql62V1jabZStWm2+WrTDb dv4aW97Tl6/bPobKLF02+P68j+xzg4XffGsau4dMXVuvLZP6D7o+i5pXEOxv 07ZfzP4jJ+y88tttdp/rNm01f5y9bJp7H9h+wx998pld/2pZnb8Ml67Zvt97 Dh1N5/UF6zel+7Qq29L0Z1/Ot8ej7Hn1+o32M+W/2oeWV1k1T/3C/zhzyda5 snFf+dVnXXWmsrr8+lZw/MfPFto+9qpT37Z883R+dS7X//iTLYuW0XlWP0xN qy+7ltG0cnfl5tE6ULmUI7v34TzvQvEtWy/6fNGSZRn9wKO5n8qt+sm4jwTH dfLi1ck2OWaWfrfKll1lTLf7YJklQd26jH7rL3vN9co79rw03R228/Ssquv+ 1GdtufjyerVptXfVmc67PtMzAvXlV12WBW1J14nO28qC9ebg0ZPp7emZitq5 fieg+vRty9c+VQfqY6vtx+X1xeX1tu3r8+/X/pBe78OPP7Xn0V1Lvu0X3aqx 5f/408/tNlR+X/tUvavMeq3v6LdtcdHS5Wbf4ePp+ncuZulv76sftS3tT216 +54DsevqXhG9r0TvBUmv37q2Pruc6FyH26V+46F1Na1+9KobHbe7v+0+cCR9 z9P2k16rvx0/Y5fT+UxfJ0FdaRm1g8KSKjtP97Btu/bZ+5L6uJfUNJkly1fa a0DrR59rOb6y6roqmPztiutf7bs/RPnaj+++7msrPtH2LzoW7cO1Cz3Xc+1B 9RG3/Wj9+Pbn+67S8yVtV/V4q77VWxdJ69rXftSmdS51v7+cpX5Un3qv49Wz SF/78X0X+tqP9q3zou3pfui7r/uOKVr/vmspaV0DAAAAAOa+M02pDFt5ff3A M3O+Zcx0j06Ys01jprBt3M6Xy8F0w9Bzc6B62ObtF1vGTefDl+Z046i5EExX 9f2Vkdc7XSMvg32kcofCtkd2Oa0f3rdPeDyccN965fE2Zx8Zt+81He1LPxDT vz4X5fWdg6ntKlN3mXnX0CNzu7XbVNal+r1X1DVM6Uvf2NmfMU/r90z2Uc6n f30SmXn9mJ1WBqwsVLmH+i/fqG6w066fsbIt1986mr/q3/a9oy+C8v6Vzqij lD24nE95gPsNgDJSZeHZyvvVgsX2VVmHcghNu/xS23FZpCgvcRmIMg1lGDqO Tz77wpZRmWPH5Dlyon2ZfVTGi9fL7faUu8bl9cpPdZzKt5SZ6fmJxh5SGZQR KfvT8srFfOOKhMuvdVym52ienq/oHCkjj9uWb57qT3njVwsW2fOuvEfnRfm2 xmBwy0XzemVVyr409kZ4e+F2oLZeeLPKZufKhZSB+pZz59z11XZU/639U69n jUHiMjSV6WZNU7qNKaM6cb7I7sv1uVc5lJ2pbvIZH0R5pbJ4Tesc6XmD6trl fMtXrbGvGtNlx96DU8alUblcHq32pCxcrzrn7rxFt+Vrnzo3vjYZzeuVm7tr qb69P10f4f7Rvu0rr1Tbde0srn1+MX9BRnapOv3z/BU7Hoz2GT72bHm9r37U 3pRBKi/UPSNuHd99xXcvSHL9Ko/UNtT+3X3Zl9e7thh+LuVrw0muVd+6yq+1 rChP1TxltHrV9XPs9MX0/SZJ/+hwWdUmXXvTtvYczH6viYq2n2j9x7WVKF/7 99WF6k/3lHNFN237itu+r36ifN9VOs/67YHuca59+OoiSV372o+uY02rjpR7 +8qvazXuWXS4/Ujcd6GrM93PXPsPi97Xsx1TuP5911KSugYAAAAAzH0nG17l 9crie0YnbD/7w7UPba6u/F6ftQ6n8r9TjanllbXf7H5izjeP2eWKOx5PyeuV 1SvPt9sM5mtajtSl8gn1vb875u9HHh4Px1Gf+lS/+ol0v3jl9ZK5/sTkmPeZ 28w1Ho7y+q7JvONGabn9t3xVfaNp63tgx6Yvq663nymvj45V39wzaBo7+tLv 1dfeLTOb4+EoM1PfTGWVB4+dylhOuYMb92X+wm9i8/rw+7gxFJSZnL2SykPV p/ZGVYOdTpLXz1+YyhWU8y2ZzBPcfsK5lIQzEGWT0fGlNUa661PuKK9QP8ls ZXB5vcYsUC6ielEmo/FxVC/K3pSnKCPVcSq7UxmVQfvGMlFu1HZvaj4dLv+O oJ6KSjPPtRtDX3Xh+p77thWdpyxP/dGVwar/752u1LMh5WrKYcNtJpzX61Vj 1/jG6Y471+rjGv59R3S5X387Zvumh+epz6ib1m8+XmViBTb3C89Thq95B46e sOfDLec+V36mdhXOT6P5a5TyLo0t4sqr3Cvc/sPHoD7dyp53hPqGh/No9XnV mDHHzxWmz4FvW772+eXXC+2rfi+QLa934/yH20v0OYlv+xpvQ/S7BL2Pa5/R c6Z2535/oX7F4c/yzetF50p1ruvZdx1Ey+CmffeCJNevaNwc3e9cW3PPTXRe ppvX+65V37oLFi8N7uvPvZ+H60j3GtePO5twWZVX67rXtH5Hod+7aDruXhOV 7TlbtntZlK/9+7ape6d+D6D7qNpDrrYYbUNhvu8qPYNUO9e1rPtyXF0kreto +3Hlsnl30BZ95b9aVjvlt0S+9iO58nrVq2v/Ttx9Pe6YwvWf7Xs1XNdJ/p8C AAAAADC3hPvXN91/bt93PHxps/SiYF7Z3acZY+W45d1yelVOr7754bxeY9/s Kr9vLrWO2224/Wm5pP3ro3m9+tmnxsN5ktG/fmpe/5/0cvmOh6M+9GVVdbY/ vebVNraZqtvNdpwbjW2jeb68Xn9L9mZZpam+02wz/9beYVNSVhG8bzGl5dV2 mba+YVMdbKuo+Lp99R130vFw1M9TY6ooK1F+pH+Ta1p5hvpZKntWBqKxNNRn XHm7W1+5vvIxlxkmyeuVCdjxAzZusTmim58krz95sdiOJaB8TTmC5n3+5de2 n69ycuU+btlwBqLsSf0elWm5vpoaK8CNE3A0NG6/jkcZkxuDPcrl9ZrW2BvK horL6+wxqb+1MmRfXq/l1SdZeafyddcvO0ler+NSNqT60rEqlwuPHa7+r3Hb is7T2AyqCx23nlm4XEf9yhdN9k13fOPhqJ+qsiqVSeMkqM/oex/Ms6/6W58a M0XPgHR+3dgQrm+pW85tS78PiP7GwR2L6FmOtqO6dGNb6LxrPR2/y7/03EVt UzmVG/dZvwtRm4r2rdc5i/bpD1P71+8hxI1n4svYXU6vz8L9V8P5lsql/unK 0dQPXufNty1f+9x/+M9Umwr2Eff3ZuPyemVq+tujWlfH79u+6lNtXc/M3Bgn vvYZvY7V1nW/0PoqY/izfPN61YPGS9HzEZ1P39hLcfcV370gyfWrMmocIGXY +35P/TZBz3t0zHp+NN28Pnqtxq2retR7LeeeX/oyUrUhOzZKsK1sfysjWlYt r+tQ7dhd/0nz+mj78dW/r61E+dp/XD2qHsLPW7O1xVx5ffS7Sr+DUjtTu832 bDNJXfvaj75HtF9l3brv+Mpv/yZ2UC7du/Tqxu2Kth/JldeLvrP0Xu1V94G4 +3rcMYW35buWfHWd5P8pAAAAAABzixu//k3vN9f49W9DuH/9f4Nwxvh3oUyF cXeTq2zstHlleF7c+PUy1zObuPIpC3O/6Zhteiak3E79cZUdzqVxJfQsTr9V UM6nvzMwE9tMktfjn+NttP+38V31T/l7vAAAAAAA/J2R17896muovqYFk+PF IDf15dRvKqJjiCvDv1JanR7/6O9Ov+3Qc5w3dTx6ZqDnA8osS0J9wOcCjXWv vvmp30rk7nOdi8a0cePyA/I22j95PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAADgdQyMvzDDI2Pm/uiTwONg3kSe6798o+XtHX1uekee eT+7VVmTXqa85nbwvnZa++oefmo++PBj8+O2neaHLT+buzH7jXO7417G+xWr 1712WfpGX5hlK1ebzdt3mermnsTrxe1Tx1PR0JF3OaLHFHX60jWzZsOPdnr3 gcOmpvXurLSDJOXfsn23OfTH6VnZf1I79/1m3vvgw/T7jsFxs3HrDrN24xZz 9NSF1LyhR/b9yoJX52rrjj3BctttXX63eq1p7Llv38vCJd+awyfO2eXmffSJ nffTzr32fUP3kFkXbGvzzzvNzv2/23n94xNm00877H5/3r1vWsdz4kKROX+1 1E7vPXTMVDV15bX+qUvFM3pOWvoe2utT07o23nn3Pfu+urk7dh3VUd/Y7Ny3 uh88nazn/ebCtbK815/p+onKdf3mo6alx3y74nvb9ty9UeVfvW5jcAyn0ssl uVYbugYz2n9SnUOPTfvA2GuV9XVF28907utxvpi/0F63s9UOXkfSup5p0fbj +y6c6fYzF+sfAAAAAPDPobx+aOypndbr4PjzPNafsDl/dP5gsM3ocjOV67f0 DJrm7gHvZy6vj3sfprylpLox676U1ytH1fSZwuvmyGS+mtS6yXWd6eQ61ypu myMnz+e93kxmScoiXTYaR3n914uXmNb+kVnN63NR1qJsTrn1bO1DGdLlGxU5 s9/wOVBGf7mk0k6vWrvB1mm2c/X7n2dtFhWepyxYmVXn/cc2148et8uZFi9d bl/PFpXY9us+n84xTzevn2nhvF6WryrIuY7qTM9IZqM8l4L2cKbwhp0Ot70r pdWmtK7lrdZVkus3H3oWVdvamzFv1ZoNb/SYVN+uPeZb1tcVbT+zkdfPRUnr era97nfhXD4mAAAAAMDbUdrzxLQMvzBX2h+Z9ofRPDs/VzsembYHqW30By62 jptzzWPmeudjO+9G12NzOZhX2PbIdI++tMvHbetVXj9hhkcf2feivvYyNPaX XW5w7JldLjXvqRmwWf1j82Cyb77L+ZXLPxgZzdiH1tW23fuahtZU//eqWlPT 2GbnNXXdMxW1d8zN8irTcW/EzqusazB32u/a+S09Q6a9/6H9XKrqm0zP8BPT OThmSsoq7TIltyoy9pstr7/dOWD+9c6/s+aX4by+fWDcrPlhs+l5+Mz291Pu tWHzNrv+L78essspq3J9mncFr+++P89s2bE73Y/6u+/X2GW1nHKCuH3qc/Wr dtlaaW2zWbZitflm2QqzbeevseU9ffm67WOozNJlg+/P+8g+N1j4zbemsXvI 1LX12jKp/6Drs6h5BcH+Nm37xew/csLOK7/dZve5btNW88fZy6a594HtN/zR J5/Z9a+W1fnLcOma7fu959DRdF5fsH5Tuk+rsi1Nf/blfHs8yp5Xr99oP1P+ q31oeZVV89Qv/I8zl2ydKxv3lV991lVnKqvLr28Fx3/8bKHtY6869W3LN0/n V+dy/Y8/2bJoGZ1n9cPUtPqyaxlNK3dXbh6tA5VLObJ7H87zLhTfsvWizxct WZbRDzya+6ncqp+M+0hwXCcvXp1sk2Nm6XerbNlVxnS7D5ZZEtSty+i3/rLX XK+8Y89L091hO0/PqrruT33Wlosvr1ebVntXnem86zM9I1BfftVlWdCWdJ3o vK0sWG8OHj2Z3p6eqaid63cCqk/ftnztU3WgPrbaflxeX1xeb9u+Pv9+7Q/p 9T78+FN7Ht215Nt+0a0aW/6PP/3cbkPl97VP1bvKrNf6jn7bFhctXW72HT6e rn/nYpb+9r76UdvS/tSmt+85ELuu7hXR+0r0XpD0+q1r67PLic51uF3qNx5a V9PqR6+60XG7+9vuA0fS9zxtP+m1+tvxM3Y5nc/0dRLUlZZROygsqbLzdA/b tmufvS+pj3tJTZNZsnylvQa0fvS5luMrq66rgsnfrrj+1b77Q5Sv/fju6762 4hNt/6Jj0T5cu9BzPdceVB9x24/Wj29/vu8qPV/SdlWPt+pbvXWRtK597Udt WudS9/vLWepH9an3Ol49i/S1H993oa/9aN86L9qe7oe++7rvmKL177uWktY1 AAAAAGDuO9OUyrCV19cPPDPnW8ZM9+iEOds0Zgrbxu18uRxMNww9Nweqh23u frFl3HQ+fGlON46aC8F0Vd9fGXm90zXyMthHKndoDz47FSxf1P4oY98+4fFw wn3rlcfbnH1k3L7XdLQv/UBM//pclNd3Dqa2q0zdZeZdQ4/M7dZuU1mX6vde UdcwpS99Y2d/xjyt3zPZRzmf/vVJZOb1Y3ZaGbCyUOUe6r98o7rBTrt+xsq2 XH/raP6qf9v3jr4IyvtXOqOOUvbgcj7lAe43AMpIlYVnK+9XCxbbV2UdyiE0 7fJLbcdlkaK8xGUgyjSUYeg4PvnsC1tGZY4dk+fIifZl9lEZL14vt9tT7hqX 1ys/1XEq31JmpucnGntIZVBGpOxPyysX840rEi6/1nGZnqN5er6ic6SMPG5b vnmqP+WNXy1YZM+78h6dF+XbGoPBLRfN65VVKfvS2Bvh7YXbgdp64c0qm50r F1IG6lvOnXPXV9tR/bf2T72eNQaJy9BUpps1Tek2pozqxPkiuy/X517lUHam uslnfBDllcriNa1zpOcNqmuX8y1ftca+akyXHXsPThmXRuVyebTak7Jwveqc u/MW3Zavferc+NpkNK9Xbu6upfr2/nR9hPtH+7avvFJt17WzuPb5xfwFGdml 6vTP81fseDDaZ/jYs+X1vvpRe1MGqbxQ94y4dXz3Fd+9IMn1qzxS21D7d/dl X17v2mL4uZSvDSe5Vn3rKr/WsqI8VfOU0epV18+x0xfT95sk/aPDZVWbdO1N 29pzMPu9JirafqL1H9dWonzt31cXqj/dU84V3bTtK277vvqJ8n1X6Tzrtwe6 x7n24auLJHXtaz+6jjWtOlLu7Su/rtW4Z9Hh9iNx34WuznQ/c+0/LHpfz3ZM 4fr3XUtJ6hoAAAAAMPedbHiV1yuL7xmdsP3sD9c+tLm88nt91jqcyv+Ut+tV WfvN7ifmfPOYXa644/GUvF5ZvfJ8bTO8T+X7elXf+7tj/n7k4fFwHPWpT/Wr n0j3i1deL5nrT0yOeZ+5zVzj4Siv75rMO26Ultt/y1fVN5q2vgd2bPqy6nr7 mfL66Fj1zT2DprGjL/1efe3dMrM5Ho4yM/XNVFZ58NipjOWUO7hxX+Yv/CY2 rw+/jxtDQZnJ2SupPFR9am9UNdjpJHn9/IWpXEE535LJPMHtJ5xLSTgDUTYZ HV9aY6S7PuWO8gr1k8xWBpfXa8wC5SKqF2UyGh9H9aLsTXmKMlIdp7I7lVEZ tG8sE+VGbfem5tPh8u8I6qmoNPNcuzH0VReu77lvW9F5yvLUH10ZrPr/3ulK PRtSrqYcNtxmwnm9XjV2jW+c7rhzrT6u4d93RJf79bdjtm96eJ76jLpp/ebj VSZWYHO/8Dxl+Jp34OgJez7ccu5z5WdqV+H8NJq/Rinv0tgirrzKvcLtP3wM 6tOt7HlHqG94OI9Wn1eNGXP8XGH6HPi25WufX3690L7q9wLZ8no3zn+4vUSf k/i2r/E2RL9L0Pu49hk9Z2p37vcX6lcc/izfvF50rlTnup5910G0DG7ady9I cv2Kxs3R/c61NffcROdlunm971r1rbtg8dLgvv7c+3m4jnSvcf24swmXVXm1 rntN63cU+r2LpuPuNVHZnrNlu5dF+dq/b5u6d+r3ALqPqj3kaovRNhTm+67S M0i1c13Lui/H1UXSuo62H1cum3cHbdFX/qtltVN+S+RrP5Irr1e9uvbvxN3X 444pXP/ZvlfDdZ3k/ykAAAAAAHNLuH990/3n9n3Hw5c2S1c/+LK7TzPGynHL u+X0qpxeffPDeX3f+H/MrvL75lLruN1Gf/BeffI1Ro766oe35ePL69XPPjUe zpOM/vVT8/r/pJfLdzwc9aEvq6qz/ek1r7axzVTdbrbj3GhsG83z5fX6W7I3 yypN9Z1mm/m39g6bkrKK4H2LKS2vtsu09Q2b6mBbRcXX7avvuJOOh6N+nhpT RVmJ8iP9m1zTyjPUz1LZszIQjaWhPuPK2936yvWVj7nMMEler0zAjh+wcYvN Ed38JHn9yYvFdiwB5WvKETTv8y+/tv18lZMr93HLhjMQZU/q96hMy/XV1FgB bpyAo6Fx+3U8ypjcGOxRLq/XtMbeUDZUXF5nj0n9rZUh+/J6La8+yco7la+7 ftlJ8nodl7Ih1ZeOVblceOxw9X+N21Z0nsZmUF3ouPXMwuU66le+aLJvuuMb D0f9VJVVqUwaJ0F9Rt/7YJ591d/61Jgpegak8+vGhnB9S91yblv6fUD0Nw7u WETPcrQd1aUb20LnXevp+F3+pecuapvKqdy4z/pdiNpUtG+9zlm0T3+Y2r9+ DyFuPBNfxu5yen0W7r8azrdULvVPV46mfvA6b75t+drn/sN/ptpUsI+4vzcb l9crU9PfHtW6On7f9lWfaut6ZubGOPG1z+h1rLau+4XWVxnDn+Wb16seNF6K no/ofPrGXoq7r/juBUmuX5VR4wApw973e+q3CXreo2PW86Pp5vXRazVuXdWj 3ms59/zSl5GqDdmxUYJtZftbGdGyanldh2rH7vpPmtdH24+v/n1tJcrX/uPq UfUQft6arS3myuuj31X6HZTamdpttmebSera1370PaL9KuvWfcdXfvs3sYNy 6d6lVzduV7T9SK68XvSdpfdqr7oPxN3X444pvC3fteSr6yT/TwEAAAAAmFvc +PVver+5xq9/G8L96/8bhDPGvwtlKoy7m1xlY6fNK8Pz4savl7me2cSVT1mY +03HbNMzIeV26o+r7HAujSuhZ3H6rYJyPv2dgZnYZpK8Hv8cb6P9v43vqn/K 3+MFAAAAAODvjLz+7VFfQ/U1LZgcLwa5qS+nflMRHUNcGf6V0ur0+Ed/d/pt h57jvKnj0TMDPR9QZlkS6gM+F2ise/XNT/1WInef61w0po0blx+Qt9H+yesB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9HA+MvzPDImLk/+iTwOJg3 kef6L99oeXtHn5vekWfez25V1qSXKa+5Hbyvnda+uoefmg8+/Nj8uG2n+WHL z+ZuzH7j3O64l/F+xep1r12WvtEXZtnK1Wbz9l2murkn8Xpx+9TxVDR05F2O 6DFFnb50zazZ8KOd3n3gsKlpvTsr7SBJ+bds320O/XF6Vvaf1M59v5n3Pvgw /b5jcNxs3LrDrN24xRw9dSE1b+iRfb+y4NW52rpjT7DcdluX361eaxp77tv3 snDJt+bwiXN2uXkffWLn/bRzr33f0D1k1gXb2vzzTrNz/+92Xv/4hNn00w67 359375vW8Zy4UGTOXy2103sPHTNVTV15rX/qUvGMnpOWvof2+tS0ro133n3P vq9u7o5dR3XUNzY7963uB08n63m/uXCtLO/1Z7p+onJdv/moaekx36743rY9 d29U+Vev2xgcw6n0ckmu1YauwYz2n1Tn0GPTPjD2WmV9XdH2M537epwv5i+0 1+1stYPXkbSuZ1q0/fi+C2e6/czF+gcAAAAA/HMorx8ae2qn9To4/jyP9Sds zh+dPxhsM7rcTOX6LT2Dprl7wPuZy+vj3ocpbympbsy6L+X1ylE1fabwujky ma8mtW5yXWc6uc61itvmyMnzea83k1mSskiXjcZRXv/14iWmtX9kVvP6XJS1 KJtTbj1b+1CGdPlGRc7sN3wOlNFfLqm006vWbrB1mu1c/f7nWZtFhecpC1Zm 1Xn/sc31o8ftcqbFS5fb17NFJbb9us+nc8zTzetnWjivl+WrCnKuozrTM5LZ KM+loD2cKbxhp8Nt70pptSmta3mrdZXk+s2HnkXVtvZmzFu1ZsMbPSbVt2uP +Zb1dUXbz2zk9XNR0rqeba/7XTiXjwkAAAAAgLBXef2EGR59ZN+L+trL0Nhf drnBsWd2udS8p2bAZvWPzYPJvvku51cu/2BkNGMfWlfbdu9rGlpT/d+rak1N Y5ud19R1z1TU3jE3y6tMx70RO6+yrsHcab9r57f0DJn2/of2c6mqbzI9w09M 5+CYKSmrtMuU3KrI2G+2vP5254D51zv/zppfhvP69oFxs+aHzabn4TPb30+5 14bN2+z6v/x6yC6nrMr1ad4VvL77/jyzZcfudD/q775fY5fVcsoJ4vapz9Wv 2mVrpbXNZtmK1eabZSvMtp2/xpb39OXrto+hMkuXDb4/7yP73GDhN9+axu4h U9fWa8uk/oOuz6LmFQT727TtF7P/yAk7r/x2m93nuk1bzR9nL5vm3ge23/BH n3xm179aVucvw6Vrtu/3nkNH03l9wfpN6T6tyrY0/dmX8+3xKHtevX6j/Uz5 r/ah5VVWzVO/8D/OXLJ1rmzcV371WVedqawuv74VHP/xs4W2j73q1Lct3zyd X53L9T/+ZMuiZXSe1Q9T0+rLrmU0rdxduXm0DlQu5cjufTjPu1B8y9aLPl+0 ZFlGP/Bo7qdyq37C83ReT168Otkmx8zS71bZsquM6XYfLLMkqFuX0W/9Za+5 XnnHnpemu8N2np5Vdd2f+qwtF19erzat9q4603nXZ3pGoL78qsuyoC3pOtF5 W1mw3hw8ejK9PT1TUTvX7wRUn75t+dqn6kB9bLX9uLy+uLzetn19/v3aH9Lr ffjxp/Y8umvJt/2iWzW2/B9/+rndhsrva5+qd5VZr/Ud/bYtLlq63Ow7fDxd /87FLP3tffWjtqX9qU1v33Mgdl3dK6L3lei9IOn1W9fWZ5cTnetwu9RvPLSu ptWPXnWj43b3t90HjqTvedp+0mv1t+Nn7HI6n+nrJKgrLaN2UFhSZefpHrZt 1z57X1If95KaJrNk+Up7DWj96HMtx1dWXVcFk79dcf2rffeHKF/78d3XfW3F J9r+Rceifbh2oed6rj2oPuK2H60f3/5831V6vqTtqh5v1bd66yJpXfvaj9q0 zqXu95ez1I/qU+91vHoW6Ws/vu9CX/vRvnVetD3dD333dd8xRevfdy0lrWsA AAAAwNxX2vPEtAy/MFfaH5n2h1Mzvnxc7Xhk2h6kttEfuNg6bs41j5nrnY+n vO8efWmXj9tWeDyccN965fE2Zx8Zt+81He1LPxDTvz4X5fWdg6ntKlN3mXnX 0CNzu7XbVNal+r1X1DVM6Uvf2NmfMU/r90z2Uc6nf30SmXn9mJ1WBqwsVLmH +i/fqG6w066fsbIt1986mr/q3/a9oy+C8v6VzqijlD24nE95gPsNgDJSZeHZ yvvVgsX2VVmHcghNu/xS23FZpCgvcRmIMg1lGDqOTz77wpZRmWPH5Dlyon2Z fVTGi9fL7faUu8bl9cpPdZzKt5SZ6fmJxh5SGZQRKfvT8srFfOOKhMuvdVym 52ienq/oHCkjj9uWb57qT3njVwsW2fOuvEfnRfm2xmBwy0XzemVVyr409kZ4 e+F2oLZeeLPKZufKhZSB+pZz59z11XZU/639o1PqQ2OQuAxNZbpZ05RuY8qo Tpwvsvtyfe5VDmVnqpt8xgdRXqksXtM6R3reoLp2Od/yVWvsq8Z02bH34JRx aVQul0erPSkL16vOuTtv0W352qfOja9NRvN65ebuWqpv70/XR7h/tG/7yivV dl07i2ufX8xfkJFdqk7/PH/FjgejfYaPPVte76sftTdlkMoLdc+IW8d3X/Hd C5Jcv8ojtQ21f3df9uX1ri2Gn0v52nCSa9W3rvJrLSvKUzVPGa1edf0cO30x fb9J0j86XFa1SdfetK09B7Pfa6Ki7Sda/3FtJcrX/n11ofrTPeVc0U3bvuK2 76ufKN93lc6zfnuge5xrH766SFLXvvaj61jTqiPl3r7y61qNexYdbj8S913o 6kz3M9f+w6L39WzHFK5/37WUpK4BAAAAAHPfmaZUxqa8vn7gmTnfMma6RyfM 2aYxU9g2bufL5WC6Yei5OVA9bG50PTYXW8ZN58OX5nTjqLkQTFf1/ZWR1ztd Iy+DfYx537t9+4THw3HUpz7Vr34i3S9eeb1krj8xOeZ95jZzjYejvL5rMu+4 UVpu/y1fVd9o2voe2LHpy6rr7WfK66Nj1Tf3DJrGjr70e/W1d8vM5ng4yszU N1NZ5cFjpzKWU+7gxn2Zv/Cb2Lw+/D5uDAVlJmevpPJQ9am9UdVgp5Pk9fMX pnIF5XxLJvMEt59wLiXhDETZZHR8aY2R7vqUO8or1E8yWxlcXq8xC5SLqF6U yWh8HNWLsjflKcpIdZzK7lRGZdC+sUyUG7Xdm9p+w+XfEdRTUWnmuXZj6Ksu XN9z37ai85TlqT+6Mlj1/73TlXo2pFxNOWy4zYTzer1q7BrfON1x51p9XMO/ 74gu9+tvx2zf9PA89Rl10/rNx6tMrMDmfuF5yvA178DRE/Z8uOXc58rP1K7C +Wk0f41S3qWxRVx5lXuF23/4GNSnW9nzjlDf8HAerT6vGjPm+LnC9DnwbcvX Pr/8eqF91e8FsuX1bpz/cHuJPifxbV/jbYh+l6D3ce0zes7U7tzvL9SvOPxZ vnm96FypznU9+66DaBnctO9ekOT6FY2bo/uda2vuuYnOy3Tzet+16lt3weKl wX39uffzcB3pXuP6cWcTLqvyal33mtbvKPR7F03H3Wuisj1ny3Yvi/K1f982 de/U7wF0H1V7yNUWo20ozPddpWeQaue6lnVfjquLpHUdbT+uXDbvDtqir/xX y2qn/JbI134kV16venXt34m7r8cdU7j+s32vhus6yf9TAAAAAADmlpMNr/J6 ZfE9oxO2n/3h2oc2l1d+r89ah1P536nG1PLK2m92PzHnm8fscsUdj6fk9crm ledrm7736mt/d8w/7osvr1c/+9R4OE8y+tdPzev/k14u3/Fw1Ie+rKrO9qfX vNrGNlN1u9mOc6OxbTTPl9frb8neLKs01Xeabebf2jtsSsoqgvctprS82i7T 1jdsqoNtFRVft6++4046Ho76eWpMFWUlyo/0b3JNK89QP0tlz8pANJaG+owr b3frK9dXPuYywyR5vTIBO37Axi02R3Tzk+T1Jy8W27EElK8pR9C8z7/82vbz VU6u3MctG85AlD2p36MyLddXU2MFuHECjobG7dfxKGNyY7BHubxe0xp7Q9lQ cXmdPSb1t1aG7Mvrtbz6JCvvVL7u+mUnyet1XMqGVF86VuVy4bHD1f81blvR eRqbQXWh49YzC5frqF/5osm+6Y5vPBz1U1VWpTJpnAT1GX3vg3n2VX/rU2Om 6BmQzq8bG8L1LXXLuW3p9wHR3zi4YxE9y9F2VJdubAudd62n43f5l567qG0q p3LjPut3IWpT0b71OmfRPv1hav/6PYS48Ux8GbvL6fVZuP9qON9SudQ/XTma +sHrvPm25Wuf+w//mWpTwT7i/t5sXF6vTE1/e1Tr6vh921d9qq3rmZkb48TX PqPXsdq67hdaX2UMf5ZvXq960Hgpej6i8+kbeynuvuK7FyS5flVGjQOkDHvf 76nfJuh5j45Zz4+mm9dHr9W4dVWPeq/l3PNLX0aqNmTHRgm2le1vZUTLquV1 Haodu+s/aV4fbT+++ve1lShf+4+rR9VD+HlrtraYK6+Pflfpd1BqZ2q32Z5t JqlrX/vR94j2q6xb9x1f+e3fxA7KpXuXXt24XdH2I7nyetF3lt6rveo+EHdf jzum8LZ815KvrpP8PwUAAAAAYG4J969vuv/cvu94+NJm6UXBvLK7TzPGynHL u+X0qpxeffPDeX3fePDv7fL75lLruN1G9H14W3NFuH/9f4Nwxvh3oUyFcXeT q2zstHlleF7c+PUy1zObuPIpC3O/6Zhteiak3E79cZUdzqVxJfQsTr9VUM6n vzMwE9tMktfjn+NttP+38V31T/l7vAAAAACAvx83fv2b3m+u8evfBvL6t0d9 DdXXtGByvBjkpr6c+k1FdAxxZfhXSqvT4x/93em3HXqO86aOR88M9HxAmWVJ qA/4XKCx7tU3P/Vbiek/79SYNm5cfkDeRvsnrwcAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAvI6B8RdmeGTM3B99EngczJvIc/2Xb7S8 vaPPTe/IM+9ntypr0suU19wO3tdOa1/dw0/NBx9+bH7cttP8sOVnczdmv3Fu d9zLeL9i9brXLkvf6AuzbOVqs3n7LlPd3JN4vbh96ngqGjryLkf0mKJOX7pm 1mz40U7vPnDY1LTenZV2kKT8W7bvNof+OD0r+09q577fzHsffJh+3zE4bjZu 3WHWbtxijp66kJo39Mi+X1nw6lxt3bEnWG67rcvvVq81jT337XtZuORbc/jE ObvcvI8+sfN+2rnXvm/oHjLrgm1t/nmn2bn/dzuvf3zCbPpph93vz7v3Tet4 TlwoMuevltrpvYeOmaqmrrzWP3WpeEbPSUvfQ3t9alrXxjvvvmffVzd3x66j Ouobm537VveDp5P1vN9cuFaW9/ozXT9Rua7ffNS09JhvV3xv2567N6r8q9dt DI7hVHq5JNdqQ9dgRvtPqnPosWkfGHutsr6uaPuZzn09zhfzF9rrdrbawetI WtczLdp+fN+FM91+5mL9AwAAAAD+OZTXD409tdN6HRx/nsf6Ezbnj84fDLYZ XW6mcv2WnkHT3D3g/czl9XHvw5S3lFQ3Zt2X8nrlqJo+U3jdHJnMV5NaN7mu M51c51rFbXPk5Pm815vJLElZpMtG4yiv/3rxEtPaPzKreX0uylqUzSm3nq19 KEO6fKMiZ/YbPgfK6C+XVNrpVWs32DrNdq5+//OszaLC85QFK7PqvP/Y5vrR 43Y50+Kly+3r2aIS237d59M55unm9TMtnNfL8lUFOddRnekZyWyU51LQHs4U 3rDT4bZ3pbTalNa1vNW6SnL95kPPompbezPmrVqz4Y0ek+rbtcd8y/q6ou1n NvL6uShpXc+21/0unMvHBAAAAAB4O0p7npiW4RfmSvsj0/4wmmfn52rHI9P2 ILWN/sDF1nFzrnnMXO98bOcVB58fqnlgp7tHX9rl47b1Kq+fMMOjj+x7UV97 GRr7yy43OPbMLpea99QM2Kz+sXkw2Tff5fzK5R+MjGbsQ+tq2+59TUNrqv97 Va2paWyz85q67pmK2jvmZnmV6bg3YudV1jWYO+137fyWniHT3v/Qfi5V9U2m Z/iJ6RwcMyVllXaZklsVGfvNltff7hww/3rn31nzy3Be3z4wbtb8sNn0PHxm +/sp99qweZtd/5dfD9nllFW5Ps27gtd3359ntuzYne5H/d33a+yyWk45Qdw+ 9bn6VbtsrbS22Sxbsdp8s2yF2bbz19jynr583fYxVGbpssH3531knxss/OZb 09g9ZOraem2Z1H/Q9VnUvIJgf5u2/WL2Hzlh55XfbrP7XLdpq/nj7GXT3PvA 9hv+6JPP7PpXy+r8Zbh0zfb93nPoaDqvL1i/Kd2nVdmWpj/7cr49HmXPq9dv tJ8p/9U+tLzKqnnqF/7HmUu2zpWN+8qvPuuqM5XV5de3guM/frbQ9rFXnfq2 5Zun86tzuf7Hn2xZtIzOs/phalp92bWMppW7KzeP1oHKpRzZvQ/neReKb9l6 0eeLlizL6Acezf1UbtVPxn0kOK6TF69Otskxs/S7VbbsKmO63QfLLAnq1mX0 W3/Za65X3rHnpenusJ2nZ1Vd96c+a8vFl9erTau9q8503vWZnhGoL7/qsixo S7pOdN5WFqw3B4+eTG9Pz1TUzvU7AdWnb1u+9qk6UB9bbT8ury8ur7dtX59/ v/aH9HoffvypPY/uWvJtv+hWjS3/x59+breh8vvap+pdZdZrfUe/bYuLli43 +w4fT9e/czFLf3tf/ahtaX9q09v3HIhdV/eK6H0lei9Iev3WtfXZ5UTnOtwu 9RsPratp9aNX3ei43f1t94Ej6Xuetp/0Wv3t+Bm7nM5n+joJ6krLqB0UllTZ ebqHbdu1z96X1Me9pKbJLFm+0l4DWj/6XMvxlVXXVcHkb1dc/2rf/SHK1358 93VfW/GJtn/RsWgfrl3ouZ5rD6qPuO1H68e3P993lZ4vabuqx1v1rd66SFrX vvajNq1zqfv95Sz1o/rUex2vnkX62o/vu9DXfrRvnRdtT/dD333dd0zR+vdd S0nrGgAAAAAw951pSmXYyuvrB56Z8y1jpnt0wpxtGjOFbeN2vlwOphuGnpsD 1cPmRtdjc7Fl3HQ+fGlON46aC8F0Vd9fGXm90zXyMtjHq991n2wYnbJvn/B4 OOG+9crjbc4+Mm7fazral34gpn99LsrrOwdT21Wm7jLzrqFH5nZrt6msS/V7 r6hrmNKXvrGzP2Oe1u+Z7KOcT//6JDLz+jE7rQxYWahyD/VfvlHdYKddP2Nl W66/dTR/1b/te0dfBOX9K51RRyl7cDmf8gD3GwBlpMrCs5X3qwWL7auyDuUQ mnb5pbbjskhRXuIyEGUayjB0HJ989oUtozLHjslz5ET7MvuojBevl9vtKXeN y+uVn+o4lW8pM9PzE409pDIoI1L2p+WVi/nGFQmXX+u4TM/RPD1f0TlSRh63 Ld881Z/yxq8WLLLnXXmPzovybY3B4JaL5vXKqpR9aeyN8PbC7UBtvfBmlc3O lQspA/Ut586566vtqP5b+6dezxqDxGVoKtPNmqZ0G1NGdeJ8kd2X63Ovcig7 U93kMz6I8kpl8ZrWOdLzBtW1y/mWr1pjXzWmy469B6eMS6NyuTxa7UlZuF51 zt15i27L1z51bnxtMprXKzd311J9e3+6PsL9o33bV16ptuvaWVz7/GL+gozs UnX65/krdjwY7TN87Nnyel/9qL0pg1ReqHtG3Dq++4rvXpDk+lUeqW2o/bv7 si+vd20x/FzK14aTXKu+dZVfa1lRnqp5ymj1quvn2OmL6ftNkv7R4bKqTbr2 pm3tOZj9XhMVbT/R+o9rK1G+9u+rC9Wf7innim7a9hW3fV/9RPm+q3Se9dsD 3eNc+/DVRZK69rUfXceaVh0p9/aVX9dq3LPocPuRuO9CV2e6n7n2Hxa9r2c7 pnD9+66lJHUNAAAAAJj7XH6uTF5ZfM/ohO1nf7j2oc3lld/rs9bhVP53qjG1 vLL2m91PzPnmMbtcccfjKXm9snrl+dpmdH+ivvd3x/z9yMPj4TjqU5/qVz+R 7hevvF4y15+YHPM+c5u5xsNRXt81mXfcKC23/5avqm80bX0P7Nj0ZdX19jPl 9dGx6pt7Bk1jR1/6vfrau2VmczwcZWbqm6ms8uCxUxnLKXdw477MX/hNbF4f fh83hoIyk7NXUnmo+tTeqGqw00ny+vkLU7mCcr4lk3mC2084l5JwBqJsMjq+ tMZId33KHeUV6ieZrQwur9eYBcpFVC/KZDQ+jupF2ZvyFGWkOk5ldyqjMmjf WCbKjdruTc2nw+XfEdRTUWnmuXZj6KsuXN9z37ai85TlqT+6Mlj1/73TlXo2 pFxNOWy4zYTzer1q7BrfON1x51p9XMO/74gu9+tvx2zf9PA89Rl10/rNx6tM rMDmfuF5yvA178DRE/Z8uOXc58rP1K7C+Wk0f41S3qWxRVx5lXuF23/4GNSn W9nzjlDf8HAerT6vGjPm+LnC9DnwbcvXPr/8eqF91e8FsuX1bpz/cHuJPifx bV/jbYh+l6D3ce0zes7U7tzvL9SvOPxZvnm96FypznU9+66DaBnctO9ekOT6 FY2bo/uda2vuuYnOy3Tzet+16lt3weKlwX39uffzcB3pXuP6cWcTLqvyal33 mtbvKPR7F03H3Wuisj1ny3Yvi/K1f982de/U7wF0H1V7yNUWo20ozPddpWeQ aue6lnVfjquLpHUdbT+uXDbvDtqir/xXy2qn/JbI134kV16venXt34m7r8cd U7j+s32vhus6yf9TAAAAAADmlnD/+qb7z+37jocvbZZeFMwru/s0Y6wct7xb Tq/K6dU3P5zX943/x+wqv28utY7bbWieXvdW3rdj8IS35ePL69XPPjUezpOM /vVT8/r/pJfLdzwc9aEvq6qz/ek1r7axzVTdbrbj3GhsG83z5fX6W7I3yypN 9Z1mm/m39g6bkrKK4H2LKS2vtsu09Q2b6mBbRcXX7avvuJOOh6N+nhpTRVmJ 8iP9m1zTyjPUz1LZszIQjaWhPuPK2936yvWVj7nMMEler0zAjh+wcYvNEd38 JHn9yYvFdiwB5WvKETTv8y+/tv18lZMr93HLhjMQZU/q96hMy/XV1FgBbpyA o6Fx+3U8ypjcGOxRLq/XtMbeUDZUXF5nj0n9rZUh+/J6La8+yco7la+7ftlJ 8nodl7Ih1ZeOVblceOxw9X+N21Z0nsZmUF3ouPXMwuU66le+aLJvuuMbD0f9 VJVVqUwaJ0F9Rt/7YJ591d/61Jgpegak8+vGhnB9S91yblv6fUD0Nw7uWETP crQd1aUb20LnXevp+F3+pecuapvKqdy4z/pdiNpUtG+9zlm0T3+Y2r9+DyFu PBNfxu5yen0W7r8azrdULvVPV46mfvA6b75t+drn/sN/ptpUsI+4vzcbl9cr U9PfHtW6On7f9lWfaut6ZubGOPG1z+h1rLau+4XWVxnDn+Wb16seNF6Kno/o fPrGXoq7r/juBUmuX5VR4wApw973e+q3CXreo2PW86Pp5vXRazVuXdWj3ms5 9/zSl5GqDdmxUYJtZftbGdGyanldh2rH7vpPmtdH24+v/n1tJcrX/uPqUfUQ ft6arS3myuuj31X6HZTamdpttmebSera1370PaL9KuvWfcdXfvs3sYNy6d6l VzduV7T9SK68XvSdpfdqr7oPxN3X444pvC3fteSr6yT/TwEAAAAAmFvc+PVv er+5xq9/G8L96/8bhDPGvwtlKoy7m1xlY6fNK8Pz4savl7me2cSVT1mY+03H bNMzIeV26o+r7HAujSuhZ3H6rYJyPv2dgZnYZpK8Hv8cb6P9v43vqn/K3+MF AAAAAODvjLz+7VFfQ/U1LZgcLwa5qS+nflMRHUNcGf6V0ur0+Ed/d/pth57j vKnj0TMDPR9QZlkS6gM+F2ise/XNT/1WInef61w0po0blx+Qt9H+yesBAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK9jYPyFGR4ZM/dH nwQeB/Mm8lz/5Rstb+/oc9M78sz72a3KmvQy5TW3g/e109pX9/BT88GHH5sf t+00P2z52dyN2W+c2x33Mt6vWL3utcvSN/rCLFu52mzevstUN/ckXi9unzqe ioaOvMsRPaao05eumTUbfrTTuw8cNjWtd2elHSQp/5btu82hP07Pyv6T2rnv N/PeBx+m33cMjpuNW3eYtRu3mKOnLqTmDT2y71cWvDpXW3fsCZbbbuvyu9Vr TWPPffteFi751hw+cc4uN++jT+y8n3bute8buofMumBbm3/eaXbu/93O6x+f MJt+2mH3+/PufdM6nhMXisz5q6V2eu+hY6aqqSuv9U9dKp7Rc9LS99Ben5rW tfHOu+/Z99XN3bHrqI76xmbnvtX94OlkPe83F66V5b3+TNdPVK7rNx81LT3m 2xXf27bn7o0q/+p1G4NjOJVeLsm12tA1mNH+k+ocemzaB8Zeq6yvK9p+pnNf j/PF/IX2up2tdvA6ktb1TIu2H9934Uy3n7lY/wAAAACAfw7l9UNjT+20XgfH n+ex/oTN+aPzB4NtRpebqVy/pWfQNHcPeD9zeX3c+zDlLSXVjVn3pbxeOaqm zxReN0cm89Wk1k2u60wn17lWcdscOXk+7/VmMktSFumy0TjK679evMS09o/M al6fi7IWZXPKrWdrH8qQLt+oyJn9hs+BMvrLJZV2etXaDbZOs52r3/88a7Oo 8DxlwcqsOu8/trl+9LhdzrR46XL7eraoxLZf9/l0jnm6ef1MC+f1snxVQc51 VGd6RjIb5bkUtIczhTfsdLjtXSmtNqV1LW+1rpJcv/nQs6ja1t6MeavWbHij x6T6du0x37K+rmj7mY28fi5KWtez7XW/C+fyMQEAAAAA3o7SniemZfiFudL+ yLQ/jObZ+bna8ci0PUhtoz9wsXXcnGseM9c7H9t5F1vG7X6Kg/fdoy/t8nHb epXXT5jh0Uf2vaivvQyN/WWXGxx7ZpdLzXtqBmxW/9g8mOyb73J+5fIPRkYz 9qF1tW33vqahNdX/varW1DS22XlNXfdMRe0dc7O8ynTcG7HzKusazJ32u3Z+ S8+Qae9/aD+Xqvom0zP8xHQOjpmSskq7TMmtioz9Zsvrb3cOmH+98++s+WU4 r28fGDdrfthseh4+s/39lHtt2LzNrv/Lr4fscsqqXJ/mXcHru+/PM1t27E73 o/7u+zV2WS2nnCBun/pc/apdtlZa22yWrVhtvlm2wmzb+WtseU9fvm77GCqz dNng+/M+ss8NFn7zrWnsHjJ1bb22TOo/6Posal5BsL9N234x+4+csPPKb7fZ fa7btNX8cfayae59YPsNf/TJZ3b9q2V1/jJcumb7fu85dDSd1xes35Tu06ps S9OffTnfHo+y59XrN9rPlP9qH1peZdU89Qv/48wlW+fKxn3lV5911ZnK6vLr W8HxHz9baPvYq0592/LN0/nVuVz/40+2LFpG51n9MDWtvuxaRtPK3ZWbR+tA 5VKO7N6H87wLxbdsvejzRUuWZfQDj+Z+KrfqJ+M+EhzXyYtXJ9vkmFn63Spb dpUx3e6DZZYEdesy+q2/7DXXK+/Y89J0d9jO07OqrvtTn7Xl4svr1abV3lVn Ou/6TM8I1JdfdVkWtCVdJzpvKwvWm4NHT6a3p2cqauf6nYDq07ctX/tUHaiP rbYfl9cXl9fbtq/Pv1/7Q3q9Dz/+1J5Hdy35tl90q8aW/+NPP7fbUPl97VP1 rjLrtb6j37bFRUuXm32Hj6fr37mYpb+9r37UtrQ/tentew7Erqt7RfS+Er0X JL1+69r67HKicx1ul/qNh9bVtPrRq2503O7+tvvAkfQ9T9tPeq3+dvyMXU7n M32dBHWlZdQOCkuq7Dzdw7bt2mfvS+rjXlLTZJYsX2mvAa0ffa7l+Mqq66pg 8rcrrn+17/4Q5Ws/vvu6r634RNu/6Fi0D9cu9FzPtQfVR9z2o/Xj25/vu0rP l7Rd1eOt+lZvXSSta1/7UZvWudT9/nKW+lF96r2OV88ife3H913oaz/at86L tqf7oe++7jumaP37rqWkdQ0AAAAAmPvONKUybOXo9QPPzPmWMdM9OmHONo2Z wrZUvi6Xg+mGoefmQPWwudH12GbvnQ9fmtONo+ZCMF3V91dGXu90jbwM9jFm escm7LKad+LOSMa+fcLj4YT71iuPtzn7yLh9r+loX/qBmP71uSiv7xxMbVeZ usvMu4Yemdut3aayLtXvvaKuYUpf+sbO/ox5Wr9nso9yPv3rk8jM68fstDJg ZaHKPdR/+UZ1g512/YyVbbn+1tH8Vf+27x19EZT3r3RGHaXsweV8ygPcbwCU kSoLz1berxYstq/KOpRDaNrll9qOyyJFeYnLQJRpKMPQcXzy2Re2jMocOybP kRPty+yjMl68Xm63p9w1Lq9XfqrjVL6lzEzPTzT2kMqgjEjZn5ZXLuYbVyRc fq3jMj1H8/R8RedIGXnctnzzVH/KG79asMied+U9Oi/KtzUGg1sumtcrq1L2 pbE3wtsLtwO19cKbVTY7Vy6kDNS3nDvnrq+2o/pv7Z96PWsMEpehqUw3a5rS bUwZ1YnzRXZfrs+9yqHsTHWTz/ggyiuVxWta50jPG1TXLudbvmqNfdWYLjv2 HpwyLo3K5fJotSdl4XrVOXfnLbotX/vUufG1yWher9zcXUv17f3p+gj3j/Zt X3ml2q5rZ3Ht84v5CzKyS9Xpn+ev2PFgtM/wsWfL6331o/amDFJ5oe4Zcev4 7iu+e0GS61d5pLah9u/uy7683rXF8HMpXxtOcq361lV+rWVFearmKaPVq66f Y6cvpu83SfpHh8uqNunam7a152D2e01UtP1E6z+urUT52r+vLlR/uqecK7pp 21fc9n31E+X7rtJ51m8PdI9z7cNXF0nq2td+dB1rWnWk3NtXfl2rcc+iw+1H 4r4LXZ3pfubaf1j0vp7tmML177uWktQ1AAAAAGDuO9nwKq9XFt8zOmH72R+u fWhzeeX3+qx1OJX/nZrM3JW13+x+Ys43j9nlijseT8nrldUro9c2745NpPP5 Ew2pvF597zXfV67weDiO+tSn+tVPpPvFK6+XzPUnJse8z9xmrvFwlNd3TeYd N0rL7b/lq+obTVvfAzs2fVl1vf1MeX10rPrmnkHT2NGXfq++9m6Z2RwPR5mZ +mYqqzx47FTGcsod3Lgv8xd+E5vXh9/HjaGgzOTslVQeqj61N6oa7HSSvH7+ wlSuoJxvyWSe4PYTzqUknIEom4yOL60x0l2fckd5hfpJZiuDy+s1ZoFyEdWL MhmNj6N6UfamPEUZqY5T2Z3KqAzaN5aJcqO2e1Pz6XD5dwT1VFSaea7dGPqq C9f33Let6DxleeqPrgxW/X/vdKWeDSlXUw4bbjPhvF6vGrvGN0533LlWH9fw 7zuiy/362zHbNz08T31G3bR+8/EqEyuwuV94njJ8zTtw9IQ9H24597nyM7Wr cH4azV+jlHdpbBFXXuVe4fYfPgb16Vb2vCPUNzycR6vPq8aMOX6uMH0OfNvy tc8vv15oX/V7gWx5vRvnP9xeos9JfNvXeBui3yXofVz7jJ4ztTv3+wv1Kw5/ lm9eLzpXqnNdz77rIFoGN+27FyS5fkXj5uh+59qae26i8zLdvN53rfrWXbB4 aXBff+79PFxHute4ftzZhMuqvFrXvab1Owr93kXTcfeaqGzP2bLdy6J87d+3 Td079XsA3UfVHnK1xWgbCvN9V+kZpNq5rmXdl+PqImldR9uPK5fNu4O26Cv/ 1bLaKb8l8rUfyZXXq15d+3fi7utxxxSu/2zfq+G6TvL/FAAAAACAuSXcv77p /nP7vuPhS5ulFwXzyu4+zRgrxy3vltOrcnr1zQ/n9X3j/zG7yu+bS63jdhua 58bDuTY5Pk6u/vXRvF797FPj4TzJ6F8/Na//T3q5fMfDUR/6sqo6259e82ob 20zV7WY7zo3GttE8X16vvyV7s6zSVN9ptpl/a++wKSmrCN63mNLyartMW9+w qQ62VVR83b76jjvpeDjq56kxVZSVKD/Sv8k1rTxD/SyVPSsD0Vga6jOuvN2t r1xf+ZjLDJPk9coE7PgBG7fYHNHNT5LXn7xYbMcSUL6mHEHzPv/ya9vPVzm5 ch+3bDgDUfakfo/KtFxfTY0V4MYJOBoat1/Ho4zJjcEe5fJ6TWvsDWVDxeV1 9pjU31oZsi+v1/Lqk6y8U/m665edJK/XcSkbUn3pWJXLhccOV//XuG1F52ls BtWFjlvPLFyuo37liyb7pju+8XDUT1VZlcqkcRLUZ/S9D+bZV/2tT42ZomdA Or9ubAjXt9Qt57al3wdEf+PgjkX0LEfbUV26sS103rWejt/lX3ruorapnMqN +6zfhahNRfvW65xF+/SHqf3r9xDixjPxZewup9dn4f6r4XxL5VL/dOVo6gev 8+bblq997j/8Z6pNBfuI+3uzcXm9MjX97VGtq+P3bV/1qbauZ2ZujBNf+4xe x2rrul9ofZUx/Fm+eb3qQeOl6PmIzqdv7KW4+4rvXpDk+lUZNQ6QMux9v6d+ m6DnPTpmPT+abl4fvVbj1lU96r2Wc88vfRmp2pAdGyXYVra/lREtq5bXdah2 7K7/pHl9tP346t/XVqJ87T+uHlUP4eet2dpirrw++l2l30GpnandZnu2maSu fe1H3yPar7Ju3Xd85bd/Ezsol+5denXjdkXbj+TK60XfWXqv9qr7QNx9Pe6Y wtvyXUu+uk7y/xQAAAAAgLnFjV//pveba/z6tyHcv/6/QThj/LtQpsK4u8lV NnbavDI8L278epnrmU1c+ZSFud90zDY9E1Jup/64yg7n0rgSehan3yoo59Pf GZiJbSbJ6/HP8Tba/9v4rvqn/D1eAAAAAAD+zsjr3x71NVRf04LJ8WKQm/py 6jcV0THEleFfKa1Oj3/0d6ffdug5zps6Hj0z0PMBZZYloT7gc4HGulff/NRv JXL3uc5FY9q4cfkBeRvtn7weAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA APB3NDD+wgyPjJn7o08Cj4N5E3mu//KNlrd39LnpHXnm/exWZU16mfKa28H7 2mntq3v4qfngw4/Nj9t2mh+2/Gzuxuw3zu2OexnvV6xe99pl6Rt9YZatXG02 b99lqpt7Eq8Xt08dT0VDR97liB5T1OlL18yaDT/a6d0HDpua1ruz0g6SlH/L 9t3m0B+nZ2X/Se3c95t574MP0+87BsfNxq07zNqNW8zRUxdS84Ye2fcrC16d q6079gTLbbd1+d3qtaax5759LwuXfGsOnzhnl5v30Sd23k8799r3Dd1DZl2w rc0/7zQ79/9u5/WPT5hNP+2w+/15975pHc+JC0Xm/NVSO7330DFT1dSV1/qn LhXP6Dlp6Xtor09N69p459337Pvq5u7YdVRHfWOzc9/qfvB0sp73mwvXyvJe f6brJyrX9ZuPmpYe8+2K723bc/dGlX/1uo3BMZxKL5fkWm3oGsxo/0l1Dj02 7QNjr1XW1xVtP9O5r8f5Yv5Ce93OVjt4HUnreqZF24/vu3Cm289crH8AAAAA wD+H8vqhsad2Wq+D48/zWH/C5vzR+YPBNqPLzVSu39IzaJq7B7yfubw+7n2Y 8paS6sas+1JerxxV02cKr5sjk/lqUusm13Wmk+tcq7htjpw8n/d6M5klKYt0 2Wgc5fVfL15iWvtHZjWvz0VZi7I55daztQ9lSJdvVOTMfsPnQBn95ZJKO71q 7QZbp9nO1e9/nrVZVHiesmBlVp33H9tcP3rcLmdavHS5fT1bVGLbr/t8Osc8 3bx+poXzelm+qiDnOqozPSOZjfJcCtrDmcIbdjrc9q6UVpvSupa3WldJrt98 6FlUbWtvxrxVaza80WNSfbv2mG9ZX1e0/cxGXj8XJa3r2fa634Vz+ZgAAAAA AAh7lddPmOHRR/a9qK+9DI39ZZcbHHtml0vNe2oGbFb/2DyY7Jvvcn7l8g9G RjP2oXW1bfe+pqE11f+9qtbUNLbZeU1d90xF7R1zs7zKdNwbsfMq6xrMnfa7 dn5Lz5Bp739oP5eq+ibTM/zEdA6OmZKySrtMya2KjP1my+tvdw6Yf73z76z5 ZTivbx8YN2t+2Gx6Hj6z/f2Ue23YvM2u/8uvh+xyyqpcn+Zdweu7788zW3bs Tvej/u77NXZZLaecIG6f+lz9ql22VlrbbJatWG2+WbbCbNv5a2x5T1++bvsY KrN02eD78z6yzw0WfvOtaeweMnVtvbZM6j/o+ixqXkGwv03bfjH7j5yw88pv t9l9rtu01fxx9rJp7n1g+w1/9Mlndv2rZXX+Mly6Zvt+7zl0NJ3XF6zflO7T qmxL0599Od8ej7Ln1es32s+U/2ofWl5l1Tz1C//jzCVb58rGfeVXn3XVmcrq 8utbwfEfP1to+9irTn3b8s3T+dW5XP/jT7YsWkbnWf0wNa2+7FpG08rdlZtH 60DlUo7s3ofzvAvFt2y96PNFS5Zl9AOP5n4qt+onPE/n9eTFq5Ntcsws/W6V LbvKmG73wTJLgrp1Gf3WX/aa65V37Hlpujts5+lZVdf9qc/acvHl9WrTau+q M513faZnBOrLr7osC9qSrhOdt5UF683BoyfT29MzFbVz/U5A9enblq99qg7U x1bbj8vri8vrbdvX59+v/SG93ocff2rPo7uWfNsvulVjy//xp5/bbaj8vvap eleZ9Vrf0W/b4qKly82+w8fT9e9czNLf3lc/alvan9r09j0HYtfVvSJ6X4ne C5Jev3VtfXY50bkOt0v9xkPralr96FU3Om53f9t94Ej6nqftJ71Wfzt+xi6n 85m+ToK60jJqB4UlVXae7mHbdu2z9yX1cS+paTJLlq+014DWjz7Xcnxl1XVV MPnbFde/2nd/iPK1H9993ddWfKLtX3Qs2odrF3qu59qD6iNu+9H68e3P912l 50varurxVn2rty6S1rWv/ahN61zqfn85S/2oPvVex6tnkb724/su9LUf7Vvn RdvT/dB3X/cdU7T+fddS0roGAAAAAMx9pT1PTMvwC3Ol/ZFpfzg148vH1Y5H pu3Bq20UB+8P1TxIvz/ZMGr3c73rsekefWmXj9tWeDyccN965fE2Zx8Zt+81 He1LPxDTvz4X5fWdg6ntKlN3mXnX0CNzu7XbVNal+r1X1DVM6Uvf2NmfMU/r 90z2Uc6nf30SmXn9mJ1WBqwsVLmH+i/fqG6w066fsbIt1986mr/q3/a9oy+C 8v6VzqijlD24nE95gPsNgDJSZeHZyvvVgsX2VVmHcghNu/xS23FZpCgvcRmI Mg1lGDqOTz77wpZRmWPH5Dlyon2ZfVTGi9fL7faUu8bl9cpPdZzKt5SZ6fmJ xh5SGZQRKfvT8srFfOOKhMuvdVym52ienq/oHCkjj9uWb57qT3njVwsW2fOu vEfnRfm2xmBwy0XzemVVyr409kZ4e+F2oLZeeLPKZufKhZSB+pZz59z11XZU /639o1PqQ2OQuAxNZbpZ05RuY8qoTpwvsvtyfe5VDmVnqpt8xgdRXqksXtM6 R3reoLp2Od/yVWvsq8Z02bH34JRxaVQul0erPSkL16vOuTtv0W352qfOja9N RvN65ebuWqpv70/XR7h/tG/7yivVdl07i2ufX8xfkJFdqk7/PH/FjgejfYaP PVte76sftTdlkMoLdc+IW8d3X/HdC5Jcv8ojtQ21f3df9uX1ri2Gn0v52nCS a9W3rvJrLSvKUzVPGa1edf0cO30xfb9J0j86XFa1SdfetK09B7Pfa6Ki7Sda /3FtJcrX/n11ofrTPeVc0U3bvuK276ufKN93lc6zfnuge5xrH766SFLXvvaj 61jTqiPl3r7y61qNexYdbj8S913o6kz3M9f+w6L39WzHFK5/37WUpK4BAAAA AHPfmaZUxqYcvX7gmTnfMma6RyfM2aYxU9g2bufL5WC6Yei5OVA9bG50PTYX W8ZN58OX5nTjqLkQTFf1/TUlrxdl9HrVNt20thHet094PBxHfepT/eon0v3i lddL5voTk2PeZ24z13g4yuu7JvOOG6Xl9t/yVfWNpq3vgR2bvqy63n6mvD46 Vn1zz6Bp7OhLv1dfe7fMbI6Ho8xMfTOVVR48dipjOeUObtyX+Qu/ic3rw+/j xlBQZnL2SioPVZ/aG1UNdjpJXj9/YSpXUM63ZDJPcPsJ51ISzkCUTUbHl9YY 6a5PuaO8Qv0ks5XB5fUas0C5iOpFmYzGx1G9KHtTnqKMVMep7E5lVAbtG8tE uVHbvantN1z+HUE9FZVmnms3hr7qwvU9920rOk9ZnvqjK4NV/987XalnQ8rV lMOG20w4r9erxq7xjdMdd67VxzX8+47ocr/+dsz2TQ/PU59RN63ffLzKxAps 7heepwxf8w4cPWHPh1vOfa78TO0qnJ9G89co5V0aW8SVV7lXuP2Hj0F9upU9 7wj1DQ/n0erzqjFjjp8rTJ8D37Z87fPLrxfaV/1eIFte78b5D7eX6HMS3/Y1 3obodwl6H9c+o+dM7c79/kL9isOf5ZvXi86V6lzXs+86iJbBTfvuBUmuX9G4 ObrfubbmnpvovEw3r/ddq751FyxeGtzXn3s/D9eR7jWuH3c24bIqr9Z1r2n9 jkK/d9F03L0mKttztmz3sihf+/dtU/dO/R5A91G1h1xtMdqGwnzfVXoGqXau a1n35bi6SFrX0fbjymXz7qAt+sp/tax2ym+JfO1HcuX1qlfX/p24+3rcMYXr P9v3ariuk/w/BQAAAABgbnEZujJ55eg9oxO2n/3h2oc2l1d+r89ah1P536nG 1PLK2m92PzHnm8fscsUdj7Pm9XKt87F9BvB7barP/blg3btj/nFffHm9+tmn xsN5ktG/fmpe/5/0cvmOh6M+9GVVdbY/vebVNraZqtvNdpwbjW2jeb68Xn9L 9mZZpam+02wz/9beYVNSVhG8bzGl5dV2mba+YVMdbKuo+Lp99R130vFw1M9T Y6ooK1F+pH+Ta1p5hvpZKntWBqKxNNRnXHm7W1+5vvIxlxkmyeuVCdjxAzZu sTmim58krz95sdiOJaB8TTmC5n3+5de2n69ycuU+btlwBqLsSf0elWm5vpoa K8CNE3A0NG6/jkcZkxuDPcrl9ZrW2BvKhorL6+wxqb+1MmRfXq/l1SdZeafy ddcvO0ler+NSNqT60rEqlwuPHa7+r3Hbis7T2AyqCx23nlm4XEf9yhdN9k13 fOPhqJ+qsiqVSeMkqM/oex/Ms6/6W58aM0XPgHR+3dgQrm+pW85tS78PiP7G wR2L6FmOtqO6dGNb6LxrPR2/y7/03EVtUzmVG/dZvwtRm4r2rdc5i/bpD1P7 1+8hxI1n4svYXU6vz8L9V8P5lsql/unK0dQPXufNty1f+9x/+M9Umwr2Eff3 ZuPyemVq+tujWlfH79u+6lNtXc/M3BgnvvYZvY7V1nW/0PoqY/izfPN61YPG S9HzEZ1P39hLcfcV370gyfWrMmocIGXY+35P/TZBz3t0zHp+NN28Pnqtxq2r etR7LeeeX/oyUrUhOzZKsK1sfysjWlYtr+tQ7dhd/0nz+mj78dW/r61E+dp/ XD2qHsLPW7O1xVx5ffS7Sr+DUjtTu832bDNJXfvaj75HtF9l3brv+Mpv/yZ2 UC7du/Tqxu2Kth/JldeLvrP0Xu1V94G4+3rcMYW35buWfHWd5P8pAAAAAABz S7h/fdP95/Z9x8OXNksvCuaV3X2aMVaOW94tp1fl9OqbH83rte7eyvt2zB29 1zg4l1rHTUXv04xtzRXh/vX/DcIZ49+FMhXG3U2usrHT5pXheXHj18tcz2zi yqcszP2mY7bpmZByO/XHVXY4l8aV0LM4/VZBOZ/+zsBMbDNJXo9/jrfR/t/G d9U/5e/xAgAAAAD+ftz49W96v7nGr38byOvfHvU1VF/TgsnxYpCb+nLqNxXR McSV4V8prU6Pf/R3p9926DnOmzoePTPQ8wFlliWhPuBzgca6V9/81G8lpv+8 U2PauHH5AXkb7Z+8HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwf9h70/8oirZv/939vP09z3V76eW+ ooioqMimooIoIiAiyiqr7IsQQkIWQshONggmIUASFkW4/sn6zVGTGmqa6pnu mQk0+n1xfKanpru6+qyzqqu/dXaNEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCFEJYxO/2UmbkyZq5O3c9zKpd1Pefy9R1re y5N3zeUbfwZ/O9PUWtinsbU99/1cVecamrhjnn3+RfPFqjXmsxVfm0sx542j vf/3ou8fLlpWcVlGJv8y73+0yHz5zXempXs48XFx5+R6znb0py5H9Jqi7Dn0 m1ny6Rd2e+3Gzaa199Ks+EGS8q/4Zq3ZtH3PrJw/KWs2/GSeefb5wvf+sWmz fOVqs3T5CrN194F82vhN+/2jxQ/qauXqdbn9vrG2/GDRUtM5fNV+h7nz3zOb d/5q93vuhZds2ldr1tvvHUPjZlkury+/XmPW/PCzTbsyfd98/tVqe96v126o 6np2Hjhm9h+vt9vrN20zzV2DqY7ffehETeukZ+S6bZ9s0zaeevoZ+72leyj2 GGw0MjU7/dbQtTszdv7BHPitIfXxtbZPlHLtNw2tPcPmvQ8/tr7n+kbKv2jZ 8tw17C7sl6StdgyOFfl/UgbGb5mLo1MVlbVSov5TTb8ex2tz5tp2O1t+UAlJ bV1rov4TuhfW2n+yaH8hhBBCCCGEEP8c0OvHp+7YbT7Hpu+mOP6+1fmj6WO5 PKP71UrX7xkeM91Do8HfnF4f990HvaWupbPkudDr0VHZ3nvkpNkyo68mZdnM sY5qdJ3fzrabLbv2pz6ulloSWqTTRuNAr39z3nzTe+XGrOr15UBrQZtDt56t c6AhHT51tqz269cBGv3huia7vXDpp9amperq51/2WS3KT0MLRrMauHrL6vrR 63Y607x3F9jPfcfqrP+636u55mr1+lrj6/WwYOHissdgM+ZIZqM8h3L+sPfI Kbvt+97R+hZT39bzWG2VpP2mgbmoc72Xi9IWLvn0kV4T9nb+mLaslRL1n9nQ 67NIUlvPNpXeC7N8TUIIIYQQQgghHg/1w7dNz8Rf5ujFm+bi9aienY7j/TdN 37UHeZzIfd/Ueq3wfU/npDnSd9Ps65oyQ5P37P5xeT3Q6++bicmb9jsQaw/j U3/Y/cam/rT75dPumFGr1d8y12Zi853Ojy5/7cZk0Tk4lrzd99aO3nz8e/M5 09rZZ9O6Bn83Z89dMKcbm03/7zdsWlNbh7lw8ZJN7xkeNxevXLe/Q/P5LjM8 cdsMjE2ZuoYmu0/dmbNF5y2l17cPjJp/PfXvkvqlr9dfHJ02Sz770gxf/9PG +6F7ffrlKnv8t99vsvuhVbmY5u9yn0//5zmzYvXaQhz1Bx8vsfuyHzpB3Dn5 nbhqp63Vn+s273+4yLzz/odm1ZrvY8u75/BJG2OIZum0wf8894KdN5j7znum c2jctPVdtmUiftDFLJK2OHe+z1d9a37YstOmNbb32XMu+3yl2b7vsOm+fM3G Db/w0iv2+OMNbeEyHPrNxn6v27S1oNcv/uTzQkwr2hbbr7w+x14P2vOiT5bb 39B/OQf7U1bSiAvfvveQtTnaeKj8xKxjM8rq9Oszuevfse+IjbHHpqG8QmnU L3X5yRdf2bKwD/VMHCbbxLKzD9vo7ujmURtQLnRk993X8w6cOGPtwu9vz3+/ KA48qvtRbuxT1I/krmvXweMzPjll3v1goS07ZSz4fW6f+TnbOo1+5bfrzcmm C7Zeui5N2DTmqgavPjzXVo6QXo9P4+/YjHrnN+YIiOXHlg05X6KdUG8fLf7E /Lh1VyE/5lTwc94TwJ6hvEL+iQ2IsSX/OL3+RON56/v8/vHSzwrHPf/iy7Ye XVsK5X/sTKst/4svv2rzoPwh/8TulJnP8/1XrC++/e4Cs2HzjoL9HQdLxNuH 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 ZRmZ/Mu8/9Ei8+U335mW7uHEx8Wdk+s529GfuhzRa4qy59BvZsmnX9jttRs3 m9beS7PiB0nKv+KbtWbT9j2zcv6krNnwk3nm2ecL3/vHps3ylavN0uUrzNbd B/Jp4zft948WP6irlavX5fb7xtryg0VLTefwVfsd5s5/z2ze+avd77kXXrJp X61Zb793DI2bZbm8vvx6jVnzw8827cr0ffP5V6vteb9eu6Gq69l54JjZf7ze bq/ftM00dw2mOn73oRM1rZOekeu2fbJN23jq6Wfs95buodhjsNHI1Oz0W0PX 7szY+Qdz4LeG1MfX2j5RyrXfNLT2DJv3PvzY+p7rGyn/omXLc9ewu7Bfkrba MThW5P9JGRi/ZS6OTlVU1kqJ+k81/Xocr82Za9vtbPlBJSS1da2J+k/oXlhr /8mi/YUQQgghhBBC/HNArx+fumO3+Rybvpvi+PtW54+mj+XyjO5XK12/Z3jM dA+NBn9zen3cdx/0lrqWzpLnQq9HR2V775GTZsuMvpqUZTPHOqrRdX472262 7Nqf+rhaaklokU4bjQO9/s15803vlRuzqteXA60FbQ7derbOgYZ0+NTZstqv Xwdo9Ifrmuz2wqWfWpuWqquff9lntSg/DS0YzWrg6i2r60ev2+lM895dYD/3 Hauz/ut+r+aaq9Xra42v18OChYvLHoPNmCOZjfIcyvnD3iOn7Lbve0frW0x9 W89jtVWS9psG5qLO9V4uSlu45NNHek3Y2/lj2rJWStR/ZkOvzyJJbT3bVHov zPI1CSGEEEIIIYR4PNQP3zY9E3+ZoxdvmovXo3p2Oo733zR91x7kcSL3fVPr tcL3Y7lzHOm7aX46d80MTd6z+8fl9UCvv28mJm/a70CsPYxP/WH3G5v60+6X T7tjRq1Wf8tcm4nNdzo/uvy1G5NF5+BY8nbfWzt68/HvzedMa2efTesa/N2c PXfBnG5sNv2/37BpTW0d5sLFSza9Z3jcXLxy3f4Ozee7zPDEbTMwNmXqGprs PnVnzhadt5Re3z4wav711L9L6pe+Xn9xdNos+exLM3z9Txvvh+716Zer7PHf fr/J7odW5WKav8t9Pv2f58yK1WsLcdQffLzE7st+6ARx5+R34qqdtlZ/rtu8 /+Ei8877H5pVa76PLe+ewydtjCGapdMG//PcC3beYO4775nOoXHT1nfZlon4 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 CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIZ5ERqf/MhM3pszVyds5buXS7qc8/t4j Le/lybvm8o0/g7+daWot7NPY2p77fq6qcw1N3DHPPv+i+WLVGvPZiq/NpZjz xtHe/3vR9w8XLau4LCOTf5n3P1pkvvzmO9PSPZz4uLhzcj1nO/pTlyN6TVH2 HPrNLPn0C7u9duNm09p7aVb8IEn5V3yz1mzavmdWzp+UNRt+Ms88+3zhe//Y tFm+crVZunyF2br7QD5t/Kb9/tHiB3W1cvW63H7fWFt+sGip6Ry+ar/D3Pnv mc07f7X7PffCSzbtqzXr7feOoXGzLJfXl1+vMWt++NmmXZm+bz7/arU979dr N1R1PTsPHDP7j9fb7fWbtpnmrsFUx+8+dKKmddIzct22T7ZpG089/Yz93tI9 FHsMNhqZmp1+a+janRk7/2AO/NaQ+vha2ydKufabhtaeYfPehx9b33N9I+Vf tGx57hp2F/ZL0lY7BseK/D8pA+O3zMXRqYrKWilR/6mmX4/jtTlzbbudLT+o hKS2rjVR/wndC2vtP1m0vxBCCCGEEEKIfw7o9eNTd+w2n2PTd1Mcf9/q/NH0 sVye0f1qpev3DI+Z7qHR4G9Or4/77oPeUtfSWfJc6PXoqGzvPXLSbJnRV5Oy bOZYRzW6zm9n282WXftTH1dLLQkt0mmjcaDXvzlvvum9cmNW9fpyoLWgzaFb z9Y50JAOnzpbVvv16wCN/nBdk91euPRTa9NSdfXzL/usFuWnoQWjWQ1cvWV1 /eh1O51p3rsL7Oe+Y3XWf93v1VxztXp9rfH1eliwcHHZY7AZcySzUZ5DOX/Y e+SU3fZ972h9i6lv63mstkrSftPAXNS53stFaQuXfPpIrwl7O39MW9ZKifrP bOj1WSSprWebSu+FWb4mIYQQQgghhBDC54Fef99MTN6034FYexif+sPuNzb1 p90vn3bHjFqt/pa5NhOb73R+dPlrNyaLzsGx5O2+t3b05uPfm8+Z1s4+m9Y1 +Ls5e+6COd3YbPp/v2HTmto6zIWLl2x6z/C4uXjluv0dms93meGJ22ZgbMrU NTTZferOnC06bym9vn1g1PzrqX+X1C99vf7i6LRZ8tmXZvj6nzbeD93r0y9X 2eO//X6T3Q+tysU0f5f7fPo/z5kVq9cW4qg/+HiJ3Zf90AnizsnvxFU7ba3+ XLd5/8NF5p33PzSr1nwfW949h0/aGEM0S6cN/ue5F+y8wdx33jOdQ+Omre+y LRPxgy5mkbTFufN9vupb88OWnTatsb3PnnPZ5yvN9n2HTfflazZu+IWXXrHH H29oC5fh0G829nvdpq0FvX7xJ58XYlrRtth+5fU59nrQnhd9stz+hv7LOdif spJGXPj2vYeszdHGQ+UnZh2bUVanX5/JXf+OfUdsjD02DeUVSqN+qctPvvjK loV9qGfiMNkmlp192EZ3RzeP2oByoSO7776ed+DEGWsXfn97/vtFceBR3Y9y Yx8/jXrddfD4jE9OmXc/WGjLThkLfp/bZ37Otk6jX/ntenOy6YKtl65LEzaN uarBqw/PtZUjpNfj0/g7NqPe+Y05AmL5sWVDzpdoJ9TbR4s/MT9u3VXIjzkV /Jz3BLBnKK+Qf2IDYmzJP06vP9F43vo+v3+89LPCcc+/+LKtR9eWQvkfO9Nq y//iy6/aPCh/yD+xO2Xm83z/FeuLb7+7wGzYvKNgf8fBEvH2IfvgW5wPn/5m 3cbYY+krov1KtC9I2n7b+kbsfkBd+37JOx4cyzZx9NiG63b929qNWwp9Hvkn bas/7dhr96M+C+0kZyv2wQ+O1DXbNPqwVd9tsP0SMe51rV1m/oKPbBvg+Oi8 liNUVtrV4pl3V1x8dah/iBLyn1C/HvKVEFH/B66Fczi/YF7P+QP2iMs/ap/Q +UL3KuaXyBc7njnfG7RFUluH/Aefpi7p7w+XsA/25DvXy1xkyH9C98KQ/3Bu 6oX86A9D/XromqL2D7WlpLYWQgghhBBCCJF96odvm56Jv8zRizfNxesPa3xp ON5/0/Rde5DHidz3Ta3XCt9PDtwyh/umTePlO2Zo8p7dPy4vfz0cP7YePd7q 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 tNVK/TOrbbUa/8xCW63UP7PcVp/0e0mltgDszjm/WrO+KlsMX//Ttg9s8emX q1KV4btc21j8yef2nL+dba/KPw/+1mDt8O4HC01da1eqcrz/4aLCtXddmqjK P5OyZsNP1s7ue0N7n7XjR4uXmdMz5aetvzlvfsEnQr5Syn82bN5h09keunZn ph/7wRzI2Yo0rpN6W5prl5WMVZPQe+WG+d+nnjZ9v08mPqatb8T2FfR5/vXg k/MXfGT2Ha2z39dv2mb7Fur84uhU6rL59qnW1/28qvHFfL2cN6+89kaqY+LO 6du/mrYasv+TXJelzunbP678s+n/Wa3LLPt/Vusyy/4Puw+dMJu270l9XFJq eV9p7Rk27334sR2zOH2J8jMG27R9d2G/pHrNa3PmphrzwcD4rUT1EyprpfA8 MTL1QDusRhurpS0eBbM1LilF1H9CemLH4Jgdq6XNO85/smr/Jxn0+vGpO3ab z7HpuymOv291/mj6WC7P6H610vV7hsdM99Bo8Den18d996GvqGvpLHku9HrG /WzvPXLSPv+lKeuymWMd1fRJPPtt2bU/9XG17Ad5PmLuIsm+6DHtA/l6om/g s/fKpL0P+fv9/Ms+208kLQPP864MafsCVw7GZ+f7rxT9xjOf+z0J9HM8V6Yt B/u6/ee9u6DotzNtPanGmrWwxb5jdWbb3kNV2YI8aB+P0xbw0eJPCvmlKUct /bNSW5TyT9rddzMa6Wz7Z9baai38MwtttRb+mdW2Wol/ZqGtzsa9JCtt9Um9 l1Rqi4Grt6wuHvqtkrbqnj94zkHvTlN+fCD0W1r/dGWgfqNjyXKgP4XSK/HP NPjjTeYtqBfG2gsWLimkozeFtKWQr/hp6GRoQE7DOXTqbK4vO5W3+9d530VP 4LNzaNxqRbNxjdgW0mhcg1dvm8s38s9W6Fcu/YctO823328q+Kerc65r18Hj qcoVtU9aP/N9PZpXNb54cXTa5s3cbCXlip4zav9K22rI/n+XuvTPGbV/XPmT Uon/Z7Uu486ZJf/PWl0+Lv8/2dSeqpyzQRoNJAnMcZ/rvVyUtnDJp4/0mriP uniPtGWtFMZq/eM3C99nQ6/PIrX2n0qpVE8MkdR/niTqh2+bnom/zNGLN83F 68mfX0Ic779p+q7l87iS42DvtPm1e8qcHLhl00am/2u2t98wpwZvmaHJe3b/ uLwe6PX3zcTkTfsdiLWH8al8nNXY1J92v3zaHTNqtfpb5tpMbL7T+dHlr90o 7lM5lrzd99aO3nz8e/M509rZZ9O6Bn83Z89dMKcbm03/7zdsWlNbh7lw8ZJN 7xkeNxevXLe/Q/P5LjM8cdsMjE2ZuoYmu0/dmbNF5y2l16Ml/+upf5d8JvT1 eu6TSz770s7Hc7+kzTEfz/Hco9iPftbFHvJM9PR/njMrVq81W2d0/g8+XmL3 ZT98PO6c/E4slmvX9ee6bbzUO+9/aFat+T62vHsOn7TzYwsWLjb1uWdU0v7z 3At2fDH3nffsMwzxb5SJuS8330Ya9//PV31r77mkNbb32XMu+3yl2b7vsH2e R5t44aVX7PHHG9pK+mi0/e48cMy8Pf/9oncDuFaex9L4/uGc3ehnePZN+35A /9i0tW3Uhtgq7XgCuxw53Wx27j9mryPNsegH83N16XQzB/WdRqOoxhaw6rsN 9j7J/Gg1tlj57frcWOqCfQZPO8aulS2IB7UxmfuOmCN1zak1p1r5ZzW2iPPP Hzb/kkrnqdY/s9BWa+mfWWir1fpnlttqWv/MSludjXtJFtpqJf75pLdVtAG0 A/wqGieZ1hY+1PHlFPMNjP+wBXNabgxWqX86zpzvNd//vD3VMczf8EzMmNF/ Lq7EPx34Rc/I9ZJp/nM3cxdo802dg+alV18vpIf0+pCv+Gn4FWNs9H+n4dAG 387ZmThM1ycR87lu01brz24O69iZ1qL65zi/btLAOyiMfRkDV6Id8fzgysX7 B5T14MnGhzRGrolxf9J8Q/ap1NdL5VWJL9Im8RHmb6r1/1L2T9tWS9n/Sa9L /5xx9vfLn5Rq/T+rdemfM2v+n9W6fNT+Tx/u3qMKwe9cC7EgvPNHGnO96Bbc C79ZtzH2WHQZNBvmLrgO0qJ6SlINhPcP2A8Yn5FGfbmYdHePJI7+xZdfteMV pxGt3biloBuRf0ivcWNPxkouRuFwXZPd7/kXXy6UA1uxD9fEOJs0dCDGJ2g7 xLgzL8I7EYydOD5ubBAqa0hvYo58+95D1k8Px2hc3NMpJ3Xrxs8hbSxU/hDE +zPG471B7BC1BX6xcOmnBX9wsQxJ7BPnK1G9jzkp8sGO9BEhW1TjP/g0ZWU8 5+yan89abX2rc6as7I8tSeN5LeQ/IT2RvoD9iLl35YjmRRrXy/XgM4xpQ/4T 8sWQrySx9eNib1e+P0SvPz/6p9nfM2WGJu+bfV1T5kjftE2Hw7ntjvG7ZmPL hNXbD/ZMm4Hr98yezklzILfdPPJHkV7vGLxxL3eO/Hzmkb6bdj+O988dwl8P x4+tR4+3OvuNafud7Wgs/WhMfH050OsHxvL5oqm7sfRg7rmivXfINLXl497P tnU8FEvfOXClKI3jh2fimdLE1yehWK+fsttoDGgWtFmeyU61dNjt5q5Bux99 sXvPJzpniF8yHkCv4J3v0DlpN+7ZA1927wCgf+859FvJ8r7x1jz7yX2ONsQ2 7YNP8nFavGvrrv3m399eba/jpVdes2XkOah/po4cjBOSzg0ejNxXmZMnzX9m 5ZpcfFRSsAH9PO/x8WyW9t2i1t5Ltl/1+weuibiJNPlga97xZpyyNGW8BfcM jvV9gGdq+sFHaQvuHzy/ExdZjS2wJ/oKcZHR2NtHZQt889U33rT3Ld4jTLuW Qq38sxpbxPlnJfEW1fhnVtpqrfwzC221Wv/MalutxD+z0lZn416Shbb6JN9L qrGFAw3BPXdWYgsHz3P+O+lpwH5+PGUl/gk84/Os5s+DpIHnRb99VeKfPD9S dt6HL5UG/piXWDL6GvSbJZ4tQnp9yFf8NHyTcSrzjS/mxqiMXXlu/WX/UVtH jJXZj+dNxt9oSe5aGQ/jl5y3UD8Do7b8btyeBPpM4l/QfViPYu3GzaltSTnd sy/XwfMyayRRblfHFwZHU8fwhuxTqa/H5VWJL1L3c+bOszZDT0kbh+efs5T9 K2mrcfZ/0uvSP2cp+/vlfxT+n+W6zKr/Z7UuH5f/R3WFEIwfnF7P+IjyoBeW WuMP7cPprO5dsJCekkQDQY9kjIwe67StkF4P5BWdAw/Fmvt6DWWN06/9Y/ER 9gX3HgQaLZ/ERGzbc9BuM/ZL4pfRsobsQ92VmlNxMG724whC2lio/FEoD/7F Z3Sc59sC+zFW+fXY6YLendQ+IV+J6n3UM+8eoN85/wjZolL/wSfZxkbo3oxf WKubsnDdzPPgX65OSvkPxOmJzmZxeXF+2ry/Bmec//j2D/lKEls/LnZ1PNDr 0eKHJ+/bOPvN565bXR39nt96J/I6/O7O/P5o7aeHbpv93VN2vxP9tx7S69Hq 0fNtnrl0tmFLW75tEXt/aSocX+Svh+Mgpj4fV3+/EBePXg/Fx9+fWfO+OM9y 6+Gg1w/OtNVT9Y3WD5vPd5q+kWt2bfqGlvy4Gr0+ulZ99/CY6ewfKXwn1t7t M5vr4dDfM6/IuP/HbcVjCdoMz+5sz5n7Tqxe73+Pe/+H9u7mp7mXsq5Mqfbl w73c+kPuHjV/pi2489Am1v24pbCv336ZB4yOCVk3NDouoa0xx1fO15m/823r 5u6p57c9jej7n7bZ53L/2Oi9K0rjhYv2vSy2N/y8o7CWIP1IqTXYqBM3/8Az LPXpfmMOMbo/+kOpcjBu496ChuWvSVuu/Lyn4fpgdAW3PzZD7/D3pbyl1omL s0WS8rs6QVfw4xErscXGrTsLa/UyP+Sur1z509iiXP2SD/d8trmfuBiJNLao hX/G2aJS/+T4aF9RLq9q/DONLSr1zyTlr6V/ZqGt1sI/k9iiUv+stK1W4p9Z aau1vpdkpa3W8l6Slbaaxj/x62raqj0u55chnb9c+Z2tiCn3j6/EP7kexp9N nQOpyj8yEyPKNuv4+utfpfVP8oq+cxFKc4TGtTyX++vzhPT6kK+E0hiTu5hL 5gDQ5Z3f8MlzLrbh/VBs7vso61kSb+bSGLMz3vbXLypXv45oTGq5ugTORbxP NN2PSaUueDZnrJ3GV0L2SVK/pXzdzyvOF5Pk74jGBJezddw5o/avtK2G7G/9 NUH/UE1dJsm/0rqMO2fU/qHyp6nLtP5fbV0m9f9K6rIa/09al1H7J/HPauoy Sf6V1mWpc85mXwbMqZR778LX613doX2iicS9R+BrOO4eFtJTkmog3FMYF7p7 GP5FLARjR197rkSvX71uozlWH9a2/GPfmvduYd2i6O++jagzF8ddimhZQ/ah vpK8q4HPuXUPo+V226HyR+H+z1p4xCREz+vnie2JaaEe3DgxqX1K+YrT+3iX kPeW8XnXNkO2qNR/XLms3p2zNXEMLhbXt4Wrk1L+A+X0+lBejPsYXzFXwbyZ a/9x/uPbv5Q26ds6iS77KPDj67uu3rXf+6/fs1r6sVxaw6U7RWvluP3dfnyi 0xOb7+v1rH3zXeNVc6h32ubhzsd+SePro3o9cfb59XBuF8XXP6zX/7ewX9r1 cIihb2hus/H0pJ3r7DPN7d12nRvWtiEtpNfzX7KnG5pMy4Vuq/n3Xp4wdQ1n c997TH1ji92nb2TCtOTyOnbipP0MXXfS9XCYg1vxzVrbzmnb+BPbtEWeQbhX 035ZS4a4NO5j7nh0fdqmezZJotfjz/bdl9zYwF9/M4lev+vgCfveD/dI9/9e r77+pp0H5x5BnxVqv/SbzNnRHzNPRxrP6+4dl63euv1cD/0j77yUKos/D77V /u/bams3v12zvlA0hp93hcrFoTGPj234dPWHfZhvjDuG/o3zUZfY1p+LcNrR g31vmP/5n/9TZK8o2A6buXe+k5afeqEc2NCPiSQOLTpHSd7l3ocN2SJJ+alX bMEYtNHTESqxBbbE93k3z18TrVz509iiXP06/yc/7OHW+khS/lr6Z5wtKvVP uw5vrm9Ja4tK/TONLSr1zyTlr6V/ZqWtVuqfSW1RjX9W2lYr9c8stNVK/TPr bbWW95KstNVy5SeugbrgWWmNtz57JbbgGev/+7//z9qWMZGb30pSfvKmjfBM cv7ig/81qMQ/uQ7eQ6EMLn48Sfl5pqYu2Meu8TDzTFqpfwKxYzw/+tfup/GO CX7zzLPP2U/mbohlo+zUiXtfg/ktxrfEg/j/BxXqy0JpvobDf8vid9jJzckw T4IfgNMeucbjDecKedBeGUtHtbck9ev7vP8sXq4uKeu//vcp6xvYxF+LzNe4 eP5nnop9/P+CSNKXRe2TpH7jfD2aV5wvJvUf8DXGJLaOO6dv/2raasj+SdpX tXWZpC+upC5LndO3f1z509RlWv+vpi7T+H/auqzW/5PWZSX+X01d/h37MkgS u+3rf+iqrJdCLALljfsvnZBeH9JToJwGkn/fcYN9Z4HYB2cz7nur1/9YtG5R JXo9dYqOa8dqkbbkH8s5+c5+rk5CGin3Q7s2Si4vZ4MQ0bKG7JNUr0eT5b9m mHtAQwtpY6HyR6Hsr815y76LwbpLcWvzAfn4MatJ7RPylajex1pK+BnjERez EmeLSvwHLY7zMq5kTQ/SmLsiZoHztXTndVSeCbgG2rQ/fk6r14fy4pmA82Fr Pp1eH+c/fl4hXwnZOoku+yhw69c/6vOWW7/+ceDH1/8d8Pv6JwX6g9lcMyrJ e2sh6EfcOwVpoV+ppX3Kze3WuvxR6Ov92NNHUf5a5lVN+WtZv7W0RVb8s9K8 suKfaqvVl7+W16S2Wpvy1zKvrPhnFtpqLf1TbbXy+g09Rz3uZ6u0ZS5V3izc S2qdfy3bby3zr2VbqmX+tW5ftcw/q3WZVf/Pcl1m1f+zWpfl1q8X/zyIK0W3 Jh4d7fxRrKvyOPS+f8r/8YrsIb3+8cE8mY15Svlf9WlhDtCPL0sC7xYwxnDr CaWBdUz9OfBqYI0G/mM37XHVlD8EMQFJ3x2sRflrnVel5a9l/dbSFlnxz0rz yop/qq1WX/5aX5PaavXlr2VeWfHPLLTVaspfy7yy4p9ZaKt/R7JyL6ll/rNd v1no62udfy3bVy3zz2pdZtn/s1qXWfX/LNcla/qm/T8c8feGORzmf9Ds6x7R OEZ6vRBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIcQDRqf/MhM3pszVyds5buXS7qc8/t4jLe/lybvm8o0/ g7+daWot7NPY2p77fq6qcw1N3DHPPv+i+WLVGvPZiq/NpZjzxtHe/3vR9w8X Lau4LCOTf5n3P1pkvvzmO9PSPZz4uLhzcj1nO/pTlyN6TUk4Wt9iz/fJF1+Z /cfrbdrK1evM8pXfmCWffmE+WLQ0VX4/7dhr81q0bLkZvvZHomOuTN83n3+1 2tpv2fIVti47h6/aMsDc+e+ZzTt/TVyG7svXzKJPltvr2vHrkcTHdQyN2/N/ +fUas+aHn23alt0HCuV45tnnbVln0xbw49ZdtgxcQ1vf5aps4Wy7fOVq8/Xa DY/NFqeaO8zHSz8zi3M+lca3a+mfldoi5J8nGtsKtnjuhZdy7X5o1v0zC221 1v6ZlbZaqX9mta1W459ZaKuV+meW2+qTfi+p1BaA3TnnV2vWV2WL4et/2vaB LT79clWqMnyXaxuLP/ncnvO3s+1V+efB3xqsHd79YKGpa+1KVY73P1xUuPau SxNV+WdS1mz4ydrZfW9o77N2/GjxMnN6pvy09TfnzS/4RMhXSvnPhs07bDrb Q9fuzPRjP5gDOVuRxnVSb0tz7bKSsWoSeq/cMP/71NOm7/fJxMe09Y3YvoI+ z78efHL+go/MvqN19vv6Tdts30KdXxydSl023z7V+rqfVzW+mK+X8+aV195I dUzcOX37V9NWQ/Z/kuuy1Dl9+8eVfzb9P6t1mWX/z2pdZtn/YfehE2bT9j2p j0tKLe8rrT3D5r0PP7ZjFqcvUX7GYJu27y7sl1SveW3O3FRjPhgYv5WofkJl rRSeJ0amHmiH1WhjtbTFo2C2xiWliPpPSE/sGByzY7W0ecf5T1bt/ySDXj8+ dcdu8zk2fTfF8fetzh9NH8vlGd2vVrp+z/CY6R4aDf7m9Pq47z70FXUtnSXP hV7PuJ/tvUdO2ue/NGVdNnOso5o+iWe/Lbv2pz6ulv0gz0fMXSTZFz2mfSBf T/QNfPZembT3IX+/n3/ZZ/uJpGXged6VIW1f4MrB+Ox8/5Wi33jmc78ngX6O 58q05WBft/+8dxcU/XamrSfVWLMWtth3rM5s23uoKluQB+3jcdoCPlr8SSG/ NOWopX9WaotS/km7+25GI51t/8xaW62Ff2ahrdbCP7PaVivxzyy01dm4l2Sl rT6p95JKbTFw9ZbVxUO/VdJW3fMHzzno3WnKjw+Efkvrn64M1G90LFkO9KdQ eiX+mQZ/vMm8BfXCWHvBwiWFdPSmkLYU8hU/DZ0MDchpOIdOnc31Zafydv86 77voCXx2Do1brWg2rhHbQhqNa/DqbXP5Rv7ZCv3Kpf+wZaf59vtNBf90dc51 7Tp4PFW5ovZJ62e+r0fzqsYXL45O27yZm62kXNFzRu1faVsN2f/vUpf+OaP2 jyt/Uirx/6zWZdw5s+T/WavLx+X/J5vaU5VzNkijgSSBOe5zvZeL0hYu+fSR XhP3URfvkbaslcJYrX/8ZuH7bOj1WaTW/lMpleqJIZL6z5NE/fBt0zPxlzl6 8aa5eD3580uI4/03Td+1fB5XchzsnTa/dk+ZkwO3bNqpwVvmcC7tSN9NMzR5 z+4fl9cDvf6+mZi8ab8DsfYwPpWPsxqb+tPul0+7Y0atVn/LXJuJzXc6P7r8 tRvFfSrHkrf73trRm49/bz5nWjv7bFrX4O/m7LkL5nRjs+n//YZNa2rrMBcu XrLpPcPj5uKV6/Z3aD7fZYYnbpuBsSlT19Bk96k7c7bovKX0erTkfz3175LP hL5ez31yyWdf2vl47pe0OebjOZ57FPvRz7rYQ56Jnv7Pc2bF6rVm64zO/8HH S+y+7IePx52T34nFcu26/ly3jZd65/0Pzao138eWd8/hk3Z+bMHCxaY+94xK 2n+ee8GOL+a+8559hiH+jTIx9+Xm20jj/v/5qm/tPZe0xvY+e85ln6802/cd ts/zaBMvvPSKPf54Q1tJH422350Hjpm3579f9G4A18rzWBrfP5yzG/0Mz75p 3w/oH5u2to3aEFulHU9glyOnm83O/cfsdaQ5Fv1gfq4unW7moL7TaBTV2AJW fbfB3ieZH63GFiu/XZ8bS12wz+Bpx9i1sgXxoDYmc98Rc6SuObXmVCv/rMYW cf75w+ZfUuk81fpnFtpqLf0zC221Wv/McltN659ZaauzcS/JQlutxD+f9LaK NoB2gF9F4yTT2sKHOr6cYr6B8R+2YE7LjcEq9U/HmfO95vuft6c6hvkbnokZ M/rPxZX4pwO/6Bm5XjLNf+5m7gJtvqlz0Lz06uuF9JBeH/IVPw2/YoyN/u80 HNrg2zk7E4fp+iRiPtdt2mr92c1hHTvTWlT/HOfXTRp4B4WxL2PgSrQjnh9c uXj/gLIePNn4kMbINTHuT5pvyD6V+nqpvCrxRdokPsL8TbX+X8r+adtqKfs/ 6XXpnzPO/n75k1Kt/2e1Lv1zZs3/s1qXj9r/6cPde1Qh+J1rIRaEd/5IY64X 3YJ74TfrNsYeiy6DZsPcBddBWlRPSaqB8P4B+wHjM9KoLxeT7u6RxNG/+PKr drziNKK1G7cUdCPyD+k1buzJWMnFKByua7L7Pf/iy4VyYCv24ZoYZ5OGDsT4 BG2HGHfmRXgngrETx8eNDUJlDelNzJFv33vI+unhGI2LezrlpG7d+DmkjYXK H4J4f8Z4vDeIHaK2wC8WLv204A8uliGJfeJ8Jar3MSdFPtiRPiJki2r8B5+m rIznnF3z81mrrW91zpSV/bElaTyvhfwnpCfSF7AfMfeuHNG8SON6uR58hjFt yH9CvhjylSS2flzs7cr3h+j150f/NPt7pszQ5H2zr2vKHOmbtulwOLfdMX7X bGyZsLr7wZ5pM3D9ntnTOWkO5LabR/4o0usdgzfu5c6Rn8+8mPttd27/Yxdv Fp07hL8ejh9bjx5vdfYb0/Y729FY+tGY+PpyoNcPjOXzRVN3Y+nB3HNFe++Q aWrLx72fbet4KJa+c+BKURrHD8/EM6WJr09CsV4/ZbfRGNAsaLM8k51q6bDb zV2Ddj/6YveeT3TOEL9kPIBewTvfoXPSbtyzB77s3gFA/95z6LeS5X3jrXn2 k/scbYht2gef5OO0eNfWXfvNv7+92l7HS6+8ZsvIc1D/TB05GCcknRs8GLmv MidPmv/MyjW5+KikYAP6ed7j49ks7btFrb2XbL/q9w9cE3ETafLB1rzjzThl acp4C+4ZHOv7AM/U9IOP0hbcP3h+Jy6yGltgT/QV4iKjsbePyhb45qtvvGnv W7xHmHYthVr5ZzW2iPPPSuItqvHPrLTVWvlnFtpqtf6Z1bZaiX9mpa3Oxr0k C231Sb6XVGMLBxqCe+6sxBYOnuf8d9LTgP38eMpK/BN4xudZzZ8HSQPPi377 qsQ/eX6k7LwPXyoN/DEvsWT0Neg3SzxbhPT6kK/4afgm41TmG1/MjVEZu/Lc +sv+o7aOGCuzH8+bjL/Rkty1Mh7GLzlvoX4GRm353bg9CfSZxL+g+7AexdqN m1PbknK6Z1+ug+dl1kii3K6OLwyOpo7hDdmnUl+Py6sSX6Tu58ydZ22GnpI2 Ds8/Zyn7V9JW4+z/pNelf85S9vfL/yj8P8t1mVX/z2pdPi7/j+oKIRg/OL2e 8RHlQS8stcYf2ofTWd27YCE9JYkGgh7JGBk91mlbIb0eyCs6Bx6KNff1Gsoa p1/7x+Ij7AvuPQg0Wj6Jidi256DdZuyXxC+jZQ3Zh7orNafiYNzsxxGEtLFQ +aNQHvyLz+g4z7cF9mOs8uux0wW9O6l9Qr4S1fuoZ949QL9z/hGyRaX+g0+y jY3QvRm/sFY3ZeG6mefBv1ydlPIfiNMTnc3i8uL8tHl/Dc44//HtH/KVJLZ+ XOzqeKDXo8UPT963cfabz123ujz6Pb/1TuR1ePR2PtHaTw/dNvu7p+x+J/pv PaTXo9Wj55Onf070fT6Jvb80FY4v8tfDcRBTn4+rv1+Ii0evh+Lj78+seV+c Z7n1cNDrB2fa6qn6RuuHzec7Td/INbs2fUNLflyNXh9dq757eMx09o8UvhNr 7/aZzfVw6O+ZV2Tc/+O24rEEbYZnd7bnzH0nVq/3v8e9/0N7d/PT3EtZV6ZU +/LhXm79IXePmj/TFtx5aBPrftxS2Ndvv8wDRseErBsaHZfQ1pjjK+frzN/5 tnVz99Tz255G9P1P2+xzuX9s9N4VpfHCRfteFtsbft5RWEuQfqTUGmzUiZt/ 4BmW+nS/MYcY3R/9oVQ5GLdxb0HD8tekLVd+3tNwfTC6gtsfm6F3+PtS3lLr xMXZIkn5XZ2gK/jxiJXYYuPWnYW1epkfctdXrvxpbFGufsmHez7b3E9cjEQa W9TCP+NsUal/cny0ryiXVzX+mcYWlfpnkvLX0j+z0FZr4Z9JbFGpf1baVivx z6y01VrfS7LSVmt5L8lKW03jn/h1NW3VHpfzy5DOX678zlbElPvHV+KfXA/j z6bOgVTlH5mJEWWbdXz99a/S+id5Rd+5CKU5QuNansv99XlCen3IV0JpjMld zCVzAOjyzm/45DkX2/B+KDb3fZT1LIk3c2mM2Rlv++sXlatfRzQmtVxdAuci 3iea7sekUhc8mzPWTuMrIfskqd9Svu7nFeeLSfJ3RGOCy9k67pxR+1faVkP2 t/6aoH+opi6T5F9pXcadM2r/UPnT1GVa/6+2LpP6fyV1WY3/J63LqP2T+Gc1 dZkk/0rrstQ5Z7MvA+ZUyr134ev1ru7QPtFE4t4j8DUcdw8L6SlJNRDuKYwL 3T0M/yIWgrGjrz1XotevXrfRHKsPa1v+sW/Ne7ewblH0d99G1JmL4y5FtKwh +1BfSd7VwOfcuofRcrvtUPmjcP9nLTxiEqLn9fPE9sS0UA9unJjUPqV8xel9 vEvIe8v4vGubIVtU6j+uXFbvztmaOAYXi+vbwtVJKf+Bcnp9KC/GfYyvmKtg 3sy1/zj/8e1fSpv0bZ1El30U+PH1XVfv2u/91+9ZLZ04+IZLd4rWynH7u/34 RKcnNt/X60em/2u+a7xqDvVO2zyu5L4Tk88aOcTq+3mFCOn1xNnn18O5XRRf /7Be/9/CfmnXwyGGvqG5zcbTk3aus880t3fbdW5Y24a0kF7Pf8mebmgyLRe6 rebfe3nC1DWczX3vMfWNLXafvpEJ05LL69iJk/YzdN1J18NhDm7FN2ttO6dt 409s0xZ5BuFeTftlLRni0riPuePR9Wmb7tkkiV6PP9t3X3JjA3/9zSR6/a6D J+x7P9wj3f97vfr6m3YenHsEfVao/dJvMmdHf8w8HWk8r7t3XLZ66/ZzPfSP vPNSqiz+PPhW+79vq63d/HbN+kLRGH7eFSoXh8Y8Prbh09Uf9mG+Me4Y+jfO R11iW38uwmlHD/a9Yf7nf/5Pkb2iYDts5t75Tlp+6oVyYEM/JpI4tOgcJXmX ex82ZIsk5adesQVj0EZPR6jEFtgS3+fdPH9NtHLlT2OLcvXr/J/8sIdb6yNJ +Wvpn3G2qNQ/7Tq8ub4lrS0q9c80tqjUP5OUv5b+mZW2Wql/JrVFNf5ZaVut 1D+z0FYr9c+st9Va3kuy0lbLlZ+4BuqCZ6U13vrsldiCZ6z/7//+P2tbxkRu fitJ+cmbNsIzyfmLD/7XoBL/5Dp4D4UyuPjxJOXnmZq6YB+7xsPMM2ml/gnE jvH86F+7n8Y7JvjNM88+Zz+ZuyGWjbJTJ+59Dea3GN8SD+L/H1SoLwul+RoO /y2L32EnNyfDPAl+AE575BqPN5wr5EF7ZSwd1d6S1K/v8/6zeLm6pKz/+t+n rG9gE38tMl/j4vmfeSr28f8LIklfFrVPkvqN8/VoXnG+mNR/wNcYk9g67py+ /atpqyH7J2lf1dZlkr64krosdU7f/nHlT1OXaf2/mrpM4/9p67Ja/09al5X4 fzV1+XfsyyBJ7Lav/6Grsl4KsQiUN+6/dEJ6fUhPgXIaSP59xw32nQViH5zN uO+tXv9j0bpFlej11Ck6rh2rRdqSfyzn5Dv7uToJaaTcD+3aKLm8nA1CRMsa sk9SvR5Nlv+aYe4BDS2kjYXKH4WyvzbnLfsuBusuxa3NB+Tjx6wmtU/IV6J6 H2sp4WeMR1zMSpwtKvEftDjOy7iSNT1IY+6KmAXO19Kd11F5JuAaaNP++Dmt Xh/Ki2cCzoet+XR6fZz/+HmFfCVk6yS67KPArV//qM9bbv36x4EfX/93wO/r nxToD2Zzzagk762FoB9x7xSkhX6llvYpN7db6/JHoa/3Y08fRflrmVc15a9l /dbSFlnxz0rzyop/qq1WX/5aXpPaam3KX8u8suKfWWirtfRPtdXK6zf0HPW4 n63SlrlUebNwL6l1/rVsv7XMv5ZtqZb517p91TL/rNZlVv0/y3WZVf/Pal2W W79e/PMgrhTdmnh0tPNHsa7K49D7/in/xyuyh/T6xwfzZDbmKeV/1aeFOUA/ viwJvFvAGMOtJ5QG1jH158CrgTUa+I/dtMdVU/4QxAQkfXewFuWvdV6Vlr+W 9VtLW2TFPyvNKyv+qbZafflrfU1qq9WXv5Z5ZcU/s9BWqyl/LfPKin9moa3+ HcnKvaSW+c92/Wahr691/rVsX7XMP6t1mWX/z2pdZtX/s1yXrOmb9v9wxN8b 5nCY/0Gzr3tE4xjp9UIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBDZYXT6LzNxY8pcnbyd41Yu7X7K4+890vJenrxrLt/4M/jbmabW wj6Nre257+eqOtfQxB3z7PMvmi9WrTGfrfjaXIo5bxzt/b8Xff9w0bKKyzIy +Zd5/6NF5stvvjMt3cOJj4s7J9dztqM/dTmi15SEo/Ut9nyffPGV2X+83qat XL3OLF/5jVny6Rfmg0VLU+X30469Nq9Fy5ab4Wt/JDrmyvR98/lXq639li1f Yeuyc/iqLQPMnf+e2bzz18Rl6L58zSz6ZLm9rh2/Hkl8XMfQuD3/l1+vMWt+ +Nmmbdl9oFCOZ5593pZ1Nm0BP27dZcvANbT1Xa7KFs62y1euNl+v3fDYbHGq ucN8vPQzszjnU2l8u5b+WaktQv55orGtYIvnXngp1+6HZt0/s9BWa+2fWWmr lfpnVttqNf6ZhbZaqX9mua0+6feSSm0B2J1zfrVmfVW2GL7+p20f2OLTL1el KsN3ubax+JPP7Tl/O9telX8e/K3B2uHdDxaautauVOV4/8NFhWvvujRRlX8m Zc2Gn6yd3feG9j5rx48WLzOnZ8pPW39z3vyCT4R8pZT/bNi8w6azPXTtzkw/ 9oM5kLMVaVwn9bY01y4rGasmoffKDfO/Tz1t+n6fTHxMW9+I7Svo8/zrwSfn L/jI7DtaZ7+v37TN9i3U+cXRqdRl8+1Tra/7eVXji/l6OW9eee2NVMfEndO3 fzVtNWT/J7kuS53Tt39c+WfT/7Nal1n2/6zWZZb9H3YfOmE2bd+T+rik1PK+ 0tozbN778GM7ZnH6EuVnDLZp++7Cfkn1mtfmzE015oOB8VuJ6idU1krheWJk 6oF2WI02VktbPApma1xSiqj/hPTEjsExO1ZLm3ec/2TV/k8y6PXjU3fsNp9j 03dTHH/f6vzR9LFcntH9aqXr9wyPme6h0eBvTq+P++5DX1HX0lnyXOj1jPvZ 3nvkpH3+S1PWZTPHOqrpk3j227Jrf+rjatkP8nzE3EWSfdFj2gfy9UTfwGfv lUl7H/L3+/mXfbafSFoGnuddGdL2Ba4cjM/O918p+o1nPvd7EujneK5MWw72 dfvPe3dB0W9n2npSjTVrYYt9x+rMtr2HqrIFedA+Hqct4KPFnxTyS1OOWvpn pbYo5Z+0u+9mNNLZ9s+stdVa+GcW2mot/DOrbbUS/8xCW52Ne0lW2uqTei+p 1BYDV29ZXTz0WyVt1T1/8JyD3p2m/PhA6Le0/unKQP1Gx5LlQH8KpVfin2nw x5vMW1AvjLUXLFxSSEdvCmlLIV/x09DJ0ICchnPo1NlcX3Yqb/ev876LnsBn 59C41Ypm4xqxLaTRuAav3jaXb+SfrdCvXPoPW3aab7/fVPBPV+dc166Dx1OV K2qftH7m+3o0r2p88eLotM2budlKyhU9Z9T+lbbVkP3/LnXpnzNq/7jyJ6US /89qXcadM0v+n7W6fFz+f7KpPVU5Z4M0GkgSmOM+13u5KG3hkk8f6TVxH3Xx HmnLWimM1frHbxa+z4Zen0Vq7T+VUqmeGCKp/4jqeaDX3zcTkzftdyDWHsan 8nFWY1N/2v3yaXfMqNXqb5lrM7H5TudHl792o7hP5Vjydt9bO3rz8e/N50xr Z59N6xr83Zw9d8Gcbmw2/b/fsGlNbR3mwsVLNr1neNxcvHLd/g7N57vM8MRt MzA2Zeoamuw+dWfOFp23lF6Plvyvp/5d8pnQ1+u5Ty757Es7H8/9kjbHfDzH c49iP/pZF3vIM9HT/3nOrFi91myd0fk/+HiJ3Zf98PG4c/I7sViuXdef67bx Uu+8/6FZteb72PLuOXzSzo8tWLjY1OeeUUn7z3Mv2PHF3Hfes88wxL9RJua+ 3Hwbadz/P1/1rb3nktbY3mfPuezzlWb7vsP2eR5t4oWXXrHHH29oK+lX0fa7 88Ax8/b894veDeBaeR5L46+Hc3ajn+HZN+37Af1j09a2URtiq7TjCexy5HSz 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 8jtbEVPuH1+Jf3I9jD+bOgdSlX9kJkaUbdbx9de/Suuf5BV95yKU5giNa3ku 99fnCen1IV8JpTEmdzGXzAGgyzu/4ZPnXGzD+6HY3PdR1rMk3sylMWZnvO2v X/T/s3em/1UUWR9/N8/b53lmfGbGddRxQcQd2VRcEEUERETZFBVEFgEhQEIS 1gRICCQssgRIEBgX5p+s537rpi6Vtvreru5O0mF+L76f3Nvprj596pzqqlOn 6raqX0cyJ7VVXQL3It8nedzPSaUuGJvT146xlZB+stRvM1v3y0qzxSzlO5I5 wa10nXbPpP7z+mpI/9ZeM7QPReoyS/l56zLtnkn9h+SPqctY+y9al1ntP09d FrH/rHWZ1H8W+yxSl1nKz1uXze45kW0ZMKfSat2FH693dUfsk5hI2joCP4bj 3mGheErWGAjvFPqF7h2GfZELQd/Rjz3nidcvWb7K7Nwfjm351z4784XGvkXJ //s6os5cHnczkrKG9EN9ZVmrgc25fQ+TcrvPIfmT8P5nLzxyEpL39ctE9+S0 UA+un5hVP81sxcX7WEvIumVs3vlmSBd57cfJZePdNV2Tx+BycX1duDppZj/Q Kl4fKot+H/0r5iqYN3P+n2Y/vv6bxSZ9XWeJy04GLn5OTJ5Y/NDIXZtnv+bw dRuXJ37P//qG623RN73184m17xu8bbacHLXn7R649Yd4PbF64vmUmbwfkHt/ bjS8HjgUryfPvr4fzu1x+fV/jNf/u3Fe7H445NC3dx2x+fQcO9zbb7qOnbT7 3LC3DcdC8Xp+S3Zfe6fpPn7Sxvz7zg+btvaDte+nzP6ObntO/4Vh010ra+fu PfZv6Lmz7ofDHNx7Hy6zfo5vY098xhcZg/Cuxn/ZS4a8NN5j7nri+vimG5tk iddjz3btS61v4O+/mSVe//XW3XbdD+9I9/teT/zzGTsPzjuCNivkv7SbzNnR HjNPxzHG626Nyzpv336eh/aRNS/NZPHnwdfZ331bYvXm+zX7CyVz+Fkr1CoP jXl8dMNfV3/oh/nGtGto37gfdYlu/bkIFzu6d+4N86c//dc4fSVBd+jMrfnO Kj/1ghzo0M+JJA8tOUdJ2a3Ww4Z0kUV+6hVd0Aft8OIIeXSBLrF91ub5e6K1 kj9GF63q19k/5aEPt9dHFvnLtM80XeS1T7sPb61tidVFXvuM0UVe+8wif5n2 WRVfzWufWXVRxD7z+mpe+6yCr+a1z6r7apnvkqr4aiv5yWugLhgrLfX2Z8+j C8ZY//0//2t1S5/IzW9lkZ+y8RHGJEdP3/tdgzz2yXOwDgUZXP54FvkZU1MX nGP3eBgbk+a1TyB3jPGj/+z+MdaYYDd/e/Ah+5e5G3LZkJ06ces1mN+if0s+ iP97UKG2LHTMj+Hw27LYHXpyczLMk2AH4GKPPOOu9sONMvBX+tLJ2FuW+vVt 3h+Lt6pLZP3zXx6wtoFO/L3I/BgX43/mqTjH/y2ILG1ZUj9Z6jfN1pNlpdli VvsBP8aYRddp9/T1X8RXQ/rP4l9F6zJLW5ynLpvd09d/mvwxdRlr/0XqMsb+ Y+uyqP1nrcs89l+kLu/Htgyy5G778T/iquyXQi4C8qb9lk4oXh+Kp0CrGEh9 veNKu2aB3AenM957S1Z8Nm7fojzxeuqUOK7tqyV8yb+We/Kd81ydhGKkvA/t 3ii1spwOQiRlDekna7yemCy/NcPcAzG0UGwsJH8SZH/y6WftWgz2XUrbmw8o x89ZzaqfkK0k433spYSd0R9xOStpushjP8TiuC/9Svb04BhzV+QscL/uk/U4 KmMCngGf9vvPsfH6UFmMCbgfuuavi9en2Y9fVshWQrrOEpedDPz8+hNXf7Xf B67/bmPpO2vH2s/dGbdXjjvfncdf4vTk5vvx+gs3a7bScdVs67tpy+AYf1d0 XrV78PhlVQU/v/5+wG/rpwu0BxO5Z1SWdWshaEfcmoJYaFfK1E+rud2y5U9C W+/nnk6G/GWWVUT+Muu3TF1UxT7zllUV+5SvFpe/zGeSr5Yjf5llVcU+q+Cr ZdqnfDV//YbGUVM9toqVuZm8VXiXlF1+mf5bZvll+lKZ5ZftX2WWX9W6rKr9 V7kuq2r/Va3LVvvXi/88yCslbk0+OrHzydhXZSriff8pv8dbFdz+9ZN931b7 108FitdPHcyT2ZynyN+qj4U5QD+/LAusLaCP4fYTioF9TP058CKwRwO/sRt7 XRH5Q5ATkHXtYBnyl11WXvnLrN8ydVEV+8xbVlXsU75aXP6yn0m+Wlz+Msuq in1WwVeLyF9mWVWxzyr46v1IVd4lZZY/0fVbhba+7PLL9K8yy69qXVbZ/qta l1W1/yrXJXv6xv4ejri/YQ6H+R9i9m2T1I9RvF4IIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBDiHpdu/maG b4yaqyO3a9yqHbsbef3vkyrv+ZFfzfkbvwT/d6DzUOOcjkPHat8PF7rX4PAd 8+DDj5p3Fi81b733gTmXct80jg38NO77q3MW5Jblwshv5qXX5ph3P/zYdJ8c ynxd2j15noM9A9FyJJ8pCz/s77b3e+Od982WXfvtsUVLlpuFiz408958x7wy Z35UeZ9/ucmWNWfBQjN07V+Zrrl48655+/0lVn8LFr5n67J36KqVAWbMetGs 2fhdZhlOnr9m5ryx0D7Xl9/tyHxdz+AVe/93P1hqln76hT229pvvG3L87cGH rawTqQv4bN3XVgae4Uj/+UK6cLpduGiJ+WDZyinTxd6uHvP6/LfM3JpNxdh2 mfaZVxch+9zdcaShi4ceeazm94MTbp9V8NWy7bMqvprXPqvqq0Xsswq+mtc+ q+yr0/1dklcXgN655/tLVxTSxdD1X6x/oIs3310cJcPHNd+Y+8bb9p4/HjxW yD63/thu9fDCK7NN26ETUXK89OqcxrOfODdcyD6zsnTl51bP7nv7sX6rx9fm LjD7xuTH15+ZOathEyFbaWY/K9d8aY/zefDanbF27FPzfU1XHOM5qbf5Nb/M 01fNQt/FG+YvD/zV9P80kvmaI/0XbFtBm+c/DzY56+XXzOYf2uz3FavX27aF Oj99aTRaNl8/RW3dL6uILdbr5ah5/Mmnoq5Ju6ev/yK+GtL/dK7LZvf09Z8m /0Taf1Xrssr2X9W6rLL9wzfbdpvVG76Nvi4rZb5XDp0aMi+++rrts7j4EvLT B1u94ZvGeVnjNU8+PSOqzwdnrtzKVD8hWfPCeOLC6L3YYZHYWJm6mAwmql/S jKT9hOKJPWcv275abNlp9lNV/U9niNdfGb1jP/P38s1fI66/a+P8yeOXa2Um zysrrn9q6LI5OXgp+D8Xr0/77kNb0dbd2/RexOvp9/N50449dvwXI+uCsWsd Rdokxn5rv94SfV2Z7SDjI+YuspxLPObYmXo90Tbwt+/iiH0P+ed98dVm205k lYHxvJMhti1wctA/Ozpwcdz/GPO5/2eBdo5xZawcnOvOn/nCy+P+d+DIqai+ Zhm62LyzzazftK2QLigD/5hKXcBrc99olBcjR5n2mVcXzewTv/t4LEY60fZZ NV8twz6r4Ktl2GdVfTWPfVbBVyfiXVIVX52u75K8ujhz9ZaNi4f+l8dX3fiD cQ7x7hj5sYHQ/2Lt08lA/Sb7kq0g/hQ6nsc+Y/D7m8xbUC/0tV+ePa9xnHhT KLYUshX/GHEyYkAuhrNt78FaW7a3rvcP6rZLPIG/vYNXbKxoIp4R3UJMjOvs 1dvm/I362Ir4lTv+6dqN5qNPVjfs09U5z/X11l1RciX1E2tnvq0nyypii6cv 3bRlMzebR67kPZP6z+urIf3fL3Xp3zOp/zT5s5LH/qtal2n3rJL9V60up8r+ 93Qei5JzIoiJgWSBOe7DfefHHZs9781JfSbeoy7fI1bWvNBXG7jyc+P7RMTr q0jZ9pOXvPHEEFntZzqxf+i2OTX8m/nh9M/m9PXs45cQuwZ+Nv3X6mVcrLG1 76b57uSo2XPmlj229dRNe5/dte+DI7/b89PKuhevv2uGR36234Fce7gyWs+z ujz6iz2vfuyOuWRj9bfMtbHcfBfnJy5/7cb4NpVrKdt9P9TTV89/7zpsDvX2 22Mnzv5kDh4+bvZ1dJmBn27YY51Heszx0+fs8VNDV8zpi9ft/6Hr6AkzNHzb nLk8atraO+05bQcOjrtvs3g9seQ/P/B/TceEfrye9+S8t9618/G8L/E55uO5 nncU59HOutxDxkR//ftD5r0ly8y6sTj/K6/Ps+dyHjaedk/+Ty6W8+v9h0/a fKnnX3rVLF76Saq8327fY+fHXp491+yvjVE59veHHrH9ixnPv2jHMOS/IRNz X26+jWO8/99e/JF953Ks41i/veeCtxeZDZu32/E8sYlHHnvcXr+r/UhTG036 78bvd5rnZr00bm0Az8p4LMb2t9f0RjvD2Dd2fcDA5ZtWt0kdoqvY/gR62bGv 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 Y5/YdRFftdfV7DIU528lv9MVOeX+9Xnsk+eh/9nZeyZK/gtjOaJ8Zh9ff/+r WPukrOSai9AxR6hfy7jc358nFK8P2UroGH1yl3PJHABxeWc3/GWci25YH4rO fRtlP0vyzdwx+uz0t/39i1rVryOZk9qqLoF7ke+TPO7npFIXjM3pa8fYSkg/ Weq3ma37ZaXZYpbyHcmc4Fa6TrtnUv95fTWkf2uvGdqHInWZpfy8dZl2z6T+ Q/LH1GWs/Rety6z2n6cui9h/1rpM6j+LfRapyyzl563LZvecyLYMmFNpte7C j9e7uiP2SUwkbR2BH8Nx77BQPCVrDIR3Cv1C9w7DvsiFoO/ox57zxOuXLF9l du4Px7b8a5+d+UJj36Lk/30dUWcuj7sZSVlD+qG+sqzVwObcvodJud3nkPxJ eP+zFx45Ccn7+mWie3JaqAfXT8yqn2a24uJ9rCVk3TI273wzpIu89uPksvHu mq7JY3C5uL4uXJ00sx9oFa8PlUW/j/4VcxXMmzn/T7MfX//NYpO+rrPEZScD P7/+xNVf7feB67/bWPrO2rH2c3fG7ZXjznfn8Zc4Pbn5frz+ws1/m487rppt fTdtGVZ/Y/vh/Di2P06r/PpkvJ48+/p+OLfH5df/MV7/78Z5sfvhkEPf3nXE 5tNz7HBvv+k6dtLuc8PeNhwLxev5Ldl97Z2m+/hJG/PvOz9s2toP1r6fMvs7 uu05/ReGTXetrJ2799i/oefOuh8Oc3DvfbjM+jm+jT3xGV9kDMK7Gv9lLxny 0niPueuJ6+ObbmySJV6PPdu1L7W+gb//ZpZ4/ddbd9t1P7wj3e97PfHPZ+w8 OO8I2qyQ/9JuMmdHe8w8HccYr7s1Luu8fft5HtpH1rw0k8WfB19nf/dtidWb 79fsL5TM4WetUKs8NObx0Q1/Xf2hH+Yb066hfeN+1CW69eciXOzo3rk3zJ/+ 9F/j9JUE3aEzt+Y7q/zUC3KgQz8nkjy05BwlZbdaDxvSRRb5qVd0QR+0w4sj 5NEFusT2WZvn74nWSv4YXbSqX2f/lIc+3F4fWeQv0z7TdJHXPu0+vLW2JVYX ee0zRhd57TOL/GXaZ1V8Na99ZtVFEfvM66t57bMKvprXPqvuq2W+S6riq63k J6+BumCstNTbnz2PLhhj/ff//K/VLX0iN7+VRX7KxkcYkxw9fe93DfLYJ8/B OhRkcPnjWeRnTE1dcI7d42FsTJrXPoHcMcaP/rP7x1hjgt387cGH7F/mbshl Q3bqxK3XYH6L/i35IP7vQYXastAxP4bDb8tid+jJzckwT4IdgIs98oy72g83 ysBf6UsnY29Z6te3eX8s3qoukfXPf3nA2gY68fci82NcjP+Zp+Ic/7cgsrRl Sf1kqd80W0+WlWaLWe0H/BhjFl2n3dPXfxFfDek/i38VrcssbXGeumx2T1// afLH1GWs/Repyxj7j63LovaftS7z2H+Rurwf2zLIkrvtx/+Iq7JfCrkIyJv2 WzqheH0ongKtYiD19Y4r7ZoFch+cznjvLVnx2bh9i/LE66lT4ri2r5bwJf9a 7sl3znN1EoqR8j60e6PUynI6CJGUNaSfrPF6YrL81gxzD8TQQrGxkPxJkP3J p5+1azHYdyltbz6gHD9nNat+QraSjPexlxJ2Rn/E5ayk6SKP/RCL4770K9nT g2PMXZGzwP26T9bjqIwJeAZ82u8/x8brQ2UxJuB+6Jq/Ll6fZj9+WSFbCek6 S1x2MnD710/2fVvtXz8V+Pn19wN+Wz9doD2YyD2jsqxbC0E74tYUxEK7UqZ+ Ws3tli1/Etp6P/d0MuQvs6wi8pdZv2Xqoir2mbesqtinfLW4/GU+k3y1HPnL LKsq9lkFXy3TPuWr+es3NI6a6rFVrMzN5K3Cu6Ts8sv03zLLL9OXyiy/bP8q s/yq1mVV7b/KdVlV+69qXbbav17850FeKXFr8tGJnU/GvipTEe/7T/k9XlE9 FK+fOpgnszlPkb9VHwtzgH5+WRZYW0Afw+0nFAP7mPpz4EVgjwZ+Yzf2uiLy hyAnIOvawTLkL7usvPKXWb9l6qIq9pm3rKrYp3y1uPxlP5N8tbj8ZZZVFfus gq8Wkb/Msqpin1Xw1fuRqrxLyix/ouu3Cm192eWX6V9lll/Vuqyy/Ve1Lqtq /1WuS/b0jf09HHF/wxwO8z/E7NsmqR+jeL0QQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCHEPS7d/M0M3xg1 V0du17hVO3Y38vrfJ1Xe8yO/mvM3fgn+70DnocY5HYeO1b4fLnSvweE75sGH HzXvLF5q3nrvA3Mu5b5pHBv4adz3V+csyC3LhZHfzEuvzTHvfvix6T45lPm6 tHvyPAd7BqLlSD5TFn7Y323v98Y775stu/bbY4uWLDcLF31o5r35jnllzvyo 8j7/cpMta86ChWbo2r8yXXPx5l3z9vtLrP4WLHzP1mXv0FUrA8yY9aJZs/G7 zDKcPH/NzHljoX2uL7/bkfm6nsEr9v7vfrDULP30C3ts7TffN+T424MPW1kn Uhfw2bqvrQw8w5H+84V04XS7cNES88GylVOmi71dPeb1+W+ZuTWbirHtMu0z ry5C9rm740hDFw898ljN7wcn3D6r4Ktl22dVfDWvfVbVV4vYZxV8Na99VtlX p/u7JK8uAL1zz/eXriiki6Hrv1j/QBdvvrs4SoaPa74x94237T1/PHiskH1u /bHd6uGFV2abtkMnouR46dU5jWc/cW64kH1mZenKz62e3ff2Y/1Wj6/NXWD2 jcmPrz8zc1bDJkK20sx+Vq750h7n8+C1O2Pt2Kfm+5quOMZzUm/za36Zp6+a hb6LN8xfHvir6f9pJPM1R/ov2LaCNs9/Hmxy1suvmc0/tNnvK1avt20LdX76 0mi0bL5+itq6X1YRW6zXy1Hz+JNPRV2Tdk9f/0V8NaT/6VyXze7p6z9N/om0 /6rWZZXtv6p1WWX7h2+27TarN3wbfV1WynyvHDo1ZF589XXbZ3HxJeSnD7Z6 wzeN87LGa558ekZUnw/OXLmVqX5CsuaF8cSF0XuxwyKxsTJ1MRlMVL+kGUn7 CcUTe85etn212LLT7Keq+p/OEK+/MnrHfubv5Zu/Rlx/18b5k8cv18pMnldW XP/U0GVzcvBS8H8uXp/23Ye2oq27t+m9iNfT7+fzph177PgvRtYFY9c6irRJ jP3Wfr0l+roy20HGR8xdZDmXeMyxM/V6om3gb9/FEfse8s/74qvNtp3IKgPj eSdDbFvg5KB/dnTg4rj/MeZz/88C7Rzjylg5ONedP/OFl8f978CRU1F9zTJ0 sXlnm1m/aVshXVAG/jGVuoDX5r7RKC9GjjLtM68umtknfvfxWIx0ou2zar5a hn1WwVfLsM+q+moe+6yCr07Eu6Qqvjpd3yV5dXHm6i0bFw/9L4+vuvEH4xzi 3THyYwOh/8Xap5OB+k32JVtB/Cl0PI99xuD3N5m3oF7oa788e17jOPGmUGwp ZCv+MeJkxIBcDGfb3oO1tmxvXe8f1G2XeAJ/ewev2FjRRDwjuoWYGNfZq7fN +Rv1sRXxK3f807UbzUefrG7Yp6tznuvrrbui5ErqJ9bOfFtPllXEFk9fumnL Zm42j1zJeyb1n9dXQ/q/X+rSv2dS/2nyZyWP/Ve1LtPuWSX7r1pdTpX97+k8 FiXnRBATA8kCc9yH+86POzZ73puT+ky8R12+R6yseaGvNnDl58b3iYjXV5Gy 7ScveeOJIbLaz3Ri/9Btc2r4N/PD6Z/N6evZxy8hdg38bPqv3Stjd+376kPX Gt+/7hmx99lz9pYZHPndnp9W1r14/V0zPPKz/Q7k2sOV0Xqe1eXRX+x59WN3 zCUbq79lro3l5rs4P3H5azfGt6lcS9nu+6Gevnr+e9dhc6i33x47cfYnc/Dw cbOvo8sM/HTDHus80mOOnz5nj58aumJOX7xu/w9dR0+YoeHb5szlUdPW3mnP aTtwcNx9m8XriSX/+YH/azom9OP1vCfnvfWunY/nfYnPMR/P9byjOI921uUe Mib6698fMu8tWWbWjcX5X3l9nj2X87DxtHvyf3KxnF/vP3zS5ks9/9KrZvHS T1Ll/Xb7Hjs/9vLsuWZ/bYzKsb8/9IjtX8x4/kU7hiH/DZmY+3LzbRzj/f/2 4o/sO5djHcf67T0XvL3IbNi83Y7niU088tjj9vpd7Uea2mjSfzd+v9M8N+ul cWsDeFbGYzG2v72mN9oZxr6x6wMGLt+0uk3qEF3F9ifQy459XWbjlp32OWKu JX4wq1aXLm7moL5jYhRFdAGLP15p35PMjxbRxaKPVtT6UsftGDy2j12WLsgH tTmZm3eYHW1d0TGnsuyziC7S7PPTNV9FxXmK2mcVfLVM+6yCrxa1zyr7aqx9 VsVXJ+JdUgVfzWOf091XiQ0QO8CuknmSsbrwoY7PR8w30P9DF8xpuT5YXvt0 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 0+6Z1H9eXw3p39prhvahSF1mKT9vXabdM6n/kPwxdRlr/0XrMqv956nLIvaf tS6T+s9in0XqMkv5eeuy2T0nsi0D5lRarbvw4/Wu7oh9EhNJW0fgx3DcOywU T8kaA+GdQr/QvcOwL3Ih6Dv6sec88foly1eZnfvDsS3/2mdnvtDYtyj5f19H 1JnL425GUtaQfqivLGs1sDm372FSbvc5JH8S3v/shUdOQvK+fpnonpwW6sH1 E7Pqp5mtuHgfawlZt4zNO98M6SKv/Ti5bLy7pmvyGFwurq8LVyfN7AdaxetD ZdHvo3/FXAXzZs7/0+zH13+z2KSv6yxx2cnAz68/cfVX+33g+u82lr6zdqz9 3J1xe+W48915/CVOT25+Ml7PtSs6r9o9d/jOPjjb+m6ag+fvjCsrRCheT559 fT+c2+Py6/8Yr/9347zY/XDIoW/vOmLz6Tl2uLffdB07afe5YW8bjoXi9fyW 7L72TtN9/KSN+fedHzZt7Qdr30+Z/R3d9pz+C8Omu1bWzt177N/Qc2fdD4c5 uPc+XGb9HN/GnviMLzIG4V2N/7KXDHlpvMfc9cT18U03NskSr8ee7dqXWt/A 338zS7z+66277bof3pHu972e+Oczdh6cdwRtVsh/aTeZs6M9Zp6OY4zX3RqX dd6+/TwP7SNrXprJ4s+Dr7O/+7bE6s33a/YXSubws1aoVR4a8/johr+u/tAP 841p19C+cT/qEt36cxEudnTv3BvmT3/6r3H6SoLu0Jlb851VfuoFOdChnxNJ HlpyjpKyW62HDekii/zUK7qgD9rhxRHy6AJdYvuszfP3RGslf4wuWtWvs3/K Qx9ur48s8pdpn2m6yGufdh/eWtsSq4u89hmji7z2mUX+Mu2zKr6a1z6z6qKI feb11bz2WQVfzWufVffVMt8lVfHVVvKT10BdMFZa6u3PnkcXjLH++3/+1+qW PpGb38oiP2XjI4xJjp6+97sGeeyT52AdCjK4/PEs8jOmpi44x+7xMDYmzWuf QO4Y40f/2f1jrDHBbv724EP2L3M35LIhO3Xi1mswv0X/lnwQ//egQm1Z6Jgf w+G3ZbE79OTmZJgnwQ7AxR55xl3thxtl4K/0pZOxtyz169u8PxZvVZfI+ue/ PGBtA534e5H5MS7G/8xTcY7/WxBZ2rKkfrLUb5qtJ8tKs8Ws9gN+jDGLrtPu 6eu/iK+G9J/Fv4rWZZa2OE9dNrunr/80+WPqMtb+i9RljP3H1mVR+89al3ns v0hd3o9tGWTJ3fbjf8RV2S+FXATkTfstnVC8PhRPgVYxkPp6x5V2zQK5D05n vPeWrPhs3L5FeeL11ClxXNtXS/iSfy335DvnuToJxUh5H9q9UWplOR2ESMoa 0k/WeD0xWX5rhrkHYmih2FhI/iTI/uTTz9q1GOy7lLY3H1COn7OaVT8hW0nG +9hLCTujP+JyVtJ0kcd+iMVxX/qV7OnBMeauyFngft0n63FUxgQ8Az7t959j 4/WhshgTcD90zV8Xr0+zH7+skK2EdJ0lLjsZuP3rJ/u+rfavnwr8/Pr7Ab+t ny7QHkzknlFZ1q2FoB1xawpioV0pUz+t5nbLlj8Jbb2fezoZ8pdZVhH5y6zf MnVRFfvMW1ZV7FO+Wlz+Mp9JvlqO/GWWVRX7rIKvlmmf8tX89RsaR0312CpW 5mbyVuFdUnb5ZfpvmeWX6Utlll+2f5VZflXrsqr2X+W6rKr9V7UuW+1fL/7z IK+UuDX56MTOJ2NflamI9/2n/B6vqB6K108dzJPZnKfI36qPhTlAP78sC6wt oI/h9hOKgX1M/TnwIrBHA7+xG3tdEflDkBOQde1gGfKXXVZe+cus3zJ1URX7 zFtWVexTvlpc/rKfSb5aXP4yy6qKfVbBV4vIX2ZZVbHPKvjq/UhV3iVllj/R 9VuFtr7s8sv0rzLLr2pdVtn+q1qXVbX/Ktcle/rG/h6OuL9hDof5H2L2bZPU j1G8XgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEKI6 XLr5mxm+MWqujtyucat27G7k9b9PqrznR34152/8Evzfgc5DjXM6Dh2rfT9c 6F6Dw3fMgw8/at5ZvNS89d4H5lzKfdM4NvDTuO+vzlmQW5YLI7+Zl16bY979 8GPTfXIo83Vp9+R5DvYMRMuRfKYs/LC/297vjXfeN1t27bfHFi1ZbhYu+tDM e/Md88qc+VHlff7lJlvWnAULzdC1f2W65uLNu+bt95dY/S1Y+J6ty96hq1YG mDHrRbNm43eZZTh5/pqZ88ZC+1xffrcj83U9g1fs/d/9YKlZ+ukX9tjab75v yPG3Bx+2sk6kLuCzdV9bGXiGI/3nC+nC6XbhoiXmg2Urp0wXe7t6zOvz3zJz azYVY9tl2mdeXYTsc3fHkYYuHnrksZrfD064fVbBV8u2z6r4al77rKqvFrHP KvhqXvussq9O93dJXl0Aeuee7y9dUUgXQ9d/sf6BLt58d3GUDB/XfGPuG2/b e/548Fgh+9z6Y7vVwwuvzDZth05EyfHSq3Maz37i3HAh+8zK0pWfWz277+3H +q0eX5u7wOwbkx9ff2bmrIZNhGylmf2sXPOlPc7nwWt3xtqxT833NV1xjOek 3ubX/DJPXzULfRdvmL888FfT/9NI5muO9F+wbQVtnv882OSsl18zm39os99X rF5v2xbq/PSl0WjZfP0UtXW/rCK2WK+Xo+bxJ5+Kuibtnr7+i/hqSP/TuS6b 3dPXf5r8E2n/Va3LKtt/VeuyyvYP32zbbVZv+Db6uqyU+V45dGrIvPjq67bP 4uJLyE8fbPWGbxrnZY3XPPn0jKg+H5y5citT/YRkzQvjiQuj92KHRWJjZepi MpiofkkzkvYTiif2nL1s+2qxZafZT1X1P50hXn9l9I79zN/LN3+NuP6ujfMn j1+ulZk8r6y4/qmhy+bk4KXg/1y8Pu27D21FW3dv03sRr6ffz+dNO/bY8V+M rAvGrnUUaZMY+639ekv0dWW2g4yPmLvIci7xmGNn6vVE28Dfvosj9j3kn/fF V5ttO5FVBsbzTobYtsDJQf/s6MDFcf9jzOf+nwXaOcaVsXJwrjt/5gsvj/vf gSOnovqaZehi8842s37TtkK6oAz8Yyp1Aa/NfaNRXowcZdpnXl00s0/87uOx GOlE22fVfLUM+6yCr5Zhn1X11Tz2WQVfnYh3SVV8dbq+S/Lq4szVWzYuHvpf Hl914w/GOcS7Y+THBkL/i7VPJwP1m+xLtoL4U+h4HvuMwe9vMm9BvdDXfnn2 vMZx4k2h2FLIVvxjxMmIAbkYzra9B2tt2d663j+o2y7xBP72Dl6xsaKJeEZ0 CzExrrNXb5vzN+pjK+JX7vinazeajz5Z3bBPV+c819dbd0XJldRPrJ35tp4s q4gtnr5005bN3GweuZL3TOo/r6+G9H+/1KV/z6T+0+TPSh77r2pdpt2zSvZf tbqcKvvf03ksSs6JICYGkgXmuA/3nR93bPa8Nyf1mXiPunyPWFnzQl9t4MrP je8TEa+vImXbT17yxhNDZLUfUZx78fq7ZnjkZ/sdyLWHK6P1PKvLo7/Y8+rH 7phLNlZ/y1wby813cX7i8tdujG9TuZay3fdDPX31/Peuw+ZQb789duLsT+bg 4eNmX0eXGfjphj3WeaTHHD99zh4/NXTFnL543f4fuo6eMEPDt82Zy6Omrb3T ntN24OC4+zaL1xNL/vMD/9d0TOjH63lPznvrXTsfz/sSn2M+nut5R3Ee7azL PWRM9Ne/P2TeW7LMrBuL87/y+jx7Ludh42n35P/kYjm/3n/4pM2Xev6lV83i pZ+kyvvt9j12fuzl2XPN/toYlWN/f+gR27+Y8fyLdgxD/hsyMffl5ts4xvv/ 7cUf2XcuxzqO9dt7Lnh7kdmwebsdzxObeOSxx+31u9qPNLWrpP9u/H6neW7W S+PWBvCsjMdi7HV7TW+0M4x9Y9cHDFy+aXWb1CG6iu1PoJcd+7rMxi077XPE XEv8YFatLl3czEF9x8QoiugCFn+80r4nmR8tootFH62o9aWO2zF4bB+7LF2Q D2pzMjfvMDvauqJjTmXZZxFdpNnnp2u+iorzFLXPKvhqmfZZBV8tap9V9tVY +6yKr07Eu6QKvprHPqe7rxIbIHaAXSXzJGN14UMdn4+Yb6D/hy6Y03J9sLz2 6ThwtM988sWGqGuYv2FMTJ/RHxfnsU8HdnHqwvWmx/xxN3MXxOY7e8+ax574 Z+N4KF4fshX/GHZFH5v4v4vh4IPP1fRMHqZrk8j5XL56nbVnN4e188ChcfXP dX7dxMAaFPq+9IHzxI4YPzi5WH+ArFv3dPwhxsgz0e/PWm5IP3ltvVlZeWwR n8RGmL8pav/N9B/rq830P93r0r9nmv59+bNS1P6rWpf+Patm/1Wty8m2f9pw t44qBP/nWcgFYc0fx5jrJW7Bu/DD5atSryUuQ8yGuQueg2PJeErWGAjrDzgP 6J9xjPpyOenuHUke/aP/eML2V1yMaNmqtY24EeWH4jWu70lfyeUobG/rtOc9 /Og/GnKgK87hmehnc4w4EP0TYjvkuDMvwpoI+k5cn9Y3CMkaijcxR75h0zZr p9tTYly805GTunX951BsLCR/CPL96eOxbhA9JHWBXcye/2bDHlwuQxb9pNlK Mt7HnBTloEfaiJAuitgPNo2s9OecXuvzWUusbfWOycr56JJjjNdC9hOKJ9IW cB45906OZFkc43l5HmyGPm3IfkK2GLKVLLqeKvYP3Tanhn8zP5z+2Zy+nv09 FGLXwM+m/9q9MnbXvq8+dO2ebnpHzI7+n83mE6NmcOR3e35aWf5+OH5uPfF4 G2e/cdN+53Myl/5SSn59K4jXn7lcL5eYuutLn62NK471DZrOI/W894NHev6Q S9975uK4Y1w/NJbPFJNfn4Xx8fpR+5kYAzELfJYx2d7uHvu568RZex5tsVvn k5wzxC7pDxCvYM136J74jRt7YMtuDQDx72+3/dhU3qeenWn/8p7Dh/iMf/CX clwsHvB157/19dtL7HM89viTVkbGQQNjdeSgn5B1bnBr4r3KnDzH/DErz+Ty o7KCDmjnWcfH2Cx2bdGhvnO2XfXbB56JvImYctA1a7zpp8yPzLfgncG1vg0w pqYdnExd8P5g/E5eZBFdoE/iK+RFJnNvJ0sX2OYTTz1j31usI4zdS6Es+yyi izT7zJNvUcQ+q+KrZdlnFXy1qH1W1Vfz2GdVfHUi3iVV8NXp/C4pogsHMQQ3 7syjCwfjOX9Negzoz8+nzGOfwBifsZo/DxID40Xfv/LYJ+NHZGc9fLNj4Pd5 ySWjrSF+M8/TRSheH7IV/xi2ST+V+cZHa31U+q6MW7/a8oOtI/rKnMd4k/43 sST3rPSHsUvu26ifM5es/K7fngXaTPJfiPuwH8WyVWuidYmcbuzLczBeZo8k 5HZ1fPzspegc3pB+8tp6Wll5bJG6f3rGTKsz4imxeXj+PZvpP4+vpul/utel f89m+vflnwz7r3JdVtX+q1qXU2X/ybhCCPoPLl5P/wh5iBc22+OP2IeLs7q1 YKF4SpYYCPFI+sjEY11sKxSvB8pKzoGHcs39eA2ypsWv/WuxEc4Ftw6CGC1/ yYlY/+1W+5m+Xxa7TMoa0g9112xOxUG/2c8jCMXGQvInQR7si7/Jfp6vC/RH X+W7nfsa8e6s+gnZSjLeRz2z9oD4nbOPkC7y2g82yWd0RNyb/gt7dSMLz808 D/bl6qSZ/UBaPNHpLK0s7o/P+3twptmPr/+QrWTR9VSx6US930m8/uilX8yW U8TS79qY+o7+m/Y4bK997rnyq1nVPWz2nr1ltp66ac5c/93G4L+vfe668K8/ xOvh6557fd0vj9+w96M8/94h/P1wHOTU1/Pq7zby4onXw/jr747teT++zFb7 4RCvPzvmq3v3d1g77Draa/ovXLN707d31/vVxOuTe9WfHLpsegcuNL6Ta+/O mcj9cGjvmVek3//Z+vF9CXyGsTufn57xfGq83v+etv4Hf3fz07xL2VemmX/5 8C7nL++oWWO+4O6DTyz/bG3jXN9/mQdM9gnZNzTZL8HXmONrZevM3/m6dXP3 1PNzXozok8/X23G5f23y3ZWk4/hpuy6Lzyu/+LKxlyDtSLM92KgTN//AGJb6 dP9jDjF5PvGHZnLQb+PdQgzL35O2lfys03BtMHEFdz46I97hn4u8zfaJS9NF FvldnRBX8PMR8+hi1bqNjb16mR9yz9dK/hhdtKpfyuGdz2feJy5HIkYXZdhn mi7y2ifXJ9uKVmUVsc8YXeS1zyzyl2mfVfDVMuwziy7y2mdeX81jn1Xx1bLf JVXx1TLfJVXx1Rj7xK6L+Kq9rmaXoTh/K/mdrsgp96/PY588D/3Pzt4zUfJf GMsR5TP7+Pr7X8XaJ2Ul11yEjjlC/VrG5f7+PKF4fchWQsfok7ucS+YAiMs7 u+Ev41x0w/pQdO7bKPtZkm/mjtFnp7/t71/Uqn4dyZzUVnUJ3It8n+RxPyeV umBsTl87xlZC+slSv81s3S8rzRazlO9I5gS30nXaPZP6z+urIf1be83QPhSp yyzl563LtHsm9R+SP6YuY+2/aF1mtf88dVnE/rPWZVL/WeyzSF1mKT9vXTa7 50S2ZcCcSqt1F3683tUdsU9iImnrCPwYjnuHheIpWWMgvFPoF7p3GPZFLgR9 Rz/2nCdev2T5KrNzfzi25V/77MwXGvsWJf/v64g6c3nczUjKGtIP9ZVlrQY2 5/Y9TMrtPofkT8L7n73wyElI3tcvE92T00I9uH5iVv00sxUX72MtIeuWsXnn myFd5LUfJ5eNd9d0TR6Dy8X1deHqpJn9QKt4fags+n30r5irYN7M+X+a/fj6 bxab9HWdJS47Gbh4OjF0YvFDI3dtnv2aw9dtXJ74Pf/rG663Rd/01s8n1r5v 8LbZcnLUnrd74FbTeP3FmzX99dXHkl8eq+8r813t2nOj4fXAoXg9efb1/XBu j8uv/2O8/t+N82L3wyGHvr3riM2n59jh3n7Tdeyk3eeGvW04ForX81uy+9o7 Tffxkzbm33d+2LS1H6x9P2X2d3Tbc/ovDJvuWlk7d++xf0PPnXU/HObg3vtw mfVzfBt74jO+yBiEdzX+y14y5KXxHnPXE9fHN93YJEu8Hnu2a19qfQN//80s 8fqvt+626354R7rf93rin8/YeXDeEbRZIf+l3WTOjvaYeTqOMV53a1zWefv2 8zy0j6x5aSaLPw++zv7u2xKrN9+v2V8omcPPWqFWeWjM46Mb/rr6Qz/MN6Zd Q/vG/ahLdOvPRbjY0b1zb5g//em/xukrCbpDZ27Nd1b5qRfkQId+TiR5aMk5 SsputR42pIss8lOv6II+aIcXR8ijC3SJ7bM2z98TrZX8MbpoVb/O/ikPfbi9 PrLIX6Z9pukir33afXhrbUusLvLaZ4wu8tpnFvnLtM+q+Gpe+8yqiyL2mddX 89pnFXw1r31W3VfLfJdUxVdbyU9eA3XBWGmptz97Hl0wxvrv//lfq1v6RG5+ K4v8lI2PMCY5evre7xrksU+eg3UoyODyx7PIz5iauuAcu8fD2Jg0r30CuWOM H/1n94+xxgS7+duDD9m/zN2Qy4bs1Ilbr8H8Fv1b8kH834MKtWWhY34Mh9+W xe7Qk5uTYZ4EOwAXe+QZd7UfbpSBv9KXTsbestSvb/P+WLxVXSLrn//ygLUN dOLvRebHuBj/M0/FOf5vQWRpy5L6yVK/abaeLCvNFrPaD/gxxiy6Trunr/8i vhrSfxb/KlqXWdriPHXZ7J6+/tPkj6nLWPsvUpcx9h9bl0XtP2td5rH/InV5 P7ZlkCV324//EVdlvxRyEZA37bd0QvH6UDwFWsVA6usdV9o1C+Q+OJ3x3luy 4rNx+xbliddTp8RxbV8t4Uv+tdyT75zn6iQUI+V9aPdGqZXldBAiKWtIP1nj 9cRk+a0Z5h6IoYViYyH5kyD7k08/a9disO9S2t58QDl+zmpW/YRsJRnvYy8l 7Iz+iMtZSdNFHvshFsd96VeypwfHmLsiZ4H7dZ+sx1EZE/AM+LTff46N14fK YkzA/dA1f128Ps1+/LJCthLSdZa47GTg59efuPqr/T5w/XcbS99ZO9Z+7s64 vXLc+e48/hKnJzc/Ga/n2hWdV+2eO3xff/S6jdl/f2p0XFlVwc+vvx/w2/rp Au3BRO4ZlWXdWgjaEbemIBbalTL102put2z5k9DW+7mnkyF/mWUVkb/M+i1T F1Wxz7xlVcU+5avF5S/zmeSr5chfZllVsc8q+GqZ9ilfzV+/oXHUVI+tYmVu Jm8V3iVll1+m/5ZZfpm+VGb5ZftXmeVXtS6rav9Vrsuq2n9V67LV/vXiPw/y Solbk49O7Hwy9lWZinjff8rv8VYFt3/9ZN+31f71U4Hi9VMH82Q25ynyt+pj YQ7Qzy/LAmsL6GO4/YRiYB9Tfw68COzRwG/sxl5XRP4Q5ARkXTtYhvxll5VX /jLrt0xdVMU+85ZVFfuUrxaXv+xnkq8Wl7/Msqpin1Xw1SLyl1lWVeyzCr56 P1KVd0mZ5U90/VahrS+7/DL9q8zyq1qXVbb/qtZlVe2/ynXJnr6xv4cj7m+Y w2H+h5h92yT1YxSvF0IIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhLjHpZu/meEbo+bqyO0at2rH7kZe//uk ynt+5Fdz/sYvwf8d6DzUOKfj0LHa98OF7jU4fMc8+PCj5p3FS81b731gzqXc N41jAz+N+/7qnAW5Zbkw8pt56bU55t0PPzbdJ4cyX5d2T57nYM9AtBzJZ8rC D/u77f3eeOd9s2XXfnts0ZLlZuGiD828N98xr8yZH1Xe519usmXNWbDQDF37 V6ZrLt68a95+f4nV34KF79m67B26amWAGbNeNGs2fpdZhpPnr5k5byy0z/Xl dzsyX9czeMXe/90Plpqln35hj6395vuGHH978GEr60TqAj5b97WVgWc40n++ kC6cbhcuWmI+WLZyynSxt6vHvD7/LTO3ZlMxtl2mfebVRcg+d3ccaejioUce q/n94ITbZxV8tWz7rIqv5rXPqvpqEfusgq/mtc8q++p0f5fk1QWgd+75/tIV hXQxdP0X6x/o4s13F0fJ8HHNN+a+8ba9548HjxWyz60/tls9vPDKbNN26ESU HC+9Oqfx7CfODReyz6wsXfm51bP73n6s3+rxtbkLzL4x+fH1Z2bOathEyFaa 2c/KNV/a43wevHZnrB371Hxf0xXHeE7qbX7NL/P0VbPQd/GG+csDfzX9P41k vuZI/wXbVtDm+c+DTc56+TWz+Yc2+33F6vW2baHOT18ajZbN109RW/fLKmKL 9Xo5ah5/8qmoa9Lu6eu/iK+G9D+d67LZPX39p8k/kfZf1bqssv1XtS6rbP/w zbbdZvWGb6Ovy0qZ75VDp4bMi6++bvssLr6E/PTBVm/4pnFe1njNk0/PiOrz wZkrtzLVT0jWvDCeuDB6L3ZYJDZWpi4mg4nqlzQjaT+heGLP2cu2rxZbdpr9 VFX/0xni9VdG79jP/L1889eI6+/aOH/y+OVamcnzyorrnxq6bE4OXgr+z8Xr 07770Fa0dfc2vRfxevr9fN60Y48d/8XIumDsWkeRNomx39qvt0RfV2Y7yPiI uYss5xKPOXamXk+0Dfztuzhi30P+eV98tdm2E1llYDzvZIhtC5wc9M+ODlwc 9z/GfO7/WaCdY1wZKwfnuvNnvvDyuP8dOHIqqq9Zhi4272wz6zdtK6QLysA/ plIX8NrcNxrlxchRpn3m1UUz+8TvPh6LkU60fVbNV8uwzyr4ahn2WVVfzWOf VfDViXiXVMVXp+u7JK8uzly9ZePiof/l8VU3/mCcQ7w7Rn5sIPS/WPt0MlC/ yb5kK4g/hY7nsc8Y/P4m8xbUC33tl2fPaxwn3hSKLYVsxT9GnIwYkIvhbNt7 sNaW7a3r/YO67RJP4G/v4BUbK5qIZ0S3EBPjOnv1tjl/oz62In7ljn+6dqP5 6JPVDft0dc5zfb11V5RcSf3E2plv68myitji6Us3bdnMzeaRK3nPpP7z+mpI //dLXfr3TOo/Tf6s5LH/qtZl2j2rZP9Vq8upsv89ncei5JwIYmIgWWCO+3Df +XHHZs97c1Kfifeoy/eIlTUv9NUGrvzc+D4R8foqUrb95CVvPDFEVvuZTuwf um1ODf9mfjj9szl9Pfv4JcSugZ9N/7V7ZeyufV996Frj+87aPXb0/2w+P3zN DI78bs9PK+tevP6uGR752X4Hcu3hymg9z+ry6C/2vPqxO+aSjdXfMtfGcvNd nJ+4/LUb49tUrqVs9/1QT189/73rsDnU22+PnTj7kzl4+LjZ19FlBn66YY91 Hukxx0+fs8dPDV0xpy9et/+HrqMnzNDwbXPm8qhpa++057QdODjuvs3i9cSS //zA/zUdE/rxet6T8956187H877E55iP53reUZxHO+tyDxkT/fXvD5n3liwz 68bi/K+8Ps+ey3nYeNo9+T+5WM6v9x8+afOlnn/pVbN46Sep8n67fY+dH3t5 9lyzvzZG5djfH3rE9i9mPP+iHcOQ/4ZMzH25+TaO8f5/e/FH9p3LsY5j/fae C95eZDZs3m7H88QmHnnscXv9rvYjTW006b8bv99pnpv10ri1ATwr47EY299e 0xvtDGPf2PUBA5dvWt0mdYiuYvsT6GXHvi6zcctO+xwx1xI/mFWrSxc3c1Df MTGKIrqAxR+vtO9J5keL6GLRRytqfanjdgwe28cuSxfkg9qczM07zI62ruiY U1n2WUQXafb56ZqvouI8Re2zCr5apn1WwVeL2meVfTXWPqviqxPxLqmCr+ax z+nuq8QGiB1gV8k8yVhd+FDH5yPmG+j/oQvmtFwfLK99Og4c7TOffLEh6hrm bxgT02f0x8V57NOBXZy6cL3pMX/czdwFsfnO3rPmsSf+2TgeiteHbMU/hl3R xyb+72I4+OBzNT2Th+naJHI+l69eZ+3ZzWHtPHBoXP1znV83MbAGhb4vfeA8 sSPGD04u1h8g69Y9HX+IMfJM9PuzlhvST15bb1ZWHlvEJ7ER5m+K2n8z/cf6 ajP9T/e69O+Zpn9f/qwUtf+q1qV/z6rZf1XrcrLtnzbcraMKwf95FnJBWPPH MeZ6iVvwLvxw+arUa4nLELNh7oLn4FgynpI1BsL6A84D+mcco75cTrp7R5JH /+g/nrD9FRcjWrZqbSNuRPmheI3re9JXcjkK29s67XkPP/qPhhzoinN4JvrZ HCMORP+E2A457syLsCaCvhPXp/UNQrKG4k3MkW/YtM3a6faUGBfvdOSkbl3/ ORQbC8kfgnx/+nisG0QPSV1gF7Pnv9mwB5fLkEU/abaSjPcxJ0U56JE2IqSL IvaDTSMr/Tmn1/p81hJrW71jsnI+uuQY47WQ/YTiibQFnEfOvZMjWRbHeF6e B5uhTxuyn5Athmwli66nik0n6u0h8fqjl34xW06NmsGRu2bziVGzo/+mPQ7b a597rvxqVnUPm71nb5mtp26aM9d/N9/2jpjva5+7LvzrD/F66wM949tb5gc6 L9wZd+8Q/n44fm498XgbZ79x037nczKX/lJKfn0riNefuVwvl5i660ufrY0r jvUNms4j9bz3g0d6/pBL33vm4rhjXD80ls8Uk1+fhfHx+lH7mRgDMQt8ljHZ 3u4e+7nrxFl7Hm2xW+eTnDPELukPEK9gzXfonviNG3tgy24NAPHvb7f92FTe p56daf/ynsOH+Ix/8JdyXCze+brz3/r67SX2OR57/EkrI+OggbE6ctBPyDo3 uDXxXmVOnmP+mJVncvlRWUEHtPOs42NsFru26FDfOduu+u0Dz0TeREw56Jo1 3vRT5kfmW/DO4FrfBhhT0w5Opi54fzB+Jy+yiC7QJ/EV8iKTubeTpQts84mn nrHvLdYRxu6lUJZ9FtFFmn3mybcoYp9V8dWy7LMKvlrUPqvqq3nssyq+OhHv kir46nR+lxTRhYMYght35tGFg/GcvyY9BvTn51PmsU9gjM9YzZ8HiYHxou9f eeyT8SOysx6+2THw+7zkktHWEL+Z5+kiFK8P2Yp/DNukn8p846O1Pip9V8at X235wdYRfWXOY7xJ/5tYkntW+sPYJfdt1M+ZS1Z+12/PAm0m+S/EfdiPYtmq NdG6RE439uU5GC+zRxJyuzo+fvZSdA5vSD95bT2trDy2SN0/PWOm1RnxlNg8 PP+ezfSfx1fT9D/d69K/ZzP9+/JPhv1XuS6rav9Vrcupsv9kXCEE/QcXr6d/ hDzEC5vt8Ufsw8VZ3VqwUDwlSwyEeCR9ZOKxLrYVitcDZSXnwEO55n68BlnT 4tf+tdgI54JbB0GMlr/kRKz/dqv9TN8vi10mZQ3ph7prNqfioN/s5xGEYmMh +ZMgD/bF32Q/z9cF+qOv8t3OfY14d1b9hGwlGe+jnll7QPzO2UdIF3ntB5vk Mzoi7k3/hb26kYXnZp4H+3J10sx+IC2e6HSWVhb3x+f9PTjT7MfXf8hWsuh6 qnDxdGLyxOKHRu7aPPs1h6/buDzxe/7XN1yPw3/TWz+fWPu+wdtmy8lRe97u gVuZ4vUbjt1ofP6udu250XB+kb8fjoOc+npe/d1GXjzxehh//d2xPe/Hl9lq Pxzi9WfHfHXv/g5rh11He03/hWt2b/r27nq/mnh9cq/6k0OXTe/AhcZ3cu3d ORO5Hw7tPfOK9Ps/Wz++L4HPMHbn89Mznk+N1/vf09b/4O9ufpp3KfvKNPMv H97l/OUdNWvMF9x98Inln61tnOv7L/OAyT4h+4Ym+yX4GnN8rWyd+Ttft27u nnp+zosRffL5ejsu969NvruSdBw/bddl8XnlF1829hKkHWm2Bxt14uYfGMNS n+5/zCEmzyf+0EwO+m28W4hh+XvStpKfdRquDSau4M5HZ8Q7/HORt9k+cWm6 yCK/qxPiCn4+Yh5drFq3sbFXL/ND7vlayR+ji1b1Szm88/nM+8TlSMToogz7 TNNFXvvk+mRb0aqsIvYZo4u89plF/jLtswq+WoZ9ZtFFXvvM66t57LMqvlr2 u6Qqvlrmu6Qqvhpjn9h1EV+119XsMhTnbyW/0xU55f71eeyT56H/2dl7Jkr+ C2M5onxmH19//6tY+6Ss5JqL0DFHqF/LuNzfnycUrw/ZSugYfXKXc8kcAHF5 Zzf8ZZyLblgfis59G2U/S/LN3DH67PS3/f2LWtWvI5mT2qougXuR75M87uek UheMzelrx9hKSD9Z6reZrftlpdlilvIdyZzgVrpOu2dS/3l9NaR/a68Z2oci dZml/Lx1mXbPpP5D8sfUZaz9F63LrPafpy6L2H/WukzqP4t9FqnLLOXnrctm 95zItgyYU2m17sKP17u6I/ZJTCRtHYEfw3HvsFA8JWsMhHcK/UL3DsO+yIWg 7+jHnvPE65csX2V27g/Htvxrn535QmPfouT/fR1RZy6PuxlJWUP6ob6yrNXA 5ty+h0m53eeQ/El4/7MXHjkJyfv6ZaJ7clqoB9dPzKqfZrbi4n2sJWTdMjbv fDOki7z24+Sy8e6arsljcLm4vi5cnTSzH2gVrw+VRb+P/hVzFcybOf9Psx9f /81ik76us8RlJwM/v/7E1V/t94Hrv9tYOvvXtJ+7M26vHHe+O4+/xOnJzU/G 67l2RedVm1PP994rv9qykvcOEYrXk2df3w/n9rj8+j/G6//dOC92Pxxy6Nu7 jth8eo4d7u03XcdO2n1u2NuGY6F4Pb8lu6+903QfP2lj/n3nh01b+8Ha91Nm f0e3Paf/wrDprpW1c/ce+zf03Fn3w2EO7r0Pl1k/x7exJz7ji4xBeFfjv+wl Q14a7zF3PXF9fNONTbLE67Fnu/al1jfw99/MEq//eutuu+6Hd6T7fa8n/vmM nQfnHUGbFfJf2k3m7GiPmafjGON1t8ZlnbdvP89D+8ial2ay+PPg6+zvvi2x evP9mv2Fkjn8rBVqlYfGPD664a+rP/TDfGPaNbRv3I+6RLf+XISLHd0794b5 05/+a5y+kqA7dObWfGeVn3pBDnTo50SSh5aco6TsVuthQ7rIIj/1ii7og3Z4 cYQ8ukCX2D5r8/w90VrJH6OLVvXr7J/y0Ifb6yOL/GXaZ5ou8tqn3Ye31rbE 6iKvfcboIq99ZpG/TPusiq/mtc+suihin3l9Na99VsFX89pn1X21zHdJVXy1 lfzkNVAXjJWWevuz59EFY6z//p//tbqlT+Tmt7LIT9n4CGOSo6fv/a5BHvvk OViHggwufzyL/IypqQvOsXs8jI1J89onkDvG+NF/dv8Ya0ywm789+JD9y9wN uWzITp249RrMb9G/JR/E/z2oUFsWOubHcPhtWewOPbk5GeZJsANwsUeecVf7 4UYZ+Ct96WTsLUv9+jbvj8Vb1SWy/vkvD1jbQCf+XmR+jIvxP/NUnOP/FkSW tiypnyz1m2brybLSbDGr/YAfY8yi67R7+vov4qsh/Wfxr6J1maUtzlOXze7p 6z9N/pi6jLX/InUZY/+xdVnU/rPWZR77L1KX92NbBllyt/34H3FV9kshFwF5 035LJxSvD8VToFUMpL7ecaVds0Dug9MZ770lKz4bt29Rnng9dUoc1/bVEr7k X8s9+c55rk5CMVLeh3ZvlFpZTgchkrKG9JM1Xk9Mlt+aYe6BGFooNhaSPwmy P/n0s3YtBvsupe3NB5Tj56xm1U/IVpLxPvZSws7oj7iclTRd5LEfYnHcl34l e3pwjLkrcha4X/fJehyVMQHPgE/7/efYeH2oLMYE3A9d89fF69Psxy8rZCsh XWeJy04Gbv/6yb5vq/3rpwI/v/5+wG/rpwu0BxO5Z1SWdWshaEfcmoJYaFfK 1E+rud2y5U9CW+/nnk6G/GWWVUT+Muu3TF1UxT7zllUV+5SvFpe/zGeSr5Yj f5llVcU+q+CrZdqnfDV//YbGUVM9toqVuZm8VXiXlF1+mf5bZvll+lKZ5Zft X2WWX9W6rKr9V7kuq2r/Va3LVvvXi/88yCslbk0+OrHzydhXZSriff8pv8cr qofi9VMH82Q25ynyt+pjYQ7Qzy/LAmsL6GO4/YRiYB9Tfw68COzRwG/sxl5X RP4Q5ARkXTtYhvxll5VX/jLrt0xdVMU+85ZVFfuUrxaXv+xnkq8Wl7/Msqpi n1Xw1SLyl1lWVeyzCr56P1KVd0mZ5U90/VahrS+7/DL9q8zyq1qXVbb/qtZl Ve2/ynXJnr6xv4cj7m+Yw2H+h5h92yT1YxSvF0IIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhLjHpZu/meEb o+bqyO0at2rH7kZe//ukynt+5Fdz/sYvwf8d6DzUOKfj0LHa98OF7jU4fMc8 +PCj5p3FS81b731gzqXcN41jAz+N+/7qnAW5Zbkw8pt56bU55t0PPzbdJ4cy X5d2T57nYM9AtBzJZ8rCD/u77f3eeOd9s2XXfnts0ZLlZuGiD828N98xr8yZ H1Xe519usmXNWbDQDF37V6ZrLt68a95+f4nV34KF79m67B26amWAGbNeNGs2 fpdZhpPnr5k5byy0z/XldzsyX9czeMXe/90Plpqln35hj6395vuGHH978GEr 60TqAj5b97WVgWc40n++kC6cbhcuWmI+WLZyynSxt6vHvD7/LTO3ZlMxtl2m febVRcg+d3ccaejioUceq/n94ITbZxV8tWz7rIqv5rXPqvpqEfusgq/mtc8q ++p0f5fk1QWgd+75/tIVhXQxdP0X6x/o4s13F0fJ8HHNN+a+8ba9548HjxWy z60/tls9vPDKbNN26ESUHC+9Oqfx7CfODReyz6wsXfm51bP73n6s3+rxtbkL zL4x+fH1Z2bOathEyFaa2c/KNV/a43wevHZnrB371Hxf0xXHeE7qbX7NL/P0 VbPQd/GG+csDfzX9P41kvuZI/wXbVtDm+c+DTc56+TWz+Yc2+33F6vW2baHO T18ajZbN109RW/fLKmKL9Xo5ah5/8qmoa9Lu6eu/iK+G9D+d67LZPX39p8k/ kfZf1bqssv1XtS6rbP/wzbbdZvWGb6Ovy0qZ75VDp4bMi6++bvssLr6E/PTB Vm/4pnFe1njNk0/PiOrzwZkrtzLVT0jWvDCeuDB6L3ZYJDZWpi4mg4nqlzQj aT+heGLP2cu2rxZbdpr9VFX/0xni9VdG79jP/L1889eI6+/aOH/y+OVamcnz yorrnxq6bE4OXgr+z8Xr07770Fa0dfc2vRfxevr9fN60Y48d/8XIumDsWkeR Nomx39qvt0RfV2Y7yPiIuYss5xKPOXamXk+0Dfztuzhi30P+eV98tdm2E1ll YDzvZIhtC5wc9M+ODlwc9z/GfO7/WaCdY1wZKwfnuvNnvvDyuP8dOHIqqq9Z hi4272wz6zdtK6QLysA/plIX8NrcNxrlxchRpn3m1UUz+8TvPh6LkU60fVbN V8uwzyr4ahn2WVVfzWOfVfDViXiXVMVXp+u7JK8uzly9ZePiof/l8VU3/mCc Q7w7Rn5sIPS/WPt0MlC/yb5kK4g/hY7nsc8Y/P4m8xbUC33tl2fPaxwn3hSK LYVsxT9GnIwYkIvhbNt7sNaW7a3r/YO67RJP4G/v4BUbK5qIZ0S3EBPjOnv1 tjl/oz62In7ljn+6dqP56JPVDft0dc5zfb11V5RcSf3E2plv68myitji6Us3 bdnMzeaRK3nPpP7z+mpI//dLXfr3TOo/Tf6s5LH/qtZl2j2rZP9Vq8upsv89 ncei5JwIYmIgWWCO+3Df+XHHZs97c1Kfifeoy/eIlTUv9NUGrvzc+D4R8foq Urb95CVvPDFEVvuZTuwfum1ODf9mfjj9szl9Pfv4JcSugZ9N/7V7ZeyufV99 6Frj+54zt8z2/pum4/wdMzjyuz0/rax78fq7ZnjkZ/sdyLWHK6P1PKvLo7/Y 8+rH7phLNlZ/y1wby813cX7i8tdujG9TuZay3fdDPX31/Peuw+ZQb789duLs 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 nk+N1/vf09b/4O9ufpp3KfvKNPMvH97l/OUdNWvMF9x98Inln61tnOv7L/OA yT4h+4Ym+yX4GnN8rWyd+Ttft27unnp+zosRffL5ejsu969NvruSdBw/bddl 8XnlF1829hKkHWm2Bxt14uYfGMNSn+5/zCEmzyf+0EwO+m28W4hh+XvStpKf dRquDSau4M5HZ8Q7/HORt9k+cWm6yCK/qxPiCn4+Yh5drFq3sbFXL/ND7vla yR+ji1b1Szm88/nM+8TlSMToogz7TNNFXvvk+mRb0aqsIvYZo4u89plF/jLt swq+WoZ9ZtFFXvvM66t57LMqvlr2u6Qqvlrmu6Qqvhpjn9h1EV+119XsMhTn byW/0xU55f71eeyT56H/2dl7Jkr+C2M5onxmH19//6tY+6Ss5JqL0DFHqF/L uNzfnycUrw/ZSugYfXKXc8kcAHF5Zzf8ZZyLblgfis59G2U/S/LN3DH67PS3 /f2LWtWvI5mT2qougXuR75M87uekUheMzelrx9hKSD9Z6reZrftlpdlilvId yZzgVrpOu2dS/3l9NaR/a68Z2ocidZml/Lx1mXbPpP5D8sfUZaz9F63LrPaf py6L2H/WukzqP4t9FqnLLOXnrctm95zItgyYU2m17sKP17u6I/ZJTCRtHYEf w3HvsFA8JWsMhHcK/UL3DsO+yIWg7+jHnvPE65csX2V27g/Htvxrn535QmPf ouT/fR1RZy6PuxlJWUP6ob6yrNXA5ty+h0m53eeQ/El4/7MXHjkJyfv6ZaJ7 clqoB9dPzKqfZrbi4n2sJWTdMjbvfDOki7z24+Sy8e6arsljcLm4vi5cnTSz H2gVrw+VRb+P/hVzFcybOf9Psx9f/81ik76us8RlJwM/v/7E1V/t94Hrv9tY +s7aMXLh/b1y3PnuPP4Spyc3Pxmv59oVnVftnjt839Z300I+vl9WiFC8njz7 +n44t8fl1/8xXv/vxnmx++GQQ9/edcTm03PscG+/6Tp20u5zw942HAvF6/kt 2X3tnab7+Ekb8+87P2za2g/Wvp8y+zu67Tn9F4ZNd62snbv32L+h5866Hw5z cO99uMz6Ob6NPfEZX2QMwrsa/2UvGfLSeI+564nr45tubJIlXo8927Uvtb6B v/9mlnj911t323U/vCPd73s98c9n7Dw47wjarJD/0m4yZ0d7zDwdxxivuzUu 67x9+3ke2kfWvDSTxZ8HX2d/922J1Zvv1+wvlMzhZ61Qqzw05vHRDX9d/aEf 5hvTrqF9437UJbr15yJc7OjeuTfMn/70X+P0lQTdoTO35jur/NQLcqBDPyeS PLTkHCVlt1oPG9JFFvmpV3RBH7TDiyPk0QW6xPZZm+fvidZK/hhdtKpfZ/+U hz7cXh9Z5C/TPtN0kdc+7T68tbYlVhd57TNGF3ntM4v8ZdpnVXw1r31m1UUR +8zrq3ntswq+mtc+q+6rZb5LquKrreQnr4G6YKy01NufPY8uGGP99//8r9Ut fSI3v5VFfsrGRxiTHD1973cN8tgnz8E6FGRw+eNZ5GdMTV1wjt3jYWxMmtc+ gdwxxo/+s/vHWGOC3fztwYfsX+ZuyGVDdurErddgfov+Lfkg/u9Bhdqy0DE/ hsNvy2J36MnNyTBPgh2Aiz3yjLvaDzfKwF/pSydjb1nq17d5fyzeqi6R9c9/ ecDaBjrx9yLzY1yM/5mn4hz/tyCytGVJ/WSp3zRbT5aVZotZ7Qf8GGMWXafd 09d/EV8N6T+LfxWtyyxtcZ66bHZPX/9p8sfUZaz9F6nLGPuPrcui9p+1LvPY f5G6vB/bMsiSu+3H/4irsl8KuQjIm/ZbOqF4fSieAq1iIPX1jivtmgVyH5zO eO8tWfHZuH2L8sTrqVPiuLavlvAl/1ruyXfOc3USipHyPrR7o9TKcjoIkZQ1 pJ+s8XpisvzWDHMPxNBCsbGQ/EmQ/cmnn7VrMdh3KW1vPqAcP2c1q35CtpKM 97GXEnZGf8TlrKTpIo/9EIvjvvQr2dODY8xdkbPA/bpP1uOojAl4Bnza7z/H xutDZTEm4H7omr8uXp9mP35ZIVsJ6TpLXHYycPvXT/Z9W+1fPxX4+fX3A35b P12gPZjIPaOyrFsLQTvi1hTEQrtSpn5aze2WLX8S2no/93Qy5C+zrCLyl1m/ ZeqiKvaZt6yq2Kd8tbj8ZT6TfLUc+cssqyr2WQVfLdM+5av56zc0jprqsVWs zM3krcK7pOzyy/TfMssv05fKLL9s/yqz/KrWZVXtv8p1WVX7r2pdttq/Xvzn QV4pcWvy0YmdT8a+KlMR7/tP+T1eUT0Ur586mCezOU+Rv1UfC3OAfn5ZFlhb QB/D7ScUA/uY/j97b/5fRZH9//8271/fy8zXGddx/OiIiDuyqaggEhEVEUVE AUH2RfYAYQlhyQJhJwSyCC4D73+yvvdZN3WpdKrv7eruJM28Xz88H7m30119 +pxT26nTdf018CKwRwO/sRt7XRH5Q5ATkPXdwTLkL7usvPKXad8ydVEV/8xb VlX8U3W1uPxlP5PqanH5yyyrKv5ZhbpaRP4yy6qKf1ahrv47UpW+pMzyJ9u+ VWjryy6/zPpVZvlVtWWV/b+qtqyq/1fZluzpG/t7OOLfG9ZwWP8hZr9/isYx itcLIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCVIcb o/8yg0Mj5tbwvRp3a8ceRF5/f0rlvTL8h7ky9Hvwf4eOHm+c0368s/b9RKF7 9Q/+ah5/8mnzwZJl5r1FH5vLKfdNo7Pv+rjvb85ZkFuWq8P/Mq+9Ncd8uPRT 03HuUubr0u7J8xzp6ouWI/lMWdh5sMPe750PPjKbdx+0xxa3fWYWLl5q5r37 gXljzvyo8r7+fqMta86ChebS7d8yXXNt9IF5/6M2q78FCxdZW565dMvKADNm vWpWr/spswznrtw2c95ZaJ/r+592ZL6uq3/A3v/Dj5eZZV9+Y499u2FLQ46/ Pv6klXUydQFfrVlvZeAZTvZcKaQLp9uFi9vMx8tXTJsu9h3rMm/Pf8/MrflU jG+X6Z95dRHyzz3tJxu6eOKpZ2r1vn/S/bMKdbVs/6xKXc3rn1Wtq0X8swp1 Na9/VrmuPup9SV5dAHrnnh8t+7yQLi7d+d3WD3Tx7odLomT4tFY35r7zvr3n z0c6C/nn1p8PWz288sZss//42Sg5XntzTuPZz14eLOSfWVm24murZ/f9cGeP 1eNbcxeYA2PyU9f/OXNWwydCvtLMf1as/t4e53P/7V/H2rEvzZaarjjGc2K3 +bV6mWesmoXua0Pmz395zPRcH858zcmeq7atoM3znwefnPX6W2bTzv32++er vrNtCzbvvTESLZuvn6K+7pdVxBfrdjllnn3u+ahr0u7p679IXQ3p/1G2ZbN7 +vpPk38y/b+qtqyy/1fVllX2f9iwbY9ZtfbH6OuyUma/cvz8JfPqm2/bMYuL LyE/Y7BVazc0zssar3nuhRlRYz64MHA3k31CsuaF+cTVkYexwyKxsTJ1MRVM 1rikGUn/CcUTuy7etGO12LLT/Keq+n+UIV4/MPKr/czfm6N/RFz/wMb5k8dv 1spMnldWXP/8pZvmXP+N4P9cvD7tuw9txf6OM03vRbyecT+fN+7Ya+d/MbIu GLvWUaRNYu737frN0deV2Q4yP2LtIsu5xGM6L9TtRNvA3+5rw7Yf8s/75odN tp3IKgPzeSdDbFvg5GB8dqrv2rj/Medz/88C7Rzzylg5ONedP/OV18f979DJ 81FjzTJ0sWnXfvPdxm2FdEEZ1I/p1AW8NfedRnkxcpTpn3l10cw/qXefjsVI J9s/q1ZXy/DPKtTVMvyzqnU1j39Woa5ORl9Slbr6qPYleXVx4dZdGxcP/S9P XXXzD+Y5xLtj5McHQv+L9U8nA/ZNjiVbQfwpdDyPf8bgjzdZt8AujLVfnz2v cZx4Uyi2FPIV/xhxMmJALoazbd+RWlu2r673j+u+SzyBv2f6B2ysaDKeEd1C TIzr4q175spQfW5F/Mod//LbdeaTL1Y1/NPZnOdav3V3lFxJ/cT6me/rybKK +GLvjVFbNmuzeeRK3jOp/7x1NaT/fxdb+vdM6j9N/qzk8f+q2jLtnlXy/6rZ crr8f+/Rzig5J4OYGEgWWOM+0X1l3LHZ896d0meiH3X5HrGy5oWxWt/AL43v kxGvryJl+09e8sYTQ2T1H1Gch/H6B2Zw+Bf7Hci1h4GRep7VzZHf7Xn1Y7+a GzZWf9fcHsvNd3F+4vK3h8a3qVxL2e778a7uev77sRPm+Jkee+zsxevmyInT 5kD7MdN3fcgeO3qyy5zuvWyPn780YHqv3bH/h2OnzppLg/fMhZsjZv/ho/ac /YeOjLtvs3g9seT/+cv/13RO6Mfr6SfnvfehXY+nv6TOsR7P9fRRnEc763IP mRM99rcnzKK25WbNWJz/jbfn2XM5Dx9Puyf/JxfL1euDJ87ZfKmXX3vTLFn2 Raq8P27fa9fHXp891xyszVE59rcnnrLjixkvv2rnMOS/IRNrX269jWP0/+8v +cT2uRxr7+yx91zw/mKzdtN2O58nNvHUM8/a63cfPtnUr5L1d92WXealWa+N ezeAZ2U+FuOv22t6o51h7hv7fkDfzVGr26QO0VXseAK97DhwzKzbvMs+R8y1 xA9m1Wzp4mYO7B0ToyiiC1jy6QrbT7I+WkQXiz/5vDaWOm3n4LFj7LJ0QT6o zcnctMPs2H8sOuZUln8W0UWaf365+oeoOE9R/6xCXS3TP6tQV4v6Z5Xraqx/ VqWuTkZfUoW6msc/H/W6SmyA2AF+lcyTjNWFDza+ErHewPgPXbCm5cZgef3T cehUt/nim7VR17B+w5yYMaM/L87jnw784vzVO02P+fNu1i6IzR89c9E884// 1zgeiteHfMU/hl8xxib+72I41MGXanomD9O1SeR8frZqjfVnt4a169Dxcfbn Ot82MfAOCmNfxsB5YkfMH5xcvH+ArFv3tk+IMfJMjPuzlhvST15fb1ZWHl+k TuIjrN8U9f9m+o+tq830/6jb0r9nmv59+bNS1P+rakv/nlXz/6racqr9nzbc vUcVgv/zLOSC8M4fx1jrJW5BX7j0s5Wp1xKXIWbD2gXPwbFkPCVrDIT3DzgP GJ9xDHu5nHTXR5JH//Tf/2HHKy5GtHzlt424EeWH4jVu7MlYyeUobN9/1J73 5NN/b8iBrjiHZ2KczTHiQIxPiO2Q4866CO9EMHbi+rSxQUjWULyJNfK1G7dZ P92eEuOiT0dObOvGz6HYWEj+EOT7M8bjvUH0kNQFfjF7/rsNf3C5DFn0k+Yr yXgfa1KUgx5pI0K6KOI/+DSyMp5zeq2vZ7VZ3zozJivno0uOMV8L+U8onkhb wHnk3Ds5kmVxjOflefAZxrQh/wn5YshXsuh6ujh46Z45P/gvs7P3F9N7J3s/ FGJ33y+m53a9jGs1tnaPmp/OjZi9F+5O+N4/fN+en1aWvx+On1tPPN7G2YdG 7Xc+J3Ppb6Tk17eCeP2Fm/Vyiam7sfTF2ryis7vfHD1Zz3s/crJrQi79mQvX xh3j+ktj+Uwx+fVZGB+vH7GfiTEQs6DOMifb19FlPx87e9GeR1vs3vNJrhni l4wHiFfwznfontQbN/fAl907AMS/f9z2c1N5n39xpv1LP0cd4jP1g7+U42Lx QF139bf+/nabfY5nnn3Oysg8qG/MRg7GCVnXBrcm+lXW5Dnmz1l5JpcflRV0 QDvPe3zMzWLfLTrefdm2q377wDORNxFTDrrmHW/GKfMj8y3oM7jW9wHm1LSD U6kL+g/m7+RFFtEF+iS+Ql5kMvd2qnSBb/7j+X/afov3CGP3UijLP4voIs0/ 8+RbFPHPqtTVsvyzCnW1qH9Wta7m8c+q1NXJ6EuqUFcf5b6kiC4cxBDcvDOP LhzM5/x30mNAf34+ZR7/BOb4zNX8dZAYmC/69SuPfzJ/RHbeh292DPwxL7lk tDXEb+Z5ugjF60O+4h/DNxmnst74dG2MytiVeesPm3daGzFW5jzmm4y/iSW5 Z2U8jF9y34Z9Ltyw8rtxexZoM8l/Ie7DfhTLV66O1iVyurkvz8F8mT2SkNvZ +PTFG9E5vCH95PX1tLLy+CK2f2HGTKsz4imxeXj+PZvpP09dTdP/o25L/57N 9O/LPxX+X2VbVtX/q2rL6fL/ZFwhBOMHF69nfIQ8xAub7fFH7MPFWd27YKF4 SpYYCPFIxsjEY11sKxSvB8pKroGHcs39eA2ypsWv/WvxEc4F9x4EMVr+khPx 3Y9b7WfGfln8MilrSD/YrtmaioNxs59HEIqNheRPgjz4F3+T4zxfF+iPscpP uw404t1Z9RPylWS8Dzvz7gHxO+cfIV3k9R98ks/oiLg34xf26kYWnpt1HvzL 2aSZ/0BaPNHpLK0s7k+d9/fgTPMfX/8hX8mi6+li49n6uJN4/akbv5vN50dM //ADs+nsiNnRM2qPw/ba566BP8zKjkGz7+Jds/X8qLlw57758cyw2VL7fOzq b+Pi9Y6LQ/dr9xgJfnf3DuHvh+Mgp76eV/+gkRdPvB7GX/9gbM/78WW22g+H eP3Fsbq672C79cNjp86Ynqu37d70hzvq42ri9cm96s9dumnO9F1tfCfX3p0z mfvh0N6zrsi4/6vvxo8lqDPM3fn8woyXU+P1/ve093+o7259mr6UfWWa1S8f +nJr+1ofNWusLrj7UCc+++rbxrl+/WUdMDkmZN/Q5LiEusYaXytfZ/3O161b u8fOL3kxoi++/s7Oy/1rk31XkvbTvfa9LD6v+Ob7xl6CtCPN9mDDJm79gTks 9nT/Yw0xeT7xh2ZyMG6jbyGG5e9J20p+3tNwbTBxBXc+OiPe4Z+LvM32iUvT RRb5nU2IK/j5iHl0sXLNusZevawPuedrJX+MLlrZl3Lo8/lMf+JyJGJ0UYZ/ pukir39yfbKtaFVWEf+M0UVe/8wif5n+WYW6WoZ/ZtFFXv/MW1fz+GdV6mrZ fUlV6mqZfUlV6mqMf+LXReqqva7ml6E4fyv5na7IKfevz+OfPA/jz6NnLkTJ f3UsR5TP7OPr738V65+UlXznInTMERrXMi/39+cJxetDvhI6xpjc5VyyBkBc 3vkNf5nnohveD0Xnvo+ynyX5Zu4YY3bG2/7+Ra3s60jmpLayJXAv8n2Sx/2c VGzB3JyxdoyvhPSTxb7NfN0vK80Xs5TvSOYEt9J12j2T+s9bV0P6t/6aoX0o Ysss5ee1Zdo9k/oPyR9jy1j/L2rLrP6fx5ZF/D+rLZP6z+KfRWyZpfy8tmx2 z8lsy4A1lVbvXfjxemc7Yp/ERNLeI/BjOK4PC8VTssZA6FMYF7o+DP8iF4Kx ox97zhOvb/tspdl1MBzb8q99ceYrjX2Lkv/3dYTNXB53M5KyhvSDvbK8q4HP uX0Pk3K7zyH5k9D/sxceOQnJ+/plontyWrCDGydm1U8zX3HxPt4l5L1lfN7V zZAu8vqPk8vGu2u6Jo/B5eL6unA2aeY/0CpeHyqLcR/jK9YqWDdz9T/Nf3z9 N4tN+rrOEpedCtZ3PYzXE4u/NPzA5tmvPnHHxuWJ3/O/7sF6W7ThTP18Yu0H +u+ZzedG7Hl7+u5OiNcTmyeeT5mh7+TaXx4Jvw8citeTZ1/fD+feuPz6ifH6 /22cF7sfDjn0h4+dtPn0HDtxpscc6zxn97lhbxuOheL1/JbsgcNHTcfpczbm 331l0Ow/fKT2/bw52N5hz+m5Omg6amXt2rPX/g09d9b9cFiDW7R0ua3n1G38 ic/UReYg9NXUX/aSIS+NfsxdT1yfuunmJlni9fizffelNjbw99/MEq9fv3WP fe+HPtL9vtc//t8/7To4fQRtVqj+0m6yZkd7zDodx5ivu3dc1nj79vM8tI+8 89JMFn8dfI393bc2qze/XrO/UDKHn3eFWuWhsY6Pbvjr7Id+WG9Mu4b2jfth S3Trr0W42NHDc4fMn/70H+P0lQTdoTP3zndW+bELcqBDPyeSPLTkGiVlt3of NqSLLPJjV3TBGLTdiyPk0QW6xPd5N8/fE62V/DG6aGVf5/+Uhz7cXh9Z5C/T P9N0kdc/7T68tbYlVhd5/TNGF3n9M4v8ZfpnVepqXv/Mqosi/pm3rub1zyrU 1bz+WfW6WmZfUpW62kp+8hqwBXOlZd7+7Hl0wRzrP//rv61uGRO59a0s8lM2 dYQ5yaneh79rkMc/eQ7eQ0EGlz+eRX7m1NiCc+weD2Nz0rz+CeSOMX/0n90/ xjsm+M1fH3/C/mXthlw2ZMcm7n0N1rcY35IP4v8eVKgtCx3zYzj8tix+h57c mgzrJPgBuNgjz7j78IlGGdRXxtLJ2FsW+/o+78/FW9kSWf/nz3+xvoFO/L3I /BgX83/WqTjH/y2ILG1ZUj9Z7Jvm68my0nwxq/+AH2PMouu0e/r6L1JXQ/rP Ur+K2jJLW5zHls3u6es/Tf4YW8b6fxFbxvh/rC2L+n9WW+bx/yK2/HdsyyBL 7rYf/yOuyn4p5CIgb9pv6YTi9aF4CrSKgdTfd1xh31kg98HpjH6v7fOvxu1b lCdej02J49qxWqIu+ddyT75znrNJKEZKf2j3RqmV5XQQIilrSD9Z4/XEZPmt GdYeiKGFYmMh+ZMg+3MvvGjfxWDfpbS9+YBy/JzVrPoJ+Uoy3sdeSvgZ4xGX s5Kmizz+QyyO+zKuZE8PjrF2Rc4C9+s4V4+jMifgGajT/vg5Nl4fKos5AfdD 1/x18fo0//HLCvlKSNdZ4rJTgZ9ff/bWH/Z73537Npa+q3bs8OVfx+2V4853 5/GXOD25+X68/upozVfab5lt3aO2jOR3v6yq4OfX/zvgt/WPCrQHk7lnVJb3 1kLQjrh3CmKhXSlTP63WdsuWPwltvZ97OhXyl1lWEfnLtG+ZuqiKf+Ytqyr+ qbpaXP4yn0l1tRz5yyyrKv5Zhbpapn+qrua3b2geNd1zq1iZm8lbhb6k7PLL rL9lll9mXSqz/LLrV5nlV9WWVfX/Ktuyqv5fVVu22r9e/N+DvFLi1uSjEzuf in1VpiPe93/l93irgtu/fqrv22r/+ulA8frpg3Uym/MU+Vv1sbAG6OeXZYF3 CxhjuP2EYmAfU38NvAjs0cBv7MZeV0T+EOQEZH13sAz5yy4rr/xl2rdMXVTF P/OWVRX/VF0tLn/Zz6S6Wlz+Msuqin9Woa4Wkb/Msqrin1Woq/+OVKUvKbP8 ybZvFdr6sssvs36VWX5VbVll/6+qLavq/1W2JXv6xv4ejvj3hjUc1n+I2e+f onGM4vVCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ QgghhBBCCCGEEEIIIYQQD7kx+i8zODRibg3fq3G3duxB1PU3R343AyO/ecce BMsYHBqNlg2Zbg8N2783Ru+3PH9w+JdJ09PeA4eidTNZnL96x3ywZJl5/sWZ 5vXZc82ituX2+JtzFky7bEXp7Lsefc3Ogx3mvUUfm3c++Mhs3n3QHlvc9plZ uHipmffuB+aNOfOjyvv6+422rDkLFppLt3/LdM210Qfm/Y/azIdLPzULFi4y l4d+N3vaT1oZ4ImnnjEd5/ozy3Duym0z552F9rm+/2lH5uu6+gfs/T/8eJlZ 9uU39ti3G7Y05Pjr409aWSdTF/DVmvVWBp7hZM8Vc+bSrYYMM2a9alav+ylz WU63Cxe3mY+Xr5g2Xew71mXenv+emVvzqSNdfdPin3l1URX/rGpdLeKfVamr ef2zqnW1iH+qrk5OXX3U+5K8ugD0zj0/WvZ5IV1cuvO79Ql08e6HS6Jk+LRW N+a+8769589HOgvpIisbd+yrPd8T5nj35caxZSu+ts/w/pJPxh1DD+57SD9p dWlP+ynz7HPPN76v27zLtH3+lbU714XahzI52XPVlk+b4euQe896/S2zaed+ +/3zVd/ZuvnKG7NN742R6PusWP29ff6s5zfzFb+sNPmzktR/Frb+fNjWI3Sx //jZxvHua0Pmz395zPRcHy7k6yH9l2nLNPkny5bN/MfXf1Fb+vov05ZF/T+P LbP6f1Fb5vH/LLYs6v95bFnVtqwIRe2bl66LN81bcycvrpIn3pEXfIlY0d8D fo5uQ+PkVjGlRUuXm1Vrf5xW/V8YuBv03+demBE1Pp0O8GXG+bPnv5tL/qn0 HzH9EK8fGPnVfubvzdE/CpXH9cTwy5IvJgafJ17P8098honHppKDJ86ZK0Ot 7cD8l7GB+/6ox+v7b/9q1yGynEs8pvPCDfv56nDdXt3Xhm0swD/vmx822TY/ qwzM550MsW29k4Px2am+a+Oe69PIOSZtOHPxWDk4150/85XXx/3v0MnzUWPl MnSxadd+893GbeP+9/HyLxv/zwJlbNyxd1p1AW/NfadRXowcZfpnXl1UxT+r Xlfz+GcV6moZ/lnVuprHP1VXi/tnM108qn1JXl1cuHXXxppD/8tTV938knny 2cuDUfLjA6H/xeoihk++WNWI1xMPcmsWX323oeUYNKQfvy713hi1emBtzf2f NQn+Erdv7+xp2j6UwcVb9xpjbmJC7viX366zz+7kd3ZjDWP91t1R92BuTows NsYV8pVkWWnyZyt/ov5j5KJ9ID7ojhObBBdjzOvrIf1Phi2T8k+FLX3/Seq/ iC1D+p8MW+bx/zy2TPOfpP6L2LKo/zezZZr8k2nL6WrL9h7tnCAnMeDt+46Y qyMP8y13Hz5p9necyaXrPPY9dKrb7Nh/bNwxchEO1vqlmHImg9hnKYOYOFGz c+mPGQewhj6dOtxW8y+XT/IoQt0IxetbERMvE3EcvHTPnB/8l9nZ+4vpvVNs TL277xfTc7texrUaW7tHzU/nRszeC3fr9h/9X7O2c8jsu3jX9A/ft+enlfUw Xv/Axrv5bnPua59v1XC588TgXQ6+i3HzfdCeU58/3By7rn5tPSee+H09T35k 3D2T5VNuvfxfxq0Z+DH4elkPz2uUNTRqj7scfu7rznOy8Rn5eA5/PQG5/Jg9 15LT776fvzxgjp06a/bsfTjGON7VbU6c6TFHTpw2J872Wt0dPnaybo9aG3bk eKf9fPRklznde9med/7SgOm5OmgOtB8z7R2nzMEjHak2efzJp83RMxda+kEy Xv/G2/Nsfzx73ru2DeNYvU9ts/OfM/0DwXKOnrlo5r33oc07IyeKY/Tpn61a Y/vjlWvWNe639LOV5rG/Pm4/n754wyxZ9oX937otu8zWve32O23I67Pn2bae PpycOMYv5GIxZuB88qt8WZnPI+dTzzxr14Dp05s9e7J95v4vzXrNdJy71DjW P/irncPG1C3GFt+u32znkzF5mdB3c9Q+j9OJ48vVP0TFeWDB+4vNjgPH7HyV 54i5lvnxrNfebMSKHNglJkZRRBew5NMV1gdY/3bHGCPFjg0Xf/J5zY9O21yR 2PFuWbogH9TmZG7aYcd+sTGnsvyziC6q4p9Vrqt5/LMKdbWof1a5rsb6p+pq ef4Z0kUe/6xKX5JXF8QLiH3gV8k8yVhd+GDjKxExdnLL0QUxaz/ekEcXDnJA Gaf5xxiPMS503/14PTET3uvkL+NBxoLuvND8PqmfZF1Cp7wz6mL0wDoA1zEW 5P0SjiXbhxPdV+wY1L8XcSDiVXn04HTh1qYOd/bYMTDj2mSMkdxS8mqylovf zl+4yK775M1Jdb7SrCxf/qyE9B8D8bAvvllrP+MLjN2xWzJ2F+vrzfRfpi19 +afKlr7/pOk/jy2b6b9MW8b6f1Fb+v7TTP+xtmym/zJt6cs/Vbac6raMNn7L z4fHnbt9/9EJa8hbE+c4dh06PqEfTR7z7Rtq60NlpN0zTQ5f/+j+tbfmNI6h Q/o8+/zeWMSHvpKcCtZZOJ9jx85etOUQl107lnPAOY/97Ql7jzVjcZeQDbkX ZREfSZOVMUnfQD0mxrms17AOw2fGLejNnev30cRmuD+53G5cxl/GF5Q54+VX U+9Jf8wYmxx7N5ZK6gfbIze5DhxP0wVr8q+9OceOz9Zu2p6qf8Y/1DHeE+Ge rBvxmWfkXMbG+Byfn3z6743rfty+1+bpM25x46ZkDCr0jNyD/3Oui41TF5Gh /u7s0tSxX1LWND0m4/Uh+clV4R1d9Epdjo2XiTg2nq23t8TrT9343Ww+P2L6 hx+YTWdHzI6eUXscttc+dw38YVZ2DNp4+9bzo+bCnfvmxzPDZkvt87Grv42L 1zsuDt2v3aMeE9/R84s9j+v9e4fw98NxcXIbtx/b+8XFwImrh/aluenl59vv iXi4w4+7h8p/+P8HY/vyTLwO+fz4O7KMK2vs3Hqs/q49118ncOsIeex36Ojx xmfi9X3Xh+zng0fqx0+e7TUXB0bN2f7rNjbPsSMnu8y5/ofzCeL1nd31OdCJ M72m70Z8H+yTjNfT3jEeIF5B7J38c2L/tEm0G8tXfptaFvV/y55D5sWZr9jv 9OnkcvnnsB7AHI02g3Y4LV5PPiD3pw3+4uvvxt7fbrNyPPPsc1bGpKyU4fb5 yfLsyb6Wfptj/jyQmD59VoxOf9z2s22DeXeM9wlj3zdiTksf2eWtjdDex9qW vY4O1Poi2ub5kWvw2IZrnV6BvhwfmEpd4FPEl+hr3DHsiw/FlIM+ia+QFxmb W1eWLvDNfzz/T7vmtWrthui9FMryzyK6qIp/Vrmu5vHPKtTVov5Z1bqaxz9V V8vzz5AuHuW+pIguHMRA3JpJHl04iG3gn3muRX9+DmceXVDfWEdBDhdHYp0I HSfj9368HsgnIabOfJ2xnzuejNeH9OPXJcaZL8yYaefy7Dfk8jB4Hsa2zLGJ KTh5k+0DcSbKos7znbmzfabaWNbF+WNgLeTQ2Hz+6dpYlfEs+/YQM3DxGca9 sXmR+D7jYNbwKDd2zcr3lWZl+fJnIU3/WUHHvMuEbmjn/vbEU7Ys9gNZvnJ1 IV9P03+ZtvTlnypb+v7TTP+xtmym/zJtmcf/i9oyi//nsWVR/89qy1j/L2rL rP5fdluWnJdnidcTd6cN99ckQseS9g219awh0H/5cZHQPdOOhfD7NMZj5By4 /iYEfaWLj5O36Mpw1/xz5qzG+wZZct15JuKxz7/4Uuq+RfSL5IVwDzdWQz+s aRMn8uMqoXuS1+nsyP9dfkkz+XhO8jwZ22KDkH4YP+JvxMvdHoghXbxUK4Ox Ryv9M07Bp/09Ghlbhuqtfx3jPqdL4ud8DsWgkqA7lx9AfcIv8UnqZKs9MEKy hkjLr/flZ88h9gf098GMiZeJONZ3PYzXE4u/NPzA5tmvPnHHxtWJ3/O/7sF6 27bhTP18Yu0H+u+ZzedG7Hl7+u5OiNcTqyeeb8usHeczfHuyXifIvb88El4D upGIt0Monm7PrR3jXD/mPSFen7IfTvZ4ffrnery+Xue5p8vTvx6I10/c5+ZB I46ffP6krKH9cJLx+otja5nu+OU7v5mO0+fNkRNdDXmI11/x5gw2Xt9Tz1Pr 6Dxneq+F2/wy9sPhs8uDalUO65nMu3iXj5g8xxh7JNfhaZ95H533ofnO3NvN xegrXLyeMQBzYdp/t0deckyblJW/tKWsr7aSF/3479O5Pp3+6SUvLsJaAfNy /9pm/Sy0n+61+7DyecU33zf2yqPtbbbHH22u629YM6Z/cjKF+jziD83kYFxC P8JYx9/ntZX82NCt9xJXcOejM+Id/rnI22xOm6aLLPI7mxBX8PMRnX/F6IL3 O9irl8/4s3u+VvLH6KKVfSmH/p3P9MEubyJGF2X4Z15dxPhnK10U8c8YXeT1 z7x1Na9/VqGuluGfVayrefyz6nW1zL5kOupqmX1JFvnL9M80XcT4J7YsUlft dTW/DMX5W8nvdEXuu399SBet7Mueghu27Rn3WwLrt+6xOYrJc5Pxev84MQH3 PemfIf2E6hK4nNRTvddM21guHnri9wvS2gfgHZa13j5J+BTzY38PhFa6AMbT jIOTx/2cVPRPDIaxaoyuHeTZ+TmpWfw/zVeSZYXkz1J+Uv9ZfRF7MM4PvQvs 5wTn9fWQ/iFL/cpiyzT5s5Sf15Zp/pPUf1FbJnOyW/lnVlsW9f88tszi/0Vt mdR/Fv/Masui/h9ryzT/Seq/7LYMWJPw3yFoFa8nLkx813//MHQszb6hth5d sU+AW+dN3rPZsRDJPo38cGKwyT12HH5f6a5lrOH0Sk6k00mreD3xWdZFyA8g Rz35PpkPsRP2L3DPTb4lfSN29v0xtB+8H6/3f88gNK5wzPP27/LHZUn9YDvW G3g3DtuEdMFv76StszkdcR5xdcrHds6/8Wk/ZyBkN9bRnKzIkfx/mh2oR66+ sHbGmIlnaPVeVZqsIdBPKA8nKRPtBWMhNzZKi5dljR+KdPz8+rO3/rDf++7c t7H0XbVjhy//Om6vHHe+O4+/xOnJzffj9ex982n7LbOte9SW4e7HeVnz65Px +of71dwdFx+v70Nzb1w8Phmvt/vq2P1pxufi+3H3UPmhGH3y92ZD8XqOufsN NvbIud/IpX+Yj3+3Xkbi93Fb7YfjaBWvB/a/IW/efQ/F69kPh+Ptxzsn3MOR dz+cUPtD/0m7Snua9ht1tCe0r+xD9vKrb9hjoXg9fTvn8B6Xa9tpLzjGeCQt Xk+uAH0Ea4Euxz+trXTl0c83e3a/r11jf9eszcrgt9us/SbXbHl/qFWeJM/A GgN/3RyRMQF2SbuGtRHux7thC7x35cjx9H+TrX7ukPnTn/7D/k0rD92hM/pc 38at5GedHTnQoZ8TSZ5nco2Xslv1OyFdZJGfMSa6wA/avbm5i6PF6AJdkpPJ eIU9FbLKH6OLVvYFYhmUhz7cWDKL/GX6Z15dxPhnFl3k9c8YXeT1z7x1Na9/ VqWu5vXPKtfVvP5Z5bpaZl8yHXW1zL4ki/xl+meaLlrJzzwNWzDv9X/vNI8u mO/953/9t9UtYyK3ppNFfsqmjjDnJK6dposs9gXmlYyl/PepiY2TU8Zck+/M U5974UX7/MTyWU9y40XGd5zDOyDYld+l5a97fyKkn1BdAhdToHz2xWV9h+fl OUPtA3kjrGX58aV9HV32fskYXStd8HvO//Pnv9jysYkfK/JjXC/MeNnGGzjH /y2FLLqGZIyrlf+n+UqyrDT5s9SvpP6z+iL1gPeYuB+5h8k6i+xFfD2k/yz1 K6st0+TP0pblsWUz//H1X4YtkzHeVv6ZxZZl+H+sLbP6f1Fb5vH/LLYsw/9j bTldbRnk3Q+H/pW23N9bxD8Wsm+oref77sMnJvpdCfF67kPsnHg8ciR/98oR itcTz2Gdnxiuv/cN76gR80j7XWnGfIxX8AFi2s3i9ZRLPoL7TpyGfpSxkx9P x9bu/TV3zI/X4z/kZ9DPvvrm28F70ef6+9Yz/gjpBz00+vLa+fhCSBfkb7g9 bZJ7Azkd4gfEsrgHf10MnPHxy7XxEH7h5xT4cSXmA+SwE8M6MJYrkiVeT3wf nTL2Yezq6nSrNiVN1jSYI9h1Ge9dWl8mF6dHt/54KhQvyxo/FOm4/eun+r6t 9q8XU4efX/+oQQ4WczR+44J8gXmRv81TNln72iS0dYwD8lxLX1KW/OxFlmcN tIj8Seh3/NzTqZC/zLKKyF+mfcvURV77VkUXVfFP1dXi8pdZVlX8swp1tYj8 ZZZVFf+sQl0t0z+rUldj7BvagzXvnvxTRYzMZfp62eWX6f9lll+mL5ZZftl9 SZnlV9WWVfX/Ktuyqv5fVVsW3b8+tg+KOb9IvF4IIcT/LR7leD2wBw3rwbzn xO+gTKcsrK37+WVZYK2UMZL/W/VZ+WHzzsa6bFHYo8H9pspUyR+CNe+s7z6W IX/ZZeWVv0z7lqmLIvatgi6q4p+qq8XlL7usKvhnVepqmf6pulqOfcv0zyrU 1bLt+ygz2bqoSltQZvll+mLZ5ZdZV8ssv6q2rLL/V9WWVfX/KtuS33FP/oYK eb47D3aMK4+87pjfty0Ke/HtOjh+jzfeJ/N/g1UIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCBHPjdF/ mcGhEXNr+F6Nu7VjD6KuvznyuxkY+c079iBYxuDQaLRsyHR7aNj+vTF6v+X5 g8O/TJqe9h44FK2byeL81TvmgyXLzPMvzjSvz55rFrUtt8ffnLNg2mUrSmff 9ehrdh7sMO8t+ti888FHZvPug/bY4rbPzMLFS828dz8wb8yZH1Xe199vtGXN WbDQXLr9W6Zrro0+MO9/1GY+XPqpWbBwkbk89LvZ037SygBPPPWM6TjXn1mG c1dumznvLLTP9f1POzJf19U/YO//4cfLzLIvv7HHvt2wpSHHXx9/0so6mbqA r9astzLwDCd7rpgzl241ZJgx61Wzet1Pmctyul24uM18vHzFtOli37Eu8/b8 98zcmk8d6eqbFv/Mq4uq+GdV62oR/6xKXc3rn1Wtq0X8U3V1curqo96X5NUF oHfu+dGyzwvp4tKd361PoIt3P1wSJcOntbox95337T1/PtJZSBdZ2bhjX+35 njDHuy83ji1b8bV9hveXfDLuGHpw30P6SatLe9pPmWefe77xfd3mXabt86+s 3bku1D6Uycmeq7Z82gxfh9x71utvmU0799vvn6/6ztbNV96YbXpvjETfZ8Xq 7+3zZz2/ma/4ZaXJn5Wk/rOw9efDth6hi/3HzzaOd18bMn/+y2Om5/pwIV8P 6b9MW6bJP1m2bOY/vv6L2tLXf5m2LOr/eWyZ1f+L2jKP/2exZVH/z2PLqrZl RShq37x0Xbxp3po7eXGVPPGOvOBLxIr+HvBzdBsaJ7eKKS1autysWvvjtOr/ wsDdoP8+98KMqPHpdIAvM86fPf/dXPJPpf+I6Yd4/cDIr/Yzf2+O/lGoPK4n hl+WfDEx+Dzxep5/4jNMPDaVHDxxzlwZam0H5r+MDdz3Rz1e33/7V7sOkeVc 4jGdF27Yz1eH6/bqvjZsYwH+ed/8sMm2+VllYD7vZIht650cjM9O9V0b91yf Rs4xacOZi8fKwbnu/JmvvD7uf4dOno8aK5ehi0279pvvNm4b97+Pl3/Z+H8W KGPjjr3Tqgt4a+47jfJi5CjTP/Pqoir+WfW6msc/q1BXy/DPqtbVPP6pulrc P5vp4lHtS/Lq4sKtuzbWHPpfnrrq5pfMk89eHoySHx8I/S9WFzF88sWqRrye eJBbs/jquw0tx6Ah/fh1qffGqNUDa2vu/6xJ8Je4fXtnT9P2oQwu3rrXGHMT E3LHv/x2nX12J7+zG2sY67fujroHc3NiZLExrpCvJMtKkz9b+RP1HyMX7QPx QXec2CS4GGNeXw/pfzJsmZR/Kmzp+09S/0VsGdL/ZNgyj//nsWWa/yT1X8SW Rf2/mS3T5J9MW05XW7b3aOcEOYkBb993xFwdeZhvufvwSbO/40wuXeex76FT 3WbH/mPjjpGLcLDWL8WUMxnEPksZxMSJmp1Lf8w4gDX06dThtpp/uXySRxHq Rihe34qYeJmI4+Cle+b84L/Mzt5fTO+dYmPq3X2/mJ7b9TKu1djaPWp+Ojdi 9l64a4/tu3jXbK8d29Hzi+kfvm/PTyvrYbz+gY13893m3Nc+36rhcueJwbsc fBfj5vugPac+f7g5dl392npOPPH7ep78yLh7Jsun3Hr5v4xbM/Bj8PWyHp7X KGto1B53Ofzc153nZOMz8vEc/noCcvkxe64lp999P395wBw7ddbs2ftwjHG8 q9ucONNjjpw4bU6c7bW6O3zsZN0etTbsyPFO+/noyS5zuveyPe/8pQHTc3XQ HGg/Zto7TpmDRzpSbfL4k0+bo2cutPSDZLz+jbfn2f549rx3bRvGsXqf2mbn P2f6B4LlHD1z0cx770Obd0ZOFMfo0z9btcb2xyvXrGvcb+lnK81jf33cfj59 8YZZsuwL+791W3aZrXvb7XfakNdnz7NtPX04OXGMX8jFYszA+eRX+bIyn0fO p5551q4B06c3e/Zk+8z9X5r1muk4d6lxrH/wVzuHjalbjC2+Xb/Zzidj8jKh 7+aofR6nE8eXq3+IivPAgvcXmx0Hjtn5Ks8Rcy3z41mvvdmIFTmwS0yMoogu YMmnK6wPsP7tjjFGih0bLv7k85ofnba5IrHj3bJ0QT6ozcnctMOO/WJjTmX5 ZxFdVMU/q1xX8/hnFepqUf+scl2N9U/V1fL8M6SLPP5Zlb4kry6IFxD7wK+S eZKxuvDBxlciYuzklqMLYtZ+vCGPLhzkgDJO848xHmNc6L778XpiJrzXyV/G g4wF3Xmh+X1SP8m6hE55Z9TF6IF1AK5jLMj7JRxLtg8nuq/YMah/L+JAxKvy 6MHpwq1NHe7ssWNgxrXJGCO5peTVZC0Xv52/cJFd98mbk+p8pVlZvvxZCek/ BuJhX3yz1n7GFxi7Y7dk7C7W15vpv0xb+vJPlS19/0nTfx5bNtN/mbaM9f+i tvT9p5n+Y23ZTP9l2tKXf6psOdVtGW38lp8Pjzt3+/6jE9aQtybOcew6dHxC P5o85ts31NaHyki7Z5ocvv7R/WtvzWkcQ4f0efb5vbGID30lORWss3A+x46d vWjLIS67dizngHMe+9sT9h5rxuIuIRtyL8oiPpImK2OSvoF6TIxzWa9hHYbP jFvQmzvX76OJzXB/crnduIy/jC8oc8bLr6bek/6YMTY59m4sldQPtkduch04 nqYL1uRfe3OOHZ+t3bQ9Vf+Mf6hjvCfCPVk34jPPyLmMjfE5Pj/59N8b1/24 fa/N02fc4sZNyRhU6Bm5B//nXBcbpy4iQ/3d2aWpY7+krGl6TMbrQ/KTq8I7 uuiVuhwbLxNxbDxbb2+J15+68bvZfH7E9A8/MJvOjpgdPaP2OGyvfe4a+MOs 7Bi0cfet50fNhTv3zY9nhs2W2udjV38bF693XBy6X7tHPSbeW/vfhtr5u3p/ GXfvEP5+OC5ObuP2Y3u/uBg4cfXQvjQ3vfx8+z0RD3f4cfdQ+Q///2BsX56J 1yGfH39HlnFljZ1bj9Xftef66wRuHSGP/Q4dPd74TLy+7/qQ/XzwSP34ybO9 5uLAqDnbf93G5jl25GSXOdf/cD5BvL6zuz4HOnGm1/TdiO+DfZLxeto7xgPE K4i9k39O7J82iXZj+cpvU8ui/m/Zc8i8OPMV+50+nVwu/xzWA5ij0WbQDqfF 68kH5P60wV98/d3Y+9ttVo5nnn3OypiUlTLcPj9Znj3Z19Jvc8yfBxLTp8+K 0emP2362bTDvjvE+Yez7Rsxp6SO7vLUR2vtY27LX0YFaX0TbPD9yDR7bcK3T K9CX4wNTqQt8ivgSfY07hn3xoZhy0CfxFfIiY3PrytIFvvmP5/9p17xWrd0Q vZdCWf5ZRBdV8c8q19U8/lmFulrUP6taV/P4p+pqef4Z0sWj3JcU0YWDGIhb M8mjCwexDfwzz7Xoz8/hzKML6hvrKMjh4kisE6HjZPzej9cD+STE1JmvM/Zz x5Px+pB+/LrEOPOFGTPtXJ79hlweBs/D2JY5NjEFJ2+yfSDORFnUeb4zd7bP VBvLujh/DKyFHBqbzz9dG6synmXfHmIGLj7DuDc2LxLfZxzMGh7lxq5Z+b7S rCxf/iyk6T8r6Jh3mdAN7dzfnnjKlsV+IMtXri7k62n6L9OWvvxTZUvff5rp P9aWzfRfpi3z+H9RW2bx/zy2LOr/WW0Z6/9FbZnV/8tuy5Lz8izxeuLutOH+ mkToWNK+obaeNQT6Lz8uErpn2rEQfp/GeIycA9ffhKCvdPFx8hZdGe6af86c 1XjfIEuuO89EPPb5F19K3beIfpG8EO7hxmrohzVt4kR+XCV0T/I6nR35v8sv aSYfz0meJ2NbbBDSD+NH/I14udsDMaSLl2plMPZopX/GKfi0v0cjY8tQvfWv Y9zndEn8nM+hGFQSdOfyA6hP+CU+SZ1stQdGSNYQafn1vvzsOcT+gP4+mDHx MhHH+q6H8Xpi8ZeGH9g8+9Un7ti4PPF7/tc9WG/biLfzl1j7gf57ZvO5EXve nr67E+L1xOqJ51Omf0/i+/wl9/7ySHgN6EYi3g6heLo9t3aMc/2Y94R4fcp+ ONnj9emf6/H6ep3nni5P/3ogXj9xn5sHjTh+8vmTsob2w0nG6y+OrWW645fv /GY6Tp83R050NeQhXn/FmzPYeH1PPU+to/Oc6b0WbvPL2A+Hzy4PqlU5rGcy 7+JdPmLyHGPskVyHp33mfXTeh+Y7c283F6OvcPF6xgDMhWn/3R55yTFtUlb+ 0payvtpKXvTjv0/n+nT6p5e8uAhrBczL/Wub9bPQfrrX7sPK5xXffN/YK4+2 t9kef7S5rr9hzZj+yckU6vOIPzSTg3EJ/QhjHX+f11byY0O33ktcwZ2Pzoh3 +Ocib7M5bZoussjvbEJcwc9HdP4Vowve72CvXj7jz+75Wskfo4tW9qUc+nc+ 0we7vIkYXZThn3l1EeOfrXRRxD9jdJHXP/PW1bz+WYW6WoZ/VrGu5vHPqtfV MvuS6airZfYlWeQv0z/TdBHjn9iySF2119X8MhTnbyW/0xW57/71IV20si97 Cm7Ytmfcbwms37rH5igmz03G6/3jxATc96R/hvQTqkvgclJP9V4zbWO5eOiJ 3y9Iax+Ad1jWevsk4VPMj/09EFrpAhhPMw5OHvdzUtE/MRjGqjG6dpBn5+ek ZvH/NF9JlhWSP0v5Sf1n9UXswTg/9C6wnxOc19dD+ocs9SuLLdPkz1J+Xlum +U9S/0VtmczJbuWfWW1Z1P/z2DKL/xe1ZVL/Wfwzqy2L+n+sLdP8J6n/stsy YE3Cf4egVbyeuDDxXf/9w9CxNPuG2np0xT4Bbp03ec9mx0Ik+zTyw4nBJvfY cfh9pbuWsYbTKzmRTiet4vXEZ1kXIT+AHPXk+2Q+xE7Yv8A9N/mW9I3Y2ffH 0H7wfrze/z2D0LjCMc/bv8sflyX1g+1Yb+DdOGwT0gW/vZO2zuZ0xHnE1Skf 2zn/xqf9nIGQ3VhHc7IiR/L/aXagHrn6wtoZYyaeodV7VWmyhkA/oTycpEy0 F4yF3NgoLV6WNX4o0vHz68/e+sN+77tz38bSyYM/fPnXcXvluPPdefwlTk9u vh+vvzr6v+bT9ltmW/eoLeNa7Ts5+eyRQ66+X1aIULz+4X41d8fFx+v70Nwb F49Pxuvtvjp2f5rxufh+3D1UfihGn/y92VC8nmPufoONPXLuN3LpH+bj362X kfh93Fb74ThaxeuB/W/Im3ffQ/F69sPhePvxzgn3cOTdDyfU/tB/0q7Snqb9 Rh3tCe0r+5C9/Oob9lgoXk/fzjm8x+XadtoLjjEeSYvXkytAH8FaoMvxT2sr XXn0882e3e9r19jfNWuzMvjtNmu/yTVb3h9qlSfJM7DGwF83R2RMgF3SrmFt hPvxbtgC7105cjz932Srnztk/vSn/7B/08pDd+iMPte3cSv5WWdHDnTo50SS 55lc46XsVv1OSBdZ5GeMiS7wg3Zvbu7iaDG6QJfkZDJeYU+FrPLH6KKVfYFY BuWhDzeWzCJ/mf6ZVxcx/plFF3n9M0YXef0zb13N659Vqat5/bPKdTWvf1a5 rpbZl0xHXS2zL8kif5n+maaLVvIzT8MWzHv93zvNowvme//5X/9tdcuYyK3p ZJGfsqkjzDmJa6fpIot9gXklYyn/fWpi4+SUMdfkO/PU51540T4/sXzWk9x4 kfEd5/AOCHbld2n5696fCOknVJfAxRQon31xWd/heXnOUPtA3ghrWX58aV9H l71fMkbXShf8nvP//Pkvtnxs4seK/BjXCzNetvEGzvF/SyGLriEZ42rl/2m+ kiwrTf4s9Sup/6y+SD3gPSbuR+5hss4iexFfD+k/S/3Kass0+bO0ZXls2cx/ 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 c+zY2Yu2HOKya8dyDjjnsb89Ye+xZizuErIh96Is4iNpsjIm6Ruox8Q4l/Ua 1mH4zLgFvblz/T6a2Az3J5fbjcv4y/iCMme8/GrqPemPGWOTY+/GUkn9YHvk JteB42m6YE3+tTfn2PHZ2k3bU/XP+Ic6xnsi3JN1Iz7zjJzL2Bif4/OTT/+9 cd2P2/faPH3GLW7clIxBhZ6Re/B/znWxceoiMtTfnV2aOvZLypqmx2S8PiQ/ uSq8o4teqcux8TIRx8FL98z5wX+Znb2/mN47xXJgdvf9Ynpu18u4VmNr96j5 6dyI2Xuh3n5sPT9q77On9r1/+L49P60sfz8cFye3cfuxvV9cDJy4emhfmpte fr79noiHO/y4e6j8h/9/MLYvz8TrkM+PvyPLuLLGzq3H6u/ac/11AreOkEfn h44eb3wmXt93fahu1yP14yfP9pqLA6PmbP91G5vn2JGTXeZc/8P5BPH6zu76 HOjEmV7TdyO+D/ZJxutp7xgPEK8g9k7+ObF/2iTajeUrv00ti/q/Zc8h8+LM V+x3+nRyufxzWA9gjkabQTucFq8nH5D70wZ/8fV3Y+9vt1k5nnn2OStjUlbK cPv8ZHn2ZF9Lv80xfx5ITJ8+K0anP2772bbBvDvG+4Sx7xsxp6WP7PLWRmjv Y23LXkcHan0RbfP8yDV4bMO1Tq9AX44PTKUu8CniS/Q17hj2xYdiykGfxFfI i4zNrStLF/jmP57/p13zWrV2Q/ReCmX5ZxFdVMU/q1xX8/hnFepqUf+sal3N 45+qq+X5Z0gXj3JfUkQXDmIgbs0kjy4cxDbwzzzXoj8/hzOPLqhvrKMgh4sj sU6EjpPxez9eD+STEFNnvs7Yzx1PxutD+vHrEuPMF2bMtHN59htyeRg8D2Nb 5tjEFJy8yfaBOBNlUef5ztzZPlNtLOvi/DGwFnJobD7/dG2syniWfXuIGbj4 DOPe2LxIfJ9xMGt4lBu7ZuX7SrOyfPmzkKb/rKBj3mVCN7Rzf3viKVsW+4Es X7m6kK+n6b9MW/ryT5Utff9ppv9YWzbTf5m2zOP/RW2Zxf/z2LKo/2e1Zaz/ F7VlVv8vuy1LzsuzxOuJu9OG+2sSoWNJ+4baetYQ6L/8uEjonmnHQvh9GuMx cg5cfxOCvtLFx8lbdGW4a/45c1bjfYMsue48E/HY5198KXXfIvpF8kK4hxur oR/WtIkT+XGV0D3J63R25P8uv6SZfDwneZ6MbbFBSD+MH/E34uVuD8SQLl6q lcHYo5X+Gafg0/4ejYwtQ/XWv45xn9Ml8XM+h2JQSdCdyw+gPuGX+CR1stUe GCFZQ6Tl1/vys+cQ+wP6+2DGxMtEHBvP1tsd4uinbvxuNp8fMf3DD8ymsyNm R089vg7ba5+7Bv4wKzsGzb6Ld23s/cKd++bHM8NmS+3zsau/jYvXOy4O3a/d Y8RcGXlgz+XYutND4+4d4kYi3g6heLo9t3aMc/2Y94R4fcp+ONnj9emf6/H6 ep3nni5P/3ogXj9xn5sHjTh+8vmTsob2w0nG6y+OrWW645fv/GY6Tp83R050 NeQhXn/FmzPYeH1PPU+to/Oc6b0WbvPL2A+Hzy4PqlU5rGcy7+JdPmLyHGPs kVyHp33mfXTeh+Y7c283F6OvcPF6xgDMhWn/3R55yTFtUlb+0payvtpKXvTj v0/n+nT6p5e8uAhrBczL/Wub9bPQfrrX7sPK5xXffN/YK4+2t9kef7S5rr9h zZj+yckU6vOIPzSTg3EJ/QhjHX+f11byY0O33ktcwZ2Pzoh3+Ocib7M5bZou ssjvbEJcwc9HdP4Vowve72CvXj7jz+75Wskfo4tW9qUc+nc+0we7vIkYXZTh n3l1EeOfrXRRxD9jdJHXP/PW1bz+WYW6WoZ/VrGu5vHPqtfVMvuS6airZfYl WeQv0z/TdBHjn9iySF2119X8MhTnbyW/0xW57/71IV20si97Cm7Ytmfcbwms 37rH5igmz03G6/3jxATc96R/hvQTqkvgclJP9V4zbWO5eOiJ3y9Iax+Ad1jW evsk4VPMj/09EFrpAhhPMw5OHvdzUtE/MRjGqjG6dpBn5+ekZvH/NF9JlhWS P0v5Sf1n9UXswTg/9C6wnxOc19dD+ocs9SuLLdPkz1J+Xlum+U9S/0VtmczJ buWfWW1Z1P/z2DKL/xe1ZVL/Wfwzqy2L+n+sLdP8J6n/stsyYE3Cf4egVbye uDDxXf/9w9CxNPuG2np0xT4Bbp03ec9mx0Ik+zTyw4nBJvfYcfh9pbuWsYbT KzmRTiet4vXEZ1kXIT+AHPXk+2Q+xE7Yv8A9N/mW9I3Y2ffH0H7wfrze/z2D 0LjCMc/bv8sflyX1g+1Yb+DdOGwT0gW/vZO2zuZ0xHnE1Skf2zn/xqf9nIGQ 3VhHc7IiR/L/aXagHrn6wtoZYyaeodV7VWmyhkA/oTycpEy0F4yF3NgoLV6W NX4o0lnf9TBeTyz+0vADm2e/+sQdG5cnfs//ugfr9XjDWMydWPuB/ntm87kR e96evrsT4vXE6onRU+blkQeN+Py6rnq8ntx7jofkCsXrH+5Xc3dcfLy+D829 cfH4ZLze7qtj96cZn4vvx91D5Ydi9Mnfmw3F6znm7jfY2CPnfiOX/mE+/t16 GYnfx221H46jVbwe2P+GvHn3PRSvZz8cjrcf75xwD0fe/XBC7Q/9J+0q7Wna b9TRntC+sg/Zy6++YY+F4vX07ZzDe1yubae94BjjkbR4PbkC9BGsBboc/7S2 0pVHP9/s2f2+do39XbM2K4PfbrP2m1yz5f2hVnmSPANrDPx1c0TGBNgl7RrW Rrgf74Yt8N6VI8fT/022+rlD5k9/+g/7N608dIfO6HN9G7eSn3V25ECHfk4k eZ7JNV7KbtXvhHSRRX7GmOgCP2j35uYujhajC3RJTibjFfZUyCp/jC5a2ReI ZVAe+nBjySzyl+mfeXUR459ZdJHXP2N0kdc/89bVvP5Zlbqa1z+rXFfz+meV 62qZfcl01NUy+5Is8pfpn2m6aCU/8zRswbzX/73TPLpgvvef//XfVreMidya Thb5KZs6wpyTuHaaLrLYF5hXMpby36cmNk5OGXNNvjNPfe6FF+3zE8tnPcmN FxnfcQ7vgGBXfpeWv+79iZB+QnUJXEyB8tkXl/UdnpfnDLUP5I2wluXHl/Z1 dNn7JWN0rXTB7zn/z5//YsvHJn6syI9xvTDjZRtv4Bz/txSy6BqSMa5W/p/m K8my0uTPUr+S+s/qi9QD3mPifuQeJussshfx9ZD+s9SvrLZMkz9LW5bHls38 x9d/GbZMxnhb+WcWW5bh/7G2zOr/RW2Zx/+z2LIM/4+15XS1ZZB3Pxz6V9py f28R/1jIvqG2nu+7D5+Y6HclxOu5D7Fz4vHIkfzdK0coXk88h3V+Yrj+3je8 o0bMI+13pRnzMV7BB4hpN4vXUy75CO47cRr6UcZOfjwdW7v319wxP16P/5Cf QT/76ptvB+9Fn+vvW8/4I6Qf9NDoy2vn4wshXZC/4fa0Se4N5HSIHxDL4h78 dTFwxscv18ZD+IWfU+DHlZgPkMNODOvAWK5Ilng98X10ytiHsaur063alDRZ 02COYNdlvHdpfZlcnB7d+uOpULwsa/xQpOPn15+99Yf93nfnvo2l76odO3z5 13F75bjz3Xn8JU5Pbr4fr786WquX7bfMtu5RWwbH3H44P4/tj9Msv15MHX5+ /aMGOVjM0fiNC/IF5kX+Nk/ZZO1rk9DWMQ7Icy19SVnysxdZnjXQIvInod/x c0+nQv4yyyoif5n2LVMXee1bFV1UxT9VV4vLX2ZZVfHPKtTVIvKXWVZV/LMK dbVM/6xKXY2xb2gP1rx78k8VMTKX6etll1+m/5dZfpm+WGb5ZfclZZZfVVtW 1f+rbMuq+n9VbVl0//rYPijm/CLxeiHE/y3c/vVTfd9W+9eLqeNRjtcDe9Cw Hsx7TvwOynTKwtq6n1+WBdZKGSP5v1WflR8272ysyxaFPRrcb6pMlfwhWPPO +u5jGfKXXVZe+cu0b5m6KGLfKuiiKv6pulpc/rLLqoJ/VqWulumfqqvl2LdM /6xCXS3bvo8yk62LqrQFZZZfpi+WXX6ZdbXM8qtqyyr7f1VtWVX/r7It+R33 5G+okOe782DHuPLI6475fduisBffroPj93jjfTL/N1iFEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBDx 3Bj9lxkcGjG3hu/VuFs79iDq+psjv5uBkd+8Yw+CZQwOjUbLhky3h4bt3xuj 91uePzj8y6Tpae+BQ9G6mSzOX71jPliyzDz/4kzz+uy5ZlHbcnv8zTkLpl22 onT2XY++ZufBDvPeoo/NOx98ZDbvPmiPLW77zCxcvNTMe/cD88ac+VHlff39 RlvWnAULzaXbv2W65troA/P+R23mw6WfmgULF5nLQ7+bPe0nrQzwxFPPmI5z /ZllOHfltpnzzkL7XN//tCPzdV39A/b+H368zCz78ht77NsNWxpy/PXxJ62s k6kL+GrNeisDz3Cy54o5c+lWQ4YZs141q9f9lLksp9uFi9vMx8tXTJsu9h3r Mm/Pf8/MrfnUka6+afHPvLqoin9Wta4W8c+q1NW8/lnVulrEP1VXJ6euPup9 SV5dAHrnnh8t+7yQLi7d+d36BLp498MlUTJ8Wqsbc995397z5yOdhXSRlY07 9tWe7wlzvPty49iyFV/bZ3h/ySfjjqEH9z2kn7S6tKf9lHn2uecb39dt3mXa Pv/K2p3rQu1DmZzsuWrLp83wdci9Z73+ltm0c7/9/vmq72zdfOWN2ab3xkj0 fVas/t4+f9bzm/mKX1aa/FlJ6j8LW38+bOsRuth//GzjePe1IfPnvzxmeq4P F/L1kP7LtGWa/JNly2b+4+u/qC19/Zdpy6L+n8eWWf2/qC3z+H8WWxb1/zy2 rGpbVoSi9s1L18Wb5q25kxdXyRPvyAu+RKzo7wE/R7ehcXKrmNKipcvNqrU/ Tqv+LwzcDfrvcy/MiBqfTgf4MuP82fPfzSX/VPqPmH6I1w+M/Go/8/fm6B+F yuN6YvhlyRcTg88Tr+f5Jz7DxGNTycET58yVodZ2YP7L2MB9f9Tj9f23f7Xr EFnOJR7TeeGG/Xx1uG6v7mvDNhbgn/fND5tsm59VBubzTobYtt7JwfjsVN+1 cc/1aeQckzacuXisHJzrzp/5yuvj/nfo5PmosXIZuti0a7/5buO2cf/7ePmX jf9ngTI27tg7rbqAt+a+0ygvRo4y/TOvLqrin1Wvq3n8swp1tQz/rGpdzeOf qqvF/bOZLh7VviSvLi7cumtjzaH/5amrbn7JPPns5cEo+fGB0P9idRHDJ1+s asTriQe5NYuvvtvQcgwa0o9fl3pvjFo9sLbm/s+aBH+J27d39jRtH8rg4q17 jTE3MSF3/Mtv19lnd/I7u7GGsX7r7qh7MDcnRhYb4wr5SrKsNPmzlT9R/zFy 0T4QH3THiU2CizHm9fWQ/ifDlkn5p8KWvv8k9V/EliH9T4Yt8/h/Hlum+U9S /0VsWdT/m9kyTf7JtOV0tWV7j3ZOkJMY8PZ9R8zVkYf5lrsPnzT7O87k0nUe +x461W127D827hi5CAdr/VJMOZNB7LOUQUycqNm59MeMA1hDn04dbqv5l8sn eRShboTi9a2IiZeJOA5eumfOD/7L7Oz9xfTeKTam3t33i+m5/bCMPbXvq47f bnxf3zVs77P34l3TP3zfnp9W1sN4/QMb7+a7zbmvfb5Vw+XOE4N3Ofguxs33 QXtOff5wc+y6+rX1nHji9/U8+ZFx90yWT7n18n8Zt2bgx+DrZT08r1HW0Kg9 7nL4ua87z8nGZ+TjOfz1BOTyY/ZcS06/+37+8oA5duqs2bP34RjjeFe3OXGm xxw5cdqcONtrdXf42En7P9qwI8c77eejJ7vM6d7L9rzzlwZMz9VBc6D9mGnv OGUOHulItcnjTz5tjp650NIPkvH6N96eZ/vj2fPetW0Yx+p9apud/5zpHwiW c/TMRTPvvQ9t3hk5URyjT/9s1RrbH69cs65xv6WfrTSP/fVx+/n0xRtmybIv 7P/Wbdlltu5tt99pQ16fPc+29fTh5MQxfiEXizED55Nf5cvKfB45n3rmWbsG TJ/e7NmT7TP3f2nWa6bj3KXGsf7BX+0cNqZuMbb4dv1mO5+MycuEvpuj9nmc Thxfrv4hKs4DC95fbHYcOGbnqzxHzLXMj2e99mYjVuTALjExiiK6gCWfrrA+ wPq3O8YYKXZsuPiTz2t+dNrmisSOd8vSBfmgNidz0w479ouNOZXln0V0URX/ rHJdzeOfVairRf2zynU11j9VV8vzz5Au8vhnVfqSvLogXkDsA79K5knG6sIH G1+JiLGTW44uiFn78YY8unCQA8o4zT/GeIxxofvux+uJmfBeJ38ZDzIWdOeF 5vdJ/STrEjrlnVEXowfWAbiOsSDvl3As2T6c6L5ix6D+vYgDEa/KowenC7c2 dbizx46BGdcmY4zklpJXk7Vc/Hb+wkV23SdvTqrzlWZl+fJnJaT/GIiHffHN WvsZX2Dsjt2SsbtYX2+m/zJt6cs/Vbb0/SdN/3ls2Uz/Zdoy1v+L2tL3n2b6 j7VlM/2XaUtf/qmy5VS3ZbTxW34+PO7c7fuPTlhD3po4x7Hr0PEJ/WjymG/f UFsfKiPtnmly+PpH96+9NadxDB3S59nn98YiPvSV5FSwzsL5HDt29qIth7js 2rGcA8557G9P2HusGYu7hGzIvSiL+EiarIxJ+gbqMTHOZb2GdRg+M25Bb+5c v48mNsP9yeV24zL+Mr6gzBkvv5p6T/pjxtjk2LuxVFI/2B65yXXgeJouWJN/ 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 3OE7++Bs6x41R678Oq6sEKF4/cP9au6Oi4/X96G5Ny4en4zX23117P4043Px /bh7qPxQjD75e7OheD3H3P0GG3vk3G/k0j/Mx79bLyPx+7it9sNxtIrXA/vf kDfvvofi9eyHw/H2450T7uHIux9OqP2h/6RdpT1N+4062hPaV/Yhe/nVN+yx ULyevp1zeI/Lte20FxxjPJIWrydXgD6CtUCX45/WVrry6OebPbvf166xv2vW ZmXw223WfpNrtrw/1CpPkmdgjYG/bo7ImAC7pF3D2gj3492wBd67cuR4+r/J Vj93yPzpT/9h/6aVh+7QGX2ub+NW8rPOjhzo0M+JJM8zucZL2a36nZAussjP GBNd4Aft3tzcxdFidIEuyclkvMKeClnlj9FFK/sCsQzKQx9uLJlF/jL9M68u Yvwziy7y+meMLvL6Z966mtc/q1JX8/pnletqXv+scl0tsy+ZjrpaZl+SRf4y /TNNF63kZ56GLZj3+r93mkcXzPf+87/+2+qWMZFb08kiP2VTR5hzEtdO00UW +wLzSsZS/vvUxMbJKWOuyXfmqc+98KJ9fmL5rCe58SLjO87hHRDsyu/S8te9 PxHST6gugYspUD774rK+w/PynKH2gbwR1rL8+NK+ji57v2SMrpUu+D3n//nz X2z52MSPFfkxrhdmvGzjDZzj/5ZCFl1DMsbVyv/TfCVZVpr8WepXUv9ZfZF6 wHtM3I/cw2SdRfYivh7Sf5b6ldWWafJnacvy2LKZ//j6L8OWyRhvK//MYssy /D/Wlln9v6gt8/h/FluW4f+xtpyutgzy7odD/0pb7u8t4h8L2TfU1vN99+ET E/2uhHg99yF2TjweOZK/e+UIxeuJ57DOTwzX3/uGd9SIeaT9rjRjPsYr+AAx 7WbxesolH8F9J05DP8rYyY+nY2v3/po75sfr8R/yM+hnX33z7eC96HP9fesZ f4T0gx4afXntfHwhpAvyN9yeNsm9gZwO8QNiWdyDvy4Gzvj45dp4CL/wcwr8 uBLzAXLYiWEdGMsVyRKvJ76PThn7MHZ1dbpVm5ImaxrMEey6jPcurS+Ti9Oj W388FYqXZY0finTc/vVTfd9W+9eLqcPPr3/UIAeLORq/cUG+wLzI3+Ypm6x9 bRLaOsYBea6lLylLfvYiy7MGWkT+JPQ7fu7pVMhfZllF5C/TvmXqIq99q6KL qvin6mpx+cssqyr+WYW6WkT+Msuqin9Woa6W6Z9Vqasx9g3twZp3T/6pIkbm Mn297PLL9P8yyy/TF8ssv+y+pMzyq2rLqvp/lW1ZVf+vqi2L7l8f2wfFnF8k Xi+EEOL/Fo9yvB7Yg4b1YN5z4ndQplMW1tb9/LIssFbKGMn/rfqs/LB5Z2Nd tijs0eB+U2Wq5A/BmnfWdx/LkL/ssvLKX6Z9y9RFEftWQRdV8U/V1eLyl11W FfyzKnW1TP9UXS3HvmX6ZxXqatn2fZSZbF1UpS0os/wyfbHs8susq2WWX1Vb Vtn/q2rLqvp/lW3J77gnf0OFPN+dBzvGlUded8zv2xaFvfh2HRy/xxvvk/m/ wSqEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhIjnxui/zODQiLk1fK/G3dqxB1HX3xz53QyM/OYdexAs Y3BoNFo2ZLo9NGz/3hi93/L8weFfJk1Pew8citbNZHH+6h3zwZJl5vkXZ5rX Z881i9qW2+Nvzlkw7bIVpbPvevQ1Ow92mPcWfWze+eAjs3n3QXtscdtnZuHi pWbeux+YN+bMjyrv6+832rLmLFhoLt3+LdM110YfmPc/ajMfLv3ULFi4yFwe +t3saT9pZYAnnnrGdJzrzyzDuSu3zZx3Ftrn+v6nHZmv6+ofsPf/8ONlZtmX 39hj327Y0pDjr48/aWWdTF3AV2vWWxl4hpM9V8yZS7caMsyY9apZve6nzGU5 3S5c3GY+Xr5i2nSx71iXeXv+e2ZuzaeOdPVNi3/m1UVV/LOqdbWIf1alrub1 z6rW1SL+qbo6OXX1Ue9L8uoC0Dv3/GjZ54V0cenO79Yn0MW7Hy75/9l78++q jizf87esX2vIXM70mC4vO21jPGOMJzzbGGMbY2yMsfGAGQ0YM4MYhBAgCQkx CCHQYMB2wuuqfuv1qqrursqqrlev31vdb/UPvfofir6fuIqruKE4955J0uHV 94fP0r1H58TZZ+8d04594maS4d1a3Xj2hZftPb/f31lIF2n5ZssPtee7wxw6 Ndg4tnT5x/YZXn7znaZj6MF9j+knqS5t33fU3Hvf/Y3va9dvNUve/8janeti 7UOZHOk5Z8unzfB1yL3nP/G0WffdTvv9/ZWf2br56JMLTO/QeOb7LF/1uX3+ tOe38hW/rCT50xLqPw0bv99r6xG62Hmou3H81PlR8+vf3GZ6LowV8vWY/su0 ZZL8M2XLVv7j67+oLX39l2nLov6fx5Zp/b+oLfP4fxpbFvX/PLasaltWhKL2 zUtX/0Xz9LMzF1fJE+/IC75ErOj3ET9Ht7FxcruY0mtvLzMr13w9p/o/PXw1 6r/3PfBQpvHpXIAvM85f8NyLueSfTf8Rcw/x+uHx6/Yzfy9O/FKoPK4nhl+W fFli8Hni9Tz/9GeYfmw22X34hDk72t4OzH8ZG7jvt3q8fuDydbsOkeZc4jGd p4fs53NjdXudOj9mYwH+eZ98sc62+WllYD7vZMja1js5GJ8d7Tvf9FzvZpxj 0oYzF88qB+e68+c9+kTT//YcOZlprFyGLtZt3Wk++2ZT0//eWvZh4/9poIxv tuyYU13A08++0Cgvixxl+mdeXVTFP6teV/P4ZxXqahn+WdW6msc/VVeL+2cr XdyqfUleXZy+dNXGmmP/y1NX3fySeXL34Egm+fGB2P+y6iIL73ywshGvJx7k 1iw++uyrtmPQmH78utQ7NGH1wNqa+z9rEvwlbr+vs6dl+1AG/ZeuNcbcxITc 8Q8/XWuf3cnv7MYaxpcbt2W6B3NzYmRZY1wxXwnLSpI/XfnT9Z9FLtoH4oPu OLFJcDHGvL4e0/9M2DKUfzZs6ftPqP8itozpfyZsmcf/89gyyX9C/RexZVH/ b2XLJPln0pZz1ZbtONA5TU5iwJt/2G/OjU/lW27be8Ts7DieS9d57Lvn6Cmz ZefBpmPkIuyu9UtZypkJsj5LGWSJE7U6l/6YcQBr6HOpw001/3L5JLci1I1Y vL4dWeJlIhu7z1wzJ0f+aL7r/dH0Xik2pt7W96PpuTxVxvba95WHLje+f318 zGzp+dGs6x43A2M37PlJZU3F62/aeDffbc597fOlGi53nhi8y8F3MW6+j9hz 6vOHi5PX1a+t58QTv6/nyY833TMsn3Lr5f/YtGbgx+DrZU2d1yhrdMIedzn8 3Ned52TjM/LxHP56AnL5MXuuJafffT85OGwOHu0223dMjTEOdZ0yh4/3mP2H j5nD3b1Wd3sPHrH/ow3bf6jTfj5wpMsc6x205508M2x6zo2YXfsOmn0dR83u /R2JNrn9zrvNgeOn2/pBGK9/8plFtj9esOhF24ZxrN6nLrHzn+MDw9FyDhzv N4teetXmnZETxTH69PdWrrb98YrVaxv3e/u9Fea2395uPx/rHzJvLv3A/m/t hq1m44599jttyBMLFtm2nj6cnDjGL+RiMWbgfPKrfFmZzyPnXffca9eA6dNb PXvYPnP/h+c/bjpOnGkcGxi5buewWeoWY4tPv1xv55NZ8jKh7+KEfR6nE8eH q77IFOeB519+3WzZddDOV3mOLNcyP57/+FONWJEDu2SJURTRBbz57nLrA6x/ u2OMkbKODV9/5/2aHx2zuSJZx7tl6YJ8UJuTuW6LHftljTmV5Z9FdFEV/6xy Xc3jn1Woq0X9s8p1Nat/qq6W558xXeTxz6r0JXl1QbyA2Ad+FeZJZtWFDzY+ myHGTm45uiBm7ccb8ujCQQ4o4zT/GOMxxoXuux+vJ2bCe538ZTzIWNCdF5vf h/oJ6xI65Z1RF6MH1gG4jrEg75dwLGwfDp86a8eg/r2IAxGvyqMHpwu3NrW3 s8eOgRnXhjFGckvJq0lbLn773OLX7LpP3pxU5yutyvLlT0tM/1kgHvbBJ2vs Z3yBsTt2C2N3WX29lf7LtKUv/2zZ0vefJP3nsWUr/Zdpy6z+X9SWvv+00n9W W7bSf5m29OWfLVvOdltGG7/h+71N527eeWDaGvLG4BzH1j2HpvWj4THfvrG2 PlZG0j2T5PD1j+4ff3ph4xg6pM+zz++NRXzoK8mpYJ2F8zl2sLvflkNcds1k zgHn3Pa7O+w9Vk/GXWI25F6URXwkSVbGJH3D9ZgY57JewzoMnxm3oDd3rt9H E5vh/uRyu3EZfxlfUOZDjzyWeE/6Y8bY5Ni7sVSoH2yP3OQ6cDxJF6zJP/7U Qjs+W7Nuc6L+Gf9Qx3hPhHuybsRnnpFzGRvjc3y+8+7fN677evMOm6fPuMWN m8IYVOwZuQf/51wXG6cuIkP93dm3E8d+oaxJegzj9TH5yVXhHV30Sl3OGi8T 2fimu97eEq8/OvSzWX+SWPpNG1Pf0jNhj8Pm2ueu4V/Mio4R80P/VbPx5IQ5 feWGjcFvqH0+eO6nafF6+LJrqj3//NiovR/l+feO4e+H4+LkNm4/ufeLi4ET V4/tS3PRy8+334N4uMOPu8fKn/r/zcl9eaZfh3x+/B1ZmsqaPLceq79qz/XX Cdw6Qh777TlwqPGZeH3fhVH7eff++vEj3b2mf3jCdA9csLF5ju0/0mVODEzN J4jXd56qz4EOH+81fUPZ+2CfMF5Pe8d4gHgFsXfyz4n90ybRbixb8WliWdT/ Ddv3mAfnPWq/06eTy+Wfw3oAczTaDNrhpHg9+YDcnzb4g48/m3x/e4mV4557 77MyhrJShtvnJ82zh30t/TbH/HkgMX36rCw6/XrT97YN5t0x3ifM+r4Rc1r6 yC5vbYT2Pqtt2etoV60vom1+LuMaPLbhWqdXoC/HB2ZTF/gU8SX6GncM++JD WcpBn8RXyIvMmltXli7wzb++/w92zWvlmq8y76VQln8W0UVV/LPKdTWPf1ah rhb1z6rW1Tz+qbpann/GdHEr9yVFdOEgBuLWTPLowkFsA//Mcy3683M48+iC +sY6CnK4OBLrROg4jN/78Xogn4SYOvN1xn7ueBivj+nHr0uMMx94aJ6dy7Pf kMvD4HkY2zLHJqbg5A3bB+JMlEWd5ztzZ/tMtbGsi/NngbWQPZPz+btrY1XG s+zbQ8zAxWcY92bNi8T3GQezhke5WdesfF9pVZYvfxqS9J8WdMy7TOiGdu53 d9xly2I/kGUrVhXy9ST9l2lLX/7ZsqXvP630n9WWrfRfpi3z+H9RW6bx/zy2 LOr/aW2Z1f+L2jKt/5fdloXz8jTxeuLutOH+mkTsWGjfWFvPGgL9lx8Xid0z 6VgMv09jPEbOgetvYtBXuvg4eYuuDHfNH+bNb7xvkCbXnWciHnv/gw8n7ltE v0heCPdwYzX0w5o2cSI/rhK7J3mdzo783+WXtJKP5yTPk7EtNojph/Ej/ka8 3O2BGNPFw7UyGHu00z/jFHza36ORsWWs3vrXMe5zuiR+zudYDCoE3bn8AOoT folPUifb7YERkzVGUn69Lz97DrE/oL8PZpZ4mciGi6cTQycWf2bsps2zX3X4 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 1u5cF2sfyuRIzzlbPm2Gr0PuPf+Jp82673ba7++v/MzWzUefXGB6h8Yz32f5 qs/t86c9v5Wv+GUlyZ+WUP9p2Pj9XluP0MXOQ92N46fOj5pf/+Y203NhrJCv x/Rfpi2T5J8pW7byH1//RW3p679MWxb1/zy2TOv/RW2Zx//T2LKo/+exZVXb siIUtW9euvovmqefnbm4Sp54R17wJWJFv4/4ObqNjZPbxZRee3uZWbnm6znV /+nhq1H/ve+BhzKNT+cCfJlx/oLnXswl/2z6j5h7iNcPj1+3n/l7ceKXQuVx PTH8suTLEoPPE6/n+ac/w/Rjs8nuwyfM2dH2dmD+y9jAfb/V4/UDl6/bdYg0 5xKP6Tw9ZD+fG6vb69T5MRsL8M/75It1ts1PKwPzeSdD1rbeycH47Gjf+abn ejfjHJM2nLl4Vjk4150/79Enmv6358jJTGPlMnSxbutO89k3m5r+99ayDxv/ TwNlfLNlx5zqAp5+9oVGeVnkKNM/8+qiKv5Z9bqaxz+rUFfL8M+q1tU8/qm6 Wtw/W+niVu1L8uri9KWrNtYc+1+euurml8yTuwdHMsmPD8T+l1UXWXjng5WN eD3xILdm8dFnX7Udg8b049el3qEJqwfW1tz/WZPgL3H7fZ09LduHMui/dK0x 5iYm5I5/+Ola++xOfmc31jC+3Lgt0z2YmxMjyxrjivlKWFaS/OnKn67/LHLR PhAfdMeJTYKLMeb19Zj+Z8KWofyzYUvff0L9F7FlTP8zYcs8/p/Hlkn+E+q/ iC2L+n8rWybJP5O2nKu2bMeBzmlyEgPe/MN+c258Kt9y294jZmfH8Vy6zmPf PUdPmS07DzYdIxdhd61fylLOTJD1WcogS5yo1bn0x4wDWEOfSx1uqvmXyye5 FaFuxOL17cgSLxP/YzAVr79p4918tzn3tc+XarjceWLwLgffxbj5PmLPqc8f Lk5eV7+2nhNP/L6eJz/edM+wfMqtl/9j05qBH4OvlzV1XqOs0Ql73OXwc193 npONz8jHc/jrCcjlx+y5lpx+9/3k4LA5eLTbbN8xNcY41HXKHD7eY/YfPmYO d/da3e09eMT+jzZs/6FO+/nAkS5zrHfQnnfyzLDpOTdidu07aPZ1HDW793ck 2uT2O+82B46fbmu7MF7/5DOLbH+8YNGLtg3jWL1PXWLnP8cHhqPlHDjebxa9 9KrNOyMnimP06e+tXG374xWr1zbu9/Z7K8xtv73dfj7WP2TeXPqB/d/aDVvN xh377HfakCcWLLJtPX04OXGMX8jFYszA+eRX+bIyn0fOu+65164B06e3evaw feb+D89/3HScONM4NjBy3c5hs9QHxhaffrneziez5GVC38UJ+zxOJ44PV32R Kc4Dz7/8utmy66Cdr/IcWa5lfjz/8acasSIHdskSoyiiC3jz3eXWB1j/dscY I2UdG77+zvs1Pzpmc0WyjnfL0gX5oDYnc90WO/bLGnMqyz+L6KIq/lnluprH P6tQV4v6Z5Xralb/VF0tzz9jusjjn1XpS/LqgngBsQ/8KsyTzKoLH2x8NkOM ndxydEHM2o835NGFgxxQxmn+McZjjAvddz9eT8yE9zr5y3iQsaA7Lza/D/UT 1iV0yjujLkYPrANwHWNB3i/hWNg+HD511o5B/XsRByJelUcPThdubWpvZ48d AzOuDWOM5JaSV5O2XPz2ucWv2XWfvDmpzldaleXLn5aY/rNAPOyDT9bYz/gC Y3fsFsbusvp6K/2XaUtf/tmype8/SfrPY8tW+i/Tlln9v6gtff9ppf+stmyl /zJt6cs/W7ac7baMNn7D93ubzt2888C0NeSNwTmOrXsOTetHw2O+fWNtfayM pHsmyeHrH90//vTCxjF0SJ9nn98bi/jQV5JTwToL53PsYHe/LYe47JrJnAPO ue13d9h7rJ6Mu8RsyL0oi/hIkqyMSfqG6zExzmW9hnUYPjNuQW/uXL+PJjbD /cnlduMy/jK+oMyHHnks8Z70x4yxybF3Y6lQP9geucl14HiSLliTf/yphXZ8 tmbd5kT9M/6hjvGeCPdk3YjPPCPnMjbG5/h8592/b1z39eYdNk+fcYsbN4Ux qNgzcg/+z7kuNk5dRIb6u7NvJ479QlmT9BjG62Pyk6vCO7rolbqcNV4msrH7 zDVzcuSP5rveH03vlWI5MNv6fjQ9l6fK2F77vvLQ5cb3rbV7bOn50Xx8+LIZ GLthz08qy98Px8XJbdx+cu8XFwMnrh7bl+ail59vvwfxcIcfd4+VP/X/m5P7 8ky/Dvn8+DuyNJU1eW49Vn/VnuuvE7h1hDw633PgUOMz8fq+C6N1u+6vHz/S 3Wv6hydM98AFG5vn2P4jXebEwNR8gnh956n6HOjw8V7TN5S9D/YJ4/W0d4wH iFcQeyf/nNg/bRLtxrIVnyaWRf3fsH2PeXDeo/Y7fTq5XP45rAcwR6PNoB1O iteTD8j9aYM/+Pizyfe3l1g57rn3PitjKCtluH1+0jx72NfSb3PMnwcS06fP yqLTrzd9b9tg3h3jfcKs7xsxp6WP7PLWRmjvs9qWvY521foi2ubnMq7BYxuu dXoF+nJ8YDZ1gU8RX6KvccewLz6UpRz0SXyFvMisuXVl6QLf/Ov7/2DXvFau +SrzXgpl+WcRXVTFP6tcV/P4ZxXqalH/rGpdzeOfqqvl+WdMF7dyX1JEFw5i IG7NJI8uHMQ28M8816I/P4czjy6ob6yjIIeLI7FOhI7D+L0frwfySYipM19n 7OeOh/H6mH78usQ484GH5tm5PPsNuTwMnoexLXNsYgpO3rB9IM5EWdR5vjN3 ts9UG8u6OH8WWAvZMzmfv7s2VmU8y749xAxcfIZxb9a8SHyfcTBreJSbdc3K 95VWZfnypyFJ/2lBx7zLhG5o5353x122LPYDWbZiVSFfT9J/mbb05Z8tW/r+ 00r/WW3ZSv9l2jKP/xe1ZRr/z2PLov6f1pZZ/b+oLdP6f9ltWTgvTxOvJ+5O G+6vScSOhfaNtfWsIdB/+XGR2D2TjsXw+zTGY+QcuP4mBn2li4+Tt+jKcNf8 Yd78xvsGaXLdeSbisfc/+HDivkX0i+SFcA83VkM/rGkTJ/LjKrF7ktfp7Mj/ XX5JK/l4TvI8Gdtig5h+GD/ib8TL3R6IMV08XCuDsUc7/TNOwaf9PRoZW8bq rX8d4z6nS+LnfI7FoELQncsPoD7hl/gkdbLdHhgxWWMk5df78rPnEPsD+vtg ZomXiWx8011vd4jXHx362aw/OW4Gxm6add3jZkvPhD0Om2ufu4Z/MSs6RswP /VfNxpMT5vSVG+br42NmQ+3zwXM/TYvXw5ddzWN11gcOnLvedO8YQ0G8HWLx dHtu7Rjn+jHvafH6hP1w0sfrkz/X4/X1Os89XZ7+hUi8fvo+Nzcbcfzw+UNZ Y/vhhPH6/sm1THd88MpPpuPYSbP/cFdDHuL1Z705g43X99Tz1Do6T5je8/E2 v4z9cPjs8qDalcN6JvMu3uUjJs8xxh7hOjztM++j8z4035l7u7kYfYWL1zMG YC5M++/2yAvHtKGs/KUtZX21nbzox3+fzvXp9E8Pe3ER1gqYl/vXtupnYd+x XrsPK5+Xf/J5Y6882t5We/zR5rr+hjVj+icnU6zPI/7QSg7GJfQjjHX8fV7b yY8N3XovcQV3Pjoj3uGfi7yt5rRJukgjv7MJcQU/H9H5VxZd8H4He/XyGX92 z9dO/iy6aGdfyqF/5zN9sMubyKKLMvwzry6y+Gc7XRTxzyy6yOufeetqXv+s Ql0twz+rWFfz+GfV62qZfclc1NUy+5I08pfpn0m6yOKf2LJIXbXX1fwyFudv J7/TFbnv/vUxXbSzL3sKfrVpe9NvCXy5cbvNUQzPDeP1/nFiAu576J8x/cTq Eric1KO9582SyVw89MTvFyS1D8A7LGu8fZLwKebH/h4I7XQBjKcZB4fH/ZxU 9E8MhrFqFl07yLPzc1LT+H+Sr4RlxeRPU36o/7S+iD0Y58feBfZzgvP6ekz/ kKZ+pbFlkvxpys9ryyT/CfVf1JZhTnY7/0xry6L+n8eWafy/qC1D/afxz7S2 LOr/WW2Z5D+h/stuy4A1Cf8dgnbxeuLCxHf99w9jx5LsG2vr0RX7BLh13vCe rY7FCPs08sOJwYZ77Dj8vtJdy1jD6ZWcSKeTdvF64rOsi5AfQI56+D6ZD7ET 9i9wz02+JX0jdvb9MbYfvB+v93/PIDaucCzy9u/yx2WhfrAd6w28G4dtYrrg t3eS1tmcjjiPuDrlYzvn3/i0nzMQsxvraE5W5Aj/n2QH6pGrL6ydMWbiGdq9 V5Ukawz0E8vDCWWivWAs5MZGSfGytPFDkYyLpxOTJxZ/ZuymzbNfdfiKjcsT v+d/p0bq9fir4/XzibXvGrhm1p8Yt+dt77uaKl6/pnO08fnb2rWD4/F3NmLx +qn9aq42xcfr+9Bca4rHh/F6u6+O3Z+mORffj7vHyo/F6MPfm43F6znm7jfS 2CPnRiOXfiof/2q9jOD3cdvth+NoF68H9r8hb959j8Xr2Q+H4/sOdU67hyPv fjix9of+k3aV9jTpN+poT2hf2YfskceetMdi8Xr6ds7hPS7XttNecIzxSFK8 nlwB+gjWAl2Of1Jb6cqjn2/17H5fu9r+rtkSK4PfbrP2G67Z8v5QuzxJnoE1 Bv66OSJjAuySdA1rI9yPd8Oe996VI8fT/022+rmj5le/+jP7N6k8dIfO6HN9 G7eTn3V25ECHfk4keZ7hGi9lt+t3YrpIIz9jTHSBH+zz5uYujpZFF+iSnEzG K+ypkFb+LLpoZ18glkF56MONJdPIX6Z/5tVFFv9Mo4u8/plFF3n9M29dzeuf Vamref2zynU1r39Wua6W2ZfMRV0tsy9JI3+Z/pmki3byM0/DFsx7/d87zaML 5nt//hd/aXXLmMit6aSRn7KpI8w5iWsn6SKNfYF5JWMp/31qYuPklDHX5Dvz 1PseeNA+P7F81pPceJHxHefwDgh25Xdp+even4jpJ1aXwMUUKJ99cVnf4Xl5 zlj7QN4Ia1l+fOmHji57vzBG104X/J7zX/36N7Z8bOLHivwY1wMPPWLjDZzj /5ZCGl1DGONq5/9JvhKWlSR/mvoV6j+tL1IPeI+J+5F7GNZZZC/i6zH9p6lf aW2ZJH+atiyPLVv5j6//MmwZxnjb+WcaW5bh/1ltmdb/i9oyj/+nsWUZ/p/V lnPVlkHe/XDoX2nL/b1F/GMx+8baer5v23t4ut+VEK/nPsTOiccjR/i7V45Y vJ54Duv8xHD9vW94R42YR9LvSjPmY7yCDxDTbhWvp1zyEdx34jT0o4yd/Hg6 tnbvr7ljfrwe/yE/g372saeeid6LPtfft57xR0w/6KHRl9fOxxdiuiB/w+1p E+4N5HSIHxDL4h78dTFwxseP1MZD+IWfU+DHlZgPkMNODGvXZK5Imng98X10 ytiHsaur0+3alCRZk2COYNdlvHdpfZlcnB7d+uOpWLwsbfxQJOPn13df+sV+ 77tyw8bS2b9m7+D1pr1y3PnuPP4Spyc3P4zXc+37By7ZnHq+Hx/+xZYV3lvM LX5+/a0GOVjM0fiNC/IFFmX8bZ6ySdvXhtDWMQ7Icy19SVnysxdZnjXQIvKH 0O/4uaezIX+ZZRWRv0z7lqmLvPatii6q4p+qq8XlL7OsqvhnFepqEfnLLKsq /lmFulqmf1alrmaxb2wP1rx78s8WWWQu09fLLr9M/y+z/DJ9sczyy+5Lyiy/ qrasqv9X2ZZV9f+q2rLo/vVZ+6As5xeJ1wsh/n3h9q+f7fu2279ezB63crwe 2IOG9WDec+J3UOZSFtbW/fyyNLBWyhjJ/636tHyx/rvGumxR2KPB/abKbMkf gzXvtO8+liF/2WXllb9M+5apiyL2rYIuquKfqqvF5S+7rCr4Z1Xqapn+qbpa jn3L9M8q1NWy7XsrM9O6qEpbUGb5Zfpi2eWXWVfLLL+qtqyy/1fVllX1/yrb kt9xD39DhTzf73Z3NJVHXneW37ctCnvxbd3dvMcb75P5v8EqhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYTIztDEH83I6Li5NHatxtXasZuZrr84/rMZHv/JO3YzWsbI6ERm2ZDp8uiY /Ts0caPt+SNjP86Ynnbs2pNZNzPFyXNXzCtvLjX3PzjPPLHgWfPakmX2+FML n59z2YrS2Xch8zXf7e4wL732lnnhlTfM+m277bHXl7xnFr/+tln04ivmyYXP ZSrv48+/sWUtfH6xOXP5p1TXnJ+4aV5+Y4l59e13zfOLXzODoz+b7fuOWBng jrvuMR0nBlLLcOLsZbPwhcX2uT7/dkvq67oGhu39X31rqVn64Sf22KdfbWjI 8dvb77SyzqQu4KPVX1oZeIYjPWfN8TOXGjI8NP8xs2rtt6nLcrpd/PoS89ay 5XOmix8OdplnnnvJPFvzqf1dfXPin3l1URX/rGpdLeKfVamref2zqnW1iH+q rs5MXb3V+5K8ugD0zj3fWPp+IV2cufKz9Ql08eKrb2aS4d1a3Xj2hZftPb/f 31lIF2n5ZssPtee7wxw6Ndg4tnT5x/YZXn7znaZj6MF9j+knqS5t33fU3Hvf /Y3va9dvNUve/8janeti7UOZHOk5Z8unzfB1yL3nP/G0WffdTvv9/ZWf2br5 6JMLTO/QeOb7LF/1uX3+tOe38hW/rCT50xLqPw0bv99r6xG62Hmou3H81PlR 8+vf3GZ6LowV8vWY/su0ZZL8M2XLVv7j67+oLX39l2nLov6fx5Zp/b+oLfP4 fxpbFvX/PLasaltWhKL2zUtX/0Xz9LMzF1fJE+/IC75ErOj3ET9Ht7FxcruY 0mtvLzMr13w9p/o/PXw16r/3PfBQpvHpXIAvM85f8NyLueSfTf8Rcw/x+uHx 6/Yzfy9O/FKoPK4nhl+WfFli8Hni9Tz/9GeYfmw22X34hDk72t4OzH8ZG7jv t3q8fuDydbsOkeZc4jGdp4fs53NjdXudOj9mYwH+eZ98sc62+WllYD7vZMja 1js5GJ8d7Tvf9FzvZpxj0oYzF88qB+e68+c9+kTT//YcOZlprFyGLtZt3Wk+ +2ZT0//eWvZh4/9poIxvtuyYU13A08++0Cgvixxl+mdeXVTFP6teV/P4ZxXq ahn+WdW6msc/VVeL+2crXdyqfUleXZy+dNXGmmP/y1NX3fySeXL34Egm+fGB 2P+y6iIL73ywshGvJx7k1iw++uyrtmPQmH78utQ7NGH1wNqa+z9rEvwlbr+v s6dl+1AG/ZeuNcbcxITc8Q8/XWuf3cnv7MYaxpcbt2W6B3NzYmRZY1wxXwnL SpI/XfnT9Z9FLtoH4oPuOLFJcDHGvL4e0/9M2DKUfzZs6ftPqP8itozpfyZs mcf/89gyyX9C/RexZVH/b2XLJPln0pZz1ZbtONA5TU5iwJt/2G/OjU/lW27b e8Ts7DieS9d57Lvn6CmzZefBpmPkIuyu9UtZypkJsj5LGWSJE7U6l/6YcQBr 6HOpw001/3L5JLci1I1YvL4dWeJlIhu7z1wzJ0f+aL7r/dH0Xik2pt7W96Pp uTxVxvba95WHLje+7zh91WzumTD7zl43A2M37PlJZU3F62/aeDffbc597fOl Gi53nhi8y8F3MW6+j9hz6vOHi5PX1a+t58QTv6/nyY833TMsn3Lr5f/YtGbg x+DrZU2d1yhrdMIedzn83Ned52TjM/LxHP56AnL5MXuuJafffT85OGwOHu02 23dMjTEOdZ0yh4/3mP2Hj5nD3b1Wd3sPHrH/ow3bf6jTfj5wpMsc6x205508 M2x6zo2YXfsOmn0dR83u/R2JNrn9zrvNgeOn2/pBGK9/8plFtj9esOhF24Zx rN6nLrHzn+MDw9FyDhzvN4teetXmnZETxTH69PdWrrb98YrVaxv3e/u9Fea2 395uPx/rHzJvLv3A/m/thq1m44599jttyBMLFtm2nj6cnDjGL+RiMWbgfPKr fFmZzyPnXffca9eA6dNbPXvYPnP/h+c/bjpOnGkcGxi5buewWeoWY4tPv1xv 55NZ8jKh7+KEfR6nE8eHq77IFOeB519+3WzZddDOV3mOLNcyP57/+FONWJED u2SJURTRBbz57nLrA6x/u2OMkbKODV9/5/2aHx2zuSJZx7tl6YJ8UJuTuW6L HftljTmV5Z9FdFEV/6xyXc3jn1Woq0X9s8p1Nat/qq6W558xXeTxz6r0JXl1 QbyA2Ad+FeZJZtWFDzY+myHGTm45uiBm7ccb8ujCQQ4o4zT/GOMxxoXuux+v J2bCe538ZTzIWNCdF5vfh/oJ6xI65Z1RF6MH1gG4jrEg75dwLGwfDp86a8eg /r2IAxGvyqMHpwu3NrW3s8eOgRnXhjFGckvJq0lbLn773OLX7LpP3pxU5yut yvLlT0tM/1kgHvbBJ2vsZ3yBsTt2C2N3WX29lf7LtKUv/2zZ0vefJP3nsWUr /Zdpy6z+X9SWvv+00n9WW7bSf5m29OWfLVvOdltGG7/h+71N527eeWDaGvLG 4BzH1j2HpvWj4THfvrG2PlZG0j2T5PD1j+4ff3ph4xg6pM+zz++NRXzoK8mp YJ2F8zl2sLvflkNcds1kzgHn3Pa7O+w9Vk/GXWI25F6URXwkSVbGJH3D9ZgY 57JewzoMnxm3oDd3rt9HE5vh/uRyu3EZfxlfUOZDjzyWeE/6Y8bY5Ni7sVSo H2yP3OQ6cDxJF6zJP/7UQjs+W7Nuc6L+Gf9Qx3hPhHuybsRnnpFzGRvjc3y+ 8+7fN677evMOm6fPuMWNm8IYVOwZuQf/51wXG6cuIkP93dm3E8d+oaxJegzj 9TH5yVXhHV30Sl3OGi8T2fimu97eEq8/OvSzWX9y3AyM3TTrusfNlp4JexyI s3cN/2JWdIyYH/qvmo0nJ8zpKzfM18fHzIba54PnfpoWr4cvu+rln5+otb8H R2yZewevN907hr8fjouT27j95N4vLgZOXD22L81FLz/ffg/i4Q4/7h4rf+r/ Nyf35Zl+HfL58XdkaSpr8tx6rP6qPddfJ3DrCHnst+fAocZn4vV9F0bt5937 68ePdPea/uEJ0z1wwcbmObb/SJc5MTA1nyBe33mqPgc6fLzX9A1l74N9wng9 7R3jAeIVxN7JPyf2T5tEu7FsxaeJZVH/N2zfYx6c96j9Tp9OLpd/DusBzNFo M2iHk+L15ANyf9rgDz7+bPL97SVWjnvuvc/KGMpKGW6fnzTPHva19Nsc8+eB xPTps7Lo9OtN39s2mHfHeJ8w6/tGzGnpI7u8tRHa+6y2Za+jXbW+iLb5uYxr 8NiGa51egb4cH5hNXeBTxJfoa9wx7IsPZSkHfRJfIS8ya25dWbrAN//6/j/Y Na+Va77KvJdCWf5ZRBdV8c8q19U8/lmFulrUP6taV/P4p+pqef4Z08Wt3JcU 0YWDGIhbM8mjCwexDfwzz7Xoz8/hzKML6hvrKMjh4kisE6HjMH7vx+uBfBJi 6szXGfu542G8PqYfvy4xznzgoXl2Ls9+Qy4Pg+dhbMscm5iCkzdsH4gzURZ1 nu/Mne0z1cayLs6fBdZC9kzO5++ujVUZz7JvDzEDF59h3Js1LxLfZxzMGh7l Zl2z8n2lVVm+/GlI0n9a0DHvMqEb2rnf3XGXLYv9QJatWFXI15P0X6Ytffln y5a+/7TSf1ZbttJ/mbbM4/9FbZnG//PYsqj/p7VlVv8vasu0/l92WxbOy9PE 64m704b7axKxY6F9Y209awj0X35cJHbPpGMx/D6N8Rg5B66/iUFf6eLj5C26 Mtw1f5g3v/G+QZpcd56JeOz9Dz6cuG8R/SJ5IdzDjdXQD2vaxIn8uErsnuR1 Ojvyf5df0ko+npM8T8a22CCmH8aP+BvxcrcHYkwXD9fKYOzRTv+MU/Bpf49G xpaxeutfx7jP6ZL4OZ9jMagQdOfyA6hP+CU+SZ1stwdGTNYYSfn1vvzsOcT+ gP4+mFniZSIbLp5OTJ5Y/JmxmzbPftXhKzYuT/ye/50aqbdtXx2vn0+sfdfA NbP+xLg9b3vf1bbxepdr/9nRep34tnbt4Hh8DWgoiLdDLJ5uz60d41w/5j0t Xp+wH076eH3y53q8vl7nuafL078QiddP3+fmZiOOHz5/KGtsP5wwXt8/uZbp jg9e+cl0HDtp9h/uashDvP6sN2ew8fqeep5aR+cJ03s+3uaXsR8On10eVLty WM9k3sW7fMTkOcbYI1yHp33mfXTeh+Y7c283F6OvcPF6xgDMhWn/3R554Zg2 lJW/tKWsr7aTF/3479O5Pp3+6WEvLsJaAfNy/9pW/SzsO9Zr92Hl8/JPPm/s lUfb22qPP9pc19+wZkz/5GSK9XnEH1rJwbiEfoSxjr/Pazv5saFb7yWu4M5H Z8Q7/HORt9WcNkkXaeR3NiGu4OcjOv/Kogve72CvXj7jz+752smfRRft7Es5 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 CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBC CCGEEEIIIYQQQgghhBBCCCGEEEJkZ2jij2ZkdNxcGrtW42rt2M1M118c/9kM j//kHbsZLWNkdCKzbMh0eXTM/h2auNH2/JGxH2dMTzt27cmsm5ni5Lkr5pU3 l5r7H5xnnljwrHltyTJ7/KmFz8+5bEXp7LuQ+ZrvdneYl157y7zwyhtm/bbd 9tjrS94zi19/2yx68RXz5MLnMpX38eff2LIWPr/YnLn8U6przk/cNC+/scS8 +va75vnFr5nB0Z/N9n1HrAxwx133mI4TA6llOHH2sln4wmL7XJ9/uyX1dV0D w/b+r7611Cz98BN77NOvNjTk+O3td1pZZ1IX8NHqL60MPMORnrPm+JlLDRke mv+YWbX229RlOd0ufn2JeWvZ8jnTxQ8Hu8wzz71knq351P6uvjnxz7y6qIp/ VrWuFvHPqtTVvP5Z1bpaxD9VV2emrt7qfUleXQB6555vLH2/kC7OXPnZ+gS6 ePHVNzPJ8G6tbjz7wsv2nt/v7yyki7R8s+WH2vPdYQ6dGmwcW7r8Y/sML7/5 TtMx9OC+x/STVJe27ztq7r3v/sb3teu3miXvf2TtznWx9qFMjvScs+XTZvg6 5N7zn3jarPtup/3+/srPbN189MkFpndoPPN9lq/63D5/2vNb+YpfVpL8aQn1 n4aN3++19Qhd7DzU3Th+6vyo+fVvbjM9F8YK+XpM/2XaMkn+mbJlK//x9V/U lr7+y7RlUf/PY8u0/l/Ulnn8P40ti/p/HltWtS0rQlH75qWr/6J5+tmZi6vk iXfkBV8iVvT7iJ+j29g4uV1M6bW3l5mVa76eU/2fHr4a9d/7Hngo0/h0LsCX GecveO7FXPLPpv+IuYd4/fD4dfuZvxcnfilUHtcTwy9Lviwx+Dzxep5/+jNM Pzab7D58wpwdbW8H5r+MDdz3Wz1eP3D5ul2HSHMu8ZjO00P287mxur1OnR+z sQD/vE++WGfb/LQyMJ93MmRt650cjM+O9p1veq53M84xacOZi2eVg3Pd+fMe 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 xqpZdO0gz87PSU3j/0m+EpYVkz9N+aH+0/oi9mCcH3sX2M8JzuvrMf1DmvqV xpZJ8qcpP68tk/wn1H9RW4Y52e38M60ti/p/Hlum8f+itgz1n8Y/09qyqP9n tWWS/4T6L7stA9Yk/HcI2sXriQsT3/XfP4wdS7JvrK1HV+wT4NZ5w3u2OhYj 7NPIDycGG+6x4/D7SnctYw2nV3IinU7axeuJz7IuQn4AOerh+2Q+xE7Yv8A9 N/mW9I3Y2ffH2H7wfrze/z2D2LjCscjbv8sfl4X6wXasN/BuHLaJ6YLf3kla Z3M64jzi6pSP7Zx/49N+zkDMbqyjOVmRI/x/kh2oR66+sHbGmIlnaPdeVZKs MdBPLA8nlIn2grGQGxslxcvSxg9FMn5+ffelX+z3vis3bCx9a+3Y3sHrTXvl uPPdefwlTk9uvh+vPzfxH8y7+y6ZTacmbBnhd7+sGLF4/dR+NVeb4uP1fWiu NcXjw3i93VfH7k/TnIvvx91j5cdi9OHvzcbi9Rxz9xtp7JFzo5FLP5WPf7Ve RvD7uO32w3G0i9cD+9+QN+++x+L17IfD8X2HOqfdw5F3P5xY+0P/SbtKe5r0 G3W0J7Sv7EP2yGNP2mOxeD19O+fwHpdr22kvOMZ4JCleT64AfQRrgS7HP6mt dOXRz7d6dr+vXW1/12yJlcFvt1n7DddseX+oXZ4kz8AaA3/dHJExAXZJuoa1 Ee7Hu2HPe+/KkePp/yZb/dxR86tf/Zn9m1QeukNn9Lm+jdvJzzo7cqBDPyeS PM9wjZey2/U7MV2kkZ8xJrrAD/Z5c3MXR8uiC3RJTibjFfZUSCt/Fl20sy8Q y6A89OHGkmnkL9M/8+oii3+m0UVe/8yii7z+mbeu5vXPqtTVvP5Z5bqa1z+r XFfL7Evmoq6W2Zekkb9M/0zSRTv5madhC+a9/u+d5tEF870//4u/tLplTOTW dNLIT9nUEeacxLWTdJHGvsC8krGU/z41sXFyyphr8p156n0PPGifn1g+60lu vMj4jnN4BwS78ru0/HXvT8T0E6tL4GIKlM++uKzv8Lw8Z6x9IG+EtSw/vvRD R5e9Xxija6cLfs/5r379G1s+NvFjRX6M64GHHrHxBs7xf0shja4hjHG18/8k XwnLSpI/Tf0K9Z/WF6kHvMfE/cg9DOssshfx9Zj+09SvtLZMkj9NW5bHlq38 x9d/GbYMY7zt/DONLcvw/6y2TOv/RW2Zx//T2LIM/89qy7lqyyDvfjj0r7Tl /t4i/rGYfWNtPd+37T083e9KiNdzH2LnxOORI/zdK0csXk88h3V+Yrj+3je8 o0bMI+l3pRnzMV7BB4hpt4rXUy75CO47cRr6UcZOfjwdW7v319wxP16P/5Cf QT/72FPPRO9Fn+vvW8/4I6Yf9NDoy2vn4wsxXZC/4fa0CfcGcjrED4hlcQ/+ uhg44+NHauMh/MLPKfDjSswHyGEnhrVrMlckTbye+D46ZezD2NXV6XZtSpKs STBHsOsy3ru0vkwuTo9u/fFULF6WNn4oknH718/2fdvtXy9mDz+//laDHCzm aPzGBfkCizL+Nk/ZpO1rQ2jrGAfkuZa+pCz52YsszxpoEflD6Hf83NPZkL/M sorIX6Z9y9RFXvtWRRdV8U/V1eLyl1lWVfyzCnW1iPxlllUV/6xCXS3TP6tS V7PYN7YHa949+WeLLDKX6etll1+m/5dZfpm+WGb5ZfclZZZfVVtW1f+rbMuq +n9VbVl0//qsfVCW84vE64UQQvz74laO1wN70LAezHtO/A7KXMrC2rqfX5YG 1koZI/m/VZ+WL9Z/11iXLQp7NLjfVJkt+WOw5p323ccy5C+7rLzyl2nfMnVR xL5V0EVV/FN1tbj8ZZdVBf+sSl0t0z9VV8uxb5n+WYW6WrZ9b2VmWhdVaQvK LL9MXyy7/DLrapnlV9WWVfb/qtqyqv5fZVvyO+7hb6iQ5/vd7o6m8sjrzvL7 tkVhL76tu5v3eON9Mv83WIUQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEII IYQQQgghhBBCCCGEELceQxN/NCOj4+bS2LUaV2vHbma6/uL4z2Z4/Cfv2M1o GSOjE5llQ6bLo2P279DEjbbnj4z9OGN62rFrT2bdzBQnz10xr7y51Nz/4Dzz xIJnzWtLltnjTy18fs5lK0pn34XM13y3u8O89Npb5oVX3jDrt+22x15f8p5Z /PrbZtGLr5gnFz6XqbyPP//GlrXw+cXmzOWfUl1zfuKmefmNJebVt981zy9+ zQyO/my27ztiZYA77rrHdJwYSC3DibOXzcIXFtvn+vzbLamv6xoYtvd/9a2l ZumHn9hjn361oSHHb2+/08o6k7qAj1Z/aWXgGY70nDXHz1xqyPDQ/MfMqrXf pi7L6Xbx60vMW8uWz5kufjjYZZ557iXzbM2n9nf1zYl/5tVFVfyzqnW1iH9W pa7m9c+q1tUi/qm6OjN19VbvS/LqAtA793xj6fuFdHHmys/WJ9DFi6++mUmG d2t149kXXrb3/H5/ZyFdpOWbLT/Unu8Oc+jUYOPY0uUf22d4+c13mo6hB/c9 pp+kurR931Fz7333N76vXb/VLHn/I2t3rou1D2VypOecLZ82w9ch957/xNNm 3Xc77ff3V35m6+ajTy4wvUPjme+zfNXn9vnTnt/KV/yykuRPS6j/NGz8fq+t R+hi56HuxvFT50fNr39zm+m5MFbI12P6L9OWSfLPlC1b+Y+v/6K29PVfpi2L +n8eW6b1/6K2zOP/aWxZ1P/z2LKqbVkRito3L139F83Tz85cXCVPvCMv+BKx ot9H/BzdxsbJ7WJKr729zKxc8/Wc6v/08NWo/973wEOZxqdzAb7MOH/Bcy/m kn82/UfMPcTrh8ev28/8vTjxS6HyuJ4YflnyZYnB54nX8/zTn2H6sdlk9+ET 5uxoezsw/2Vs4L7f6vH6gcvX7TpEmnOJx3SeHrKfz43V7XXq/JiNBfjnffLF Otvmp5WB+byTIWtb7+RgfHa073zTc72bcY5JG85cPKscnOvOn/foE03/23Pk ZKaxchm6WLd1p/nsm01N/3tr2YeN/6eBMr7ZsmNOdQFPP/tCo7wscpTpn3l1 URX/rHpdzeOfVairZfhnVetqHv9UXS3un610cav2JXl1cfrSVRtrjv0vT111 80vmyd2DI5nkxwdi/8uqiyy888HKRryeeJBbs/jos6/ajkFj+vHrUu/QhNUD a2vu/6xJ8Je4/b7OnpbtQxn0X7rWGHMTE3LHP/x0rX12J7+zG2sYX27cluke zM2JkWWNccV8JSwrSf505U/Xfxa5aB+ID7rjxCbBxRjz+npM/zNhy1D+2bCl 7z+h/ovYMqb/mbBlHv/PY8sk/wn1X8SWRf2/lS2T5J9JW85VW7bjQOc0OYkB b/5hvzk3PpVvuW3vEbOz43guXeex756jp8yWnQebjpGLsLvWL2UpZybI+ixl kCVO1Opc+mPGAayhz6UON9X8y+WT3IpQN2Lx+nZkiZeJ/zGYitfftPFuvtuc +9rnSzVc7jwxeJeD72LcfB+x59TnDxcnr6tfW8+JJ35fz5Mfb7pnWD7l1sv/ sWnNwI/B18uaOq9R1uiEPe5y+LmvO8/Jxmfk4zn89QTk8mP2XEtOv/t+cnDY HDzabbbvmBpjHOo6ZQ4f7zH7Dx8zh7t7re72Hjxi/0cbtv9Qp/184EiXOdY7 aM87eWbY9JwbMbv2HTT7Oo6a3fs7Em1y+513mwPHT7e1XRivf/KZRbY/XrDo RduGcazepy6x85/jA8PRcg4c7zeLXnrV5p2RE8Ux+vT3Vq62/fGK1Wsb93v7 vRXmtt/ebj8f6x8yby79wP5v7YatZuOOffY7bcgTCxbZtp4+nJw4xi/kYjFm 4Hzyq3xZmc8j51333GvXgOnTWz172D5z/4fnP246TpxpHBsYuW7nsFnqA2OL T79cb+eTWfIyoe/ihH0epxPHh6u+yBTngedfft1s2XXQzld5jizXMj+e//hT jViRA7tkiVEU0QW8+e5y6wOsf7tjjJGyjg1ff+f9mh8ds7kiWce7ZemCfFCb k7luix37ZY05leWfRXRRFf+scl3N459VqKtF/bPKdTWrf6quluefMV3k8c+q 9CV5dUG8gNgHfhXmSWbVhQ82Ppshxk5uObogZu3HG/LowkEOKOM0/xjjMcaF 7rsfrydmwnud/GU8yFjQnReb34f6CesSOuWdURejB9YBuI6xIO+XcCxsHw6f OmvHoP69iAMRr8qjB6cLtza1t7PHjoEZ14YxRnJLyatJWy5++9zi1+y6T96c VOcrrcry5U9LTP9ZIB72wSdr7Gd8gbE7dgtjd1l9vZX+y7SlL/9s2dL3nyT9 57FlK/2Xacus/l/Ulr7/tNJ/Vlu20n+ZtvTlny1bznZbRhu/4fu9Tedu3nlg 2hryxuAcx9Y9h6b1o+Ex376xtj5WRtI9k+Tw9Y/uH396YeMYOqTPs8/vjUV8 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 Mt67tL5MLk6Pbv3xVCxeljZ+KJLx8+u7L/1iv/dduWFj6Vtrx/YOXm/aK8ed 787jL3F6cvP9eP25iVq93HfJbDo1YcvgGH/fP3DJ7sHjlyXmFj+//laDHCzm aPzGBfkCizL+Nk/ZpO1rQ2jrGAfkuZa+pCz52YsszxpoEflD6Hf83NPZkL/M sorIX6Z9y9RFXvtWRRdV8U/V1eLyl1lWVfyzCnW1iPxlllUV/6xCXS3TP6tS V7PYN7YHa949+WeLLDKX6etll1+m/5dZfpm+WGb5ZfclZZZfVVtW1f+rbMuq +n9VbVl0//qsfVCW84vE64UQ/75w+9fP9n3b7V8vZo9bOV4P7EHDejDvOfE7 KHMpC2vrfn5ZGlgrZYzk/1Z9Wr5Y/11jXbYo7NHgflNltuSPwZp32ncfy5C/ 7LLyyl+mfcvURRH7VkEXVfFP1dXi8pddVhX8syp1tUz/VF0tx75l+mcV6mrZ 9r2VmWldVKUtKLP8Mn2x7PLLrKtlll9VW1bZ/6tqy6r6f5Vtye+4h7+hQp7v d7s7msojrzvL79sWhb34tu5u3uON98n832AVQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh hBBCCCGEEOJW5sov/9H87T/8s/mP/+u/NPE3f/8n+7+5lk8IIYQQQgghhBBC CCGE+B8d4vL/5f/6f8z/9Hf/ZP7nf/jnJv7m7//J/u9v/+5PjfOHR66Z/++B 35l/fed1899eXGCGL19PLHto4qb5tzcXt7z/2ZEfzekzZ83A+WHTf3bInBv9 KZXcg5cm7LV87j930Vyo3SvNdVzD+a3uE5Z3fuKGOXPxStuyz4//sfYcl6Yd P3Nx1Jy9cs3KTNmnB8+Zc1eum7OXr9nv0DdwNrHcgQuXrH4Gh8ei/+dZbDmD F8yZ4VErhyu393S/lT+qw1p5A+eGa+WPpCrXyWLl7T9Tk/9q/Lras3EOMiPL tHNqurXl1uxtdT0pS1035xPlcc9Fueguds6ZocuNcs6P3yhNx6HtpONsOk5T bl4dZ60faXXcznZ5ddzWdtJxSx2XUj9qoFt3Tlrb0Za7c86N/Zxsu7MX6v1M 7Zw0tuM5XLmDIxOpyk1ru3ZYuU4PeD4yPqlv+uOf4+cEukqSBTl7+07b/58f +2VS50P2WRr3mrRv2j487tfjNd0OtnzG+n0uTN2n9hd7UCcSz4nVhfOXGr44 rQ7WntE9j+9DvnxpbB2TL60v+vKl8dfQTlXUX+hHsXOy6i/JDlXXXytfr4L+ 8vi6Lx9j9PCetr0o0D4kjc3bgS3ODF1pzBsYx8fmAjxnUp873f+Hp7XV2IF+ LW0bThvaeK4L2Z/Lv2/ea2fTDi3L9OZnzl5p/cW3xWzrQgghhBCiHdf+5u/M v/yf/3fb8/6P//rf7bl8Jl7/X15/0X7+0/J3zfWuU+Y/bVhv/vmDpRbGSP+6 9A3zv63+xPwv6742/++8e8z/vmqlve7s4CXTt35TU9l2bD4ZA2LcdPrMOfvZ jl9rY6l6LKUes2EMxtiUa1x8342jOZ+xWhi/sddMnnthvF5+GMNpOmcyPmTL Y3xeK98fY4ZyMZ+z3yflYp7CMV8GFw9yEEvyz/F1EGKfr/Zc3P/sSDw25WOf YfJzPYYyFD2P/9l1kprcobztygXmX0nn1mM4l+rziDZj5rBcdJU0L0YHdZLP mbLplaY1mbJ0HNpOOk6n4yzlZtFxkfrRSsdFbdfqObPYTjqeufrhYt8udpzG dg2d1PqZJJnrcfWhaXGZVrZrQP9DvC5Dua1sF9ox6buvy/rnm1YHflw1pu9Q V6Estl+tlWHjcDWdued3Zbm/xPKI8xEPY32qIWPwPcmP0E0rf2jIU+u/XX3i GuI8YWzQP2e6Dq821ira3cvJkyhfC1u3kq+VLybJ18pfQztVTX+t5Gtl87T6 8+1Qdf1l8fW50F9eXw/lC8fMrs1z4++wzWZcj6y0j401ick1XpfbE47N6+dc sH1EfX13MgbOfVjz5pr+M9Yf3LyB9cvGXIB15tpn/u/uUZ8r1OcHyOP6OCvb ZB4Qcvg2pkzuwzOFctvrB87W/zepG9pbzrdl1D67PtT1j3YN3OpzyJbnnte2 5/Z5RxrzLHeOeyaude20X4Zb57c+MXQlrnvsVzuX+zTmT5evNT3D4PD4NDvU 53BDVgZ0H871XJ1Imne5+VnDXrV+xPmLWyu333kO+1z1cVJoC2f/2HzQHUvK DxBCCCGEmAn+/k//Zq7/zd+3Pe+nv/0H83f/9J/tZ5tf/4c7zL8se8v86cNl Zqg2l/5PGzaYf1y53Pz3hfPNWP8FG6+/cr4+pkuTX+/HMBj72THW4IXGmM/l A7nxKuOoML/ejtEnx9mN8u0cYXIMe2nCwrjL5QwmnePuWb/XhanxYCjX6M/T 4uOx3BFfJsa6jCn9+Zi9R0JejZszOd200iNjT39uZfOCEnJ+mJ+4ORUyN+mk Tblc2yoXhfxK9Mq1SXNcnt/G1AJ7tYzB1Z6f64jfhLG7JnuSz1U719dpGTqO 2U46TqfjVOXm0HGR+tFKx2ltl0fHaWwnHbfWcRn1w0E5jWdvY7uGbSbjQq3O szE+L67UynZRWVKW28p2LvfQxRrC7w3f8Z65EeMgrjMtjt+sh/CYLwv3ce9d 2P55Mm5DfIm4jdXJ4IWGPV28qh6buVT35eB7VGf4RQq7uViYfUbed5uMs/n+ 6p8z7frxG434ULt4s/W7ybhWknytbJ0kXytfTJSvjb+Gdqqa/pLk88/JrT/P DlXXXxZfnwv95fX1mHxJ8fp6HHt82hpe03pLTV4Xy+ZY/R216WNzF6Ol7bFl BPF6/5ibN0zNBa423iMDNx9xbVVjjjAZv6/r4FLje9gPuPvE5I7VFT+/vvHe GfHu8V8aMWgXw/Zt4OY1frx+Sn83GzHqsAzrByMTTdc4nK1dnN7F/30dOBlj dqB/dm1/vfzmuV6WeVdDj85fgjUiG6+fXK+oyzllC3tt0nwQf6v9L/RLIYQQ QoiZ5B//838z1/+2Hq83H33U+Ot/5u9PtXP+8V//q/3s59fDxdqYx8Xk/7R8 mbl6st/G6y9Oxl7+7a2XW8oQy6+vxyOa5xFhDJ2x4/T9cG5G51l8LideH8jl XWvlZ74XjEXrc57xpmNu/eH/Z+9enyQ5ykP//wm/1w7HL84r43CcIMIODNhh xFUg0AWxsOJmEAaOEUQYBOZ2wNjYx8Y22rn2TM/03Hf2PtpdsSt2pb1pL5J2 hRZDnPCb35+Tv3qerKc6Kzvr0jW9mtnV98UnpnsmOyvryeq6PJWVE79Okc/G YxLrhPm0uvJ+ucG1yFr1vEZxvWF86srKeXbV9WCprvzcXNc1ilV6G2i+Xg3r mmSM47qIcbsYj1PvODHezfejLsbj9t04MR6n74hxOsaT/H7ofGX5saSp7/x9 lH7j+Hsh+SCbq6Cp74TmtKIx8E31NvWJ5qTkeKk5t52R93V1SM4uPJ7FZVKx CsvYswA2FlT62O4RxOPrfU5oc7h+OoZ2Lfm+tA1JLkif/VjWezRVc274ZwWG c+7YeEmZF0rI7+MyI/HIn+WzuZiqx5AfLu4lVbWvqa9T7WvaFpPta7G9xv20 n+JX1b64TKf4Rf2w3+PXdlvfq/h13dZT7Qv3FVpHkVfd0X267t+DNtlxRMeG y/jqkbz36Lm5tVnnT7Hx74efL+XY6/L14TijMF8fHsfC+WqGuezx8vWp+W5S 8+Fo/Vkbq44Hdfl6vU7RXPYgeb9F1y/vj8p8/frxfF4fvw6WLw/bWNUP/rjU L+axC6+/mq+7Wubrg8/Z/d+2+frk9SUAAMA9dv7yDXfmwtXGcvK/aM9duq6v 43y9kJz8xae/pOPr43y9jMG/evDJYj6c5/72m6XPVs1f759hHBTnSvEcNb11 /2ynXWNVnU/5645BMW5kJF+fKJOcD2dxkGyXjVW06wydPzGa3zKcH7mYx2ct H48Und+PzLuYXy/a87WpMnI+a88TF8/FR3kqjVmUD7PxMxazuEyq3vgc2J4x Deu1c9zw2eSwjF2zDJ9v9b/X8/5gveLryV4+rkbiUYznisrYfCDheLhJxDjV d11i3KbvusQ4XvakYpxadpcYt+m7TjHu+P1oE+Om70fXGDd9P9rGuMv3o02M J7UPimPcZR+UivEk9kFiOF/0MEfW1HdSVnIddmxIlZFYar1zi0Xeoen7IW2T fJWPXzrGqXrb7IOsXLiNhu+lbZJfs2NakbfMcy2pMqlYVd0bsfss9pyEHUN9 P+Xz1+e5Enkv24/lUOL3qXiXvncV24O2PZ9nIjz+h+OH4zJVsQzHi8Zl5HMy D7dtW6n2tenrVPviMqltMW5fm+017qdJxS9Vz27iN9yORst0iV+qHyYRv1SZ ScYv3JYmFb+qbb1L/Jq29Vbxq50PZzj3y/Cz5Xy9n/vF5pXJn+WJzs3tfqQe L7P19/NsDop7FWG9cb5e29Tz87HIs0LhfDg2d5zNYRPn622+ltIztvly4nZX 5ev9+PVBPqa9XL9ek/T88bK3NlyG1R0+NxU+UyDbRDFXU1RHbb5e5grK5yOV 5dv/LLD52+J1iPtB4uf7dLG4rx1ef9m2UXXdVZevt7YMn5vp6zHKnkUM+6I8 H075ejC+vqx7BgYAAGBSVo+/4G6/+Xu3tfNiZRn52527v3crx87uaVvDPMFb LX6udPzPt3+Gsk3ZLs9k6nlti7kYxv2fhXqd0zR/Q4syMRmHE89R2qXMvotx h3rbxK9L37WJX5e+a7OenfuOGLeu9778frAPuucxvp/dy31Wl1hOKt73anvY y/jdq33qfo9f133CnsbvHh1Xu8Zm0v+TFDYflZ8HvvF/Eoyhzf9OGa++vbvW AwAA2G82Tp3X/zkr893cvHO35OqtN/RvGyfP7Xk772c638IErn8BAACAB5HN l77X7QAAAAD2i/WT5zR3H9vrdgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA3p7626fdmYvX3JWbd9zN23dLrt66485cuLrnbQQAAAAAAAAA4EF3 685v3fnLN9zaiXNu49T5kvXsd/I3yd1b+eWVI+6/3/EH7uajD7s7D73bLa8e ra1/ZXnLXfjqV9xqf8NdO/CE/u7kT//RHf+nf2nVPvnM5lSvtswrTz6q9XdZ /97GcTfdW3KHZubd1NyCvp5b3nTzq9t73jdtTPf6I7+Tts8tb7i5wZauz9Rc z/XWjrqFzZP6Xjw3Ne0Wtk4l65xZHLiZhWWtIxmz9WO+nrlFN7u8XnxG4zg9 Wxk7qW+mt5yVXUmvz9aOr3e+rz/tM34dFio/J+smZaTNso6pMrP91aKehc1T WRuPFLGQvk99xuIl9Ur55Dq9RTFuW2+XGLfpuy4xbtN3bWLcpe/axLhr3zXF uOv3ozHGHb8fxHh/7IPs+CJl5H2bGM8urRfLlmNVZd/NL2o5KdM2xk20XVMz QV9u5nHpZ/E/niwT90HVOkpdh2bm/Pa5cSKPTV/XJbU9dm2/78tF7VfrX2mH bJeyXOvryu3B1mthUGwPI9+vinrCdZRY2PrMrWxVLyto3zjbQ9i+NttM3L4u 8assM6H4SdufOzSl2/Ok4ldVT5f4he3b7/Frva13jF+4LXWJ3/zK4WFMsljo /j3/2el7XkOWJTGQfYy0u4hjtp+cXVpr/Hwd3f933N/W1Rf3WRivoR3dF1cd 48dRFwu75phEvMYl6yzrbseWqrYBAAA8CHZevOwuXL3VWE7KSFl5Lfn61x5+ SF9fO/C4O/qv/+le/uLn3PUnP+Fe++hDmr+//PmDmkN/+UtfKPL0p7//Q/e7 P3uH+/XXv+bOfO/v3fM//LHbmF50r33kfe7mJz7izj77rFtbWHW//fM/cRe/ 8mV389GP5Mvw+fqbj31U67v+yY9rvr+fneO/+rEPuCtPHdB6ZTnnv/mMLvfV Rz7oNmb7uoxff/2r7uTPfu4uZW2U+qZ/9A9u9p//fWQd5RrDzv98jqmv58qW P9A8T/Zefi/XPvY5ueaQc2m5XpDPy7XHVHa9I5/THE52DSF/n5r19xzsfFLP OfNzbluWlNOy2XWOXHdIfX6ZWd0r20XuS+qe7a/psiUvIp8JrxEsH1S0MWuH rJ+99/mc9HmttEnbnF0fyjKbtg25/gvfa9sT5TQus/Oazwnb0rZeWaeqaz+f Rxuopus1jVtwDah9UJFrlBh41ct+q2NcV+9uY1zVd7uNcV38xonxOH03TozH 6bv9EuNxvh/EeDL17nYfZDl1O6a0iXFRZnW7ss0+X98fyRXVxbgos3Vq5N6G tCcVS/96p7jHXRfv+HfhOkq7pM1Wxu4vpz5n26O2MYjr/NqR1nl8OT7aNq3H zqW1kVxX3fdSj735PZumZVk98ToW5H6Q5BUrPl/Vvrrtoap9ddtMZfs6xi8s M4n4aZ35uU8pHz6h+IX1dIlfZfv2e/watvUu8avalsaNnz9v3cnXc2dkfe1+ b9V7i2G8b0jtK3S52Xl8uC+WuuRYpvc29Lx9oMuwv8fn3xYvXQ85VmTLkHsW cV9KHOw+ZtheuVdg+1r9W56X1+sOuwed79NtP67Lk7qy9sV9ZPtYi5sen/Xa YuDrmPev/ed2StcdWnfWV/79oIiFlAvbFF5z9LI4WZm4Lrneke1Illne/irK yn4+jLVebw3y+p8v9YFdN9k1lK1jb/1o8noIAADgfnXp+utu+/QFfe0OHix+ hq/l5/bpX7uXr7+mr3V8/R//obv+xCPu2qef0Py85Onlb2ef/a7m3SW3/sJ3 vuNWlraKfH04vt7y9ZJr3zrkx9zdef+7NV8v+Xh5f/UzT7rVxfVSvn4lq2N5 7Zi78fgj7tRPfubOfetbWvb1D/+VW++tuN/96R+5y59/Su8jnP7+D/Rvkr+/ 8/73uH7DtX2crx+O9ennY47m8vPWQSmfsZCfs1rO3sY2yt/0vDHP7dfl621Z VkbaIueuNp5zOBZoqxjTZPWk8jFhvl7Og+UcNrx+kN/VjbO1MTPWnhRpu8Qk vGaQNteNP7XrOX9unc57STt1vcN7Dln8664xZQyp3t/I2lR5fZiPm5V1Cs/l 5bqn6txeykp75Fovzt2VY/bWxbiu3t3EuK7vdhXjhr5rFeMOfdc2xuP2XdsY j/v9aBvjLt8PYrz778dE9kE5aV+47nUxLvpmJO+RiIfkx4L8U22M8/vMmpOS bSMfK+mfwRjm78N1trHyxT3lRJmqPgjXUeMaxNPuccu9FHm2LbU9Ss7N7p/b eGE7HteNwfW5t/yYm9Vhz52F24z2WT89TlS+M5a/asqXhvXE61jV96XPV7Sv bnuobF/DNlPVvi7xC8tMKn6yLdozNHFOdtfxC+rpGr+q9u33+NVt613iV7kt dYhfVb5e8trFM1xZvfH7OIbxviG1r6jL1/t29Uv5Y9+O6Pw7X8fib5nU+Ho/ 7sbn60v3Zbd2hvXk61yM2cmPp6V8vZU//HzRT+Fy7FpFxxTp/nzd7y/1GsT3 j933DO+RyvNm8TY4kq9PjDmyMiN1ybYa3gsL97WJsql9kObr82WG46PifH15 HRlfDwAAHixd8/U2vl4srR8f5uu/+z3N18vYd5nv5u5736l5dMm5ryxttsrX Xz34pL6/8tlPu/W55VK+XpYldd/6xIc1X//C331by8o4+/X5FffG+941so7S ttsf+kv9bF0s4ny95SzsPLnqutaPMzmej19Z9Oewi4Pib6P5+uE1SHHeacua H56Ly7WTjbO3ZY206/Do+alca8Tj6+1ZaHtfd40u7aoa65gS5unsGihVzrdh OEYovhaKhddx2qbgueWqNkj/VV2LltYvryuOS7INwbVOXb1vVYzryu8mxnV9 t5sYN/XdODEep+/GifE4fTdujNt+P8aN8TjfD2K8++/HJPdBeqzJ7/k2xdjy L03PRQjd9y8OxyM27YPsmTD77HDM5k5tHT53Xr2cuA/CdbRcjhyj5B6H5L+k L+y4FtcVxl3n4siOkVbWjnVV8fbPAfSLY6iNhZW5mYTdX6m7h+bHb+bz+UT3 nOJyVk9qHeX3muMM7vWPbBeJ9jVtD8n2NWwzVe3rEr+4zCTip9tQ/ryIjZed WPyierrEr6p9+z1+Tdt6l/glt6WO8bP9QClfn+fEZZ+pY+Tj94k4p/YN8fu6 fL29lrLhfC+p64I2+frifk3iXq6O18+PB6XnjCrz9TZH22b5nk/WXomln4eo V4zP9/t1f+9B73vqM3H91vn6VJta5ettXJL8LThu1pUt7ePytsT3Y+N8fbyO 5OsBAMCDZLfz4ZhLX/ise+VTjw3nw/ncZzTPLnl0GyPfz87Bbn/wL9zFv3m6 yNdvTi1oXToe/9vfHitfLz9ljL/MjS/j6mX8vry+8fjHdIz+kX/7pc6Fc/oH P3RHfvGcu/aZT2q90z/6qZv9+S9G1rE2X3/YjwfSeY9lToS18rOu9oysjSey nIleR+TzhVoewp6l1XPmhny9jmcsnmHdTLbLj+0fJOfDKebwkWWtHcnbW84n SRtKeaut4fOqdq2i1zThXATyfG/+LLNdf9j9Cisj5//xHA82xil8Xjdctn9W Yblgvw/vW6TqteeUizGHqWXn84GEY770Xkuw/PhaVsbf2nzNxViyqEybGMfx 6xrjxr7rGOM2fdc1xvE9py4xbtN3XWLc6fvRIsZdvx9NMW7z/WgT467fjzYx 7vL9aBPj/bQPSq5ni+/HcJ7lYW6pKcZSVvIkfk60w8ll6/Gk5+fytzx5mxjb WNUwh2RzsNlyJAdnebMid5jfl06VifsgtY6lmB4ePs+gY/fzfFm8Pca5Wmu3 HfdS8dZ25f+HIHyWwnJr8juZP9v6pTJOh4f/AyJVJlVPvI7SNsunVe2P4va1 3R7i9rXZZuL2dYlfqsyk42f3zCYVv1Q9u4lfaXx4VKZL/FL9MIn4pcpMMn7h ttQ5fjXz4fjngQbF/i18H8cw3jfE74vlVuTr7X6kHi9L+5zEdYHe4xgU+3Qb +19+lmy1+H8ccb5e6tNns7L1tXsf+jxa/r8AUvPh2Dwz5ecuV0vPnej/F1je zNu2WNyvGM7xacfuQXG9Ys9X6Tgjmxso2Sb/mdH5cIZ1VeXr68qWt4u+LtOe DSz1QZCvD9dx+KzzcP6f1DYHAABwP7l55+7w/82eHCV/uxH8v1m0559l9nM/ Ns4HOkHx+Prasi3mehynPuPHC9X/36su80y2qbdNmVRfxfNKdynTNX5dYtyq 74gxMZ5AvW3i17nv7rN90IMa4/tZ13h3idOkYnmv9lmxe7m9Er/2Zdq4V/us /R4/vyzL/abnr5+kVL4eAAAA2G/626fdmYvX3NVbb2juPnTl1h135sLVPW8j xhM+cwoAAADsRzZmWl7beHD7OellyZw9w/8JVT3HGQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAPavjVPn3frJcyUbJ8/vebsAAAAAAAAAAHg7kDz99dff dJdv3na33vhtyZWbd/RvGyfP7Xk7AQAAAAAAAAB4UK0ef8G9/ubv3NbOi5Vl 5G+37/7erRw7q++XV464/37HH7ibjz7s7jz0bre8erTys/2tHffqxz5Q24b5 lcNuanbezSwsu+n5vuutH2vV9rnBln5WXk/3ltxitqw2n5PPSPm65cT1LWyd crNLa411L2yezNZjMPL72aV1N792RNssdU/N9Vxv7aibXz2i78WhmfnKemcW BxqfueWN5N9lXbSeuUU3u7yu7bB6n5ua1vYnY5jVN9NbzupfaVWvtUXbOz2b tX87/bls3aSMtFnaMlImi63Wm/W3xjpvi4/NQmV7bL2kXoldqsxsf7WoZ2Hz 1MRiHPcdMR4vxm3q7Rrjcb8fbWPc1HddY9zYd8S4NsYT+X5kJLZWpm3fyb7c yvQ2jlf33fyiP85kZdr0nayH1Tu3stWq3rZ910TbNTUTbCObebzleHw8XSaK VVVbpJ3PHZrSvy9snMhj3td1KZaV92/bY3h6u97MYjtXu45+OYvD5WQ/pT/k O1FZJvVdWBgU2+LIdzBbR1ufcBsK29emr1Pta7sthu1rs73G/bQf4xdvR6ky 48avqh/2e/zqtvX9EL8u23rYPjlHj5ep+4td7B+qzs2bSF/M9teK6wY5j09d C8h6Vh1zR7f/5ZF9tfSDHNfa7sNlH1qs1+L46xUut+tn38p+qK0zuD6z/mq7 vYR98VbHAgAAoMn5SzfcmYvXGsudfekVd+7SdX0t+frXHn5IX1878Lg7+q// 6c4/8w33yqceU3KOdPOxj7pLX/yce/F/fc393//5P9zlzz+ln5ufG7hD3/hW qW49N89zQHLeNDXb09d6/pqdS/lcis/ZyDmYnJvKZyy/b+fRUl7O1eL8jX4m L7u46euPczilMnl+SOuT8/Os/vAcM26XXM/p+7xdcp0ivwvbYPkgI7mksEwY g5iuX7Zesvz5lXRuKqTrkL/2OZR+spz8Te+TZO2O29tUr5Drr6qyPocz8NcR DefMcb0Sq6rrYomBV11m2KdrpXsyk4px3HfEuF2Mx6l3nBjv5vtRF+Pd9l3d eo7Td8T43n0/LPdtueM2fVfEJDvOVLXZ59X7I3mZur4ryPFH8nVj1FvXd3E/ Vr0PY+lf72gMwrxqKt5xrOK26HE1q0PzcFnMbP2tLvspuTzJ80k+TO5PFW2M 3ldtRxKbuu2haE92/Lbvk3xG8jxxbjAsMxrD7eJeRdOyrD2V7avp67r21W2L Ve2r217jftpv8atrX12ft41f2A/7PX7jbOt7Eb+u23rcvvic2fZ5dv4d77Pl vF7aKvvH4p5Efo/XxvbE5+a+zKIeI/z93TwHLsuRe97ymelZ3R7sukHuXxbX AnKfOXstf7dl+GsFf30g7bFjnLYtHwck7Qj7WOqU5cg6xe3Wz8/M+7/lsZH9 rZTXOrLXdgy146PeA9d49rU+W1/dn+v6rhTXWVbG1kk+a/vpsA67z6/bRH8t HXvpv6ysLKe4flo9UlqHueXNkX7w13B9bYPEPr7Ws+9E1XWXXZ8V/ZUdR2x7 sXvl+l7WQ9fLnyfFfWH9n7oetN9VjQ8AAAC4F67cuuOOnr2or93Bg8XP8LX8 PJaVuXLztr7W8fV//Ifu+hOPuGuffsL1s2vp88884648dcDdfe873cb0oubr 1xb8OV2b8fVhDkPO/fQca26xOOez8UB2virnUfH4ej1Hz8+zi/r1GiE/hx1s KTnvsjGDVWVsmX5Zi8Pzwbhd68dH8uOpsSNhm+RcV84pw+sxXUbFuBq7ZrLY 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAALA/rZ34lTv70ivuVy9fLzlz8Zr+ba/bBwAA AAAAAADAg07y8q/95r/c6QtX3QsvvVJy5uJV/dvZC9eK8ssrR9x/v+MP3M1H H3Z3Hnq3W149Wlv/yvKWu/DVr7jV/oa7duAJ/d3Jn/6jO/5P/9KqffKZzale bZlXnnxU6++y/r2N4266t+QOzcy7qbkFfT23vOnmV7f3vG/amO71R34nbZ9b 3nBzgy1dn6m5nuutHXULmyf1vXhuatotbJ1K1jmzOHAzC8taRzJm68d8PXOL bnZ5vfiMxnF6tjJ2Ut9Mbzkru5Jen60dX+98X3/aZ/w6LFR+TtZNykibZR1T ZWb7q0U9C5unsjYeKWIhfZ/6jMVL6pXyyXV6i2Lctt4uMW7Td11i3Kbv2sS4 S9+1iXHXvmuKcdfvR2OMO34/iPH+2AfZ8UXKyPs2MZ5dWi+WLceqyr6bX9Ry UqZtjJtou6Zmgr7czOPSz+J/PFkm7oOqdZS6Ds3M+e1z40Qem76uS2p77Np+ 35eL2q/Wv9IO2S5ludbXlduDrdfCoNgeRr5fFfWE6yixsPWZW9mqXlbQvnG2 h7B9bbaZuH1d4ldZZkLxk7Y/d2hKt+dJxa+qni7xC9u33+PXelvvGL9wW+oS v/mVw8OYZLHQ/Xv+s9P3vIYsS2Ig+xhpdxHHbD85u7TW+Pk6uv/vuL+tqy/u szBeQzu6L646xo+jLhZ2zTGJeI1L1lnW3Y4tVW0DAAB4EBw5c8Fdf/3NxnI3 bt/VsvJa8vWvPfyQvr524HF39F//0738xc+5609+wr320Yc0f3/58wc1h/7y l75Q5OlPf/+H7nd/9g73669/zZ353t+753/4Y7cxvehe+8j73M1PfMSdffZZ t7aw6n7753/iLn7ly+7mox/Jl+Hz9Tcf+6jWd/2TH9d8fz87x3/1Yx9wV546 oPXKcs5/8xld7quPfNBtzPZ1Gb/++lfdyZ/93F3K2ij1Tf/oH9zsP//7yDrK NYad//kcU1/PlS1/oHme7L38Xq597HNyzSHn0nK9IJ+Xa4+p7HpHPqc5nOwa Qv4+NevvOdj5pJ5z5ufctiwpp2Wz6xy57pD6/DKzule2i9yX1D3bX9NlS15E PhNeI1g+qGhj1g5ZP3vv8znp81ppk7Y5uz6UZTZtG3L9F77XtifKaVxm5zWf E7albb2yTlXXfj6PNlBN12sat+AaUPugItcoMfCql/1Wx7iu3t3GuKrvdhvj uviNE+Nx+m6cGI/Td/slxuN8P4jxZOrd7T7Icup2TGkT46LM6nZlm32+vj+S K6qLcVFm69TIvQ1pTyqW/vVOcY+7Lt7x78J1lHZJm62M3V9Ofc62R21jENf5 tSOt8/hyfLRtWo+dS2sjua6676Uee/N7Nk3LsnridSzI/SDJK1Z8vqp9ddtD VfvqtpnK9nWMX1hmEvHTOvNzn1I+fELxC+vpEr/K9u33+DVs613iV7UtjRs/ f966k6/nzsj62v3eqvcWw3jfkNpX6HKz8/hwXyx1ybFM723oeftAl2F/j8+/ LV66HnKsyJYh9yzivpQ42H3MsL1yr8D2tfq3PC+v1x12Dzrfp9t+XJcndWXt i/vI9rEWNz0+67XFwNcx71/7z+2Urju07qyv/PtBEQspF7YpvOboZXGyMnFd cr0j25Ess7z9VZSV/XwYa73eGuT1P1/qA7tusmsoW8fe+tHk9RAAAMD96uK1 V93RMxcbyx07+5K7cPWWvtbx9X/8h+76E4+4a59+QvPzkqeXv5199ruad5fc +gvf+Y5bWdoq8vXh+HrL10uufeuQH3N35/3v1ny95OPl/dXPPOlWF9dL+fqV rI7ltWPuxuOPuFM/+Zk7961vadnXP/xXbr234n73p3/kLn/+Kb2PcPr7P9C/ Sf7+zvvf4/oN1/Zxvn441qefjzmay89bB6V8xkJ+zmo5exvbKH/T88Y8t1+X r7dlWRlpi5y72njO4VigrWJMk9WTyseE+Xo5D5Zz2PD6QX5XN87WxsxYe1Kk 7RKT8JpB2lw3/tSu5/y5dTrvJe3U9Q7vOWTxr7vGlDGken8ja1Pl9WE+blbW KTyXl+ueqnN7KSvtkWu9OHdXjtlbF+O6encT47q+21WMG/quVYw79F3bGI/b d21jPO73o22Mu3w/iPHuvx8T2QflpH3hutfFuOibkbxHIh6SHwvyT7Uxzu8z a05Kto18rKR/BmOYvw/X2cbKF/eUE2Wq+iBcR41rEE+7xy33UuTZttT2KDk3 u39u44XteFw3Btfn3vJjblaHPXcWbjPaZ/30OFH5zlj+qilfGtYTr2NV35c+ X9G+uu2hsn0N20xV+7rELywzqfjJtmjP0MQ52V3HL6ina/yq2rff41e3rXeJ X+W21CF+Vfl6yWsXz3Bl9cbv4xjG+4bUvqIuX+/b1S/lj307ovPvfB2Lv2VS 4+v9uBufry/dl93aGdaTr3MxZic/npby9Vb+8PNFP4XLsWsVHVOk+/N1v7/U axDfP3bfM7xHKs+bxdvgSL4+MebIyozUJdtqeC8s3Ncmyqb2QZqvz5cZjo+K 8/XldWR8PQAAeLBcuXXHHT3r8/Xu4MHiZ/hafh7Lyly5eVtfh+PrxdL68WG+ /rvf03y9jH2X+W7uvvedmkeXnPvK0marfP3Vg0/6tn320259brmUr5dlSd23 PvFhzde/8Hff1rIyzn59fsW98b53jayjtO32h/5SP1sXizhfbzkLO0+uuq71 40yO5+NXFv057OKg+Ntovn54DVKcd9qy5ofn4nLtZOPsbVkj7To8en4q1xrx +Hp7Ftre112jS7uqxjqmhHk6uwZKlfNtGI4Riq+FYuF1nLYpeG65qg3Sf1XX oqX1y+uK45JsQ3CtU1fvWxXjuvK7iXFd3+0mxk19N06Mx+m7cWI8Tt+NG+O2 349xYzzO94MY7/77Mcl9kB5r8nu+TTG2/EvTcxFC9/2Lw/GITfsgeybMPjsc s7lTW4fPnVcvJ+6DcB0tlyPHKLnHIfkv6Qs7rsV1hXHXuTiyY6SVtWNdVbz9 cwD94hhqY2FlbiZh91fq7qH58Zv5fD7RPae4nNWTWkf5veY4g3v9I9tFon1N 20OyfQ3bTFX7usQvLjOJ+Ok2lD8vYuNlJxa/qJ4u8atq336PX9O23iV+yW2p Y/xsP1DK1+c5cdln6hj5+H0izql9Q/y+Ll9vr6VsON9L6rqgTb6+uF+TuJer 4/Xz40HpOaPKfL3N0bZZvueTtVdi6ech6hXj8/1+3d970Pue+kxcv3W+PtWm Vvl6G5ckfwuOm3VlS/u4vC3x/dg4Xx+vI/l6AADwIDl/+YY7c+FqYzn5X7Tn Ll3X13G+Xlz6wmfdK596bDgfzuc+o3l2yaPbGPl+dg52+4N/4S7+zdNFvn5z akHr0vH43/72WPl6+Slj/GVufBlXL+P35fWNxz+mY/SP/NsvdS6c0z/4oTvy i+fctc98Uuud/tFP3ezPfzGyjrX5+sN+PJDOeyxzIqyVn3W1Z2RtPJHlTPQ6 Ip8v1PIQ9iytnjM35Ot1PGPxDOtmsl1+bP8gOR9OMYePLGvtSN7ecj5J2lDK W20Nn1e1axW9pgnnIpDne/Nnme36w+5XWBk5/4/neLAxTuHzuuGy/bMKywX7 fXjfIlWvPadcjDlMLTufDyQc86X3WoLlx9eyMv7W5msuxpJFZdrEOI5f1xg3 9l3HGLfpu64xju85dYlxm77rEuNO348WMe76/WiKcZvvR5sYd/1+tIlxl+9H mxjvp31Qcj1bfD+G8ywPc0tNMZaykifxc6IdTi5bjyc9P5e/5cnbxNjGqoY5 JJuDzZYjOTjLmxW5w/y+dKpM3AepdSzF9PDweQYdu5/ny+LtMc7VWrvtuJeK t7Yr/z8E4bMUlluT38n82dYvlXE6PPwfEKkyqXridZS2WT6tan8Ut6/t9hC3 r802E7evS/xSZSYdP7tnNqn4perZTfxK48OjMl3il+qHScQvVWaS8Qu3pc7x q5kPxz8PNCj2b+H7OIbxviF+Xyy3Il9v9yP1eFna5ySuC/Qex6DYp9vY//Kz ZKvF/+OI8/VSnz6bla2v3fvQ59Hy/wWQmg/H5pkpP3e5WnruRP+/wPJm3rbF 4n7FcI5PO3YPiusVe75KxxnZ3EDJNvnPjM6HM6yrKl9fV7a8XfR1mfZsYKkP gnx9uI7DZ52H8/+ktjkAAID7xerxF9ztN3/vtnZerCwjf7tz9/du5djZPW/v /cY/y+znfmycD3SC4vH1tWVbzPU4Tn3Gjxeq/79XXeaZbFNvmzKpvornle5S pmv8usS4Vd8RY2I8gXrbxK9z391n+6AHNcb3s67x7hKnScXyXu2zYvdyeyV+ 7cu0ca/2Wfs9fn5ZlvtNz18/Sal8PQAAALDfbJw6r/9zVua7uXnnbsnVW2/o 3zZOntvzdqK98JlTAAAAYD+yMdPy2saD289JL0vm7Bn+T6jqOc4AAACA/WL9 5DnN3cf2ul0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgLen/vZp d+biNXfl5h138/bdkqu37rgzF67ueRsBAAAAAAAAAHjQ3brzW3f+8g23duKc 2zh1vmQ9+538TXL3Vn555Yj773f8gbv56MPuzkPvdsurRyvr7m/tuFc/9oHa 5c+vHHZTs/NuZmHZTc/3XW/9WKt2zw229LPyerq35BazZbX5nHxGytctJ65v YeuUm11aa6x7YfNkth6Dkd/PLq27+bUj2mape2qu53prR9386hF9Lw7NzFfW O7M40PjMLW8k/y7rovXMLbrZ5XVth9X73NS0tj8Zw6y+md5yVv9Kq3qtLdre 6dms/dvpz2XrJmWkzdKWkTJZbLXerL811nlbfGwWKttj6yX1SuxSZWb7q0U9 C5unJhbjuO+I8XgxblNv1xiP+/1oG+Omvusa48a+I8a1MZ7I9yMjsbUybftO 9uVWprdxvLrv5hf9cSYr06bvZD2s3rmVrVb1tu27JtquqZlgG9nM4y3H4+Pp MlGsqtoi7Xzu0JT+fWHjRB7zvq5Lsay8f9sew9Pb9WYW27nadfTLWRwuJ/sp /SHficoyqe/CwqDYFke+g9k62vqE21DYvjZ9nWpf220xbF+b7TXup/0Yv3g7 SpUZN35V/bDf41e3re+H+HXZ1sP2yTl6vEzdX+xi/1B1bt5E+mK2v1ZcN8h5 fOpaQNaz6pg7uv0vj+yrpR/kuNZ2Hy770GK9Fsdfr3C5XT/7VvZDbZ3B9Zn1 V9vtJeyLtzoWAAAATXZevOwuXL3VWE7KSFl5Lfn61x5+SF9fO/C4O/qv/+nO P/MN98qnHlNyjnTzsY+6S1/8nHvxf33N/d//+T/c5c8/pZ+bnxu4Q9/4Vqlu PTfPc0By3jQ129PXev6anUv5XIrP2cg5mJybymcsv2/n0VJeztXi/I1+Ji+7 uOnrj3M4pTJ5fkjrk/PzrP7wHDNul1zP6fu8XXKdIr8L22D5ICO5pLBMGIOY rl+2XrL8+ZV0biqk65C/9jmUfrKc/E3vk2TtjtvbVK+Q66+qsj6HM/DXEQ3n zHG9Equq62KJgVddZtina6V7MpOKcdx3xLhdjMepd5wY7+b7URfj3fZd3XqO 03fE+N59Pyz3bbnjNn1XxCQ7zlS12efV+yN5mbq+K8jxR/J1Y9Rb13dxP1a9 D2PpX+9oDMK8airecazituhxNatD83BZzGz9rS77Kbk8yfNJPkzuTxVtjN5X bUcSm7rtoWhPdvy275N8RvI8cW4wLDMaw+3iXkXTsqw9le2r6eu69tVti1Xt q9te437ab/Gra19dn7eNX9gP+z1+42zrexG/rtt63L74nNn2eXb+He+z5bxe 2ir7x+KeRH6P18b2xOfmvsyiHiP8/d08By7LkXve8pnpWd0e7LpB7l8W1wJy nzl7LX+3ZfhrBX99IO2xY5y2LR8HJO0I+1jqlOXIOsXt1s/PzPu/5bGR/a2U 1zqy13YMteOj3gPXePa1Pltf3Z/r+q4U11lWxtZJPmv76bAOu8+v20R/LR17 6b+srCynuH5aPVJah7nlzZF+8NdwfW2DxD6+1rPvRNV1l12fFf2VHUdse7F7 5fpe1kPXy58nxX1h/Z+6HrTfVY0PAAAAuBcuXX/dbZ++oK/dwYPFz/C1/Nw+ /Wv38vXX9LWOr//jP3TXn3jEXfv0E66fXUuff+YZd+WpA+7ue9/pNqYXNV+/ tuDP6dqMrw9zGHLup+dYc4vFOZ+NB7LzVTmPisfX6zl6fp5d1K/XCPk57GBL yXmXjRmsKmPL9MtaHJ4Pxu1aPz6SH0+NHQnbJOe6ck4ZXo/pMirG1dg1k8Wm Lo5y7hleW+m4oIoxP3J9YtdU0uZSTBrqlc/WjUWR8ZUSV/ls1TWurL/m1KL+ qs3BZesvn5P8TZy7K/WnjOfKyoYxnUSMU31HjNvFuFW9HWK8m+9HXYzb9l2X GLfpO2JcH+NJfD+M1FOse0PfFX2T54XqymmOL8gr1fVdsi0t663rOxt7aLmG +H2x7QTrXOQ4JK8zkscvxyH+XdgWWY49d6HH5zxvI/klydtoTOYWi/60fJXP zQz8thy9T8ZMtosW/Wa5MF1Hed4tz7OF22tYZuTzm6eK/FBTvlm3uzyvVdW+ ur6ual/dtljZvobtNe6n/Ra/qvaFZTrHL+iH/R6/cbb1vYhf12091b6qfL3P Y2+O3MMr3W/J2mu5bPmdf0Zt9NzccrSy79E6onx9+Du7bhheC2wXz5EJux6x fVVxjZDn730MBsX7+Dhgy0m1O/VdCcfXF8+dSb5780SRg7YcdtgHdl0T5uuH 8dspctRxHbodrGyVPmOsry1Pb/n/MAbWxlQ/yPHZ9v2+/vK13jjXXUUcbXuJ 7hFpvj6/X+HbOewL/WzV9aBsb9nf4u0SAADgXuqar7fx9WIpO+exnPy1A0+4 7f+Y1nz9Up57efWRD9a2ITW+3ucjytcRcQ5dzh1H58PZSV5nyevJ5OujdgWf 1fbL9V50LuqveTZLv7P7D/HrFPlsPCaxTphPqyvvlxtci6xVz2sU1xvGp66s nGdXXQ+W6srPzXVdo1ilt4Hm69WwrknGOK6LGLeL8Tj1jhPj3Xw/6mI8bt+N E+Nx+o4Yp2M8ye+HzleWH0ua+s7fR+k3jr8Xkg+yuQqa+k5oTisaA99Ub1Of aE5Kjpeac9sZeV9Xh+TswuNZXCYVq7CMPQtgY0Glj+0eQTy+3ueENofrp2No 15LvS9uQ5IL02Y9lvUdTNeeGf1ZgOOeOjZeUeaGE/D4uMxKP/Fk+m4upegz5 4eJeUlX7mvo61b6mbTHZvhbba9xP+yl+Ve2Ly3SKX9QP+z1+bbf1vYpf1209 1b5wX6F1FHnVHd2n6/49aJMdR3RsuIyvHsl7j56bW5t1/hQb/374+VKOvS5f H44zCvP14XEsnK9mmMseL1+fmu8mNR+O1p+1sep4UJev1+sUzWUPkvdbdP3y /qjM168fz+f18etg+fKwjVX94I9L/WIeu/D6q/m6q2W+Pvic3f9tm69PXl8C AADcY7udD8dITv7i01/S8fVxvl7G4F89+GQxH85zf/vN0mer5q/3zzAOinOl eI6a3rp/ttOusarOp/x1x6AYNzKSr0+USc6HszhItsvGKtp1hs6fGM1vGc6P XMzjs5aPR4rO70fmXcyvF+352lQZOZ+154mL5+KjPJXGLMqH2fgZi1lcJlVv fA5sz5iG9do5bvhscljGrlmGz7f63+t5f7Be8fVkLx9XI/EoxnNFZWw+kHA8 3CRinOq7LjFu03ddYhwve1IxTi27S4zb9F2nGHf8frSJcdP3o2uMm74fbWPc 5fvRJsaT2gfFMe6yD0rFeBL7IDGcL3qYI2vqOykruQ47NqTKSCy13rnFIu/Q 9P2Qtkm+yscvHeNUvW32QVYu3EbD99I2ya/ZMa3IW+a5llSZVKyq7o3YfRZ7 TsKOob6f8vnr81yJvJftx3Io8ftUvEvfu4rtQduezzMRHv/D8cNxmapYhuNF 4zLyOZmH27atVPva9HWqfXGZ1LYYt6/N9hr306Til6pnN/EbbkejZbrEL9UP k4hfqswk4xduS5OKX9W23iV+Tdt6q/jVzocznPtl+Nlyvt7P/WLzyuTP8kTn 5nY/Uo+X2fr7eTYHxb2KsN44X69t6vn5WORZoXA+HJs7zuawifP1Nl9L6Rnb fDlxu6vy9X78+iAf016uX69Jev542VsbLsPqDp+bCp8pkG2imKspqqM2Xy9z BeXzkcry7X8W2Pxt8TrE/SDx8326WNzXDq+/bNuouu6qy9dbW4bPzfT1GGXP IoZ9UZ4Pp3w9GF9f1j0DAwAAMEk379wd/r/Zk6PkbzeC/ze7V8I8wVstfq50 /M+3f4ayTdkuz2TqeW2LuRjG/Z+Fep3TNH9DizIxGYcTz1Hapcy+i3GHetvE r0vftYlfl75rs56d+44Yt673vvx+sA+65zG+n93LfVaXWE4q3vdqe9jL+N2r fep+j1/XfcKexu8eHVe7xmbS/5MUNh+Vnwe+8X8SjKHN/04Zr769u9YDAADY b/rbp92Zi9fc1VtvaO4+dOXWHXfmwtU9b+P9TudbmMD1LwAAAPAgsvnS97od AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2L82Tp136yfPlWycPL/n7QIA AAAAAAAA4O1A8vTXX3/TXb55291647clV27e0b9tnDy35+0EAAAAAAAAAOBB tXr8Bff6m79zWzsvVpaRv92++3u3cuxs8bvz3/hb9+ojH3TXn3hE7bYd/a2d kd9JvcsrRyo/MzU776Z7S2ph82Rt/TMLy25h65S+nu7170ks5wZbbn7lcOvy bdoh9cn69daPFb9bWd9yg41t/dnfql/vpc3jbmnrxETWL13XjrZFXsvP1fWN 1vXNLK6U4hDH417101tJt7uKbXN6vnn9ZvurbjHx3WhcZsW23qW+qrrrVH0X JBYzCwN9Pb+6nan+fgMAAAAAAABvN+cv3XBnLl5rLHf2pVfcuUvX9fXWoXl3 65EPFX/r5/nIEz/7uXvlyUfdzcc+6nZ+/BN39tlntdzLX/yce+npv9ac/NWD n9IyNx5/RD8nZS9lfz/9999355/5hnvlU48pySmG+fpffvlpt7B6tNSmqbmF 0nvLTUqe0PLckp+cW9l0h2bmND8see+puZ6+ls9L/tDnEJfV7NKavp+amdfP DnOtO1q/lovyzLY8+ZvkYMNlzywO9H1v47jPlR72Oc/e+lF3aHpW6wrzn/qZ vJ7FzVNuarY3kvNd2fB5UMmfL28e1Rz6YOOI5sv7WTvl9/Ja/ia/l/JSxvLt /Wx58jeta30rL7etv4/rEmGZsC55b2XjtqX65dDUjFvYOFGsT5ynj3PLuu5Z fKbnF/VzcT+VljHf1zyw5InjWEt8pS75jN7byeqScrK82f6asuXJ697aUV2u LUv63t7rNpF9XtokfStlR9uVbyvZZ2S7C/tu+NkVXV6qrcPtdmu0/dl6Sn3y ubCeIhbZ96ZuW7f6wvUJ4zi7tJ5v4z6nPre8oXG1HLt9XvLs0k59L+sUfRcs Xy85eanL7qnJ76R9spyijH5f+rpu0mbfNz4G1jcAAAAAAADA28GVW3fc0bMX 9bU7eLD4Gb6Wn8eyMldu3tbXz//gR+7XX/+avj7/zDPuzvvf7VYX17Of73GX P/+UuvSFz2q+/sz3vq/lZCz+yZ/93N35wHv177c+/iG3Mb2o+fq1hbWiritP HXB33/tO/Vvb8fWWS0zl6y1XGo4Ltjy/5RV97nLgc8P5Z+RnuCzJO0ruUuvq lfPNcY7St2W4bM1DJvOy0fjqrZ1izLXUJeQzvfXjpXI2vr7Izwc59uXNYz4v v+k/0zS+3vLrkquXOuK6+sH4+bCu8ufq8/USW8nDSkzmljeLdWzM1+f9JOuv fRT107DsjpaVPpIYJvP1VteGr8vHdzNY7s5wu5Bc9NzicHvQfPSSll/YPJWv S19z9bqMqF3htqL3GoJ8vd6f2TiRb7/V+fp4u5V6/La2XWyzYT3leNds68Ey bH1S25/RfH1+T6C41xK0x1Tn649obHzfb5TG11sZq8u+d9o3K1vJbQIAAAAA AAB4kF24essde+GlxnKSr79w5Za+lvH1kn+3v8l4+fW5ZffG+97lloLcsuTr d/73T/X1qx/7gDv50390L335r0v1Sr5ePrO0cULLyO+uHXjCbf/HdHO+fmR8 vc/hSh7S8vU290dqjhDNq2ZldSzy2nDsvuYU8/HFJp2vLy9PcoylfH2eT7Xx 4cNx+Uu7y9dHOfFivP3WiWG+Ps+rN+br131e1PL1cV0+X39kpK7BGPl6iYn0 leXs/Zj1bvn6sJ9COuZbc7/9ZKzjukr5+nmfrw+3i9Fx3Tuae9bceNZP0v86 Nn9pbaRdtl3ZOlXm62XMe3K7GN1uU9tsm3z9yOeKv5XXJ97+4vd2z6U6Xx99 F4pc/DCPL2Pq5f5Am3y93ntJbBMAAAAAAADAg2z79AV34/U3G8vduH1Xy9r7 F/P56yVXL2PlJa8u4+dfe/ghd+3A4+7sd54dydf3N0+5m49+RP8uPyVPb/l6 LZPVd/HpL+n4+jhf/8svfblxPhybPyOck8ZykZartLHR8jvLYWqeUOYWWRgU c+DE+frhfDiD4m/x8iQXLPXYsovx1kEOX/K7OkfK1qmirtH5cAY+z5m1vU2+ Xuaqsflq4ny95NN1DhudO2c4H47l4P1YfZ+nt3lywrrCfH1Yl58P50hpPhx5 LfPX+/fDOdIlR/vcoSkfgyw+8djp5vlw+sV8OGE/hfUX89Hkv49jHc+to3Ou 5HPoDD8zXL49t2HbkI2h175eszHjvt9H27WTz42znpwPx+bNsTx73NY2+Xo/ H06/mOsmjFvdtl6eD2cwMp5e7z9Ecz7JNq7PAgT5eqnPb+OD/N5F+btguXj/ +9V8HdeLbUCWU54PZ6k0H06cr28z1z8AAAAAAADwIPjVy9fda7/5nTtz4aq+ Dsnc9q/95r/c2exve93O+0mYc93PwrHxD7L4XkCYE74f6T2KfA56WZe9bg8A AAAAAACAyVk78SvNzb/w0islZ7PfrR7/1Z63DwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAADw9rR24lfu7EuvuF+9fL3kzMVr+re9bh8AAAAAAAAA AA86ycu/9pv/cqcvXHUvvPRKyZmLV/VvZy9cK8ovrxxx//2OP3A3H33Y3Xno 3W559Wht/SvLW+7CV7/iVvsb7tqBJ/R3J3/6j+74P/1Lq/bJZzanerVlXnny Ua2/y/r3No676d6SOzQz76bmFvT13PKmm1/d3vO+aWO61x/5nbR9bnnDzQ22 dH2m5nqut3bULWye1Pfiualpt7B1KlnnzOLAzSwsax3JmK0f8/XMLbrZ5fXi MxrH6dnK2El9M73lrOxKen22dny98339aZ/x67BQ+TlZNykjbZZ1TJWZ7a8W 9SxsnsraeKSIhfR96jMWL6lXyifX6S2Kcdt6u8S4Td91iXGbvmsT4y591ybG XfuuKcZdvx+NMe74/SDG+2MfZMcXKSPv28R4dmm9WLYcqyr7bn5Ry0mZtjFu ou2amgn6cjOPSz+L//FkmbgPqtZR6jo0M+e3z40TeWz6ui6p7bFr+31fLmq/ Wv9KO2S7lOVaX1duD7ZeC4Niexj5flXUE66jxMLWZ25lq3pZQfvG2R7C9rXZ ZuL2dYlfZZkJxU/a/tyhKd2eJxW/qnq6xC9s336PX+ttvWP8wm2pS/zmVw4P Y5LFQvfv+c9O3/MasiyJgexjpN1FHLP95OzSWuPn6+j+v+P+tq6+uM/CeA3t 6L646hg/jrpY2DXHJOI1LllnWXc7tlS1DQAA4EFw5MwFd/31NxvL3bh9V8vK a8nXv/bwQ/r62oHH3dF//U/38hc/564/+Qn32kcf0vz95c8f1Bz6y1/6QpGn P/39H7rf/dk73K+//jV35nt/757/4Y/dxvSie+0j73M3P/ERd/bZZ93awqr7 7Z//ibv4lS+7m49+JF+Gz9fffOyjWt/1T35c8/397Bz/1Y99wF156oDWK8s5 /81ndLmvPvJBtzHb12X8+utfdSd/9nN3KWuj1Df9o39ws//87yPrKNcYdv7n c0x9PVe2/IHmebL38nu59rHPyTWHnEvL9YJ8Xq49prLrHfmc5nCyawj5+9Ss v+dg55N6zpmfc9uypJyWza5z5LpD6vPLzOpe2S5yX1L3bH9Nly15EflMeI1g +aCijVk7ZP3svc/npM9rpU3a5uz6UJbZtG3I9V/4XtueKKdxmZ3XfE7Ylrb1 yjpVXfv5PNpANV2vadyCa0Dtg4pco8TAq172Wx3junp3G+OqvtttjOviN06M x+m7cWI8Tt/tlxiP8/0gxpOpd7f7IMup2zGlTYyLMqvblW32+fr+SK6oLsZF ma1TI/c2pD2pWPrXO8U97rp4x78L11HaJW22MnZ/OfU52x61jUFc59eOtM7j y/HRtmk9di6tjeS66r6XeuzN79k0LcvqidexIPeDJK9Y8fmq9tVtD1Xtq9tm KtvXMX5hmUnET+vMz31K+fAJxS+sp0v8Ktu33+PXsK13iV/VtjRu/Px5606+ njsj62v3e6veWwzjfUNqX6HLzc7jw32x1CXHMr23oeftA12G/T0+/7Z46XrI sSJbhtyziPtS4mD3McP2yr0C29fq3/K8vF532D3ofJ9u+3FdntSVtS/uI9vH Wtz0+KzXFgNfx7x/7T+3U7ru0LqzvvLvB0UspFzYpvCao5fFycrEdcn1jmxH sszy9ldRVvbzYaz1emuQ1/98qQ/susmuoWwde+tHk9dDAAAA96uL1151R89c bCx37OxL7sLVW/pax9f/8R+660884q59+gnNz0ueXv529tnvat5dcusvfOc7 bmVpq8jXh+PrLV8vufatQ37M3Z33v1vz9ZKPl/dXP/OkW11cL+XrV7I6lteO uRuPP+JO/eRn7ty3vqVlX//wX7n13or73Z/+kbv8+af0PsLp7/9A/yb5+zvv f4/rN1zbx/n64Viffj7maC4/bx2U8hkL+Tmr5extbKP8Tc8b89x+Xb7elmVl pC1y7mrjOYdjgbaKMU1WTyofE+br5TxYzmHD6wf5Xd04WxszY+1JkbZLTMJr Bmlz3fhTu57z59bpvJe0U9c7vOeQxb/uGlPGkOr9jaxNldeH+bhZWafwXF6u e6rO7aWstEeu9eLcXTlmb12M6+rdTYzr+m5XMW7ou1Yx7tB3bWM8bt+1jfG4 34+2Me7y/SDGu/9+TGQflJP2heteF+Oib0byHol4SH4syD/Vxji/z6w5Kdk2 8rGS/hmMYf4+XGcbK1/cU06UqeqDcB01rkE87R633EuRZ9tS26Pk3Oz+uY0X tuNx3Rhcn3vLj7lZHfbcWbjNaJ/10+NE5Ttj+aumfGlYT7yOVX1f+nxF++q2 h8r2NWwzVe3rEr+wzKTiJ9uiPUMT52R3Hb+gnq7xq2rffo9f3bbeJX6V21KH +FXl6yWvXTzDldUbv49jGO8bUvuKuny9b1e/lD/27YjOv/N1LP6WSY2v9+Nu fL6+dF92a2dYT77OxZid/Hhaytdb+cPPF/0ULseuVXRMke7P1/3+Uq9BfP/Y fc/wHqk8bxZvgyP5+sSYIyszUpdsq+G9sHBfmyib2gdpvj5fZjg+Ks7Xl9eR 8fUAAODBcuXWHXf0rM/Xu4MHi5/ha/l5LCtz5eZtfR2OrxdL68eH+frvfk/z 9TL2Xea7ufved2oeXXLuK0ubrfL1Vw8+6dv22U+79bnlUr5eliV13/rEhzVf /8LffVvLyjj79fkV98b73jWyjtK22x/6S/1sXSzifL3lLOw8ueq61o8zOZ6P X1n057CLg+Jvo/n64TVIcd5py5ofnovLtZONs7dljbTr8Oj5qVxrxOPr7Vlo e193jS7tqhrrmBLm6ewaKFXOt2E4Rii+FoqF13HapuC55ao2SP9VXYuW1i+v K45Lsg3BtU5dvW9VjOvK7ybGdX23mxg39d04MR6n78aJ8Th9N26M234/xo3x ON8PYrz778ck90F6rMnv+TbF2PIvTc9FCN33Lw7HIzbtg+yZMPvscMzmTm0d PndevZy4D8J1tFyOHKPkHofkv6Qv7LgW1xXGXefiyI6RVtaOdVXx9s8B9Itj qI2FlbmZhN1fqbuH5sdv5vP5RPec4nJWT2od5fea4wzu9Y9sF4n2NW0PyfY1 bDNV7esSv7jMJOKn21D+vIiNl51Y/KJ6usSvqn37PX5N23qX+CW3pY7xs/1A KV+f58Rln6lj5OP3iTin9g3x+7p8vb2WsuF8L6nrgjb5+uJ+TeJero7Xz48H peeMKvP1NkfbZvmeT9ZeiaWfh6hXjM/3+3V/70Hve+ozcf3W+fpUm1rl621c kvwtOG7WlS3t4/K2xPdj43x9vI7k6wEAwIPk/OUb7syFq43l5H/Rnrt0XV/H +Xpx6Qufda986rHhfDif+4zm2SWPbmPk+9k52O0P/oW7+DdPF/n6zakFrUvH 43/722Pl6+WnjPGXufFlXL2M35fXNx7/mI7RP/Jvv9S5cE7/4IfuyC+ec9c+ 80mtd/pHP3WzP//FyDrW5usP+/FAOu+xzImwVn7W1Z6RtfFEljPR64h8vlDL Q9iztHrO3JCv1/GMxTOsm8l2+bH9g+R8OMUcPrKstSN5e8v5JGlDKW+1NXxe 1a5V9JomnItAnu/Nn2W26w+7X2Fl5Pw/nuPBxjiFz+uGy/bPKiwX7PfhfYtU vfaccjHmMLXsfD6QcMyX3msJlh9fy8r4W5uvuRhLFpVpE+M4fl1j3Nh3HWPc pu+6xji+59Qlxm36rkuMO30/WsS46/ejKcZtvh9tYtz1+9Emxl2+H21ivJ/2 Qcn1bPH9GM6zPMwtNcVYykqexM+Jdji5bD2e9Pxc/pYnbxNjG6sa5pBsDjZb juTgLG9W5A7z+9KpMnEfpNaxFNPDw+cZdOx+ni+Lt8c4V2vttuNeKt7arvz/ EITPUlhuTX4n82dbv1TG6fDwf0CkyqTqiddR2mb5tKr9Udy+tttD3L4220zc vi7xS5WZdPzsntmk4peqZzfxK40Pj8p0iV+qHyYRv1SZScYv3JY6x69mPhz/ PNCg2L+F7+MYxvuG+H2x3Ip8vd2P1ONlaZ+TuC7QexyDYp9uY//Lz5KtFv+P I87XS336bFa2vnbvQ59Hy/8XQGo+HJtnpvzc5WrpuRP9/wLLm3nbFov7FcM5 Pu3YPSiuV+z5Kh1nZHMDJdvkPzM6H86wrqp8fV3Z8nbR12Xas4GlPgjy9eE6 Dp91Hs7/k9rmAAAA7herx19wt9/8vdvaebGyjPztzt3fu5VjZ/e8vfcb/yyz n/uxcT7QCYrH19eWbTHX4zj1GT9eqP7/XnWZZ7JNvW3KpPoqnle6S5mu8esS 41Z9R4yJ8QTqbRO/zn13n+2DHtQY38+6xrtLnCYVy3u1z4rdy+2V+LUv08a9 2mft9/j5ZVnuNz1//SSl8vUAAADAfrNx6rz+z1mZ7+bmnbslV2+9oX/bOHlu z9uJ9sJnTgEAAID9yMZMy2sbD24/J70smbNn+D+hquc4AwAAAPaL9ZPnNHcf 2+t2AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADenvrbp92Zi9fc lZt33M3bd0uu3rrjzly4uudtBAAAAAAAAADgQXfrzm/d+cs33NqJc27j1PmS 9ex38jfJ3YefOf+Nv3WvPvJBd/2JR9Ru29Df2hn5ndS7vHKk8jNTs/Nuurek FjZP1tY/s7DsFrZO6evpXv+exHFusOXmVw63Lt+mHVKfrF9v/Vjxu5X1LTfY 2Naf/a369RbLm0eznzv6GfkpvxtsVMc1tLR1Ivv8sfoym8dVl5hJ/eJe9Edo tr/qFrNtzLaDcHso+m51+563416SbUXWI/U3Xd+G74is//xqu+2iFLd8m5ft dDH4Hnepr6ruOrJeMwuD5N/sOyZ9Pbu0tud9BAAAAAAAANTZefGyu3D1VmM5 KSNl5fXWoXl365EPFX/r53nAEz/7uXvlyUfdzcc+6nZ+/BN39tlntdzLX/yc e+npv9ac/NWDn9IyNx5/RD8nZS9lfz/9999355/5hnvlU48pyfuF+fpffvlp t7B6tNSmqbmF0nvLzUmOz/LckqedW9l0h2bm3Mziiua9p+Z6+lo+L7k+n+9b VpLTk/dTM/P62WGOc0fr13LZZ1PLk79Nz/dLy55ZHOj73sZxnzM+7HOnvfWj 7tD0rNYV5o31M3k9i5un3NRsbyTXurLhc5iSI5dcvOS7NX+f/V7y9/J7ee9z 8sM8/er6pv5OyvjfPV+Us/y9vJc65afl0iVf388+L/cH7G9S1r8+osuVZfaz 9fD1+TrsvX42b7O1RXP8Un/w0z43/OyRfDnHtIwtX9oftqUfxM/6Ym55I7+P c6ro2zBPn8rXS8wl71v0U9Y39lm7zxH+3srF24HWlf1utr+miu1paT2v6/lg 29zSnLb2efa7+ZXtfPvxbZE2WrssFx+3y7az6fnFKF+fb7NZedn+pR1h/lo+ b+stbbP8eLHtZn/39zB2fBuCeopYRNu8lJF2yOesvnh97LPannzdJAbyGV2P /P6bfT4uF6/DMF+/M+yb5XX9ztl3rLdxwi8/+yl1yTIsVvIdk++9/L7pngYA AAAAAABwL126/rrbPn1BX7uDB4uf4Wv5uX361+7l66/p6+d/8CP3669/TV+f f+YZd+f973ari+vZz/e4y59/Sl36wmc1X3/me9/XcjIW/+TPfu7ufOC9+vdb H/+Q25he1Hz92sJaUdeVpw64u+99p/6t7fh6G1ubytdb/i3Mz1qe33KrPsc3 8LnG/DM6VjhYluYflzd8Xb3lUu4zzNOGY41t2ZIHjPP1moeNx9dv+byovJa6 hHymt14eu27j6+NceD/PzUt+23Le8nvLkZfH12+Xxs5bXfbTyof5+mGO/0jp vebTNd9+JOD/Jr+X+wRhTj1UytvnY/Tts7Ze8c/wdZjXFz4/Pyhov6xstcrX zw02i/6S/p6eWxxuExvDZwB8rndTl5Xa7kp19SQHfKLYnmQb8jnn4fYh26Nu gxnpb8md670iXeaO/l3z5tn2oZ8N25VtG7Z8qTvM14fbrOTQq/L19pkwX6/r lj+P4OsZxibMaae2+bBu+Vt5fYZ97++fHQ/ae0T7TOObr4veB4vKNebr5V7c bK9cNi/jc/fHS/sBiY3vv+3K5xMAAAAAAACAt0KXfL2Mr5f8u9Uh4+XX55bd G+97l1sK8mqSr9/53z/V169+7APu5E//0b305b8uLV/y9fKZpY0TWkZ+d+3A E277P6ab8/Uj4+vznOhgs8g72vwcqflw/BjgTZ/DWxuO3dfc3mJ5fo10vr68 PB0rHeYu8/yk5kplfG8xLn9pd/n6jcPJ92EO3Y+hPxyMpW+fr7d6R/P1Ngb/ SDF2Xt6H+fqlaH4euW/g5+1pka/P58UJ6xXh2P9inde38vUs5+utf3Wc/NJ6 8QxFl3y9jI1Pb3s+b645YemzeDuI6grz9dImy9fbtqnbcTQflDwHovd5su1S 2qnbc6pd4fKXN0fz9aX7BsNt1mISzgMU5ut9e3zdtfn6ldR8ODvF+HX7W7g+ 9tmRPPz88L5HON5/NF9fXgfLxYff0bHy9dH+oOu+FAAAAAAAANitLvPhiBfz +eslVy9j5SWvLuPnX3v4IXftwOPu7HeeHcnX9zdPuZuPfkT/Lj8lT2/5ei2T 1Xfx6S/p+Po4X//LL325cT4cHZvcXyvNz2F5UM3L6zw0x0byc36+jcViLpRU vn44H86g+Fu8PMkp6lwg4dwgOsfJMJ8p827onCJbp4q6RufDGfjc5dZOq3z9 cP4bn5+3HLefH+dUkadfzss1zYdj9Tbl623umnA+HHktf7d5a2xOnng+nOXE fDhxvl7n8FlbL+boj/P14TqG8fDzGq1rX8t8KPa7cefDsWc34nnZ7XkMyy/H 20Fcl82H47eHflG31an5+2LOm03Njfv6F3UdirmaKtrlx+T75cfz4VgsbB4b P2/ToJjvpk2+Pp5XJ4xFvM2n8vXh+oRj7HVuGq3Xz3Pj47iaf0+G+fq4XLwO lou377H0hbZT+91/x2w+HMnVD+fDGd7LCPcHuu2slfc1AAAAAAAAwFvl5p27 w/83e3KU/O1G9P9mUS/O8WKywtz9fhP/79r0/Z/7i9wPkHWwZ0QAAAAAAAAA 3Bv97dPuzMVr7uqtNzR3H7py6447c+HqnrcRAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAPD2tXHqvFs/ea5k4+T5PW8XAAAAAAAAAABvB5Knv/76 m+7yzdvu1hu/Lbly847+bePkuT1vJwAAAAAAAAAAD6rV4y+419/8ndvaebGy jPzt9t3fu5VjZ/X98soR99rDD7n+1o575clH3env/3AibZlfOeyme0vuualp /TnbX9Wfi9ly9jpOTRY2T7qZhUH5d1un3KGpGV2HqbmFVusxs7hSqmt+dTtz pFUb5DO9jeMNZZa1/qa65pY33OzSWlHvwsYJXY/p+b7vk7yMrZu0uyouUkaW W7Ue1s9Sz8LmKS2ny8ocmpmvidVA65V2JNdhsJXX23O9taNFW2wbk/6pWveZ 3nLlOvXWj/l65hbd7PJ60RZt7/Ss9lnyc1kbLBbJPsi2jy4xbqy3Y4zb9F3X GDf1XdcYN/UdMa6O8aS+H6kYT+T7kYjx23UfNL92xE1l7ZJ65le2W8e4iezz D83MaluLbWR+UeudW9lKlknFKtUWOTY9d2gq79udol7ZTtp+D5vbv17UER4L 5Rhm22JVmdG+28zWZ67y77bOsh7FsT37KTGQfq8sk9qOgvaNbL/BsTeMSxhP ibGtk/VT1XczbN+9jF+5v/d3/KrKjBu/qn4It6X9GL+iffm+W37a/lj2NfKz al/VFOfK8ll9Yf32U/Y5xfaY7Zd3c/6fOi/fDatP2m7nx0V/5Pux+Puk5/4T WHbVtUDX64VJ0eN1Fo9Un7eNv3xWjhlN21gR695orAEAAB5E5y/dcGcuXmss d/alV9y5S9f1teTrb3/oL92tj3/InfjZz/V38lNy9zcf+6jb+fFP3LUDT7iN 2SW3lJ3DS25/Y3rR3f7gX7hrn/mkO/p//kM/88svP+0WVo+OLCs8v9U8S3Yu J9cbdt2v53bZOaKQ634rK3+3PIGcJ2quJDuHlnNmufaROuSzU7M9fa/XAoeH 55vhsuQzlouRMpo/yV7LeaJcl1geRuqY7a/pvQa53pHPWXu0zvwcXnPp2fWP lNd65PfZdYiti7VF6g/rkuXIe70WyvNf8jtZv6nZeb1mKHJieb7e2uXzU9sa I6lXliX1+uv7I/n6+HyPLEOWJ7/Xz8p9g2yZkruythV9El2XSD1V153SJq+6 jJE4htdq0qaqPJje25H+zOq2fFUVjXvYL5ozS5/vW1yl78PPVIljUXdt5vNQ A9V0DTpOjMepd5wYj9N348R4nL4bJ8a77TtifP98P+IYv932QZqvz45jUkdv vbxObfJDdu8g9V7295aLD1/L8oZxGv6+LlZhW+x4o/nR4NgoMQzzNNZPKli3 +H0dOe5Z7KRv7F5AVZlUH8g6tomlHCttm9HzgeyYHOdzwzKj21G6fVXfkVQ8 izJb/j5I9fadbt+k41fZvv0ev4bvT9v4hf1QtS3tl/jF7ZNYSllpn+Tx7WdR fuvUyP1A+e6nYqjltsrn6OH7ueVN3ZfFP8MYWC44PE828blufJ6cOi+X8+Gi vuVy/K3PZF+jMct/6nlydm5c5Ovtpy5veF0Rx9buXUi54n32OT2HLz7rrw38 eKW+lpH46zEiLy/LtvWJ25S6XkjVFV8vhH0Xlg2vm9rEbHj91B9Zx+R1UdRH sk+X+7ph32p7Z+aL7dm2iWIZveE93vC6rGo7AQAAuF9duXXHHT17UV+7gweL n+Fr+XksK3Pl5m19Lfn6/+///X/cjccfKeq58/73uMuff0pd+sJn3eb0grvy 1AH3wre/7U7/4Idu+98PuVc/9gF39P/8e2Ob4ny9Xd/b+EgZD2rnq3YeLHwO 2ufr5TxOzgXtuiU8Z67L18uy5PzR8vSWV5dzTn8uOPB5Cal7xcYw9avH10/P 5PcWBvk1XH6embfNn7Nual48VZed89q1g8XHl1nO1214/WD5eq1P7gfk1zGW R9HciJwL52MYRRgHi32Rr8/Yubacy+vn8uWqbBm1OTiJtV4vnBrJ3YV16Hiz rGyYt4nzOCE7j7dlVC1f8m9yLVAes7VWOQZJrpuKGEg8K/JDdh0SXhfLZ+vG lcl4WllXuzeSXH6HGLept0uMW/Vdhxi37btxY9y274hxfYwn8f1IxXgS349k jN+m+yAh6xSue1OM5VhTPA+QrXP83tbLcvHFswnZMSYca57K18exCtsicbLn OSz/KH0hzx2U8kdBX9oYVj2GyT3r6H3VOtpxVs8bNk8Vx8d4OVYmVYdutw3b lbYxzz3pd0nzjeXzjrhMqv+S7av4rsp2UxVPbXcW76rtqqp99yJ+Ve3b7/EL y3SOX9QPyW1pn8Qv1T4955Q8cJSvtzyx5pdlfxp+H4P8fRhDaZPlT3WcSPS+ bb4+Pk828blu+jw5Ht+9U5z7xvtt3a9l6+Z/Hvc5YLnXa9cbUb4+vq4I67Lx OXo9oftBH2O7Z+H7t1/sR8P7OzZ2KNz3h2N3Um0Ky8R1pa4XihhGZdPbd3XM yvn68jqm4h/3ke/H8vYZfp9lm07m6xPXZVXbCQAAwP3qwtVb7tgLLzWWk3z9 hSu39LXNh3Phq19xL3/pC/q7N973LrcU5RVufeLDOqa+n+cB1uZX3EtP/7W7 +DdP1y4rztf7PMJOPp5ku/J6qrhuyfM9/rpjOCY/PK+2sRi2DLsm0HPM0t/6 yev2sG6fYz+VzNeXrpMS+XpZL7k20nPgrZ2Rumrz9YuD0rqF+fo4ZjY+yu4H pObn0TEv+XPTVqdeT0RjUsNrSKk3HHs10ifFPZXm3EdYlz1bXVs2vwfRKqcS 1PX/t3euPXIcVR//CHwCPgUSAolLgoAACReLhBBwDAjehiBBhJAiWQpSUGJ7 b971znrsXe/6tvvYzoXYiRPbsZ1gB/Lw8JaPU0+fU316qqurunvas/Fu/Hvx 0+zM1tTlf6q765y6TFt6a7P8nYpJNfpq4LvE80e5tH4PQ7oPD9F4mnyn0Xga 202j8TS2m0bjaW2HxmmNZ3l91OKzM7w+Qo0f+XtQPL+d07h8/siz0WJctfdl umSZ8gxsWV+f0iqsi19zuarzFvosC2L54drf2Ja29teem/H7ZBuDZ5bFcOxs Hi0nStPQX9e1Lmt9ZQ4pd76Mf9au1OY5/Jz3kqIxuShNTLJ+mXThPEysp+nY No+Rqt9u6Jer317XL04zSL/IDsm+tIf0S9VPxq0Wcw3j9YKt6dbyy7OybByb 01DPCCraY+Pl8H3feH08Tg7vMeFYtzlObo7Lw/UrjRi7zkmMJvtiy/z8WH65 PV4f3dPlPDNbRy52VL1lb4LG08P72dive+8Zr2/WqekvJOP1kb8w6WvNeH1j /0SLZvH6+rCNKf37xuutvr4PbtXqmvPLcv0EAAAAYL+yeemqu/2Pf3Wmu33v U00rf1u8Xv5+53e/ddd/8ay7+PJh/ezmgafcld+/qP+78uIf3LVDB/Xv84f/ 6m795En30ROP6Xk58tlrB5/vdR5OOB63z6rzSoMxmT+bxp9DHMfr/Xk4fm/q ZIx4ojyLd6E9Xn/Gr3fS84Rlr/74XCNer696js4kztSI158xn2oUnYcz8Q/i vMI9sJM9pOtTxet1bYysaSo0Cc/DmexbXfdn4Ug5hQ/mz6Tweeo+BInnaP6r wTlEga0CG8S+mvgbvt4rk/VmURo7qyJcb2YxnVC32vi79Hl9u8bJfKu9suIb lj5gHAvUNkexqcomZX+Ly9Zzl8q96rYO2HynyvZyZlJ0NoTtp7B2xmUP1TjO N1X2EI372G6QxgnbzUrj2HZDNO5ju6EaD7k++mjc5/roo/GQ66OPxkOuj74a 76V7UJxmVvegOE0Vp5Rz4iw22ENj1aOMSVnMJnxv51jLHjZ5FtjzRPK18uM0 Ka3iuhjV/E15XoiPaU3O1g5taTH9qp7R+5Qddc3+vF+zH8auw/WaqTS5mGi1 1j+hpf7OTvlMjuNqtj41TpOydVy/OI18T84xt7h0Sk+pm8QEbUyT7K+J+sVp Zq1ftT9yRvrl+vSD6pdKM0S/lB3ivjREv1SaWeoX1k/PU9Fz0BPn4ZR7csL9 T3a2YkrDeA4pfj/deTiTcXKoTzjWjcfJXu9oXF7OUei+p8TvU4htLL39HoHN EabOw7H7fy2OHcWSvT+yXj0TJT+/12Dk7AzMyT29PMOmnLeVe3N4Hk5cp7CN 9fNwgrxa4vVx2lS8vk2zMF7v4/OTNqb0T9qoJV5vc8Ghxjm/rOFPtewrAQAA ANgvvPneh+7jf/6fu3z1hv4dImfbf/zPf7srxf+myVPi83LG/WjUsm/9M8Tv m/ZnG3aePQqT83DW078jldO469zIPmmS9QnPLpllvtLOjt+46io7hfer2n/3 q0/ZQ9rZp2w0frB8h2j8MK+PoRr3sh0a71uN9zND7Tgkn1lpuVu2TuazS/31 Yeq3W/f8va7frPp6H/26zq+fJV3xegAAAAAA+B83vvCmxubfePdWjSvFZyfP v/nQ6wefLeKz2RpQXT/T8ZtnAAAAALBPKX/HQ8/SGZ/1ewDGW87OjJxlWban 1fK319yZRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADG +MKb7sq7t9yb731Y4/K1m/q/h10/AAAAAAAAAAAAAIDPOxKX//if/3aXrt5w b7x7q8blazf0f1eu3qzSr65tuY+//XW3srHjbv34B+7SH1+aST0W1864Y0sn 3OtHj+nr/MpJfV0uynnYGnVxfP2imzs+qn+2se2OHJ3TNhxdON6rHXPLa7W8 Fk9uFmz1qoN8Z+n0+Y40q5p/V14Lq6fd/Ilxle/x0xe0HccWV7xNyjTWNql3 ThdJI+Xm2mF2lnyOr29rOi2r4MjcYotWI81X6pFsw2ijzHfJLY3PVnWxPib2 ybV9bmk126alU+d8PgvLbn71VFUXre+xebVZ8ntFHUyLpA2K/jFE4858B2rc x3ZDNe6y3VCNu2yHxnmNZ3V9pDSeyfWR0PhRvQctjrfc0aJeks/i2mZvjbuQ e/6RuXmta9VHFpc134W1jWSalFapusiz6fUjR0vb7lT5Sj/pex121/9UlUf4 LJRnmPXFXJqm7daL9ixk/29tlnZUz/biVTQQu2fTpPpRUL9G/w2evaEuoZ6i sbXJ7JS7NsP67aZ+dXvvbf1yaabVL2eHsC/tRf2q+pX3bnm1+7Hca+Q1d6/q 0jmbvsgvzN9e5Z5T9cfivvwg4//UuPxBsPyk7jY+ruxR3sfi60nH/jMoO+cL DPUXZoU+rws9Ujbvq798V54ZXX2s0nqpqTUAAADA55Gty1fdh//4V2e62/c+ 1bTyt8Tr7z3+VXf3e4+7Cy8f1s/kVWL3d578jtv581/czQM/dKfnT7gTxRhe Yvunjy27e499xd386Y/c2Vf+pt957flD7vjJs42ywvGtxlmKsZz4G+b369iu GCMK4vdbWvm/xQlknKixkmIMLWNm8X0kD/nu0fklfa++wJnJeDMsS75jsRhJ o/GT4m8ZJ4pfYnEYyWN+ZaxzDeLvyPesPppnOYbXWHrh/0h6zUc+L/wQa4vV RfIP85Jy5L36QmX8Sz6T9h2dX1SfoYqJlfF6q5ePT22qRpKvlCX5ev9+q2yP j/dIGVKefK7flXmDokyJXVndKptEfonkk/M7pU6efBpDdAx9NalTLg6mczti zyJvi1flUN1Du2jMLD3eN13F9uF3csRatPlmPg41Urp80Gk0nibfaTSexnbT aDyN7abR+EFth8b75/qINX7U7kEary+eY5LH0ql6m/rEh2zuIPVe7vcWiw// lvImOk0+b9MqrIs9bzQ+GjwbRcMwTmN2UoK2xe/bkOeeaSe2sbmAXJqUDaSN fbSUZ6X1GR0PFM/kOJ4bpmn2o3T9ctdISs8qzYafB8n373T9Zq1ftn57Xb+O 66evfqEdcn1pr+gX10+0lLRSP4nj22uVfmO7MR8o135KQ023UR+jh+8XVtf1 Xha/hhpYLDgcJxvxWDceJ6fG5TIervJbretvNpN7jWpWvuo4uRgbV/F6e9Xy Jn5FrK3NXUi66n3xPR3DV9/1voFfr7SiaUR/fUaU6aVsa09cp5S/kMor9hdC 24VpQ7+pj2YT/2ml0cakXxTZSO7pMq8b2lbrO7dY9WfrE1UZS5M53tAvy/UT AAAAgP3KtZsfubOXr3WmO3flXXf1xl39W+L1//3iF9ztp56o/n//G1927//8 GeX6cz9z68eOuw+eOeDeeOEFd+lPL7nNV4+4j777TXf2lVc7y4rj9ebf2/pI WQ9q41UbBws+Bu3j9TKOk7Gg+S3hmLktXi9lyfjR4vQWV5cxpx8LjnxcQvJe szVMK/n19cfmyrmFUenDlePMsm5+zLqucfFUXjbmNd/B9PFpVsu2TfwHi9dr fjIfUPoxFkfR2IiMhcs1jEKog2lfxesLbKwtY3n9XlmuUpTRGoMTrdVf2G7E 7sI8dL1ZkTaM28RxnBAbx1sZufIl/ia+QH3N1ji7Bkn8pkoD0TMTHzI/JPSL 5btt68pkPa201eZGkuUP0LhPvkM07mW7ARr3td20Gve1HRq3azyL6yOl8Syu j6TGj+g9SJA2hW3v0lieNdV+gKLN8Xtrl8Xiq70JxTMmXGueitfHWoV1EZ1s P4fFH8UWsu+gFj8KbGlrWPUZJnPW0ftcG+05q+OG9e3q+RiXY2lSeWi/7ehX Wscy9qTXksYb6+OOOE3Kfsn6Za5V6Tc5PbXehd65fpWr327ol6vfXtcvTDNY v8gOyb60R/RL1U/HnBIHjuL1FifW+LLcT8PrMYjfhxpKnSx+qutEovd94/Xx ONmIx7rpcXK8vnunGvvG9229rxVt86/nfQxY5nrN34ji9bFfEeZl63PUn9D7 oNfY5iy8fVeq+2g4v2Nrh8J7f7h2J1WnME2cV8pfqDSM0qb7d16zery+3saU /rGNvB3r/TO8nqVPJ+P1Cb8s108AAAAA9isf3L3vzl7x8Xr39NPVa/i3vJ4r 0nxw557+befhXP3Nr9x7B5/Tzz752pfciSiucPf739I19StlHGC8uObePfRL d+3Xh1rrFMfrfRxhp1xPspn1pyq/pYz3eL9jsiY/HFfbWgwrw3wCHWPW/reS 9NvDvH2MfTsZr6/5SYl4vbRLfCMdA2/sNPJqjdcvj2ptC+P1sWa2PsrmA1Ln 8+ial3LftOWp/kS0JjX0ISXfcO1VwybVnEp37CPMy/ZWt6Yt5yB6xVSCvNrS W5vl71RMqtFXA98lnj/KpfV7GNJ9eIjG0+Q7jcbT2G4ajaex3TQaT2s7NE5r PMvroxafneH1EWr8yN+D4vntnMbl80eejRbjqr0v0yXLlGdgy/r6lFZhXfya y1Wdt9BnWRDLD9f+xra0tb/23IzfJ9sYPLMshmNn82g5UZqG/rqudVnrK3NI ufNl/LN2pTbP4ee8lxSNyUVpYpL1y6QL52FiPU3HtnmMVP12Q79c/fa6fnGa QfpFdkj2pT2kX6p+Mm61mGsYrxdsTbeWX56VZePYnIZ6RlDRHhsvh+/7xuvj cXJ4jwnHus1xcnNcHq5facTYdU5iNNkXW+bnx/LL7fH66J4u55nZOnKxo+ot exM0nh7ez8Z+3XvPeH2zTk1/IRmvj/yFSV9rxusb+ydaNIvX14dtTOnfN15v 9fV9cKtW15xflusnAAAAAPuVt9+/7S5fvdGZTn6L9q3rH+rfFq+Xv9/53W/d 9V886y6+fFg/u3ngKXfl9y/677z4B3ft0EH9+/zhv7pbP3nSffTEY3pejnz2 2sHne52HE47H7bPqvNJgTObPpvHnEMfxen8ejt+bOhkjnijP4l1oj9ef8eud 9Dxh2as/PteI1+urnqMziTM14vVnzKcaRefhTPyDOK9wD+xkD+n6VPF6XRsj a5oKTcLzcCb7Vtf9WThSTuGD+TMpfJ66D0HiOZr/anAOUWCrwAaxryb+hq/3 ymS9WZTGzqoI15tZTCfUrTb+Ln1e365xMt9qr6z4hqUPGMcCtc1RbKqySdnf 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 AAAAmC3/D8bE23Q= "], "Byte", ColorSpace -> ColorProfileData[CompressedData[" 1:eJx9kT1IHEEUx393RhRRFLwiSIoVNJWCRAmWuUtABAPHqqDRwv269eB275hd kYBlIK2QIh9NLlrYpI6tha0gBPIBYmdnZYiNyObN3sEd4mVgZn7zn/d/zHsz alfNUhaIemUxre28UtbrxSE5LIdR2Q89dz6MPd9Ts3ZGxLqOJVuvOEH0YAqC MFbmXMFYWX1l9FzQxwAZppmynKiWLxYX6Diuf6AT8n1S5+ocd+8YcL3IgYwh /MypqVh4Q/jpdlzT/EE452xarvBX4QklDxT+pXW7wZea/ZTTonJqyXwunBM2 /Da229jZVIHwjPCYG4SSP7vSYFfzjuagsuU036kr7PfC5UWty3zEHPO8pIiB zRZlKsRMyh6KEmHKfaGDfyT1F8Vli6uMI44XVAmwUj/6D+72NipNP2lk6i9A 93mS/BmHnndwu5skN1+S5HYPus7gKGz5q3WY/Sv6bksb+wyDb+DbcUuz38Ph W3j4u2YpK5W6ZGZLJbg6kG9aheFT6Ftr9K15z/5PWJJeLZzAx0/w2Jfc6x3q 7m3v239jmv37Bwk/f7Q= "], "RGB", "XYZ"], ImageResolution -> {72, 72}, Interleaving -> True, MetaInformation -> Association["Comments" -> Association["Comment" -> "Created with GIMP"]]] (* ::Item:: *) (*Here are those same error messages CONTEXTUALIZED*) (* ::Text::Plain:: *) (*--> Option "Spectrograms - Payload Sizes" Plot Selected . Continuing .*) (* ---- > Processing :: Took 116.353 seconds*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"Part", "partd1", *) (* "\"Depth of object {37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37,*) (* 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 57, 2, 57, 2,*) (* 57, <<19177480>>, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4,*) (* 242, 4, 242, 4, 242, 4} is not sufficient for the given part*) (* specification.\"", 2, 0, 1, 21201100210769988491, "Local"}, *) (* "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"PositionIndex", "invrp", *) (* "\"The argument {37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 57, 2, 57,*) (* <<19177483>>, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4,*) (* 242, 4, 242, 4}[[<<2>>]] is not a valid Association or a list.\"", 2, *) (* 0, 2, 21201100210769988491, "Local"}, "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"Part", "partd1", *) (* "\"Depth of object {37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37,*) (* 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 57, 2, 57, 2,*) (* 57, <<19177480>>, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4,*) (* 242, 4, 242, 4, 242, 4} is not sufficient for the given part*) (* specification.\"", 2, 0, 3, 21201100210769988491, "Local"}, *) (* "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"PositionIndex", "invrp", *) (* "\"The argument {37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 57, 2, 57,*) (* <<19177483>>, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4,*) (* 242, 4, 242, 4}[[<<2>>]] is not a valid Association or a list.\"", 2, *) (* 0, 4, 21201100210769988491, "Local"}, "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"Part", "partd1", *) (* "\"Depth of object {37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37,*) (* 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 57, 2, 57, 2,*) (* 57, <<19177480>>, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4,*) (* 242, 4, 242, 4, 242, 4} is not sufficient for the given part*) (* specification.\"", 2, 0, 5, 21201100210769988491, "Local"}, *) (* "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"General", "stop", *) (* "\"Further output of \\!\\(\\*StyleBox[RowBox[{\\\"Part\\\", \\\"::\\\",*) (* \\\"partd1\\\"}], \\\"MessageName\\\"]\\) will be suppressed during this*) (* calculation.\"", 2, 0, 6, 21201100210769988491, "Local"}, *) (* "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"PositionIndex", "invrp", *) (* "\"The argument {37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 57, 2, 57,*) (* <<19177483>>, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4,*) (* 242, 4, 242, 4}[[<<2>>]] is not a valid Association or a list.\"", 2, *) (* 0, 7, 21201100210769988491, "Local"}, "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"General", "stop", *) (* "\"Further output of \\!\\(\\*StyleBox[RowBox[{\\\"PositionIndex\\\",*) (* \\\"::\\\", \\\"invrp\\\"}], \\\"MessageName\\\"]\\) will be suppressed*) (* during this calculation.\"", 2, 0, 8, 21201100210769988491, "Local"}, *) (* "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"Keys", "invrl", *) (* "\"The argument PositionIndex[{37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 57, <<19177487>>, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242,*) (* 4, 242, 4}[[<<2>>]]] is not a valid Association or a list of rules.\"", *) (* 2, 0, 9, 21201100210769988491, "Local"}, "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"Keys", "invrl", *) (* "\"The argument PositionIndex[{37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 57, <<19177487>>, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242,*) (* 4, 242, 4}[[<<2>>]]] is not a valid Association or a list of rules.\"", *) (* 2, 0, 10, 21201100210769988491, "Local"}, "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"Keys", "invrl", *) (* "\"The argument PositionIndex[{37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6, 37, 6,*) (* 57, <<19177487>>, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242, 4, 242,*) (* 4, 242, 4}[[<<2>>]]] is not a valid Association or a list of rules.\"", *) (* 2, 0, 11, 21201100210769988491, "Local"}, "MessageTemplate"]]*) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"General", "stop", *) (* "\"Further output of \\!\\(\\*StyleBox[RowBox[{\\\"Keys\\\", \\\"::\\\",*) (* \\\"invrl\\\"}], \\\"MessageName\\\"]\\) will be suppressed during this*) (* calculation.\"", 2, 0, 12, 21201100210769988491, "Local"}, *) (* "MessageTemplate"]]*) (*--> Option "Date/Time - Error Bits" Plot Selected . Continuing .*) (* ---- > Processing :: Took 12.2835 seconds*) (**) (*PCAP File "/SOME-LOCATION/TEST.pcap" ended processing at "Wed 29 Sep 2021 20:21:32"*) (*= > MEMORY USAGE :: 3322299776*) (**) (**) (*BoxForm`AbsoluteRawBoxes[TemplateBox[{"Syntax", "bktmcp", *) (* "\"Expression \\\"\\!\\(\\*RowBox[{\\\"Import\\\", \\\"[\\\",*) (* \\\"\\\\\\\"/SOME-LOCATION/Untitled.png\\\\\\\"\\\"}]\\)\\\" has no closing*) (* \\\"\\!\\(\\*RowBox[{\\\"\\\\\\\"]\\\\\\\"\\\"}]\\)\\\"\\!\\(\\*RowBox[{*) (* \\\"\\\\\\\"\\\\\\\"\\\"}]\\).\"", 2, 1, 13, 21201100210769988491, *) (* "Local"}, "MessageTemplate"]]*) (**) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Checkpointing - Part 1*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold:: *) (*Very old concept*) (* ::Item::GrayLevel[0]::Bold:: *) (*MMA provides everything needed to do this*) (* ::Item::GrayLevel[0]::Bold:: *) (*Possible to restore a program to state prior to crash*) (* ::Item::GrayLevel[0]::Bold:: *) (*Complexity of checkpointing implementation depends to what extent details need to be saved*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Not a new concept*) (* ::Item::GrayLevel[0]:: *) (*Largely unfamiliar to PC world*) (* ::Item::GrayLevel[0]::Closed:: *) (*Was common for COBOL applications and JCL (IBM mainframe) batch jobs*) (* ::Subitem::GrayLevel[0]:: *) (*Other languages too but I am unfamiliar with these*) (* ::Item::GrayLevel[0]::Closed:: *) (*Can be used to recover from crashes*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Well structured checkpoints help diagnose problems*) (* ::Subsubitem::GrayLevel[0]:: *) (*Rather than look at memory dump in debugger (debugging is ugly)*) (* ::Item::GrayLevel[0]::Closed:: *) (*Can be used to rollback changes too*) (* ::Subitem::GrayLevel[0]:: *) (*Type of transaction log*) (* ::Item::GrayLevel[0]:: *) (*Prevents having to rerun long and laborious data processing jobs*) (* ::Item::GrayLevel[0]::Closed:: *) (*Provides proof to customers that application working as expected*) (* ::Subitem::GrayLevel[0]:: *) (*Looking at various checkpoints throughout run cycle of application provides confidence*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*When designing your program*) (* ::Item::GrayLevel[0]:: *) (*Think about what needs to be saved should crash occur*) (* ::Item::GrayLevel[0]:: *) (*Think about what others may need to work with post-processing*) (* ::Item::GrayLevel[0]::Closed:: *) (*Will prevent rerunning time-consuming AND/OR resource-intensive jobs*) (* ::Subitem::GrayLevel[0]:: *) (*Consider how often it should be done*) (* ::Subitem::GrayLevel[0]:: *) (*Consider variables to save that can help diagnose problems/crashes*) (* ::Item::GrayLevel[0]::Closed:: *) (*Checkpointing can be added after the fact*) (* ::Subitem::GrayLevel[0]:: *) (*Really helps if program has good structure*) (* ::Item::GrayLevel[0]:: *) (*FUNCTIONAL programming may be less conducive to Checkpointing*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*This is my own opinion*) (* ::Subsubitem::GrayLevel[0]:: *) (*I come from C (functions) and Assembly background*) (* ::Subitem::GrayLevel[0]:: *) (*Function-based programming facilitates incorporation of Checkpointing*) (* ::Subitem::GrayLevel[0]:: *) (*Your Mileage will vary*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*WDL/MMA and Checkpointing*) (* ::Item::GrayLevel[0]::Closed:: *) (*In general, popular opinion is WDL/MMA not synonymous to data processing*) (* ::Subitem::GrayLevel[0]:: *) (*i.e., COBOL & JCL*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*However, WDL/MMA provides facilities for writing enterprise-level data processing systems*) (* ::Subsubitem::GrayLevel[0]:: *) (*Requires expert-level programming skills*) (* ::Subsubitem::GrayLevel[0]:: *) (*Adequate system resources*) (* ::Subitem::GrayLevel[0]:: *) (*Even non-enterprise applications benefit from Checkpointing*) (* ::Item::GrayLevel[0]::Closed:: *) (*When to use Checkpointing inside of WDL/MMA*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*OOM*) (* ::Subsubitem::GrayLevel[0]:: *) (*Triggers complete Kernel abort - ALL memory variables die*) (* ::Subsubitem::GrayLevel[0]:: *) (*This is where high-performance swap helps*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Evaluation->Quit Kernel->Local*) (* ::Subsubitem::GrayLevel[0]:: *) (*ALL memory variables die*) (* ::Subsubitem::GrayLevel[0]:: *) (*Usually Quit Kernel to stop runaway calculation*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Necessary to recover from MMA or system crash*) (* ::Subsubitem::GrayLevel[0]:: *) (*Systems crash for all sorts of arbitrary reasons*) (* ::Subsubitem::GrayLevel[0]:: *) (*Under Linux, certain desktop environments are "buggier"*) (* ::Item::GrayLevel[0]::Closed:: *) (*Show results of what was done*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Will show 2 examples*) (* ::Subsubitem::GrayLevel[0]:: *) (*1. Reload a previous set of computations, with all necessary variables pre-baked*) (* ::Subsubitem::GrayLevel[0]:: *) (*2. Show a series of pre-formatted visualizations ready for user interaction & manipulation*) (* ::Item::GrayLevel[0]::Closed:: *) (*Can be used to advance current processing jobs*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Take existing results, finish work on bigger more capable system*) (* ::Subsubitem::GrayLevel[0]:: *) (*Think field-deployed programs collecting data and performing minimal processing*) (* ::Item::GrayLevel[0]::Closed:: *) (*Why not save results in non-Checkpoint format?*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Not always efficient*) (* ::Subsubitem::GrayLevel[0]:: *) (*Ex. Text, CSV, Table -> time-consuming to import, deconstruct and reload*) (* ::Subitem::GrayLevel[0]:: *) (*Not compact*) (* ::Subitem::GrayLevel[0]:: *) (*Makes saving internal variables much more complicated*) (* ::Item::GrayLevel[0]::Closed:: *) (*What format should be used?*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Personal preference for WXF*) (* ::Subsubitem::GrayLevel[0]:: *) (*Documentation provides file format breakdown (See: tutorial/WXFFormatDescription)*) (* ::Subsubitem::GrayLevel[0]:: *) (*Makes it possible to deconstruct manually*) (* ::Subsubitem::GrayLevel[0]:: *) (*Binary Serialized*) (* ::Subsubitem::GrayLevel[0]:: *) (*Compact*) (* ::Subsubitem::GrayLevel[0]:: *) (*Fast*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Could use WDF, ExpressionML (Wolfram XML)*) (* ::Subsubitem::GrayLevel[0]:: *) (*Others too*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Had moderate success with GZIP, ExportString/ImportString, BaseEncode/BaseDecode*) (* ::Subsubitem::GrayLevel[0]:: *) (*More work is required than with WXF*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Checkpointing - Examples - Part 2*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*CAN Bus Prototype - PROCESSED DATA*) (* ::Item:: *) (*Prototype is a CAN Bus Forensic Data Validation Suite*) (* ::Item:: *) (*Prototype loads a Network-based PCAP file (PCAP is THE standard network capture file format)*) (* ::Item:: *) (*Prototype then performs all sorts of validation routines and generates various graphs, plots and spectra*) (* ::Item:: *) (*END GOAL -> IDENTIFY INCONSISTENCIES LOOKING FOR MALICIOUS INTERFERENCE WITH VEHICLE DATA BUS*) (* ::Item:: *) (*DATA IS PROCESSED, AND CHECKPOINTED SO ANALYST CAN, LATER, PERFORM FURTHER ANALYSES*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Checkpointing - Example 1 - STORED LARGE PREPROCESSED DATA FOR LATER USE*) (* EXAMPLE 1.A.: CREATE CHECKPOINT. *) (* BELOW ARE GLOBAL PROGRAM VARIABLES CRITICAL FOR ITS OPERATION. *) Print[ AbsoluteTiming[ checkpoint = { {}, {}, {}, {} }; checkpoint[[1]] = PcapFileName; checkpoint[[2]] = PcapByteOrder; checkpoint[[3]] = PcapFileSize; checkpoint[[4]] = RAWPCAPDATA; Export["/home/chromium/checkpoint.wxf", checkpoint, "WXF"]; ][[1]], " seconds" ]; Print@FileByteCount@"/home/chromium/checkpoint.wxf"; SequenceForm[1.487361, " seconds"] 992239726 (* EXAMPLE 1.B.: CLEAR EVERYTHING IN MEMORY. NO PARALLEL KERNELS WERE RUN SO NO EXTRA MEMORY CLEANING MEASURES NEEDED. *) Print@MemoryInUse[]; ClearSystemCache[]; ClearAll[ "Global`*" ]; $HistoryLength = 0; Share[]; Print@MemoryInUse[]; (* EXAMPLE 1.C.: RELOAD CHECKPOINT AND DISTRIBUTE TO APPROPRIATE VARIABLES. *) PcapFileName = .; PcapByteOrder = .; PcapFileSize = .; RAWPCAPDATA = .; Module[{ checkpoint }, checkpoint = Import[ "/home/chromium/checkpoint.wxf"]; PcapFileName = checkpoint[[1]]; PcapByteOrder = checkpoint[[2]]; PcapFileSize = checkpoint[[3]]; RAWPCAPDATA = checkpoint[[4]]; ]; (* EXAMPLE 1.D.: CHECK WHETHER DATA WAS CORRECTED RESTORED. *) Print@PcapFileName; Print@PcapByteOrder; Print@PcapFileSize; RAWPCAPDATA (* ::Subsection::GrayLevel[0]::Closed:: *) (*Checkpointing - Example 2 - ADVANCED VISUALIZATIONS*) (* EXAMPLE 2.A.: GENERATE TABVIEW VISUALIZATION DEPLOYMENT FOR GRAPHS, PLOTS, AND SPECTRA. *) PlotsGraphsWXF = Framed@TabView[{ Framed@"Date/Time" -> TabView[{ Framed@"All Events" ->datetimeplotTallyPlot, Framed@"Reserved Bytes" ->datetimeplotHexPcapUnixTime, Framed@"Payload Sizes" ->datetimeplotPayloadPcapUnixTime, Framed@"Control Bits" ->datetimeplotControlBitsPcapUnixTime, Framed@"IDs" ->TabView[{ Framed@"IDs Set1" ->datetimeplotIDSet1PcapUnixTime, Framed@"IDs Set2" ->datetimeplotIDSet2PcapUnixTime }, LabelStyle->{ FontSize->Medium, Black, Bold }], Framed@"Error Bits" ->datetimeplotErrorBitsPcapUnixTime }, LabelStyle->{ FontSize->Large, Black, Bold }], Framed@"Tallies" -> TabView[{ Framed@"Reserved Bytes" ->barchartMagicByteTallies, Framed@"Payload Size" ->barchartPayloadSizeTallies, Framed@"Control Bits" ->barchartControlBitsTallies, Framed@"IDs" ->TabView[{ Framed@"IDs Set1" ->barchartIDs1Tallies, Framed@"IDs Set2" ->barchartIDs2Tallies }, LabelStyle->{ FontSize->Medium, Black, Bold }], Framed@"Error Bits" ->barchartErrorBits }, LabelStyle->{ FontSize->Large, Black, Bold }], Framed@"Payload Byte Distributions" -> TBV }, LabelStyle->{ FontSize->Large, Black, Bold }]; Print@ByteCount@PlotsGraphsWXF; 3233472 (* EXAMPLE 2.B.: CREATE CHECKPOINT OF VISUALIZATION SYSTEM SO ANALYST CAN LATER REVIEW ALL VISUAL RESULTS AND CUES. *) Export[ "/home/chromium/tabview_CHECKPOINT.wxf", PlotsGraphsWXF, "WXF" ]; Print@FileByteCount@"/home/chromium/tabview_CHECKPOINT.wxf"; 2808842 (* EXAMPLE 2.C.: CLEAR ALL MEMORY. *) ClearSystemCache[]; ClearAll[ "Global`*" ]; $HistoryLength = 0; Share[]; Needs["Parallel`Developer`"]; Needs["Utilities`CleanSlate`"]; Parallel`Developer`ClearSlaves[]; Parallel`Developer`ClearKernels[]; Parallel`Developer`ClearDistributedDefinitions[]; ClearSystemCache[]; ClearInOut; (* EXAMPLE 2.D.: CREATE VARIABLE TO LOAD CHECKPOINT, AND THEN RELOAD IT SO ANALYST CAN WORK WITH RESULTS. *) checkpoint = Import[ "/home/chromium/tabview_CHECKPOINT.wxf" ]; notebook = CreateDialog[ checkpoint, Background->Darker[ LightBlue, 0.5 ], Modal->False, Deployed->False, WindowTitle->"ANALYST's Plots & Graphs Viewer", WindowSize->Fit, PrintingStyleEnvironment->"Printout", NotebookAutoSave->False, Saveable->False, Deletable->False, Editable->False, Selectable->True, ShowCellBracket->False, WindowElements->{ "VerticalScrollBar", "HorizontalScrollBar", "StatusArea", "MagnificationPopUp" }, WindowFrameElements->{ "CloseBox", "ZoomBox", "MinimizeBox", "DocumentIcon", "ResizeArea" } ]; ByteCount@checkpoint ByteCount@notebook (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Memory Management - Linux && RAM, Cache and Swap - Part 1*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold:: *) (*RAM is something you can never have to much of*) (* ::Item::GrayLevel[0]::Bold:: *) (*Swap is a necessary evil*) (* ::Item::GrayLevel[0]::Bold:: *) (*No form of swap can replace RAM*) (* ::Item::GrayLevel[0]::Bold:: *) (*Linux memory management is detailed and sometimes complex*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Mathematica can consume very large quantities very fast*) (* ::Item:: *) (*It must compete with other existing processes and the Operating System's own memory needs*) (* ::Item::Closed:: *) (*Working with large sets of numbers, this becomes noticeable*) (* ::Subitem:: *) (*Each byte has some associated memory occupying metadata, such as its properties*) (* ::Subitem:: *) (*The first bytes occupy the most memory*) (* ::Item::Closed:: *) (*Let's see how a numeric list grows in MEMORY-OCCUPIED size*) (* ::Subitem::Closed:: *) (*Simple lists*) list=.; ByteCount@list; list={} ByteCount@list list={1,2}; ByteCount@list list={1,2,3}; ByteCount@list list={1,2,3,4}; ByteCount@list list={1,2,3,4,5}; ByteCount@list list={1,2,3,4,5,6}; ByteCount@list list={1,2,3,4,5,6,7}; ByteCount@list (* ::Subsubitem::Closed:: *) (*Results*) {} 40 88 112 136 160 184 208 (* ::Subitem:: *) (*Large lists*) Module[{ list }, list = RandomInteger[1, 1000000000]; Print@ByteCount@list; ]; (* ::Subsubitem::Closed:: *) (*Results*) 8000000200 (* ::Item::Closed:: *) (*Most systems have limited memory resources*) (* ::Subitem:: *) (*1 TB-sized RAM system are very costly >$5000*) (* ::Subitem:: *) (*Memory density == $$$$*) (* ::Item::Closed:: *) (*Typical Intel/AMD desktop / low-end workstation CPUs support limited RAM*) (* ::Subitem:: *) (*High-end server CPUs can support many, many TBs of RAM*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Page Cache*) (* ::Item:: *) (*Same concept as disk cache or buffer cache*) (* ::Item:: *) (*Typically automatic*) (* ::Item:: *) (*Sometimes can consume enormous quantities of RAM*) (* ::Item::Closed:: *) (*Use command "sync" to flush in-memory cache to disk*) (* ::Subitem:: *) (*Do not need to be root or sudo*) (* ::Subitem:: *) (*Does not necessarily everything out*) (* ::Item::Closed:: *) (*There are two types of caches that can be cleared manually*) (* ::Subitem:: *) (*PAGE & SLAB*) (* ::Subitem::Closed:: *) (*To clear either or both, as root or sudo*) (* ::Subsubitem:: *) (*echo 1 > /proc/sys/vm/drop_caches*) (* ::Subsubitem:: *) (*echo 2 > /proc/sys/vm/drop_caches*) (* ::Subsubitem:: *) (*echo 3 > /proc/sys/vm/drop_caches*) (* ::Subitem:: *) (*This can liberate large quantities of memory but at the risk I/O increases significantly*) (* ::Item::Closed:: *) (*Can be set live using /proc (must be root or sudo)*) (* ::Subitem:: *) (*echo 50 > /proc/sys/vm/dirty_ratio (Set RAM-to-Cache ratio)*) (* ::Subitem:: *) (*echo 25 > /proc/sys/vm/dirty_background_ratio (Set RAM-to-Cache ratio before backgrounding kernel flusher)*) (* ::Subitem:: *) (*echo 360000 > /proc/sys/vm/dirty_expire_centisecs (Set centiseconds before kernel flusher writes to disk)*) (* ::Subitem:: *) (*echo 360000 > /proc/sys/vm/dirty_writeback_centisecs (Same but specific to in-memory inodes)*) (* ::Item::Closed:: *) (*Fine-tune minimum free cache*) (* ::Subitem:: *) (*echo NUMBER_IN_KB > /proc/sys/vm/min_free_kbytes*) (* ::Subitem:: *) (*DO NOT SET TO MORE THAN 3% of TOTAL RAM OTHERWISE STABILITY ISSUES MAY OCCUR*) (* ::Subitem:: *) (*LINUX IS DESIGNED BY DEFAULT TO CACHE AS MUCH AS POSSIBLE*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Memory Compaction (RAM Fragmentation)*) (* ::Item::GrayLevel[0]:: *) (*All computer systems eventually suffer issues from insufficient contiguous memory pages*) (* ::Item::GrayLevel[0]::Closed:: *) (*Memory gets fragmented, just like disks*) (* ::Subitem::GrayLevel[0]:: *) (*It affects Windows too*) (* ::Item::GrayLevel[0]::Closed:: *) (*Memory fragmentation can cause intermittent slowdowns*) (* ::Subitem::GrayLevel[0]:: *) (*Can be worse when swap is in high use*) (* ::Subitem::GrayLevel[0]:: *) (*Typical of smaller RAM systems*) (* ::Subitem::GrayLevel[0]:: *) (*Occurs on large servers that have been running for long time*) (* ::Subitem::GrayLevel[0]:: *) (*Especially an issue if too many LARGE MEMORY PAGES are in use*) (* ::Subitem::GrayLevel[0]:: *) (*Also can be triggered if /proc/sys/vm/min_free_kbytes set to more than 5% RAM*) (* ::Item::GrayLevel[0]::Closed:: *) (*Manual memory compaction is not yet as stable as could/should be*) (* ::Subitem::GrayLevel[0]:: *) (*Before enabling compaction, SYNC and FLUSH PAGE AND SLAB CACHES first and save all work*) (* ::Subitem::GrayLevel[0]:: *) (*As root (or sudo) run echo 1 > /proc/sys/vm/compact_memory*) (* ::Item::GrayLevel[0]::Closed:: *) (*Especially problematic on systems that use large memory pages (LMP)*) (* ::Subitem::GrayLevel[0]:: *) (*For x86 typical page is 4 KiB*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*LMP can provide virtual memory performance boost*) (* ::Subsubitem::GrayLevel[0]:: *) (*Larger (but fewer) pages are required when reading/writing swap*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Useful for overcommitting Virtual Machine memory*) (* ::Subsubitem::GrayLevel[0]:: *) (*Which is then swapped out*) (* ::Subsubitem::GrayLevel[0]:: *) (*Hence performance is critical for responsiveness*) (* ::Item::GrayLevel[0]:: *) (*For everyday use, generally do not change system settings for LMP or Transparent Huge Pages*) (* ::Item::GrayLevel[0]::Closed:: *) (*More details, read*) (* ::Subitem::GrayLevel[0]:: *) (*https://savvinov.com/2019/10/14/memory-fragmentation-the-silent-performance-killer/*) (* ::Subitem::GrayLevel[0]:: *) (*https://dzone.com/articles/linux-kernel-vs-memory-fragmentation-part-i*) (* ::Subitem::GrayLevel[0]:: *) (*https://wiki.debian.org/Hugepages*) (* ::Subitem::GrayLevel[0]:: *) (*https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Swap to the rescue?*) (* ::Item:: *) (*Swap can help but ALWAYS REMEMBER IT IS AT LEAST >1 MAGNITUDE SLOWER THAN RAM*) (* ::Item:: *) (*Swap should be on its own dedicated device*) (* ::Item::Closed:: *) (*Best to use a SSD or PCIe-attached NVMe*) (* ::Subitem:: *) (*SSD connected via SATA has bandwidth limitations*) (* ::Subitem:: *) (*PCIe has much larger bandwidths*) (* ::Subitem:: *) (*New systems have dedicated PCIe lanes just for NVMe*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Swap DO's & DON'Ts*) (* ::Item::Closed:: *) (*ALWAYS use fastest swap device first*) (* ::Subitem:: *) (*Set swap priority via /etc/fstab*) (* ::Subitem:: *) (*Priority determines which device gets used most first*) (* ::Subitem::Closed:: *) (*Ex.: 4 SSD swap devices == All devices have same priority == swap gets striped evenly by kernel*) UUID=353a5bb1-851b-4c2b-9d85-d84f96703a6e none swap sw,pri=1,discard 0 0 UUID=771b130b-5c3c-4788-8239-9b71e2cdfc38 none swap sw,pri=1,discard 0 0 UUID=67463c64-45db-4ee4-bcca-f854ffc95b7c none swap sw,pri=3,discard 0 0 UUID=f73006b4-f767-4c64-af08-d3c104e38e7c none swap sw,pri=5,discard 0 0 (* ::Item::Closed:: *) (*NEVER use file-based swap*) (* ::Subitem:: *) (*This is Windows default*) (* ::Subitem::Closed:: *) (*Windows does this inefficiently*) (* ::Subsubitem:: *) (*Yes, Windows is very swap inefficient*) (* ::Subsubitem:: *) (*Usually on C:\*) (* ::Subsubitem:: *) (*Swap file/ pagefile sits atop file system -> two more layers just to read/write swap*) (* ::Subitem:: *) (*This is the worst possible thing for swap performance*) (* ::Item::Closed:: *) (*ALWAYS use swap compression*) (* ::Subitem:: *) (*Set this for boot time via boot loader*) (* ::Subsubitem:: *) (*zswap.enabled=1 zswap.zpool=zsmalloc*) (* ::Item::Closed:: *) (*NEVER use RAID stripe-based*) (* ::Subitem:: *) (*Even RAID0 performance will be degraded compared to swap priority kernel striping*) (* ::Subitem:: *) (*Only ever use RAID-based swap IF AND ONLY IF High Availability is required*) (* ::Item::Closed:: *) (*ALWAYS tune free memory-to-swap ratio to current workloads*) (* ::Subitem:: *) (*Can be set at system time using /etc/sysctl.conf*) (* ::Subitem::Closed:: *) (*Set at any time by root/sudo using sysctl or /proc*) (* ::Subsubitem:: *) (*sysctl -w vm.swappiness=80*) (* ::Subsubitem:: *) (*echo 80 > /proc/sys/vm/swappiness*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*RAM Compression*) (* ::Item::Closed:: *) (*Like Windows 10, Linux can compress some/most RAM*) (* ::Subitem:: *) (*Uses compressed RAM disks*) (* ::Subitem:: *) (*Stored as type of in-memory compressed SWAP*) (* ::Subitem:: *) (*When FULL gets paged to actual SWAP DISK*) (* ::Item::Closed:: *) (*Consult*) (* ::Subitem:: *) (*https://wiki.archlinux.org/title/improving_performance#zram_or_zswap*) (* ::Subitem:: *) (*man zramctl*) (* ::Item:: *) (*Compression algorithm is tunable*) (* ::Item::Closed:: *) (*Caveat: Each major Linux distribution has its own spin on how this is done*) (* ::Subitem:: *) (*Windows memory compression is automatic and transparent to the user*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Swap on Video RAM*) (* ::Item::Closed:: *) (*Yes, it's possible*) (* ::Subitem:: *) (*It can be fast, even very very fast*) (* ::Subitem:: *) (*Speeds can be better than PCIe NVMe*) (* ::Item::Closed:: *) (*Typically small*) (* ::Subitem::Closed:: *) (*On my system, 2 GB VRAM yields two usable memory holes*) (* ::Subsubitem:: *) (*1. 128 MiB 64-bit*) (* ::Subsubitem:: *) (*2. 32 MiB 64-bit*) (* ::Subitem:: *) (*Only use 64-bit memory regions*) (* ::Item:: *) (*Big memory GPUs will have more memory*) (* ::Item:: *) (*Multi-GPU systems will many available VRAM blocks*) (* ::Item::Closed:: *) (*For more information, consult*) (* ::Subitem:: *) (*https://wiki.archlinux.org/title/Swap_on_video_RAM*) (* ::Subitem:: *) (*https://github.com/Overv/vramfs*) (* ::Item:: *) (*Checking System Resources*) (* ::Item::Closed:: *) (*To check per-process RAM usage *) (* ::Subitem::Closed:: *) (*As percentage of the whole, from the command line, run*) (* ::Subsubitem:: *) (*ps -o pid,user,% mem,command ax | sort -b -k3 -r*) (* ::Subitem::Closed:: *) (*Specific usages in KiB*) (* ::Subsubitem:: *) (*pmap PID*) (* ::Item::Closed:: *) (*To check per-process SWAP usage*) (* ::Subitem:: *) (*Install and run smem*) (* ::Subitem:: *) (*Some distributions may/not have it included standard*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Memory Management - Cleaning Up & Reclaiming Memory - Part 2*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold:: *) (*Important to clear out memory*) (* ::Item::GrayLevel[0]::Bold:: *) (*Where possible use constructs that large automate this*) (* ::Item::GrayLevel[0]::Bold:: *) (*Clean out Parallel Kernels*) (* ::Item::GrayLevel[0]::Bold:: *) (*Last recourse available before Quit[]*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*CLEAR && CLEAN OUT MEMORY*) (* ::Item::GrayLevel[0]::Closed:: *) (*Good practice to do before starting a new program or application*) (* ::Subitem::GrayLevel[0]:: *) (*Use Protect[] && Unprotect[] as required to preserve in-memory data between programs*) (* ::Item::GrayLevel[0]:: *) (*Good practice using before and after running large memory-hungry routines or functions*) (* ::Item::GrayLevel[0]:: *) (*Typically takes microseconds*) (* ::Item::GrayLevel[0]::Closed:: *) (*Memory is your most precious resource*) (* ::Subitem::GrayLevel[0]:: *) (*A slow program is one thing because of again CPU*) (* ::Subitem::GrayLevel[0]:: *) (*Hard-crashing Mathematica or computer when RAM == 0 bytes -> THIS IS MUCH WORSE*) (* ::Item::GrayLevel[0]:: *) (*All languages have their own memory management and cleanup quirk*) (* ::Item::GrayLevel[0]::Closed:: *) (*Example of simple Clearing and Cleaning *) (* ::Code::Initialization::GrayLevel[0]:: *) CleaningFunc[] := { Protect@CleaningFunc; ClearSystemCache[]; ClearAll[ "Global`*" ]; $HistoryLength = 0; Share[]; Unprotect@CleaningFunc; }; (* ::Subsection::GrayLevel[0]::Closed:: *) (*Alternatives to Clearing/Cleaning Memory*) (* ::Item:: *) (*Use variable containing construct that automatically cleans up*) (* ::Item::Closed:: *) (*Three major constructs*) (* ::Subitem:: *) (*Module[]*) (* ::Subitem:: *) (*Block[]*) (* ::Subitem:: *) (*Manipulate[]*) (* ::Item::Closed:: *) (*Each has pros and cons*) (* ::Subitem::Closed:: *) (*Module[]*) (* ::Subsubitem:: *) (*Cleanest and simplest to read and code*) (* ::Subsubitem:: *) (*Easy to return/send values elsewhere*) (* ::Subsubitem:: *) (*Straightforward to save results to global variables*) (* ::Subsubitem:: *) (*Has a light performance impact*) (* ::Subitem::Closed:: *) (*Block[]*) (* ::Subsubitem:: *) (*Fastest of these constructs*) (* ::Subsubitem:: *) (*Code can be a bit more difficult to read*) (* ::Subsubitem:: *) (*Caveat* - I do not use this one too much*) (* ::Subitem::Closed:: *) (*Manipulate[]*) (* ::Subsubitem:: *) (*The definitive choice for complex interactive program/application building*) (* ::Subsubitem:: *) (*Can be used to isolate variables and data from rest of program*) (* ::Subsubitem:: *) (*Possible to return/send data elsewhere*) (* ::Subsubitem:: *) (*Less straightforward (sometimes) using global variables*) (* ::Subsubitem:: *) (*Be cautious using allow Manipulate[]-based variables to being used non-locally*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Clean up Parallel Kernels*) (* ::Item::Closed:: *) (*Needs to be done when Parallel*[] functions used*) (* ::Subitem::Closed:: *) (*THIS INCLUDES THEIR USE INSIDE*) (* ::Subsubitem:: *) (*Module[]*) (* ::Subsubitem:: *) (*Block[]*) (* ::Subsubitem:: *) (*Manipulate[]*) (* ::Item::Closed:: *) (*Try running very large-data generating Parallel*[] functions*) (* ::Subitem:: *) (*Keep an eye on system resource monitor*) (* ::Subitem:: *) (*Then run again and again and again*) (* ::Subitem:: *) (*You will see memory usage will increase*) (* ::Item::Closed:: *) (*However, that memory can be reclaimed without closing Kernels (CloseKernels[])*) ClearKernelMemoryFUNC[] := { Protect@ClearKernelMemoryFUNC; Needs["Parallel`Developer`"]; Needs["Utilities`CleanSlate`"]; Parallel`Developer`ClearSlaves[]; Parallel`Developer`ClearKernels[]; Parallel`Developer`ClearDistributedDefinitions[]; ClearSystemCache[]; ClearInOut[]; Unprotect@ClearKernelMemoryFUNC; }; (* ::Subsection::GrayLevel[0]::Closed:: *) (*Last Recourse*) (* ::Item:: *) (*Can be used to recover memory from crashed kernels*) (* ::Item:: *) (*Can be used to recover memory from closed kernels*) (* ::Item:: *) (*Can be used as last resort before QUITTING Kernel*) (* ::Item::Closed:: *) (*Concept of Protect[] && Unprotect[] still apply*) ClearClosedKernelMemoryFUNC[] := { Protect@ClearClosedKernelMemoryFUNC; Needs["Parallel`Developer`"]; Needs["Utilities`CleanSlate`"]; Parallel`Developer`ClearSlaves[]; Parallel`Developer`ClearKernels[]; Parallel`Developer`ClearDistributedDefinitions[]; ClearSystemCache[]; ClearInOut[]; CleanSlate[]; Unprotect@ClearClosedKernelMemoryFUNC; }; (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Memory Management - Tips and Tricks - Part 3*) (* ::Subsection::GrayLevel[0]::Bold::Closed:: *) (*Take Away*) (* ::Item::GrayLevel[0]::Bold:: *) (*MMA provides incredibly rich metadata for all data in memory*) (* ::Item::GrayLevel[0]::Bold:: *) (*Makes it possible to use and convert data into wide assortment of forms that only MMA could*) (* ::Item::GrayLevel[0]::Bold:: *) (*Comes at the cost of sometimes eating up lots of memory*) (* ::Item::GrayLevel[0]::Bold:: *) (*Constructs exist to significantly reduce memory consumption with minimal performance impact*) (* ::Item::GrayLevel[0]::Bold:: *) (*Pointer-like constructs readily available using PositionIndex[] && Keys[] (and maybe others too?)*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Keeping track of variables' memory*) (* ::Item::GrayLevel[0]:: *) (*Only works on variables and their memory usage*) (* ::Item::GrayLevel[0]::Closed:: *) (*Need a way find ALL variables*) (* ::Subitem::GrayLevel[0]:: *) (*Even automatically cleaned/cleared temporary variables*) (* ::Subitem::GrayLevel[0]:: *) (*Even most removed (Remove[]) variables *) (* ::Item::GrayLevel[0]::Closed:: *) (*Need a way to see how much memory they are still claiming*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Note: THIS IS NOT MY CODE - I FOUND IT A LONG TIME AGO AND COPIED IT INTO A NOTEBOOK - DO NOT CREDIT ME FOR THIS ONE*) (* ::Code::Initialization::GrayLevel[0]:: *) checkMemory[]:=Grid[Sort[({ByteCount[ToExpression[#1]],HoldForm[#1]}&)/@Names["Global`*"],First[#1]>First[#2]&]] checkMemory[] (* ::Subsection::GrayLevel[0]::Closed:: *) (*$HistoryLength*) (* ::Item::GrayLevel[0]:: *) (*Easy to forget about this one*) (* ::Item::GrayLevel[0]:: *) (*Can very easily large amounts of memory*) (* ::Item::GrayLevel[0]::Closed:: *) (*To minimize its effect on memory*) (* ::Subitem::GrayLevel[0]:: *) (*SET $HistoryLength = 0*) (* ::Subitem::GrayLevel[0]:: *) (*Unless you really need to work with previous inputs/outputs, don't use it *) (* ::Item::GrayLevel[0]:: *) (*Consider using variables instead of keeping $HistoryLength>0*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Other quick tips*) (* ::Item::GrayLevel[0]::Closed:: *) (*Share[]*) (* ::Subitem::GrayLevel[0]:: *) (*Engages automated mechanisms*) (* ::Subitem::GrayLevel[0]:: *) (*Attempts to find commonality between existing expressions/subexpressions*) (* ::Subitem::GrayLevel[0]:: *) (*Helps save a little bit of memory*) (* ::Item::GrayLevel[0]::Closed:: *) (*MemoryInUse[]*) (* ::Subitem::GrayLevel[0]:: *) (*Very helpful to indicate how much memory currently in use by Mathematica*) (* ::Subitem::GrayLevel[0]:: *) (*However, does not know about kernel memory*) (* ::Subitem::GrayLevel[0]:: *) (*Using at beginning and end of complex functions helps identify memory bottlenecks*) (* ::Item::GrayLevel[0]::Closed:: *) (*MaxMemoryUsed[]*) (* ::Subitem::GrayLevel[0]:: *) (*Will report maximum memory used up to current moment for completing some expression/command*) (* ::Subitem::GrayLevel[0]:: *) (*Appears to be partially kernel-aware*) (* ::Item::GrayLevel[0]::Closed:: *) (*ByteCount[]*) (* ::Subitem::GrayLevel[0]:: *) (*Use it when in doubt about a variable or function*) (* ::Subitem::GrayLevel[0]:: *) (*Will provide exact number of bytes in use by current variable/function*) (* ::Subitem::GrayLevel[0]:: *) (*Not kernel-aware*) (* ::Subitem::GrayLevel[0]:: *) (*Aware of temporary variables*) (* ::Item::GrayLevel[0]::Closed:: *) (*There are plenty of others*) (* ::Subitem::GrayLevel[0]:: *) (*$RecursionLimit*) (* ::Subitem::GrayLevel[0]:: *) (*$IterationLimit*) (* ::Subitem::GrayLevel[0]:: *) (*$MaxNumber*) (* ::Subitem::GrayLevel[0]:: *) (*$MaxPrecision*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*These can all be set to new values*) (* ::Subsubitem::GrayLevel[0]:: *) (*Be cautious when doing this*) (* ::Subsubitem::GrayLevel[0]:: *) (*Can affect stability*) (* ::Subsubitem::GrayLevel[0]:: *) (*Can affect accuracy of results*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Clearing variables & Removing functions*) (* ::Item::GrayLevel[0]::Closed:: *) (*Easy way to clear variables*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*To Clear and Remove a variable USE var = . *) (* ::Code::Initialization::GrayLevel[0]:: *) var = {{1,2,3}, {4,5,6}, {7,8,9}}; Print@ByteCount@var; var=.; Print@ByteCount@var; (* ::Subitem::GrayLevel[0]::Closed:: *) (*To Clear a variable but not remove it USE var = {}*) (* ::Code::Initialization::GrayLevel[0]:: *) var = {{1,2,3}, {4,5,6}, {7,8,9}}; Print@ByteCount@var; var={}; Print@ByteCount@var (* ::Item::GrayLevel[0]::Closed:: *) (*Functions cannot be readily cleared, but can be removed*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*To Remove a function same technique as Removing a variable*) (* ::Code::Initialization::GrayLevel[0]:: *) func[x_] := x^2; Print@func[2]; Remove@func; (* ::Subsection::GrayLevel[0]::Closed:: *) (*Where possible use ByteArray[] or NumericArray[]*) (* ::Item::GrayLevel[0]::Closed:: *) (*Both support many different data types*) (* ::Subitem::GrayLevel[0]:: *) (*NumericArray - Integer8/16/32/64, UnsignedInteger8/16/32/64, Real32/64 & Complex32/64*) (* ::Subitem::GrayLevel[0]:: *) (*ByteArray[] - Raw bytes from 0 - 255*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*ByteArray[] in conjunction with ExportByteArray[]/ImportByteArray[]*) (* ::Subsubitem::GrayLevel[0]:: *) (*Can support a very wide assortment of number-based data types*) (* ::Item::GrayLevel[0]::Closed:: *) (*They help reduce memory usage, sometimes a lot*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Example - Standard In-Memory Variable *) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list1 }, Table[{ list1 = RandomInteger[ 1024, 10^i ];, Print[ 10^i, " = ", ByteCount@list1, " bytes" ]; }, { i, 1, 9 }]; ]; (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Results*) (* ::Code::Initialization::GrayLevel[0]:: *) SequenceForm[10, " = ", 232, " bytes"] SequenceForm[100, " = ", 936, " bytes"] SequenceForm[1000, " = ", 8296, " bytes"] SequenceForm[10000, " = ", 80200, " bytes"] SequenceForm[100000, " = ", 800200, " bytes"] SequenceForm[1000000, " = ", 8000200, " bytes"] SequenceForm[10000000, " = ", 80000200, " bytes"] SequenceForm[100000000, " = ", 800000200, " bytes"] SequenceForm[1000000000, " = ", 8000000200, " bytes"] (* ::Subitem::GrayLevel[0]::Closed:: *) (*Example - With NumericArray[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list1 }, Table[{ list1 = NumericArray[ RandomInteger[ 1024, 10^i ], "UnsignedInteger16" ];, Print[ 10^i, " = ", ByteCount@list1, " bytes" ]; }, { i, 1, 9 }]; ]; (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Results*) (* ::Code::Initialization::GrayLevel[0]:: *) SequenceForm[10, " = ", 168, " bytes"] SequenceForm[100, " = ", 360, " bytes"] SequenceForm[1000, " = ", 2280, " bytes"] SequenceForm[10000, " = ", 20584, " bytes"] SequenceForm[100000, " = ", 200200, " bytes"] SequenceForm[1000000, " = ", 2000200, " bytes"] SequenceForm[10000000, " = ", 20000200, " bytes"] SequenceForm[100000000, " = ", 200000200, " bytes"] SequenceForm[1000000000, " = ", 2000000200, " bytes"] (* ::Subitem::GrayLevel[0]::Closed:: *) (*Example - With ByteArray[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list1 }, Table[{ list1 = ByteArray[ RandomInteger[ 255, 10^i ] ];, Print[ 10^i, " = ", ByteCount@list1, " bytes" ]; }, { i, 1, 9 }]; ]; (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Results*) (* ::Code::Initialization::GrayLevel[0]:: *) SequenceForm[10, " = ", 168, " bytes"] SequenceForm[100, " = ", 232, " bytes"] SequenceForm[1000, " = ", 1128, " bytes"] SequenceForm[10000, " = ", 10344, " bytes"] SequenceForm[100000, " = ", 100200, " bytes"] SequenceForm[1000000, " = ", 1000200, " bytes"] SequenceForm[10000000, " = ", 10000200, " bytes"] SequenceForm[100000000, " = ", 100000200, " bytes"] SequenceForm[1000000000, " = ", 1000000200, " bytes"] (* ::Subitem::GrayLevel[0]::Closed:: *) (*Example - With ExportByteArray[]*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list1 }, Table[{ list1 = ExportByteArray[ RandomInteger[ 512, 10^i ], "Integer16" ];, Print[ 10^i, " = ", ByteCount@list1, " bytes" ]; }, { i, 1, 9 }]; ]; (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Results*) (* ::Code::Initialization::GrayLevel[0]:: *) SequenceForm[10, " = ", 168, " bytes"] SequenceForm[100, " = ", 360, " bytes"] SequenceForm[1000, " = ", 2280, " bytes"] SequenceForm[10000, " = ", 20584, " bytes"] SequenceForm[100000, " = ", 200200, " bytes"] SequenceForm[1000000, " = ", 2000200, " bytes"] SequenceForm[10000000, " = ", 20000200, " bytes"] SequenceForm[100000000, " = ", 200000200, " bytes"] SequenceForm[1000000000, " = ", 2000000200, " bytes"] (* ::Item::GrayLevel[0]::Closed:: *) (*With respect to performance*) (* ::Subitem::GrayLevel[0]:: *) (*Occasionally, NumericArray[] can improve performance*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*ExportByteArray[] can be the slowest*) (* ::Subsubitem::GrayLevel[0]:: *) (*Often several by a factor of 2-4x*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Difference between NumericArray[] and variable stored data generation*) (* ::Subsubitem::GrayLevel[0]:: *) (*Often negligible*) (* ::Item::GrayLevel[0]::Closed:: *) (*However, there are some caveats*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*NumericArray[] && ByteArray[] elements can be readily accessed and worked on at a time*) (* ::Subsubitem::GrayLevel[0]:: *) (*var = NumericArray[ RandomInteger[ 255, 100000 ], "UnsignedInteger8" ];*) (* ::Subsubitem::GrayLevel[0]:: *) (*var[[1]] might show 222, or 234, or whatever actual number is really there*) (* ::Subsubitem::GrayLevel[0]:: *) (*var[[1;;2]] will show RawArray["Integer16",{256, 61}]*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*ExportByteArray[]/ImportByteArray[] need to be converted back*) (* ::Subsubitem::GrayLevel[0]:: *) (*var = ExportByteArray[ RandomInteger[512, 100000], "Integer16"];*) (* ::Subsubitem::GrayLevel[0]:: *) (*var[[1]] will show the actual raw converted byte, not the "Integer16"*) (* ::Subsubitem::GrayLevel[0]:: *) (*ImportByteArray[ var[[1;;2]], "Integer16"] will show 424, the first actual Random Number generated*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Pointers && Mathematica*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Pointers*) (* ::Item::GrayLevel[0]::Closed:: *) (*There are pointers*) (* ::Subitem::GrayLevel[0]:: *) (*There are many types*) (* ::Subitem::GrayLevel[0]:: *) (*Capabilities depend on language*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Typically for stores memory addresses*) (* ::Subsubitem::GrayLevel[0]:: *) (*Can be memory-mapped (this happens at the CPU/Assembly/Very low-level C)*) (* ::Subsubitem::GrayLevel[0]:: *) (*Can be the logical address (C and other low-level languages)*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Used for fast lookups of values*) (* ::Subsubitem::GrayLevel[0]:: *) (*No need to continue to searching and finding in memory*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Sometimes to find other addresses*) (* ::Subsubitem::GrayLevel[0]:: *) (*Sometimes other addresses pointed to by current memory value/location*) (* ::Item::GrayLevel[0]::Closed:: *) (*There are linked lists*) (* ::Subitem::GrayLevel[0]:: *) (*Single*) (* ::Subitem::GrayLevel[0]:: *) (*Double*) (* ::Subitem::GrayLevel[0]:: *) (*Circular*) (* ::Subitem::GrayLevel[0]:: *) (*Hash*) (* ::Subitem::GrayLevel[0]:: *) (*Many others*) (* ::Subsubsection::GrayLevel[0]::Closed:: *) (*Mathematica*) (* ::Item::GrayLevel[0]:: *) (*Direct memory access not possible*) (* ::Item::GrayLevel[0]::Closed:: *) (*Programs generated with Compile[] can use pointers to access (read/write) computer memory and addresses*) (* ::Subitem::GrayLevel[0]:: *) (*Possible to interact through pointers to memory used/allocated by/through MMA*) (* ::Subitem::GrayLevel[0]:: *) (*Very, very, very low-level - DO NOT DO THIS*) (* ::Item::GrayLevel[0]::Closed:: *) (*However, we can create pseudo-pointer structure*) (* ::Subitem::GrayLevel[0]:: *) (*Use to quickly access contents of list, multi-level list (TENSOR)*) (* ::Subitem::GrayLevel[0]:: *) (*Use for lookups and indexing of aforementioned lists*) (* ::Item::GrayLevel[0]:: *) (*We could use brute-force lookups mechanisms built using Table[], For[], ...*) (* ::Item::GrayLevel[0]:: *) (*OR WE COULD USE PositionIndex[] && Keys[]*) (* ::Item::GrayLevel[0]::Closed:: *) (*Example*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*1. Generate list, then index*) list = RandomInteger[{1,5}, 1024 ]; index = PositionIndex[list]; keys = Keys@index; (* ::Subitem::GrayLevel[0]::Closed:: *) (*2. Get list of values index*) Print@Sort@keys; {1,2,3,4,5} (* ::Subitem::GrayLevel[0]::Closed:: *) (*3. Double check there are 5 sets of values in list*) Print@Length@Tally@keys; 5 (* ::Subitem::GrayLevel[0]::Closed:: *) (*4. Check to see what values are stored where in index*) keys[[1]] keys[[2]] keys[[3]] keys[[4]] keys[[5]] 4 1 5 2 3 (* ::Subitem::GrayLevel[0]::Closed:: *) (*5. Get list of actual values stored by keys*) index[2] {11,15,18,20,24,37,38,42,47,49,64,66,68,70,71,74,82,88,92,94,99,108,114,118,120,123,126,137,154,161,162,173,183,193,194,212,213,215,219,220,222,224, 236,243,248,249,254,268,269,272,274,281,282,292,293,296,300,301,307,310,319,327,337,344,345,349,355,358,359,367,372,380,381,394,405,406,410,412,416, 422,423,424,430,440,445,446,454,473,476,485,490,493,505,509,510,512,515,519,523,526,527,530,534,538,539,543,544,548,553,571,574,576,577,586,591,593, 596,606,609,615,627,632,643,650,665,666,668,670,671,674,675,682,686,688,694,698,699,700,705,706,710,711,712,717,719,735,738,739,742,744,749,758,761, 765,766,777,778,787,790,797,800,804,806,814,821,823,824,826,829,843,852,863,865,883,901,903,907,909,915,930,931,942,944,947,949,962,963,964,973,974, 976,980,984,992,1008,1009,1010,1012,1013,1015,1021} (* ::Subitem::GrayLevel[0]::Closed:: *) (*6. Get actual numerical values stored in list through index*) list[[ index[2] ]] {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2} (* ::Subitem::GrayLevel[0]::Closed:: *) (*7. Get sorted tallied list of numerical values stored in list*) Sort@Tally@list {{1,216},{2,201},{3,201},{4,225},{5,181}} (* ::Subitem::GrayLevel[0]::Closed:: *) (*8. Let's do something with the numerical values POINTED to by index[2]*) Total[ list[[ index[2] ]] ] 402 (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Data Format Conversion & Performance - Part 1*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*What is Data Conversion*) (* ::Item::GrayLevel[0]::Closed:: *) (*It is the changing/conversion of one data stored in one format to another*) (* ::Subitem::GrayLevel[0]:: *) (*Ex. Integer8 -> Integer32*) (* ::Subitem::GrayLevel[0]:: *) (*NOT JPEG->GIF*) (* ::Item::GrayLevel[0]:: *) (*Commonly used functions are NumericArray[] & ByteArray[]*) (* ::Item::GrayLevel[0]:: *) (*Could also be ImportByteArray[] and ExportByteArray[]*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Why Convert Data Formats*) (* ::Item::GrayLevel[0]:: *) (*Typically, to improve storage efficiency*) (* ::Item::GrayLevel[0]::Closed:: *) (*Sometimes improves performance*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*This typically occurs when data is condensed*) (* ::Subsubitem::GrayLevel[0]:: *) (*Ex. Compacting 4 Integer8 -> 1 Integer32*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Or when extraneous information is removed*) (* ::Subsubitem::GrayLevel[0]:: *) (*Ex. True/False -> 1 OR 0*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Removal of metadata*) (* ::Subsubitem::GrayLevel[0]:: *) (*List or array stored as NumericArray[] or ByteArray[]*) (* ::Item::GrayLevel[0]:: *) (*Provides the ability to store/read data to/from disk more efficiently*) (* ::Item::GrayLevel[0]::Closed:: *) (*Sometimes a substitute for Import[] && Export[]*) (* ::Subitem::GrayLevel[0]:: *) (*Mileage will vary considerably*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*NumericArray[] Vs. ByteArray[]*) (* ::Item::GrayLevel[0]::Closed:: *) (*In terms of Memory Consumed -> NumericArray DATA TYPE == ByteArray[] DATA TYPE *) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Examples*) (* ::Subsubitem::GrayLevel[0]:: *) (*NumericArray[ ConstantArray[1024,10^8], "UnsignedInteger16" ] == ExportByteArray[ ConstantArray[1024,10^8], "UnsignedInteger16" ]*) (* ::Subsubitem::GrayLevel[0]:: *) (*NumericArray[ ConstantArray[23232.9292,10^8], "Real32" ] == ExportByteArray[ ConstantArray[23232.9292,10^8], "Real32" ]*) (* ::Item::GrayLevel[0]:: *) (*ByteArray[] has many more DATA TYPE choices available than NumericArray[]*) (* ::Item::GrayLevel[0]:: *) (*For both, underlying must be numeric*) (* ::Item::GrayLevel[0]:: *) (*NumericArray[] works with arrays (lists) and multi-dimensional arrays (i.e. TENSORS)*) (* ::Item::GrayLevel[0]:: *) (*ByteArray[] supports single-level lists (arrays)*) (* ::Item::GrayLevel[0]::Closed:: *) (*The primary difference between them*) (* ::Subitem::GrayLevel[0]:: *) (*Changing between NumericArray[] format does not alter underlying data*) (* ::Subitem::GrayLevel[0]:: *) (*With ImportByteArray[] && ExportByteArray[] data can be changed*) (* ::Item::GrayLevel[0]::Closed:: *) (*ByteArray[] supports more NUMERIC-types can NumericArray[]*) (* ::Subitem::GrayLevel[0]:: *) (*When used in conjunction with ImportByteArray[] && ExportByteArray[]*) (* ::Subitem::GrayLevel[0]:: *) (*Integer/UnsignedInteger 8, 16, 24, 32 64, 128*) (* ::Subitem::GrayLevel[0]:: *) (*Real 32, 64, 128*) (* ::Subitem::GrayLevel[0]:: *) (*Complex 64, 128, 256*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Can be used for storing non-variable data*) (* ::Subsubitem::GrayLevel[0]:: *) (*Images*) (* ::Subsubitem::GrayLevel[0]:: *) (*Graphs & Charts*) (* ::Item::GrayLevel[0]::Closed:: *) (*There are techniques to get non-numeric data fitted to numeric*) (* ::Subitem::GrayLevel[0]:: *) (*Usually less efficient performance-wise*) (* ::Subsection::GrayLevel[0]::Closed:: *) (*Other formats*) (* ::Item::GrayLevel[0]::Closed:: *) (*ImportString/ExportString*) (* ::Subitem::GrayLevel[0]:: *) (*Using these 2 functions it is easy to convert most any in-memory data to any other WDL supported format*) (* ::Item::GrayLevel[0]::Closed:: *) (*Compressed*) (* ::Subitem::GrayLevel[0]:: *) (*This one rarely increases performance as underlying function is not parallelized*) (* ::Item::GrayLevel[0]::Closed:: *) (*Boolean*) (* ::Subitem::GrayLevel[0]:: *) (*Enables converting True && False or 1 && 0, which can be combined with ByteArray[] or NumericArray[]*) (* ::Item::GrayLevel[0]:: *) (*Packed Array*) (* ::Item::GrayLevel[0]:: *) (*GZIP*) (* ::Item::GrayLevel[0]:: *) (*BASE64 && BASE85*) (* ::SlideShowNavigationBar:: *) (**) (* ::Text::GrayLevel[0]::Bold:: *) (*We got lots to cover - Write me at richard.carbone@drdc-rddc.gc.ca for questions, comments, ...*) (* ::Section::GrayLevel[0]::Closed:: *) (*Data Format Conversion & Performance - Examples - Part 2*) (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPLE 1. Convert and Compact INDIVIDUAL Byte Values (0-255) to UnsignedInteger32*) (* ::Subitem::GrayLevel[0]:: *) (*Compact by Factor of 4*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*The process is reversible, algorithmically*) (* ::Code::Initialization::GrayLevel[0]:: *) Module[{ list, part, res }, list = RandomInteger[ 255, 1024 ]; Print@ByteCount@list; Print@list[[1]]; part = ArrayReshape[ list, { ((1024)/4), 4 } ]; res = part . {16777216,65536,256,16}; Print@ByteCount@res; Print@list[[1;;4]]; Print@res[[1]]; ]; (* ::Subitem::Closed:: *) (*Results*) 8808 (* ORIGINAL SIZE IN BYTES *) 177 2280 (* COMPACTED SIZE IN BYTES *) {43,115,116,110} 728988384 (* COMPACTED VALUE *) (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPLE 2. There is an easier way*) (* ::Subitem::GrayLevel[0]::Closed:: *) (*Use ByteArray[], ExportByteArray[] && ImportByteArray[] *) (* ::Subsubitem::GrayLevel[0]::Closed:: *) (*Putting this into a Module[] and combining Table[] let's you build portable and scalable functions that reduce memory consumption*) list = RandomInteger[ 64, 128 ]; Print@ByteCount@list; ba = ByteArray@list; Print@ByteCount@ba; iba = ImportByteArray[ ba, "UnsignedInteger32" ]; Print@ByteCount@iba; eba = ExportByteArray[ iba, "UnsignedInteger32" ]; Print@list; Print@Normal@eba; (* ::Subitem::Closed:: *) (*Results*) 1128 232 360 {50,13,40,0,28,14,56,51,7,1,35,33,44,51,6,11,58,21,17,60,16,38,20,29,42,30,19,8,55,48,41,40,9,25,8,28,64,22,23,42,39,53,18,34,10,5,10,54,57,60,8,1,27 ,9,60,10,27,16,31,7,21,43,54,59,46,43,49,20,16,49,45,59,28,40,5,17,55,2,64,33,52,0,41,60,26,17,30,24,22,47,2,64,25,18,53,0,5,58,3,10,6,22,37,34,47,34 ,26,30,38,55,32,48,33,36,27,62,60,10,27,10,24,15,36,52,12,58,47,34} {50,13,40,0,28,14,56,51,7,1,35,33,44,51,6,11,58,21,17,60,16,38,20,29,42,30,19,8,55,48,41,40,9,25,8,28,64,22,23,42,39,53,18,34,10,5,10,54,57,60,8,1,27 ,9,60,10,27,16,31,7,21,43,54,59,46,43,49,20,16,49,45,59,28,40,5,17,55,2,64,33,52,0,41,60,26,17,30,24,22,47,2,64,25,18,53,0,5,58,3,10,6,22,37,34,47,34, 26,30,38,55,32,48,33,36,27,62,60,10,27,10,24,15,36,52,12,58,47,34} (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPLE 3. Rerun the PrimeQ[] example WITH BOOLE[]*) Module[{ list, results }, list = Range[100000000]; Print[ AbsoluteTiming[ results = ParallelTable[ Boole@PrimeQ[ list[[ i;;i+19999 ]] ], { i, 1, 50000000, 20000 }]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ Boole@PrimeQ[ list[[ i;;i+19999 ]] ], { i, 1, 50000000, 20000 }, Method->"CoarsestGrained" ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ Boole@PrimeQ[ list[[ i;;i+19999 ]] ], { i, 1, 50000000, 20000 }, Method->"EvaluationsPerKernel" -> 1 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ Boole@PrimeQ[ list[[ i;;i+19999 ]] ], { i, 1, 50000000, 20000 }, Method->"EvaluationsPerKernel" -> 2 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ Boole@PrimeQ[ list[[ i;;i+19999 ]] ], { i, 1, 50000000, 20000 }, Method->"EvaluationsPerKernel" -> 4 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ Boole@PrimeQ[ list[[ i;;i+19999 ]] ], { i, 1, 50000000, 20000 }, Method->"EvaluationsPerKernel" -> 8 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ Boole@PrimeQ[ list[[ i;;i+19999 ]] ], { i, 1, 50000000, 20000 }, Method->"EvaluationsPerKernel" -> 12 ]; ][[1]] ]; Print[ AbsoluteTiming[ results = ParallelTable[ Boole@PrimeQ[ list[[ i;;i+19999 ]] ], { i, 1, 50000000, 20000 }, Method->"EvaluationsPerKernel" -> 16 ]; ][[1]] ]; Print@ByteCount@results; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Timings*) 43.354294 13.051304 13.033573 12.324729 11.952825 11.892374 11.951601 12.09785 1200220480 (* BYTES OF MEMORY USED *) (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPLE 4. Convert PCAP UNIX Time to Numeric UNIX Time*) PcapUnixTimeFUNC[] := Module[{ temp1, temp2 }, { temp1, temp2 } = ParallelMap[ ImportByteArray[ #, "UnsignedInteger32", ByteOrdering->PcapByteOrder ]&, { ByteArray@Flatten@RAWPCAPDATA[[All, 1;;4]], ByteArray@Flatten@RAWPCAPDATA[[All, 5;;8]] }, Method->"FinestGrained" ]; PcapUnixTime = NumericArray[ temp1, "UnsignedInteger32" ]; PcapUnixTimeTally = Tally[ Normal@PcapUnixTime ]; PcapUnixFracTime = NumericArray[ temp2*PcapTimeResolution, "Real32" ]; ];//AbsoluteTiming (* ::Subitem::GrayLevel[0]::Closed:: *) (*Example Result (for PcapUnixTime[[1]])*) 1434140459 FromUnixTime[1434140459] Fri 12 Jun 2015 16:20:59GMT-4 (* ::Item::GrayLevel[0]::Closed:: *) (*EXAMPLE 5. Converting from Binary to Decimal*) Module[{ idsdata, bin, int414, int1532, i }, idsdata = Flatten[ Normal@RAWPCAPDATA[[All, 17 ;; 20]] . {16777216,65536,256,16} ]; bin = ParallelTable[ IntegerDigits[ idsdata[[i]], 2, 32 ], {i, 1, Length@idsdata}, Method->"ItemsPerEvaluation"->100000 ]; int414 = (bin[[All, 4;;14]]) . {1024,512,256,128,64,32,16,8,4,2,1}; int1532 = (bin[[All, 15;;32]]) . {131072,65536,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1}; ]; (* ::Subitem::GrayLevel[0]::Closed:: *) (*Let's break down that example*) bin = IntegerDigits[ 4189628344, 2, 32 ] int414 = (bin[[ 4;;14]]) . {1024,512,256,128,64,32,16,8,4,2,1} int1532 = (bin[[15;;32]]) . {131072,65536,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1} (* ::Subitem::GrayLevel[0]::Closed:: *) (*Results*) {1,1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,1,0,1,0,0,1,1,1,1,0,1,1,1,0,0,0} 1646 42936