From e64bed2d075f5dd673e7e1ed6da00d7f88f6c530 Mon Sep 17 00:00:00 2001 From: Khalitova Angelina Date: Mon, 18 Dec 2023 10:38:04 +0400 Subject: [PATCH 1/2] add --- tasks/khalitova-am/lab_5/App/.gitignore | 454 ++++++++++++++++++++++++ tasks/khalitova-am/lab_5/App/App.csproj | 14 + tasks/khalitova-am/lab_5/App/Program.cs | 173 +++++++++ tasks/khalitova-am/lab_5/README.md | 191 ++++++++++ tasks/khalitova-am/lab_5/shot1.PNG | Bin 0 -> 38953 bytes 5 files changed, 832 insertions(+) create mode 100644 tasks/khalitova-am/lab_5/App/.gitignore create mode 100644 tasks/khalitova-am/lab_5/App/App.csproj create mode 100644 tasks/khalitova-am/lab_5/App/Program.cs create mode 100644 tasks/khalitova-am/lab_5/README.md create mode 100644 tasks/khalitova-am/lab_5/shot1.PNG diff --git a/tasks/khalitova-am/lab_5/App/.gitignore b/tasks/khalitova-am/lab_5/App/.gitignore new file mode 100644 index 0000000..2afa2e2 --- /dev/null +++ b/tasks/khalitova-am/lab_5/App/.gitignore @@ -0,0 +1,454 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/tasks/khalitova-am/lab_5/App/App.csproj b/tasks/khalitova-am/lab_5/App/App.csproj new file mode 100644 index 0000000..1260716 --- /dev/null +++ b/tasks/khalitova-am/lab_5/App/App.csproj @@ -0,0 +1,14 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + diff --git a/tasks/khalitova-am/lab_5/App/Program.cs b/tasks/khalitova-am/lab_5/App/Program.cs new file mode 100644 index 0000000..df7eaf6 --- /dev/null +++ b/tasks/khalitova-am/lab_5/App/Program.cs @@ -0,0 +1,173 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Running; + +public class MatrixMultiplication +{ + public static int[][] MultiplySequential(int[][] matrixA, int[][] matrixB) + { + int rowsA = matrixA.Length; + int colsA = matrixA[0].Length; + int colsB = matrixB[0].Length; + + int[][] result = new int[rowsA][]; + + for (int i = 0; i < rowsA; i++) + { + result[i] = new int[colsB]; + + for (int j = 0; j < colsB; j++) + { + for (int k = 0; k < colsA; k++) + { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + } + + return result; + } + + public static int[][] MultiplyParallel(int[][] matrixA, int[][] matrixB, int numThreads) + { + int rowsA = matrixA.Length; + int colsA = matrixA[0].Length; + int colsB = matrixB[0].Length; + + int[][] result = new int[rowsA][]; + + Parallel.For(0, rowsA, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i => + { + result[i] = new int[colsB]; + + for (int j = 0; j < colsB; j++) + { + for (int k = 0; k < colsA; k++) + { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + }); + + return result; + } + + [Benchmark] + public void MultiplySequential_100x100() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_100x100_4TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_100x100_8TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 8); + + } + [Benchmark] + public void MultiplyParallel_100x100_16TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 16); + + } + + [Benchmark] + public void MultiplySequential_300x300() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_300x300_4TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_300x300_8TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 8); + } + [Benchmark] + public void MultiplyParallel_300x300_16TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 16); + } + [Benchmark] + public void MultiplySequential_500x500() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_500x500_4TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_500x500_8TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 8); + } + [Benchmark] + public void MultiplyParallel_500x500_16TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 16); + } + private static int[][] GenerateRandomMatrix(int rows, int cols) + { + int[][] matrix = new int[rows][]; + + Random rand = new Random(); + + for (int i = 0; i < rows; i++) + { + matrix[i] = new int[cols]; + for (int j = 0; j < cols; j++) + { + matrix[i][j] = rand.Next(1, 10); + } + } + + return matrix; + } +} + +class Program +{ + static void Main(string[] args) + { + var summary = BenchmarkRunner.Run(); + Console.ReadLine(); + } +} \ No newline at end of file diff --git a/tasks/khalitova-am/lab_5/README.md b/tasks/khalitova-am/lab_5/README.md new file mode 100644 index 0000000..e66fdb6 --- /dev/null +++ b/tasks/khalitova-am/lab_5/README.md @@ -0,0 +1,191 @@ +# Отчёт по лабораторной работе №5 + +Выполнила: студентка гр. ИСЭбд-41 Халитова А.М. + +## Создание приложения + +В приложении были созданы следующие методы: + +- Заполнение матрицы рандомными значениями: +``` + private static int[][] GenerateRandomMatrix(int rows, int cols) + { + int[][] matrix = new int[rows][]; + + Random rand = new Random(); + + for (int i = 0; i < rows; i++) + { + matrix[i] = new int[cols]; + for (int j = 0; j < cols; j++) + { + matrix[i][j] = rand.Next(1, 10); + } + } + + return matrix; + } +``` + +- Перемножение матриц обычным алгоритмом: +``` + public static int[][] MultiplySequential(int[][] matrixA, int[][] matrixB) + { + int rowsA = matrixA.Length; + int colsA = matrixA[0].Length; + int colsB = matrixB[0].Length; + + int[][] result = new int[rowsA][]; + + for (int i = 0; i < rowsA; i++) + { + result[i] = new int[colsB]; + + for (int j = 0; j < colsB; j++) + { + for (int k = 0; k < colsA; k++) + { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + } + + return result; + } +``` + +- Перемножение матриц параллельным алгоритмом: +``` + public static int[][] MultiplyParallel(int[][] matrixA, int[][] matrixB, int numThreads) + { + int rowsA = matrixA.Length; + int colsA = matrixA[0].Length; + int colsB = matrixB[0].Length; + + int[][] result = new int[rowsA][]; + + Parallel.For(0, rowsA, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i => + { + result[i] = new int[colsB]; + + for (int j = 0; j < colsB; j++) + { + for (int k = 0; k < colsA; k++) + { + result[i][j] += matrixA[i][k] * matrixB[k][j]; + } + } + }); + + return result; + } +``` + +- Создание матриц различных размеров и с различным количеством потоков для параллельного алгоритма: +``` + [Benchmark] + public void MultiplySequential_100x100() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_100x100_4TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_100x100_8TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 8); + + } + [Benchmark] + public void MultiplyParallel_100x100_16TH() + { + int[][] matrixA = GenerateRandomMatrix(100, 100); + int[][] matrixB = GenerateRandomMatrix(100, 100); + MultiplyParallel(matrixA, matrixB, 16); + + } + + [Benchmark] + public void MultiplySequential_300x300() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_300x300_4TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_300x300_8TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 8); + } + [Benchmark] + public void MultiplyParallel_300x300_16TH() + { + int[][] matrixA = GenerateRandomMatrix(300, 300); + int[][] matrixB = GenerateRandomMatrix(300, 300); + MultiplyParallel(matrixA, matrixB, 16); + } + [Benchmark] + public void MultiplySequential_500x500() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplySequential(matrixA, matrixB); + } + + [Benchmark] + public void MultiplyParallel_500x500_4TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 4); + } + [Benchmark] + public void MultiplyParallel_500x500_8TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 8); + } + [Benchmark] + public void MultiplyParallel_500x500_16TH() + { + int[][] matrixA = GenerateRandomMatrix(500, 500); + int[][] matrixB = GenerateRandomMatrix(500, 500); + MultiplyParallel(matrixA, matrixB, 16); + } +``` + +- Запуск приложения: +``` + static void Main(string[] args) + { + var summary = BenchmarkRunner.Run(); + Console.ReadLine(); + } +``` + +## Результаты работы приложения + +![](shot1.png) + +По результатам работы: для матриц небольших размеров большое количество потоков не ускоряет (а в некоторых случаях замедляет) работу алгоритма, за счет излишнего переключения процессора. Для больших матриц увеличение количества потоков увеличивает скорость работы алгоритма. В сравнении с однопоточным алгоритмом, работа параллельного в несколько раз быстрее. \ No newline at end of file diff --git a/tasks/khalitova-am/lab_5/shot1.PNG b/tasks/khalitova-am/lab_5/shot1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a0465decc49252d37501ef5e994673fdf3bde7b7 GIT binary patch literal 38953 zcmeFZcT|&G7dIG0MMa1egh0@%2nvXRbOI;>N)ga2(h))rJtC0MEObKeU_e2Nln{EP z3xpa%@6rh+^b!bl;`QG5d*7LNX1?{UnYHGRdDdd(A?rNP*=L`9_V2g%*(ZUT&y<vd7~_G- zDcb*M9iQmJ0f0+ye*MvnS#Y@l0CCk%A3yxl&1ks_(mf*;nW1k1`Jpo|t11Dyrkd^h zJXG(|q8<0w2h#EVa#hj84?9jE7?qRNx881?21w1nDW_+?U>08Y%8g&-NoM_|H{cK9 zn@1ZC#}tPeT7SQ;iE|S^Cw||SpO;AeeFwNl&rB2j*X7gZL;q_;v};26|MjME(y0fO zk>efm@xioU&C$5`Q4Zpm^I$*Bo4S2`v@Yj;xbIMty+c>dE@XMUIx4jnc3i1#XcRbp zM3FN(I^wE1qKBL~@7&}X(L9i|I{iM8PSl#$N4rF3!A zOM!~DMMFEyOE>QMDKXnHau10Vg|0fwTQ{0ofKO-n@k1Y==P4;bpJh~PBKKS%;TB_eC1{XmSJx) zS2WJq1p@};w<6?CeEanr!)7`du8i?!xrgi)^w(Nx?P9zS+LU&zdOr2>>vz6?JRL$B z+#9X=zIm(BbX2?qtF*-SIrc*uqq(3ZN+gKSC~70T+2PuG62ADm1h%?6!x8etsw%Sy zy_{q=OlN+?^FmMK$-rP`^kC@jP>*-9dn+OeiZpAMJ!-#OHax?oDr{3^esgCs0nViu zy4qL>JDE@f@VK-`H;eNBs3DnpQYlF}@7=6xo>!$=yn33tt3^?9fhjx4qY)GNVCO*- zTBb#o9G_;HtA$i5a1O^W{|pGd|NVN(J3*tp?J=1d9Z|0g$mW(C+)H2edFcRpseZ7& zv|7#6?&!2yM}1*JlWQ+AkyyGDHKxs^KMhZBpTAut+Mh*;9V-QrDJO%lr{`9unrlbk73B zNoV&=Yv=hqW2O6JPLBhb{=#^DlqSxoD6_om9m`X_rS~cE)eR?KHeH zBM5sS$%{1=k_Ijejj8KZ%eJ6J$b6`mi!SpWU|v$bL?!zFB1Vm3);UUt32VfgIf z+vMDM$Mg`J8R-9` zS=~30ZehqkpEV`dA3dEEwYCIQ1PYvgq;YS|(c3!ucsnf4?#qo+l6Ff3(f%{@lDcc_ zB|7P1M}_Q@&Y$p6h_Ap|_;cgRGMUROiX$xpPGDGjH`x>FUa+-+V=3*5pL~&8hb^fr z=@bJ)-0+K7%adT@%;xe5{TZ~0MsAE%_PiYe-F4YA(hCnUBV@~cCDP3<=cuK0vh_1t@CUE_zISu7pZl^Ox9Y4% z!Xt|D>?Q8K{>lW;9$*~R3WuTc?a4Pg?(-)JRBRkd#QuE6E#L_ly*l6>$-|~=m82NB z6_CLltYdF;3k=EjdGYYM)9I0{aG38m(W~7t7{yO8ksvV!WGvP!?LO!ROf%L_Z#qYm zBcJE6YV?ZRRLu5E{Kg;Kq-*w5C4+d63QJo_B`5Ddm??SONDq2SMi}{Ia}sMm6GI!X zQ4U5?iA2=S_(a6nzbDA7Jd*SFBeORqOM@(xz@-Q_r(#Ia+|~Pb8DxHMt7JQ`(&alw zO>>J!YO;dx9))hMrSrFv&aovLM-L5mPg@dov^uhGqIA5k8q(cSD9tN%v^6ZjQU*t- z6*|y3)lVQ$v+u+Jv{QS-RV; zqqv9U*PF$vR$x*{p*dMe;B;~WUTNA2*^!U=Qd8-%#?{UWMm{){F`iGnB{#Q*WGeLC zIq8n-4^7Ve;MI@+!v>@gTCAuLg|%&i>ym1%Q6){Ji(FvI9SghDYzi72FJzS8+J=AU zgD>k=3|KDdoto&#Vu%JfJnFw409}|=T)J~B4xHxxMEXV1AWMnu-KVdrhDfL<(E=dz zs*CqZg_6XDTZ_=Am3F?^mZB2vrHvlj<$}wNXYnX}xL2vi)aSB0%KN9qMUfkCSz7$- zUYR6MG+lu1y=dY4YowCc2&b7%n@#7ey%DlY$UAh(P-#5hS9?LyD9_wy*R;2P&2oWl zY3D|!MVN*D_kPM8T94!i>HDr@J3MVkuwXALU1v_0$!XISHiK)y{0Mni%J3+;K5fpv z|8|_v)><+V(^#3VR@=?G>XQ5OqxfyWDAOFBV%(&TF!~RY+m;UD1FQI9mAOW@`N-vf zY8@6<8^6kTe}b+F`1D!aNpw-BS3N>d-&ft74P?~<<@mdRt!?v(h5q|7#yg!NO@J`p zw>5s2xkgCDQzt~Dxa~%q(2wLJYFRk&&I*V&pX9xa>R66xMszNZhHR$gdpnF=+G_n^ z8_o6PLNf)CbFzv4l|bvAz_jHA2*&5@3x(CEE=bdAUk~9fWMO+f#CESJa`T6+PpuklY1DPUod8Rpaw# zhh&}tsgGb6o?47F_msHs6Nm@jx9Dn`n$A&t#}y~1OQsZi@ryS`t{xXb7c}&q*vQ^2 zmUx;g(-jVdTcBnmK4Z-)Au|%#xjT5hBRz`FK$_i>o=4S;3|B>X_KXOs(YuJJubb@h zm6VP)vcb-`)Uy~#TMoTw>vQd6McwqgKQ*@%@`;r$0X|z*N_h7}HW3p^tlSAB=0pcl z`b`UD%9Qbif{?O&Ry6j6h+RIlKv_dwi4@$IR?aMtnTA%8Ye%r}qi$8mI1DZuRs`NM z#()4T0o0V4k|`bW$LDoZzswi=mEKu91B+&cWDE5HdA00u%F`eHF3;7z;W6BvdX{vz z^odYPqf?{A#oNRdby(f-XtY!m$~ja^Y#)xi{;e?>isGKt>vSU}TRqh6bheEO3(D*E z<|B`)vU$ojg(%uWFX~Kptr`p9VWZlfHtjbTBpp84du;yEaCfmE4V`Wt%-jzmx7Dzi$mr)1LT!#nCZb`F&Sw{+~_DZXJjB z)s|sKXOr}&fFVD(_Nl}S@eJe!gU9WSCVFBsN@Qb=b8~UFwQ9wXe9D<#<`aRAoAu-F z4cvif_LS7&BiQb@ij6oedZ=-Z-qEF1OOInj*LfC1&E3wlCh6Gdo&$rZ&*fx9*uI`& z>q|aC{)(xpK*o*;9KxSog~FZW?I25hz2)PaSuG5$e~yRcX$iz$6dS7`|4gjNt%pcT z6v-7!hyaPnuLO~ZPX;L#J1MSICLA65nQW@&`=d=|9iLK00%CU}cxZ#MRaK#rCBN%L zFd>N3FN=;~FJl=+!XB4hl0h5@=NRAdlQ9xVaJAFX(|Oy7yqvU7lVY3x9JSnIdg@@D zo;q{tZ6411r)bk?k$d&&nnO!O9`$~c8}9AfDkSM1+022-%jTY;yHQ%zJz3YaRiLM{ z!wvL(WkI`t)<#Ju8zc_w{sN zxVOmmymgBXQ{es>H+;jdG1&Z7r8t(2DUt%!_r0?R zT*quIq0zmQ_o4R;Vo+ZcVLeT(YDdW&d@WVzr~pMNQK`2nSMOZ4kDpdb>6|ptR`?~B zl~apXzO9msu-3g$V|??MQu%d{+{U|Y8~dP0IX96pP>**0C11l0qdgOtWuI`siVgA&kW%4wM@PEp)$*Us;!WThuU@^%L{Zy=B}jQfIG6X09J82!W4J zXUdbQdij?|Ms;r-6WbNSAn&TY&MxKk@ay+>1V5{IZ)`(ds)LH`BymUO^FbczD}X$w z^KlmkVH(NEEtqH3+HTgYrK9H*oiD4k2WPO2dcIwE<$I2mrU5dX^rOUJ)%uoD3tyvy zKv7f1)K$Kt~c(=Iout~q7w?3HO90HBsio>VrToDsHNNa+D zj>qC#=gM|iQn2MpRIVIbftt`S7I4O}s#q^DMt6Hml{l)rk?;bP^V0ZR`*Zp}qx6v3 z)_SF7M}$XK*UQYdYl#rOd@D%x>4n3&aTczN?XSRMVyp84vE#FQoju|<>tELIMS+-+ zG9?Nnm#%XyZ1;9<`W>AoMKSXV#lz~u13506J*`~Z@jkLt@laXZb%jlSyW*?JzZmYA zAj&2#oMifBTIX!`&p8TQ*XRPyaY*OgnBTVu{K6*6PdO}lGWcYeTv(baK1doFYg`sU z5s)1VF>l~)Y7BVy%Rq%P&<1@IP+j;|vn~83=AAkR58+c-MK$v#FxN=~>R>mu{uOq~ zZl#;FJi1ScnTu(f9vuFujB`-?wqt}KfuYs)EU?`Cy(w9P{FdR_ zonm+Q4Nd5+Ipy`3o>4JxL&m9`I$9xkBct_?Sxn=n=ZEW@$Y;u zGhu5hj2W43eOW)3 zV$yChu*A}6olU4L9XhgKm_J|f{ZomX`{B!A)=aTj|5(V_aF+*uJ@>=Yj#W!X!=pl` z^joK5xir&HsI>3>cxi;W=u)`;Jc7-)`if#WmW7*dA@6n*_FUP^aHAOm<@NbV;VYOQ znB0i1=6RadIb9Bpi5?PbSGDFG$&o14?~F5oP#R-GNvXP$nvd!yw?gK~$Jr%%L4 z{`MH_Bqzg5%hET*WrzqEPsMc!Ui5jlrn^j7+4x_Q}fk-Xsoep57e~r%B2>Ly}&L0De`tQDe z9Jq9!JI_lZ>tf1ulB@-zu>t%dI{}4`3ckZ5`UmnM_R`4REwG;Aa$}lu)KjeSTz+Hc z&6_T;V9j8ToPp0D(ZSfW7#P*MA+>a#5Mu3-5t*~$;-xf*-_~*e+1e-1$09QK42K=E zZGh3VS?c{D=?+kN&b*}w8N5Ppdx$>t*LW&0XDvHi1-21G-k*C(<-CH@4vi^n>iD$b z*ee)0tdob^!DmTfl)xlQP?hg|32K_Ht($9huw?gp7g^>?RYs&gOCkY@P+j$~5gV9t z`8s;W4Pn7vGbXM_rsboURg|3RD^qILEN(btJa)6Yz!#X5l6i9W8baSntm}_kQIWR2 z%nzfRx%J&&+9zOMmUrPhOz+_rJkV?N>!C5MJE!vIA;Q_z+>i(F(?1AEM8Du?trYqx zlkybhV4()V-CaIY9k}@#YM#WBu$CKrHfwW$RJY>5;u8o5M$3BD9Zc#v>K#Q?-*5vX z=4J^g1SJI=W&!K$6_dAL_XrRF+D>IDao3gY&6>S7H;>cDJ+!K7{gDL9!?k%ONL~j* zsv4!W8C^dG9Yl!oLM^tXfX?>XU_BkGNVk4~S=5TY086)p`faD5qi2ej&hFY|{^a|! z0<^hEU|RFqSWO*`i4XX|a05`gjTJlNdP8s&xb#9JN!spQFlxZLYOeNV=v=_qd&pS; zynLIE`%~$@#vZ_D-*JcjTvgIe17V?uWY4J?$yK0jh#IOog}ekHIknNZ?g`ysrvs#P z7y^08a#%N`6vWnOpZAn+$zo9ZqQGDj;C{-;@nylknc&?2TAs9=nU^g1(cXLVh1Xo! z(RPqvESJES)rPY9!>=0IVRAKI1a8ayt3Lg&&Ue2$9qQp)vsHJV^Ja~Y9{$nso&r&4 zW59SF3jIrl3EuC_ytKrQ_YnBR6iFMbS?Yf+_>IrCoHj_X8vOL4El59YCZ4# zNU5BfR`s%lXEnsAB!?SKneHJR&n1R|zV7%Sc;XD#??LIk;nX~$PM5qhlw}GWn6}tH zpjVN-|59vun2tMKY_UbjU4DJOWImxnar-hSY3HKz`Gxz!60zGHzaJNwr=@cRY@f}( zoAG3b9=<&!mAXduD5`Ru<`knK{q(W@NnZ)l|V(w`eiz1&){j0E!14gc9A;n9;UKDy!aLu`=hb18+Z%=gVk{ZKOx z(`d@5T)%;y?KJk&_`J?~>diO5iU0lJ6?zpnPOtI|zfP64~do0TL-^vFjQ3q~o zSMMK@=vzsk?;-T97Ev9{ypu*_#jXcMxjwxLj>uh?;BV-6AEMI5TpxjgnO&;9evcqE zjzH&obT(`>z~=bl9b2>d)i0IPw6VvC-SZDV(1?$wS4re5dNq{ZV^O&ib%NURVLMx; zb_4E%C;C4$2R~L1d%W0}Zw-w&&&>0eL=)#X=(rvFV+dJqCC(8w8joKk|weA zD)Jy0bi8nAthrg^^tTj`Ew1PDl8=zpq&fbZB>Y^AIXhxwk~@uy0|vFjYj!UE*3WBT zzW3DMAs4{%e{CWC*S(4QEqax8`oPw(2S#U?o6fA$f1F@W=Njtu_POlAJPe#Y;rMc; zl)=j6Fm;oED(tRCzh^OF^(3-%&asnD@z~eR#y~isTM2gXY8Ivgwb^QZf6@*;qoj-f z^T^cGLbq}Tv!;sh?vvBpkMR(Eu8iT#@qVKOM>+Qu&e_Amf{UFn${C6Y{)q7e^ROm= zFyv3Jn{djbQWemhffU7ZJlA2p5e;r$SN*9-eWS? zaiQ)>bG07W`01~)3P#!+Q%EWkFlcbGP2lhv#wwgo2#h#8x zv==HH^>_@5U@8|zFAlJDfsM+jKU}05t(bL zC!34vlZx+<4~^KcCa0h|+Hg|waoxt2yFTR&bll`8?poDn|0LxbG|33XEM;S4$D=og zTOTaFX%F4IN+X=&`y%u$&~tGFM#s4>qWO6F~Iaex^A=A1Wh zCtXmCc&4I9R5~LPvOP-+qm9gRo+ZX9TZpjKIJDm(Da7h8&s7i3n~Gh&Lwu@?@Ed<+ z9-rJVo=Yyl%82dsHuj72RRZ12^o{~|(om}Cdpd_h8?3wM@43rAJyjycmUj_(xrpbT zoX}9V=+G}FEhh{hs?cPCgm72d(yN?jCl*;v zhnWjZSGP%ioxdoF-rn#Go@b;(`}cdyBPhDi+(d$JNb^-))(5jNIo6|c)GCQ)= z(Esg0U6p$qo$n<_RfJz;DQ{gVGSs+{|p6=d6upGvWy)k;d9;qI&K+X`&9q zN^Qvs?Gs?Oz!0QB$Gc=X{-zTKVK3th%D9WVpzZ$qS(g0PMR#v*JWOJZiM<0L0DJKkEbG|X{W>(pm%x{=R3EAxwi7jP|XPVV2 zP$Z#vntGX3D_3*8pKY~7iab?b;97Vg89Q5)RWYTEbDv5VDyxp5jm>Hr?)`BDV-H|vB(IsjJT*5_Tl!P zq*%rV5@UpB+p{pkl}OU;0-FGvfU(88k|V)b?y1_F^?N*L&Zs0=^Clx^F!!vY~EG8lgV> z&Mn8c1VMh5g@FW1bKkbL%lS6@JY`h_4}v+Be9hxHa_6{pr{_K1pIW(qu*JZe6fX;C#Mg! z7K44)cQGM+nvOW@cF;4zQ!M$8I2p+hEpLB|(fM<#8K&jJgO$5EthGG1rK#3t^^dGj zu&TI3{+*#=w}E)lDa}8`*njy9BQr0nO$>pr?My|<=-T{K>XJjHsNVOL2Rnq#b0%tG zA>TBx%9N|t18t-|9+On`k2l)~6 zp-Kx)ur4w&Fe?w0Pmp6&QKM`L*^PY^BihCl)L-ryld;uGa$T*Ifw`(HjrB}{XCE(# z!{W4Do$gKPCDIQR#Y9vySI<(S;qF@7apC4r>z!bkwO-$OlZ0mp@;!2&Jl`MmC8bS( zlM(VbsV8q888%GsCd%#Fc25}@SHkVDB_(Ry-kW>3SnLw>eW=c`faTO$Lb@xVoNmH`zOH;P^$aq_WwTDUVcF5TP?Pk)kJ0g^{{XFC}BbY&n_r#>?`&2}a|j^-zZBZC1B3cnr4ZaMP4}PR0E~ zOvu5QKL_0G1CPtrFm_Mb@=ecEs?`v@42Lmh)gL2ASZk3!j~QDGO|O4eCbHEy{NitL z2UgFP|118sL`J~v*kFnXk~vaY4dQ+V0I(D~^!bs*F52I9id(Ebs#?Kwl}<5|HGp|! z)kB{8tC-_+)&X8KI>KJ>$_!yW|~+_?;=j2tqU88k|``23Uo z^!+xlyZWXHu~G@4BKV87^+q-PMcVc%HHwA^) z7e8}I&H-ft!pst^eTj2V4^y2A4l1DMn1 zaAm{@_RcMc$QZR>N8GLMt^4%|j3+3%iV+#GK1TiKuF7~grtZI{4mA59TB8wPVF`Z# zqc`6c=m_|WshDraBxn+MX?b6yufQ0`G;a9Caq=LBk0II&wxF@%-Im#}C*SMwX-j-# z@J7!c!v*arv`l|g^`OknrDp?6|B`c<&X?r@PP659(n^gHY>jjfIURh<_rF3gwaJfQpXfqB8fZF;-~vf($|0^&1RqmQ)7MJai)}4d&t6~!PLe94DM;M z&XUex3z+!D5PF%_Lc;<4gd%JF^MPmcXir8C*gGtwQH*s&idIxaBfR`Ub6udOXiGu; z$761AwGI)g0&#@Bg)8~Fa>KWhtYMH@XEcnv zCO6)uc;f;95K8LR(Clwiuh((AODHy|)TW7=T@sNa>cxaBUuR;Bn??wLaxF1FqvuZ^ z<8fz_kYcgN)Rs{H09|4tZpNySdEqS$Jk*zFjRu*vRTxY(A~f z$YY)@r!Ui@V7X_ca(yP=0{Z=b$9%L`_2et}eZHWGhZl|JbObgFZ1WrcoN7^^DKe3! z$hI$+^7Vt06z%Aqs{d&{7VNS5rB`nk24X}}8LoJK_7E4&aFR8lySllYP>=Tgv~)*I z$nRKy_g**22$DR;(Vb1=DAbr_^dcB>;8(a=s+eeS>{b}vcK zT*06{j-Z+Z{Z7j94h>N+RNwt`i*UVunQX`yaOHAZzo`egWFi9FEY`#kY3q_N+dY?H zJ_R>dlT_~gwW1t%>CElWl+&X>^yIA~as?!YbxPLtOWnnEk_YFhKkQ|QtoCiEv&kw~ z7@{To2OjZ`ORfy2s_71ja?#2uLIV_sZ|&N3c8YmZ$53-<(#z16_2!UTXDuPw|6L~r^HpG#+;e&dSnO|ynbpiT=tH z&NncPUov>)i7O}tyL;r^4O*GU5fCpY&_i-hc2n@sSmu;h6vke*3miYCe9FS!QNUVS z=`K9;09ma5nYG(;Xu3|Xv#098Dj|b!|Gk~562sV{TzCRt-x^d~w9h}^QBVUlC$AKaN^r)FGxHB^ak4vBhm ze)tyfW-z3?!z^k{JpDJ-2ecR>xyX!w+W67 zC6%Eo?}*%XYUHGYWDuT2i3&V&pQxk*OkAb`vk&M|3aMlacRJ-EqN(E0-b1QEX4TLE z<4uFwQF_{bc=?^QW82fCjLRunD*fJGd%5a+w2}`;2|9p}#)<#4P4eGat^cY0^#8x< z|5r5NN1&T6tMNMAqt(e$$ze4|r59=JA?@KY9ZNIH@_o77^M2GPtu6(6$) zq&??+Gn|=M&fBxzWJY@lg+zQX-S?0vX!g<^anP}1xN;=J8B$DtF{?;?WkMw0RsJkv zZHjTtk=s>)tJdX|9Sqm{{jQ3KS)%7@>tI(Vzt_9AWU#`dj&2scw0O1+bOlZS$gaku zODgqb_l;BT18rjnhLpN3`qtG+;#aGh!}H&}P2P(K7VCU;6=NARk@w=L;Jzv)mufo` z6GmqAY^_TxXbPtXa5P=r18R{$z25ITw2$fFv@V_sVH~c&nXwvUCp>x=HyR;g!$qmt$PeXq3i>6ta}fKFUoF-!{ghL+o*J zIPP-hUMn6Q1i7xUsnOWw2|Z@U$<=Z13`KO!Nb|9g3||nY|Nh2l6SlB?2X_4PdBytI zD10FU&4YBzsT?X7E(wf@Gf^;gM_+i+bM`J@Qf9e_!G@XEZM83%tirXfd zn~hFEnq=z`=#9^r$ISz{aha^LR2KP(aQdKL1>fXxPE9t6)PVOtADqWtzhHn7JuSu# zNG8VYX?Q5LYC1S=aovxD;4VHPKRmo3rGPJ5$#vew0;qN}E6E0B7>QkviYje(;q6<8YDkNDlqeIphvG;smuQn{00uB$u1j8Qyj0LSXk27d-~Re zr503eNWF3@_q497Hf~SH=RgeX%9K}~S0%qZmcesP_)fP^He70CfZ*rE&n(K>=3Jzuv9bmKk(J^+>yGP$qUh)%dK8WvL`_VMgWkmm} z%4r~=>e234kbdRdAZ-eo&;?sx^A9yT!nQ&z26*6)N9zu0fl{_W$AOUz^YZ%~&MTFm zkGqM2=Ty>$#KO(hpay_iCxg$&Gh;uPrL)6wrD%PmRDojI{KI^dZ_lcF{;Z>GY(kee zSt>$qdyeQdkYf&&uH%afHLh1xV$x*>hsP?8sYh40WCb-S{nESVJET(!PNf9B`LMx% z_3&=oxf06{;fW0@L-8zzZHJu_Up(;!06>#t%+byLXY*{8JQF_7vPg0M1^EK}gZd3q zTAa{n;OZ#vpB2GHgdKO|SiBOwG~mX3cbqt2rMdTeJLWVS@~Y ztrW|aEuYa{js)<99b&`+t;Fp@Ezj?_(({LdXo~c{9Uy(?*EUP}$$7cj6S#G?3p+H= z{{ir?&eu{bXbSkH;E7W-`>*AeKX$)8Sn#*5{w3xAoskY6S6;i|A@Lx-Wl(o zt2tBywXDjWese?_F!nyMc6emn9&1k&j6+xrP2X_nWTgzhxw>*KSe{&a3-~zkCzws} zRneSUekpH>>Ey%y3T>|EN|eq=_MPY{NAEPIT3Y>$-vALkx+V{^RRig zyt!p=k0CIV1fd4b(F9tUL6H$0jvz^seT0LnlBSBoZ4W_-eYzB`mY=2%DMyE7|7`z6 zX@a$dUwzF# zA@P?+lBf*PIwvs==f6*pqbEdw zywvLFAK7Ek9*`?N-PdiP!-(gTZG;S488T^v;&gYTqyYZH1e%C)h`=sId)cE()-|d# zh%OHNQ&n*g8u(~`wXa7ME;~$H$6y8Ds2u(IghU!vW?c74dq|^XTa%1WwGGD0>Ub6pliGclrH#%Gg zk)yOM0-3e}trw~IhtZ#+H$QTWd@%p8bXNCXho`q1CKd#-@}kTr3F@u1|E0_>K^1=U zd%cTQ4B4zs3@NoY7_PX7MGhq`edJDAl@2C!Lya=0SiG`^Zm#-Dx+gxf(R_3LNwBt^ zY=1HiC?H)X9E#;Y1XN+qI2zmL-zgM@Ky(mRvfW@b2%O-7!fVY)(vFHLMjj4e;o6~2 zqb}cOnoTHgY=d&d_}-dRu3c!V^RcAs%-{lLgax-uoi?*kZ?&Zq0 zU+afwjY1#v5|D>nukJc?D;7+aI<|avfapQ%98BU0s5_z@vf8TNKFlm0H(FQm0z_-X zjOe(|_mKW%N|UKH!ISG+O;}7zF)295?kf)Bo}VOl%52&G;b22f4GSGlv;if4&^o_%*pndi+ST zr-Q)Fm5G&PSNRr@P3(l~iKY{;iQRZydNC@DnCiR~|0xE=UU zz-04rMq@oGOj(fT=9o(nAcMH)DPPgu7C`jam%fF03vS1l(Y1;7B3f)y68{ZXuel%Y zOk|uIyWKdJ&nIf3lGi^4Uh5a0VqR%4rf=nJ@y&eTqhYLT69YLyHcYU^Iz9*{15oPOe;ca%3Iy!Wahnr zZmSq#DoCij?Ybz}(jTs&^Oy(##r_lFiTxAQ1KfE2>uJ%o`Qr~XhQRz^8N$CKy1|Ce zAKnI5t7R`{xh}Hzij1IhCK3j6ao*p6butCKbpOVuXijWlXaN7>;5D1)snvYr`=Vk+ z4=hy0IW;KO^qWh*Ogtr|7GENxnh0coUQiw zh|u;#UzFH4M979GCAU3Bt6OQ|@QCu4Sp*K`#%Em1$3+c{Ds_Mj+ltCxj0Wnha-!n= zwbis%C+yp$Q$J4aZjuMMF!&^KT@0*PB8)#HkHBvSpxo;Rb&XEA?6cXH(gyrSy(f!?-#Utd>JA|JmBIv%mM_*AxU8j5YY$7~ncv6zA^ ze`Fsr6*%xjEzff1wvI5LcgIAiQyF5_s#0dx`TREXO5@)#?vrX-jQf1D!CT7oN`!}a z;9r1#4t56numJf8xBx7*d&8de<8Me;C_wj#c{UytTYf=hPlhMk$_PL{nu9XAdp2BR z;UTkiTRfZ8yQ*F)UMmq1j11I2y$WeZ>fZdMhk#)B@QTI<-Q{1s2xvFMmc9fXN@Z{w zT=W9Mcs0|kXGwU`!v;<|~T1^*WT81ozlRS({HvmO&goPl+)QQU@R zJ_RuGpkDMN!Nwtc%gHEnVuggvt2im@5j30CG>|iHw$}#dAAyPxWgV)|<6xh)!F7G$ zF-jBSmV3d`BlUX!P7}~c?xXhVGAfS2;V%pL6;?ljD()Ow4qt!qezT@5@>9Xgrl+Nr z4r0SatJt~7xS5aAJY_7-we{U2cF93NMNuRGl+iOUxK23#q;2Q z1T{XFU-GVKD}DgQ^oRg<7i)z})%*;f>Q5sWy3cI%C&CiOMN<|DrMh+sJ1e46bScY)OwV~OC zs+~*mNM2|bB3Oi_Q1&)xHu&Q*rb?)U zx%`f|it*Q@*BFo}O|I&(5!Qd?5?c1Tbb0)Vl2@2uwPc_I9UrkYa&$OAl^-&^Jwt!U zDNqIpQqQxb*Yy((AKfiS5$J<7G;XY7)gzt?ZC3@;ik=nJfdU6+z{cni@xP!RrArA3 z-&({);(5tG*`*hx?7Iq<+*#2EU%!8=q95x(xpWL?L^;>L5Gj$0Yfj$m?x{Zu6IrIM z7_Iut7&ak8&zgQ$qYn+Yqiqnq$8-%ZsS4q!=l zcr7-%R4XE17`9%v^+f-SZY_jzOSkbEd(QJ-I!P{qT;aO4+m;(?_EW`O@oPQoIBW5( z8K&Cz{n0RCDms7_rBP@(B%;!tJs0$HHCo#FAU#LW2% zw5Od+BQUn>)mo^>DH}4(=U1dHmAXVV@2N#&xI2iaxt#75XzjGa`dYsL9>qTp(ZI^5&R*Mecz0{9vWrbE!Q+~(Y=@EW|!|mPimZBq&B-rxMQW2e}$U3dt zI#UdIV`#j_D;|->_QEKamRATYylAD#CMRs=BJlKRt8b(mgC7mQzQrbTi5&cazV}HZCuZg?mFb#0@4TxaF zu+fv3wX5`9T(CxhD@U%@UAHMwKJf<+K$uoTXQ;Nu#DIW@WPdD9Sc7~vt#@n2 z>(ahBjWEip$)z5Ej|_rlMu@3=SD(3AW(~*3{3x7xQCF3plY1&&?9U~1r^4O`JJ2Wm zA6jLZTlyQ8Hc$GChBGknDHOG0AyJvgC=e_bj8e*~1OJ>#{v4n6`4zr+J6GMuc-;0uh-HtTtH8{Ja=vm80Ypded`v_T z(IQ&gs>S}Os*t|vdZTuo$NK#o9g-U*q#zn);z?;4NETUImnS|S`&!uvlWK|G+1NET zu%5H!N3I0S)_-{hT2D*>T^dU%-e=cFw}I^m-qAG6L!)bF1^Br(|6T4#Xj<=v1@O{l zz5_=CXJwQ%Ez@9T8*z9fVi$g=jykU2@=RxgT3y7;521eNwaqc;Ly>lz6G7YfvkwZ3m? zx{K-AjC}6J5({y?)#S7DacRI#&1O9j4btL5^{vAAh}&RM!C2RJ6a@0FP2bHqmj?*D zzOtWil`$|zd;<}rJ}wa;?Z)#Tk-Ni{jE2AATqB2V#u6%`*JT@abivs}%^}Tt;f9_U z^PsGO*vj3nC^S|ko}#%_T`DxQzTWKkDTm80CB<5U3E{^aVpj3?%(KG(0Q8FIz4#nC zFQ}(*>w_s#5%F8jwm@yPa>Y;yKPw4xBjay52OMYP6*5ju$@;Tl!yB#z%$2x(t(2bk zp=BxQC1!m7Sk)3nM*Sv6|66Tm9uD>UxBYgNq*d8QB~i#%w#1->L@31=MH&0fB+OVU zp)e-x*N46?vllG}mf+L)?UxKPVD_>XxGL8!q7W4c zcjsth4>RvFS)Q2s7FV|R*yyOjxIvlSku>n!?(wV*t6FW}9rFnPT^z?U;H>*Bzj zk_U}THIa2(tur;(4lE*$zu3v&k)3<&TBp^Q6{h|D`zf{g+x-fb!WLWlWBhpe9R!XK zl68W$9g2P(*f+>tUm;bg9eGcLKC!*&HvgCXTSAWngIJ=1J-;a1zc^cDcg@tbCx$a` z!Xn7#en}AW7WsR!XdSAEs38d{GKbOKwhd@6Xtyf^13O7)_|Th9HBDB2a|8IKOEJQB zVsg(jsZ@BNDqsSiuiS;>&8rAf;b(^@+`V>!l~w_9(xjs2^!MNo_$^=Z^819(+9aL2 zXVS6FdNio;fMd`III^F6q{Ai{7>ga^(M*~hnQf?-alT{wSE__#tL;bv%a#P;Rf#A! z%}ReFKRIt=HgPCF2&qHRo~oG*ad)2`tH>SBvPK%jM@SiDt@gb;!fld8x6|3yVrpl{ z-jlIoDwImF;!ksBk#Jr1J}PQ?rN;A6DE-lhtlHj4qA_WG6K|${|C}XZ{IDA$OH}ccl zijGd7MPl;n&N|ke*%G}Q{{7S6Li!;uq0S`D!}*r3Lol=X7gk$G%+|MhLrI*oHCKLY z)WW%F$y>Aa$~O> zs#|+?d06UJeG-D;rK!*S;W!v16BO20mlvwj?dQ&nJ7N3^oJCpkCG*-2C_lvJm?3ST zXz$d%s7_o7lD_npPn3R$`>wm+$mPGb+OXAz^1*%?rMHE%eif%bZNCX!ij8DW=F#=oR_l@-a`GC zZF|-1r1HTkOyn)t!mibKS*LpM++TbKY2mT{IwCIV?S#Jmp3gJY=RP#uX2fsFf^?Nr z`_oBjvI`uwyIxX5Ep>2QX!v-&*Qn;u{GIUC(A92U-eZn)Z&r;#vCGK2i0F7lf~$O# zYGIh9xn%YDbvZPi_>Q;ZuF?AEinf!VvJdl0h+hh?{B;CBTaK`$Ra)fR=1Ym@TeWHS zU*f7B^WWJ&l_ogl;9&^5Mr15^@+ z?BiS+svbaoulXsz!@Z}3_o``@pZDuHM~jB$e(%JbAe@iqThZslB(hiTH2tqfa+V7} zkK`n|he{Gv*Y9W#Gs}%(eZkZKc9&*dCcsJEat>75XI#Mt@hV6yL)9UO6j-lnC zCsEZcIdj+PGeXCzyLehW0AI|9dw6%(ej4Uz^Hmon6tUzF|*7FFaT?BZga{~)0 z7NMC%o8vel?|T16L9AOCt#by0DP9?kLk2Y8kLNEd=$2voZI}P9EWqzz9$J@|c{(l8 z`skAsl~SDBtM_W7g(~$aZ!V@n*HSNW zSG-U^PU(&`(PXtjcU&rxyfkZ&pER*2-2Ij_YX>ZT%ThXh)R#}Or0-1>JPs*KhtX*E ziQx#yR3vAn!7%2@(bo3Garn#5S9NE^2ScXsf4to7p5NaTewNh`d=( z!Nb8ccMm9V-9dLK4Ck!0g@xwRcXPs{~6U#Lpz{lPg?`$7dtR^dW8~r^)_Th-M<&;^@FZK&FN6I$z zEaR}VrDR*(<|1IEW>lGuT*~NqkaY25oKeE%+1e7T5iF8A@FOCH5ZEc;)An7)c;L*_ zAq#F8HrF@HFvxfV|0q>f)??lrnB)XUm^!`P{Z&;-)oW<*Jwi(BbgUjY(%6}MbdHT@ za53-0NCeBX2A29%`$|OV(Oqa0?Bi1oOpB%rylg_(XxF`2r|UCOOrdVQ&8N5hu*q|; zb%HZ@veI>1Nov`b{`a=!Hazt^`9&UEH=NFEuW&afpIz(bu%gDh-H0Ejz$(!q=wbt_ zjEAHSv8MrHv_Fh;iNO5fx2MrXuF#l)qzF6q$=HJV&!<)lMl_%bhQ&yYyke`G?wP-g zus)?l$ElbLf>LxEi!&iU6!9bo?=v@C;m|qrJ?D&AJp_xpC+#_3?1dJaeEhNZ1+(V{ zICo3_Ja^~st=IqMmN#dSd1DR=Uu==gjbb}oej>=DD+ zj)V97Yn6M@r zO*kh+d7?RIOrzs0N$I>)T}JnpRw?E2@z-3fImGC2dDZ}#zS)FMlGwx^@TBXOVyXd< z@Xt=I^Pqrj*T=u5biUD?W9u2?3;Tr6JbbOk$z>)jejGU@mp{>6cai8ga*|Gb`utrA z)X!Q?Q^eRaaOdEMPRV26WuX_6<#U=c2`6Pg;nIU9?oP^i#j5ll(9mkIj8XFkE;_;u z;eM;G8Xth>isCdtO*YTapZ(abH(!l_j?N(IGZvVmCcEZ_YkzybP{3qU_@=&5xEvLN z76qaRwHo<*{W%n@s3xPL*{xSjuWIF~P?(W(LR%cBmK0t}9w=CX{kh;%AKdXJsWlz6 zfJ4=A$H*bx$-a`lpxVwF10_oTHFVas+zmIGlK3Sjl1wila;dB`>yG?06QoEulnn|! znbWv3`=zN419eAey2s%VnC_9rc>d}hBWyh2vYYeFgvQCG4925~N6WIR^_&p=FJ-AJ zhOizQQfg%Svg`@96A?mCv;EQN@E3qkK5jC{j82~ z^ShDJ=&2|n;sd8NXUqVeFpw}W%b5KFtgl`t8!^5bEjN1)^e!Yo{! zQ3e8=mJMKikH9mOam+}`lk&uIIWuEfg~4Zwi+lSdIjMSI8A5nVCjxLuY>7c2w)E~M zg7aKb0+86h1_(10b}u~EBo8R;H?tqz2nbu%?iHU&HN%X~B0*tJIXok+>Z!#1#lVET zqy7fwc^}+QX5TD(R4kwre4NF`x)A*qa4>VybR&kNWXX)CbdRWh&-xtD+J_X+pu?fMLjg)}YIqJFOXok(5|Lhh z!Qd-?!Zqc~_^iP+GNAigq2R)3L7I13(Gd@WfnpqlKBPRVnAoQ0Z}IAmVO6*D0L)O` ziQR5J-^H;TD#sOavXGwNKh@kSw#eZe0Ki26Fic%LFPpM8;1F}cEPnc6rKz|BWJ_!# z_loBFzzmDT#_6U8mP*GgTK=@+8uL z2>^RQAP0=#<`F-ooaB7*)iam#(~l)SYGu`pWEE7xc{#EOlgTvc6ok(S-?tJqG(5lPT zHM(chswljz{g!ll9rtk&j^R)5E+21wo1Q#ftVGRFvRH%9Jd-132AmmI8smj#W>*bS zYl|^m7t~1P*f36Epa(4wBio#=5+W9d0-V_L`YC?i5#cx;yFCrhL7hShR`!DK;JJnU zl={`}d(k+N54_9|ti;q1xPqErPP}zA8p!n16;C5me6KMRCC%Q5Y8$+aU%K)wh`sL| z-B|wpLvzk>fx~}`^jzbt5FxbbDNm7W%kG5Km5hk|2cxZgYeG%|#0TLxXM1H^mze<~ zyi~ryAc7XFJ)Kv5DTLs#SozUQ1^d3J0qb2jbq%cRfn9fn*k$Djb?M0Qm$fH@eroRz>Dg%3GHU)hX7vER#SJx}_=iact&q~i3;);>@dzfez z8l#7LsI9BBRG=iu#qNba6@9MY5KLN%Z;mxJ-xyxrwX9L284 z6;Ng`)j{4(J;7llj!_fsUjO0FbG-=1O2jW5ScXr_B(+qBYZ^fwSzD%#ijL`Sy7Yam z&I3Nmn&5!dGB*Ai6)(}zLzT1Y8Exh@F{_SC8Vz?bKJAQ^DVAb*_1_GBdG+%X*XRoA z>@LhrEg{*yMsT*#uE;{1)01zV)G`iKt51ZmfQY;!G}@N3+kA=_)q$qRzIbbx2(`Ah ze8(-v<-KyTOygfw0x)A#*PofbYJJfnHkUI0OWqGmzGIl%RQ8er!~^&Vm~ALYsGwrL z`nh+;B3mo%_<|t1Sb`!jUBiOGb?3M_nG#4GU^I#^n4*mY5lkL+OFQ;70}&Qy!1#;E zyqa zj9mg-R4Y}m` zMkC(E0+(Sk7rWZoX6jqfd)P=XO43l(9Ct}yLO5r5c2mZp9-;?26~0E;T)S!ac2&dU z2pNrRb(Xe2@RyUgrc|!U`T~ zELQ@1IwgH%Aikdw9k)Q`J5toG{GDQ`!ciuNY!U4UNp&jHQKdA{z2^q%eO{)YREmrFm zUO~@}HKXb?VCF9a;Ue=j*QOxO_ICTFU)7*P8z{#7@Wv1NUl=+E{>2ZR&n8+MasH~M z^;Z^?=6#i?lKYw!U9832O{^=0$~;C+Hd)m|>;9Gw=;!9xRJybk3*-%2CpDD9KbC(U+b#b* zwiIz}gnX>DdAl~oQa!Be20qU!x^*S>an*B(jX}p%-dehs#eFTnc2G9P*N3eMas?-&jxAEv3Bt=ez>lt)Xoa9?@2ZIfux-G{| z2>J;Ad%)KXhl-t)UmP%e%iZI9Ti5daf%U}o`-D7ry@(H zTJ;!s_V^oTJN4~w!eYQ3YLmlahD-tcjI3zpGWBzDCt@t986=RL9VlB($U=61Pb-@^ zz?19?R!Cchvyl53J)xTG7Zdk?EC9`>i? zpsad{B_;rs)*VFUzqe^Fn6c>)4vY7m(iM~_ts9dIf0w^gX7J@bl0J8#Cp?BJ8^@Le zy&F>+kpy04QIRT=iROtydMOGx4u{eyX0&h_Vh^YP2TSzm`*4UIV`D5e>zS=_ad9Mg zEnb*>?5N_{C(ZFb0`{7lCt=%`L(UWOOWN9Ps|gJ5uPH#ra_Q15%H=Igp)Z(1lX@TQ z`W8}x*hp~RuR;mh<-s5T%!u3tZroba44&X0T%hTWSK4_l%~?|1vSzNtcWw#KT>vZy z5$g|xmqT7VANaz^9Blsk7WeN9nUXeGL15z2e+*36*KYS)J()!4%?2Dd`=6#vYMq$0{ennDK!pieZ4%44F7j^7L8{;`B za%ZZ`6eqF|InNkuf`Y4yoXUQQ1yL!Yq;thTDS|l8R|J=#g2nrn8(I{Ty`5w7+FqU& zsUf+2ng;Vp4?TIdvr#MSa#gQIKrY3?T2Hr@h+qF!k!yCw;ig&nOAl;k?zHDb-5o4W zeEreP(<`nc7I z>*w!EOntjM#I1GZ$tp-UV0AAK+~^qR5N;|sRRHJ$i|v0UqMw1Kj+2{rNgUq93&hk| zFUJ(bB7N4sypC{=gI-ugu} zvF*x`$va88_j#@=wl1GnuMZqQD{5QSqbB2dV3GHARou*XaIo=`?8x9kGwEVvE=G)k zyx^yJwIH_@_J=7SUu-7I#j&FxqJKnJNgwwj|w1Ee;$46_i- zS2O<~{sod(nmq7_f052Kg_v|I3t!vxFF0kF+Ln!}0_YJG^Q0Dn`{ADhimEV=*`TFU zz)0)znMD3nws1Ry+~SDnP~yT&BLBn}Ap)f!1S1HBmx1wguh=DNC>*JHWBcX0zPxXJE0vv~tE=9rR|#5Axmnlo6Q8bpwS*9vyA z2}D=q3e38qjikng73zH*_w&lpa_@x}AvG3TB&H7I1R+tkdRs;$HsZ{&z7te)EMZR{ zBCK=NRrM?b-s62C@gP8&S9d!Ub*m?IVF2?+$pg3enrnEwO6ao_I9L(!9O$h*Hp-YQa3V{M*8exN6~_?jwOfXhlCHPfz_Q-3jsC)b{| zV*#h|K$AsUj+|xV7Cdo@LPts47HZcphARQf@;wc8?GUJ*4p|Fj1W$V1-g&$i*4u## zf+1f>;;r<~2NuYunhpCLW9Mv?e`7mFQ1oBfZMlA8sx=6lovrdyz-J-c%}d;HdZOuiQcO{L~&TT@7rna=)7ZDwb{RNLQ ziXoHb$FPt}clq#mv^>k#!_HPh@Cg5LvCdFmB6n={S5^U?t@%?`E6o%TletZ+^T{&N zG_(kMeG5xrO4M^X*UPxC1d zNRbY8vS|lEBEer@#7y|Q1tjG?U!G%u3O1vM5=mEhN3c7;BfrFDsHii-Y>>FSj6&^I zTvex)+bm3gI^qM1(lf=a5_Wcd<|x@VV(w~rmRb3x69bO&MnUYgHPf@(YE`@SjK|## zwTo!xogu6=XZdcrfMfxV#hAS#WA16SjWtBe4Yk)5YvZTx_r|VbKA?TOgoRvTnX+h) za9&x5qu0e292>bvNXk*;9P@n+KyzD77*iemeN0H|H6+~X{J^>PI}-et9OXu-v*Z32 znN8A1sL?$@ii$lEqe5hk4dUcAUpTLN;nDm3HN_E&U7{>)v>jmW<_^=N!dHboEgcpE z!i;r#F~n`)YoxzydtGkizd(wg0Pir=-NI{g(m3x2@6ZAZOWa?xWWKJ7sWy1F?Z3<= zB~L`mnH6pTVcFa*7+MbzvDDy{Hfxs|4CIn0cOJ`ToPZy+%RHzK6|m8te-}`yqIvV! z^$gGiTXS}?2!UDA>!MByC&h$)XfEli(w~mKEu}B5*}dIebfMND6Cs<&w5apsEz07U8MJ`H) z&Vw4ZA80-Qjp>gcV3;I@43nhS+jgey#y9O%WZHU&HH(KzWBgW0piVaL175C{ylhO`_lgV4dnrNL z3O4R6e__ZiH<&`9@2xq$%okKHk-zaa?UWn?;N$Z3Ap*+JD=;YgmIg>EFkF+9vc8Ve zkoKD%9Vfn+v>UXPr1^5a7pOHvb}UzCz>bt3S-Tmi2!q;$*=;;6@jkjJh}5yo7ogrL zdUG^83ZFw9D_FYTEj)#zT*-G#^3GSKzit`Y0XSywO_FhA%_k_4v9&kk?X@L=)^^Di zYx_JoX0W$Igr4i6p674v9ukr;tz(`Ov-<{#I!Li0Eq7zz#o25z!ioEg4#vDahQ zy*H5`Ys=xV>jyiJEp{@1Z44B#awadhA~qS`$A(*6Dgh=E@da znyBI!zm^^SjQ)STn-|S7T7&=zvD8mftb-{+K`V4 zlBLq!zuGsPMDNIzEbK^9eyGOqo59R!lu&j^Y{V~H`)Rci5Jes{(rVFHKiD3rU(iyo zPfgg&FkDT({<`Vg1 zwD@36XS5)|RN~yu7+P^zXtHMBU0X-II9Op#sZr6d!@aaQQdnC;yN_`?oqOJt_!P(2 zo66DCB!a2#zaM}f<(rKvuX-;v#inCW3$Y!nW^Ce{L&yb#ygz=Q+@b@7+2CZeF6g;h z0?~*@+{qZDfaZO^T&>yrz2|Qz#cxSQjuNuSz)`gEC-||GsC#m1^iIjLCyDGr7+=!w zNMu5U4Yj8!O3Lon6p|bDdDS@)YB1r_oci1@aw5_mT{kXnrh0Z7APPV$$q_ZHKD8pb zoI*IL>XetsFa0PNkJN5ucV-@E-vldU96z0E6#jletEo-31*I%M+w0)zU#E^mFn<97mBdsU8+a3~oKGvmQl(OXo5016p1 z2NArRIX#?vwtr&u=5v|i!$2N^?fm@i*tCfErIp9Q9O`88X!?NZVYU;^vK*vc=6%78 z`6D{|AJ78g(po^9Uj-L10Ma6hIx~D)rHfkCqQ|XP@0!F9D;U;0E!+eT4aTIf_7ha` zIg$yrBs!PLB=PRv>>CquA4V~y-l^3sjk7gv7X_u1zb#DpcgDgdYFR)g*6?X@gt=VC zLO67`A0}tBAYf&vwf*ON%oY#48;IRU=@*zp3%-(~Z=2x=FGs||Y1he{)|ODtnhP1V z1F6J6hmdLQBP1B~^V1L2;hh4hr6%E>aN7eaU9F0ZB#VrKrp(5NWydB3&`(X`+j;;E z1g4PoyVK8iw%?hxJ-Za&ZZX9gcH?S`Ztv^UD-WYAo6nBD zP!diJ2LCH02IM-9Hu^qnJj|cSmi|RhHph zIkqR%u!Sh@TON6+1D2OF7N-C3hSreWqg2EYc!?#ANrs zcuA_vWjqd1RezXSQ(d|X#w!Wl+1O0hcDNaA4WTJqgt~o@S!LZ^R(fhvZDl|jUf$^k znG5FjpWUJ`9JuC7IeWE{hxwlg;@jg3vyX!*%?dZS{`GOw!7(Q&?j3r}QvXlI!=`<+ zkq8LQ=_^t$V`pa0u9s+Us21*epEUIUF){fVBqptYB_{d3U|X2~fJ}Zg=oCCSA`eqG ztdN;I`Z_avYpSUJI}7cy;fNdC#md7k{;Dcq^Y4F^cVaTa5p)$qu`zlB8epLVB63Bm zX6`p~GFo*E^shlXST9{KH81PXRYy-orwrd~s9`Z$aOxF#ySV&UwE^vQ6kcFnuXDB% z_m|8tK`!5t{7#<3AJmlwk|XA)jZ6t%D*(d(h#O`}EMnhb%B^LJch-)T)YRYbIfD#e zQ*kVUCHvg7>u77U&=6NCf91l6N#dLV#bFp~e=5<^*4+LKpJin8gjZ<`)U_=l9i@ zegoScfye+`@{WPTvDUpI9G^iNKspYMNA-Vhd0t9<4&}(B#Z~~YWu0fH)Q9$#2eeO|qLA*QIhpFZVC>>ETBvZ{{J__n87)G~`dAV-M%N<&$&XCbel#(f4%qnE#U4 z_egW(x9*L-#aUo}{4}cr9K}veL!L`qZ{AqM`wFHo7f9FtyNJX#(6^dk zl14*XWnet#B;2#m;H!@?(TB>!w?Or=zT%4}w#+f!ir+7irmf=AK-MD7wWf2n>jfk9 zJuR8Ns8!E%rNf*aHFM`}Pg9k9v(j?Nezy3ka^S|i`AY>(WE6-Qz>1j0aId^^7-XKAHT1NT6-S&Bg+doe6nZ0%Ou9T z%G{O~JVaRb5;;?LeiN_o47cU7sqYFE3{OG{tr*A6-5qdDnrLK^?lm^_l$93dL803+B6le-`?MuEbQU9(*Cu8Y z(!$fK6PuHgDM7It&p>t1KdQ%r+ToSNEy6<3A*ZA-mUNn=7XU-l4b&Y&TCcs!kVb+f z+nR78q-h7xh|5=dS|Cb=DQOWISjR}mZ&oqPZa4_L9Pv^S{gi_bRF{`r(nVmJE0BGx zRwH#c>orDqUpaoA7@vL8NiD{li#>u%rHb{YN*Xsu5~>V(vR;X23OkDH{%oxwH}y3` z6)ukAPGj; zvSUMSU0gf+yXT)M*g0}pH8FZB^x3On`=ON-*p6Zm$<8C>Xxz#buKv7}C8uiF*B;e52kG0(TPLAE zv0fbTfn#T*v-eBL%7O0=J<&lLon<|viksR*rkY_{p#`#nY;3Y@(M=CCMTVytb`n56 z@q1r6iBOy+xz(^vP#gQYE4E!BoC@YT<;owbEk{|+F)y>4kMyc@gNfK#m_%BUQ z%q6c3Qb3+|m&@M;3>MbUv4z8a;QRO%OSs(YgUF129zP}0kPj}1Gdz^ZBCy@%>>6*^ z=!BpIeWaPuz6hp}FCm;3u@W8Y5MQ9YAdNdcS#>V!iOoa>B=YbZD^GhzxOc)<4NE_l`c?a zl1cSH)JWjxPk!&W;=hpryBS!wV%3-_+92`KQ5N&QDav@SJB!S7c;k*TlqKLpKSoDH z5K2y}dh~W2dr%cRvz*hOWLgy})+Hs|Eipy#=okQhkTyq6p)!ZXrtI)}3AqGH1yp+a z@u^;m-FwPU+Y4=>3)#e~UH|&}qHa{d7JXE*@H1;RMvSw^w=MP}9C51}u^#k@iMwS3 zA`h-yGvV%M7wkYAB|zUxNm(92g)Z&**AfTZI->o;Ww{gYvqPEbl59?B9r7)#Wym32 zcC^h+%|{Ukdr2z$61BPYW2?TO+YitLc-U_b_OKR2?t;q+Ap^d2$@8Xq$2-$7Y|fZc zsbPJG#qU~8hB2k-zRp!W!}0K@&hO7qOpD;CGZ;AVQ7n3SH(txxyN+c9X`u= zPrqK`cQCa*k=nTx6f#|W_4o%?I?C<0_#JeP**i~t@f?Z!RO)u!N%vpDl#g3Y)~;>1 zmw(#ISBZ3G%Gk>G%F1z5L0NjHMBCR?12`5G;8+GgZQgjEG=NDr|9z18w;jzsDjPhY z{ublop9zm#X$>6X_do+oZmP($(?!= zJN9ln2^u&H9gg%=ctDyz#csJ9(

