(* ::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
7Dem7Xe2o7H0ozHx9eVArx8Yy+eLpu4088Hxm6a9d8g0teXj3s+2dTwUS985
cKUojeOHZ2KU08TXJ6FYr5+y22jAaKHoHsQvn2rpsNsuzhhty8VbR/VXnu0v
T/6VK+8fBY06CtqD0/nQA9w7AGikaOGlyvvGW/PsJ1oHOgTbTr8kH6dFAnqJ
00DQNNAwuI6XXnnNlhHNsX+mjhzRWOYQlPHgyUabH7prnF6Pfsp1om+hmTF/
wtpDlAGNCO2P/dHFQuuK+OXnGKfpOUhjfoU6QiOPyyuUhv3QG994621b7+g9
1Av6NmswuP2iej1aFdoXa2/4+fl+gK8fOd1stXN0ITTQ0H6uzl2stgP7916Z
fMgerEHiNDTKdLq1q+BjaFQ79x+z53Ix95QD7QzbpFkfBL0SLZ5t6oj5Bmzt
dL4FC5fYT9Z0Wb3+x4fWpaFcTo/Gn9DC+aTOXb1F8wr5J3UT8smoXo9u7trS
+YtXCvbw46ND+aNX4rvOz+L887U5bxVpl9j0l/1H7XownNO/9lJ6fcg++Bsa
JHohfUbcMaF+JdQXJGm/6JHkgf+7fjmk1ztf9OelQj6cpK2GjkW/Zl9ATyUN
jZZP2s+2PQcL/U2S+Gi/rPik8zfyWvdj6b4mStR/ovaP85UoIf8P2QL70af8
euy09a+4/EP2iRK6V1HPvHtAH+f8I2SLJLYO+Q/tmG1shO4dKj9tNW4u2vcf
iLsXOpvRnzn/94n266Wuybd/qC0lsbUQQgghhBBCiOyztyuvsaHXnx/90+zv
mTJDk/fNvq4pc6Rv2qYDOnvH+F2zsWXCnBq8ZQ72TJuB6/fMns5JcyC33Tzy
x0N6PezqyOd/Zfq/ZkPzhM2z4dKdonOH8NfDcRBTn4+rv1+Ii0evh+Lj78+s
eV+cZ7n1cNDrB2f0jlP1jfZZvvl8p+kbuWbXpm9oOW9/Q6+PrlXfPTxmOvtH
Ct+JtXf7zOZ6OGhmxGaiVf64bXfRfugObt2XOXPfidXr/e9xayigmew7mtdD
iak91dxht5Po9XPm5nUFdL75M3qCO4+vS4GvgaBNRteXZo10F1PuQK8gTrJU
GZxez5oF6CLYBU2G9XGwC9obegoaKdeJdkcZ0aBDa5mgG/X9/rD/+uVfnbPT
sfriunZr6GMLF3seyiuahpZHPDoaLPG/Fwbzc0Poauiwvs/4ej2frF0TWqc7
rq6JcfXf74ju9/1P22xsup9GzKjb5p2PB5rYYqv7+Wlo+KRt3LrT1ofbz/2O
foZf+fppVH+Ngt7F2iKuvOhevv/710BMN9rzai823NejiXllzZgdvx4p1EEo
r5B/vv7mXPvJ+wKl9Hq3zr/vL9F5klD+rLcBvJfA9zj/jNYZfufevyCu2P8t
rV4P1BU2pz2H2kG0DG471Bckab/Aujn0d87X3LwJ9VKtXh9qq6Fj35r3bq5f
vxv83bcRfY2L4y6FX1b0ato927xHwfsubMf1NVFKzbOV6suihPw/lCd9J+8D
0I/iD+V8MepDPqF7FXOQ+DltmX45zhZJbR31H1cuq3fnfDFU/uMN5x56lyjk
P1BOr8euzv8dcf163DX59i91X/VtnWRMIYQQQgghhBAiWzg9HU0eLX548r6N
s9987rrV5dHv+a13Iq//7e7M74/WfnrottnfPWX3O9F/q6xe72Ltt53P6xO/
5o69NBVe9yWk1xNnn18P53ZRfP3Dev1/C/ulXQ+HGPqG5jYbT0/auc4+09ze
bde5YW0b0kJ6Pf8le7qhybRc6Laaf+/lCVPXcDb3vcfUN7bYffpGJkxLLq9j
J07az9B1J10PhzhP1lRBK0E/4pmcbfQM4izRntFAWEuDmHH0dnc8uj76mNMM
k+j1aAJ2/YDlK6yO6NKT6PW7Dp6wawmgr6EjkPbq62/aOF90cnQft6+vgaA9
EfeIpuViNVkrwK0TsNVbt5/rQWNya7BHcXo926y9gTZ0orHNXhPx1mjIIb2e
/YlJRu9EX3dx2Un0eq4LbQh7ca3ocv7a4cS/xuUVTWNtBmzBdTNn4XQd4srf
nolNd4TWwyFOFa2KMrFOAjGjzzz7nP3kvz5ZM4U5IOrXrQ3hYkvdfi4v3g+I
vuPgrgWYyyEfbOnWtqDeOY7rd/oX8y74JjqVW/eZ90LwqWhsPXUWjen3wf95
HwLceiYhjd3p9Pzmx6/6+hblIj4dHY04eOotlFfIP3/Y/Evep3LniPu/2Ti9
Hk2N/x7lWK4/lD/2xNeZM3NrnIT8M9qO8XX6C46njP5vafV67MB6KcyPUJ+h
tZfi+pVQX5Ck/VJG1gFCw97wc/7dBOZ7uGbmj6rV66NtNe5Y7Mh39nPzlyGN
FB+ya6Pk8ir1XxnRsrI/7RA/du0/qV4f9Z+Q/UO+EiXk/3F2xA7+fGspXyyn
10fvVbwHhZ/ht6XmNpPYOuQ/3Ec4L1o3/U6o/PY/sXPlou/i063bFfUfKKfX
A/csvuOv9ANx/XrcNfl5hdpSyNZJxhRCCCGEEEIIIbKFH1/fdfWu/d5//Z7V
0o/l0oiF99fKcfu7/fhEpyc2P6rXc+z6pqt2zR2+H+qdthCP7+eVFfz4+r8D
vsb4pICmonV3k9PUOWD1Sj8tbv16yLpmE1c+tDD3Tsdsw5wQuh3xuGiHWVpX
grk43lVA5+N/BmqRZxK9XvxzeBz+/zjuVf+U/+MVQgghhBBCCPHk4davf9Tn
Lbd+/eNAev3jg1hDYk0Xz6wXI8pDLCfvVETXEEfDP1rfUlj/6EmHdzuYx3lU
18OcAfMDaJZ1Xgx4FmCte2Lz8+9KVD/fyZo2bl1+IeBx+L/0eiGEEEIIIYQQ
QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ
QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ
QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ
QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ
QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ
QgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQ
QgghhBBCCCGEEJUwOv2XmbgxZa5O3s5xK5d2P+Xx9x5peS9P3jWXb/wZ/O1M
U2thn8bW9tz3c1Wda2jijnn2+RfNF6vWmM9WfG0uxZw3jvb+34u+f7hoWcVl
GZn8y7z/0SLz5TffmZbu4cTHxZ2T6znb0Z+6HNFrSsLR+hZ7vk+++MrsP15v
01auXmeWr/zGLPn0C/PBoqWp8vtpx16b16Jly83wtT8SHXNl+r75/KvV1n7L
lq+wddk5fNWWAebOf89s3vlr4jJ0X75mFn2y3F7Xjl+PJD6uY2jcnv/Lr9eY
NT/8bNO27D5QKMczzz5vyzqbtoAft+6yZeAa2vouV2ULZ9vlK1ebr9dueGy2
ONXcYT5e+plZnPOpNL5dS/+s1BYh/zzR2FawxXMvvJRr90Oz7p9ZaKu19s+s
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/
fP2XYctkjLeVf2axZRn+H2vLrP5f1JZ5/D+LLcvw/1hbTldbBnn3w6F/pS33
9xbxj4XsG2rr+b778ImJfldCvJ77EDsnHo8cyd+9coTi9cRzWOcnhuvvfcM7
asQ80n5XmjEf4xV8gJh2s3g95ZKP4L4Tp6EfZezkx9OxtXt/zR3z4/X4D/kZ
9LOvvvl28F70uf6+9Yw/QvpBD42+vHY+vhDSBfkbbk+b5N5ATof4AbEs7sFf
FwNnfPxybTyEX/g5BX5cifkAOezEsA6M5YpkidcT30enjH0Yu7o63apNSZM1
DeYIdl3Ge5fWl8nF6dGtP54Kxcuyxg9FOm7/+qm+b6v968XU4efXP2qQg8Uc
jd+4IF9gXuRv85RN1r42CW0d44A819KXlCU/e5HlWQMtIn8S+h0/93Qq5C+z
rCLyl2nfMnWR175V0UVV/FN1tbj8ZZZVFf+sQl0tIn+ZZVXFP6tQV8v0z6rU
1Rj7hvZgzbsn/1QRI3OZvl52+WX6f5nll+mLZZZfdl9SZvlVtWVV/b/Ktqyq
/1fVlkX3r4/tg2LOLxKvF0II8X+LRzleD+xBw3ow7znxOyjTKQtr635+WRZY
K2WM5P9WfVZ+2LyzsS5bFPZocL+pMlXyh2DNO+u7j2XIX3ZZeeUv075l6qKI
faugi6r4p+pqcfnLLqsK/lmVulqmf6qulmPfMv2zCnW1bPs+yky2LqrSFpRZ
fpm+WHb5ZdbVMsuvqi2r7P9VtWVV/b/KtuR33JO/oUKe786DHePKI6875vdt
i8JefLsOjt/jjffJ/N9gFUIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE
EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE
EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE
EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE
EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE
EEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGE
EEIIIYQQQgghhBBCPHrcGP2XGRwaMbeG79W4Wzv2IOr6myO/m4GR37xjD4Jl
DA6NRsuGTLeHhu3fG6P3W54/OPzLpOlp74FD0bqZLM5fvWM+WLLMPP/iTPP6
7LlmUdtye/zNOQumXbaidPZdj75m58EO896ij807H3xkNu8+aI8tbvvMLFy8
1Mx79wPzxpz5UeV9/f1GW9acBQvNpdu/Zbrm2ugD8/5HbebDpZ+aBQsXmctD
v5s97SetDPDEU8+YjnP9mWU4d+W2mfPOQvtc3/+0I/N1Xf0D9v4ffrzMLPvy
G3vs2w1bGnL89fEnrayTqQv4as16KwPPcLLnijlz6VZDhhmzXjWr1/2UuSyn
24WL28zHy1dMmy72Hesyb89/z8yt+dSRrr5p8c+8uqiKf1a1rhbxz6rU1bz+
WdW6WsQ/VVcnp64+6n1JXl0AeueeHy37vJAuLt353foEunj3wyVRMnxaqxtz
33nf3vPnI52FdJGVjTv21Z7vCXO8+3Lj2LIVX9tneH/JJ+OOoQf3PaSftLq0
p/2Uefa55xvf123eZdo+/8ranetC7UOZnOy5asunzfB1yL1nvf6W2bRzv/3+
+arvbN185Y3ZpvfGSPR9Vqz+3j5/1vOb+YpfVpr8WUnqPwtbfz5s6xG62H/8
bON497Uh8+e/PGZ6rg8X8vWQ/su0ZZr8k2XLZv7j67+oLX39l2nLov6fx5ZZ
/b+oLfP4fxZbFvX/PLasaltWhKL2zUvXxZvmrbmTF1fJE+/IC75ErOjvAT9H
t6FxcquY0qKly82qtT9Oq/4vDNwN+u9zL8yIGp9OB/gy4/zZ89/NJf9U+o+Y
fojXD4z8aj/z9+boH4XK43pi+GXJFxODzxOv5/knPsPEY1PJwRPnzJWh1nZg
/svYwH1/1OP1/bd/tesQWc4lHtN54Yb9fHW4bq/ua8M2FuCf980Pm2ybn1UG
5vNOhti23snB+OxU37Vxz/Vp5ByTNpy5eKwcnOvOn/nK6+P+d+jk+aixchm6
2LRrv/lu47Zx//t4+ZeN/2eBMjbu2DutuoC35r7TKC9GjjL9M68uquKfVa+r
efyzCnW1DP+sal3N45+qq8X9s5kuHtW+JK8uLty6a2PNof/lqatufsk8+ezl
wSj58YHQ/2J1EcMnX6xqxOuJB7k1i6++29ByDBrSj1+Xem+MWj2wtub+z5oE
f4nbt3f2NG0fyuDirXuNMTcxIXf8y2/X2Wd38ju7sYaxfuvuqHswNydGFhvj
CvlKsqw0+bOVP1H/MXLRPhAfdMeJTYKLMeb19ZD+J8OWSfmnwpa+/yT1X8SW
If1Phi3z+H8eW6b5T1L/RWxZ1P+b2TJN/sm05XS1ZXuPdk6Qkxjw9n1HzNWR
h/mWuw+fNPs7zuTSdR77HjrVbXbsPzbuGLkIB2v9Ukw5k0Hss5RBTJyo2bn0
x4wDWEOfTh1uq/mXyyd5FKFuhOL1rYiJl4l/Dx7G6x/YeDffbc597fOtGi53
nhi8y8F3MW6+D9pz6vOHm2PX1a+t58QTv6/nyY+Mu2eyfMqtl//LuDUDPwZf
L+vheY2yhkbtcZfDz33deU42PiMfz+GvJyCXH7PnWnL63ffzlwfMsVNnzZ69
D8cYx7u6zYkzPebIidPmxNleq7vDx07a/9GGHTneaT8fPdllTvdetuedvzRg
eq4OmgPtx0x7xylz8EhHqk0ef/Jpc/TMhZa2S8br33h7nu2PZ89717ZhHKv3
qW12/nOmfyBYztEzF8289z60eWfkRHGMPv2zVWtsf7xyzbrG/ZZ+ttI89tfH
7efTF2+YJcu+sP9bt2WX2bq33X6nDXl99jzb1tOHkxPH+IVcLMYMnE9+lS8r
83nkfOqZZ+0aMH16s2dPts/c/6VZr5mOc5cax/oHf7Vz2Jj6wNji2/Wb7Xwy
Ji8T+m6O2udxOnF8ufqHqDgPLHh/sdlx4Jidr/IcMdcyP5712puNWJEDu8TE
KIroApZ8usL6AOvf7hhjpNix4eJPPq/50WmbKxI73i1LF+SD2pzMTTvs2C82
5lSWfxbRRVX8s8p1NY9/VqGuFvXPKtfVWP9UXS3PP0O6yOOfVelL8uqCeAGx
D/wqmScZqwsfbHwlIsZObjm6IGbtxxvy6MJBDijjNP8Y4zHGhe67H68nZsJ7
nfxlPMhY0J0Xmt8n9ZOsS+iUd0ZdjB5YB+A6xoK8X8KxZPtwovuKHYP69yIO
RLwqjx6cLtza1OHOHjsGZlybjDGSW0peTdZy8dv5CxfZdZ+8OanOV5qV5cuf
lZD+YyAe9sU3a+1nfIGxO3ZLxu5ifb2Z/su0pS//VNnS9580/eexZTP9l2nL
WP8vakvff5rpP9aWzfRfpi19+afKllPdltHGb/n58Lhzt+8/OmENeWviHMeu
Q8cn9KPJY759Q219qIy0e6bJ4esf3b/21pzGMXRIn2ef3xuL+NBXklPBOgvn
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