-)xl5xD1TrXiFsjWfM#W@Gyqq0c1qo8E8BE* zE(2E%fT>sM^J=~(h76_fpWcV+`msD7)4&pAF44&ZHvfF`y=)6PjTp!oMR%usAFdJy z3Hp%FYMg+c9S}BUMcZfU3O4cBW>8lM^tB!A!v)xkHP_QqZweQyE7FHm0e)!)M3vL) zzeJUOAgb)9o!{}K!!$g)@)vw!Ch-~y>?gCSSOV&nSHUq(HP5@U;Xhm*OgdR{;D$|= z90NSLgmU-_t~^SGLamlsc@GbAh)!1d?c^3Oj!(H49;Y{anXyFhq6@D>LuW0kZv#g~ z+!W)q3r&?v3K#aYL4P;zt{+yO8F9VEz+%=O&!N8~&px)3_sY6`q%Y3LGC@!YpsYLT zPWQZRwiqFe{%bBJ^#RDGEdR`Q-8Vlkm2^vF_L9gCz<{m3WdTgNBcN@ z-aUt6h`c!bo7_@u#ot9W330wzRIZimP=_K>{T))`^6(R*CK__tv!R>6PCZFUSi~`z zzlUc&L`q6X=sl2G8f`-LN-no8KVZFul}e4BXyrRU2UL7qGahWcevQE8L0zRa-J=m? zRVbgB`XS#IUiU1vw9F?LdyyV6FvI@;(f0`hzR%^1#-L5#CsQfcd{_N0zd!VrzTFmF zg_rO9@7WBn>>D*SiBQUVu-Ht`e@QysLnJ=O+%fQMyps|d?`@(ff}Yb;B(|vuvXOUD zq;jW=MC)_wpd!L(S@5?(x0T(E3gf(*@BCEmO&Wjdvw(U52s8=NBRaK&xsW-;<)k?y z?SL*8LHFZm-s4Xk3>P+Ex?%f&>>tZBl*G*rhfT>v^-?G?lJokNJg6{gn`CO6O>>K4 z{wi0Fy8tDwOREbsNBe>y2y3)hfH{f9s`y~>KO`6YXE*)&uw+keJ2Zhy>g(A7vj^l> zfBtIJoEGtRNRSKSW*f;Wz%C;~If@VRP$AK6Li(?TAs_ESDe|YhyRn_mA~otTAD(ZB z3qf&_j)}Oy?%bIXcJA>&hX}hvL*sGoLiJM1NV{&TSYn}y#VF&Gv-wL}-g%Bu68qP#oF7grZ-)1fqOaxqLa@z;)qSr1^nH?xe%3>3q}KlZa=rke&Ddt%E6S2y9mJ36zBA;GVMTv~B{s*ba1UHOB&xB1 ztF==M<2_)GwygZ_gTHZAg98-O+yO20^%+XFAqWWj$G2%51pEnep*biaJSHPF!ov{L z#oN3p`L&lr%#n9+x|ro^HiTVU!_S|zC?SiY2RKz1>m#zEJ!yGw(^}%K9EK~4AJSZz zf3BAi(%PYXVGdm;J#bnw+8x~J%E_dLeFR-n@HA_%!5V3glNG`r+&Cil*>KoNfat1SK6$$9Sqg4nKjb<;{S|_2sGNT2s$`$|Kk}PX}^!Y`0 zq}bd?(d3JXG45Fzrv6_FhR zwBzf^J~tTl5J<`_TQr{lp;&gl(Kck&Tjx4%X^)onO@F9tU?<^z`)JTCQ9P%vV_fuA zm61%ioO6NZSxHwZ)~mu&mI3sc=Em#y0l(*td+BOh)s|j;xK*L9>fHvIIY(w|@{9Gm z_gI9OV2?T{w#P#qL{_k(I=oW`P+%4n%l|Zsn!l?sLbJb{Mbw6F1@-Lhpk5LbKmxZ0 zG+PCF__9CN9AYRq(y_A^$8w~_qz<%>KL%~YTv`f%ZrKCwd!XtZY1_RNm%dB$-bLK+ zMHl~H=N+$W==Uaq|F84Tw*UKi=YL{XZqKu-5E03~2h-25=*H<^5Ss`>_KKy6fiF6Hi!?0ODB_{DsS*; za|X9%hL^@4%^6WHtA`C1JseFgI|QteYQn-B_MwG(iEcWMpFY0r9Z_@;ZX9%iB05$5 zL2{#LBcSr5wp5;_T1*W${DI(}qW{ge;J}>2p81n+aT9F@d`nBLBunkVf4VlnpcCul zR{mmWvu)$#TKYuG2H+& z=_dUcOBiAtYH1(@zy@=n?Y#Jxv+XlAE-xHDTSiYz1W3(J6pN59S@Ji^-(~&sXd17Q z1amfB#KaK)3`Vn5y@1Gq~{%74JPZw^|9N}`BkC&!bzlYUVyeTWPX z>y_1gXv@!H`C37fb6ZO4vZyxM5mZwdZ$<-{Y0Dhz;5?IN#yDV6#+zpBiydw?(SrVFj>QiDE!$eK+v&4Hnil9#gtKC z<|Rk6Gac+})pM&qj_qN)!*dQ*xFBXboza~$vG|#jIX&$rndr`QdR99nqLQ3?| zKirFcO$mHiDt<LjZ=$TLp8T#~GXu*|8DhG6s9L9sxUR3eCpAyn*aleu13g9}DZwWr9XQE>NX2a2s+ ztoVt#qkSr5#bu#2g1cfXXa<{J4K!f>00pOPyyW{ih{(&>N>gMee~Hj_=FNHMmG#Ih zuJc#L2L~Mfp^#L-Dj)~-E~}PQI#bnF)I1x|t{C0faV-CS2=s`yZSTv5Ie0w_2w=gD zdvj-z8kYXXjBdlfX&9lh^`QCF?7~yGbqiuo1RIpvZjWww4$WLnJdU0SXT*U`^L+J6 z`bOmoB2kFG*=(s@1(9da6H7GuGY&8jRC7xCVLCpcC*IT^P<>Qp*H(-Kj~%Ezx#FMx z%miDqr8mHnH#5PKp%8R%hEZD5$(@W)a56E^M)}ZhK2*|Y#CI`~ZsxI5H-l;ypLxK= zuQ77Lucd9s#%+JlF#QYIfb@dTS&j>+eWy1h#yVcke#wi{M`}<#!sTdmwt8PiqKGna zH1v|b=tAX{uYX;ay}&5&YGO54o6MWnNp#z@YR~=7|86-#-N(6BpXXWpI@P z(;rtkZ24K~{rim%;I_#id05e+e&HN;Hw&Xk`_2rg$Lf}E_q`AKGrtVRY}$ks^{mIh z^YW+81AIg56xT1b+Y(UnzGRMY~#z1vd zHVZp4p)u}-NPM^d-@?vp=P^e(m%vX{ch+7SJ%^Nk>!HEfPWKTQ6+~|X_hX7QA~ad0 zAKkppT$pR|dH{h+?LF^ln@>H#K8p;Hj!A1M5zLd4Ds$>fxFZ7-- zuzIKXdN(#;^qR2MHO4snecupZbREhxhCR!oO(@2|sX`pr+o2z$XDMeUoCBIpI`WcY z;-h|PIdEq06#4W0^`$DCj#b!%DzjEyN_4!wBr*ecA3#OWFN*sOLWSaMyzgFNM%%^D zelOu?yDD4=ZD>L6D(yI9cF!e}yEPWQ-SvPuMk0D%w@<@?A7zBPEi4b*Q)J|yP2Jx~ zR{|1WaEhiVj4RRKW#zINTAur_Xl_0p{~IQAmvT_=CFkou8o}NM5%HWti>~EA>D=m5 z@h$wEW@N=qLfb0WSmO%#iq6cxoF{FdJ4f~h-gdsC;rI#j#sVclDR9+hErbWDY}t%b z9`CDd>ReFom6gtOMA&W2wgpP1-ljU(aMgG{uEqt$M#w^^RI0>l)g$8*nH&J}1K?b? zkzd1%(3e1C*8FHcXX^bQWuHp=oUI*sl6)Rg;ko?AoZdE$ z=brPOzCu;kL$hcmlp>g*lwGED@vp`Ln&>E`(R^Io3(&1YDs(hR!I4mQ+Et|+VO3w1Wk!Kw1M%&9PN`4 zm=sf1J9X7?Hr7oxrbu!(2oXi|#TW5EO7hsB?eX*Gkp0cJs^X0>lJZ zRgzm-O0k92{@fy64Kv$QxDVTExJJ&Jjk0*%M{u``PFmHF7m&I8g~SGsk8#Hm8Q?qZ#n5(aleuH0b48&|>s*nM)kC zd!o-!Ht_8eL4`F#q45}uky0LXS+QnTR3C%=)isi=bSo*pSxkpjk7p24HD$%A2;sr* z<3TJSz7Csxp(Y#^c_a4q1X8Z+{=LQV+4~rY!?`h%Y)8I!C0v#h^J~Byj54V>h)K_@*$SWB0AESpb^fJFyg<$%X6Al@uJ271c7LGOqrvx{Ek4YZ@; zUgm20Qb*oaxP3CCT&$|$PYq_hk>73qPZ35r@UY6)e~6e!=A>LLv^45wuH-|DsRakb zYDqh~ob!6k3t1IW|?nVZ}z~7m_P674&6g z=iJ|ZN0@)Nu+-`BeM_Yh`^kvvd+$3H0T^Q`J@i1w)@4~!I2Br;=mJE=u?v%tUG#vV zGGYkzJQsUHoZDqi~-Xzm+f(`PDJ zGXqLVx}%q9=FJh&)hM_8I*XY4X!UY_T5IBEP#{X>6S3U6;G)O;qW!SI`(%v8es@v6 z47_P#N7+H@(b5hb`S1(i=7=H9+&4Gp!y3KX$DiZwhP*2yRMm;HqLH8Uk3E5_7cCxk zG@wK}0*Id4Zgf3=Vs@a+7Yrn(>Wdv0np@@vfXWLlxnQ_WoC0uv*z34yFbhnPJ(YXI zcDTnzaXue)QUEua>=*c1DvEQ)Zgsf?qC~W&zM8aqA4vZ$(ag&zEt|e8;WGAd_Q*!} zn~l@@UcEQx%|L(_m{!|?X=PT)eK-C;U$*kA-K==uzbzX7U%VxL`>)GI9@qab{;wb3 duPtwE{l;^x&HeoL0>)&es-$r>>&pG7{|A2i7UKW_ literal 0 HcmV?d00001 From d04e2f8c23cdb9761601c0b5d0cfab6247ccf3ea Mon Sep 17 00:00:00 2001 From: Khalitova Angelina Date: Mon, 18 Dec 2023 10:39:35 +0400 Subject: [PATCH 2/2] rep --- tasks/khalitova-am/lab_5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/khalitova-am/lab_5/README.md b/tasks/khalitova-am/lab_5/README.md index e66fdb6..d8bf936 100644 --- a/tasks/khalitova-am/lab_5/README.md +++ b/tasks/khalitova-am/lab_5/README.md @@ -186,6 +186,6 @@ ## Результаты работы приложения -![](shot1.png) +![](shot1.PNG) По результатам работы: для матриц небольших размеров большое количество потоков не ускоряет (а в некоторых случаях замедляет) работу алгоритма, за счет излишнего переключения процессора. Для больших матриц увеличение количества потоков увеличивает скорость работы алгоритма. В сравнении с однопоточным алгоритмом, работа параллельного в несколько раз быстрее. \ No newline at end of file