From a6c7828fbe00b909698073dfd35473986f43574b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Mon, 5 Feb 2024 12:35:22 +0100 Subject: [PATCH] Init Repo --- .gitignore | 553 ++++++++++++++++++++++++++++++++++++++++++ CodeMaid.config | 337 +++++++++++++++++++++++++ Directory.Build.props | 53 ++++ LICENSE.txt | 21 ++ README.md | 37 +++ nuget.config | 7 + package-icon.png | Bin 0 -> 13820 bytes 7 files changed, 1008 insertions(+) create mode 100644 .gitignore create mode 100644 CodeMaid.config create mode 100644 Directory.Build.props create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 nuget.config create mode 100644 package-icon.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0443cdf --- /dev/null +++ b/.gitignore @@ -0,0 +1,553 @@ +### ASPNETCore ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.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 + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# 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 +# TODO: 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 +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable 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 + +# 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 +node_modules/ +orleans.codegen.cs + +# 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 + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# 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/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/ + +### DotnetCore ### +# .NET Core build folders +bin/ +obj/ + +# Common node modules locations +/node_modules +/wwwroot/node_modules + +### Linux ### + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# 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 + +### macOS Patch ### +# iCloud generated files +*.icloud + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +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 + +### VisualStudio ### +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser + +# User-specific files (MonoDevelop/Xamarin Studio) + +# Mono auto generated files +mono_crash.* + +# Build results +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +# Uncomment if you have tasks that create the project's static files in wwwroot + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results + +# NUnit +nunit-*.xml + +# Build Results of an ATL Project + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_h.h +*.iobj +*.ipdb +*_wpftmp.csproj +*.tlog + +# Visual Studio Trace Files +*.e2e + +# 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 + +# Publish Web Output +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted + +# 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 + +# NuGet Packages +# 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 + +# Windows Store app package directories and files +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others + +# 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) + +# RIA/Silverlight projects + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.ndf + +# Business Intelligence projects +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) + +# 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/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# 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 + +# VS Code files for those working on multiple tools +*.code-workspace diff --git a/CodeMaid.config b/CodeMaid.config new file mode 100644 index 0000000..02255f6 --- /dev/null +++ b/CodeMaid.config @@ -0,0 +1,337 @@ + + + + +
+ + + + + + False + + + True + + + .*\.Designer\.cs||.*\.resx||packages.config||.*\.min\.js||.*\.min\.css + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + False + + + True + + + False + + + True + + + True + + + True + + + False + + + False + + + True + + + True + + + False + + + False + + + True + + + True + + + True + + + False + + + True + + + False + + + True + + + True + + + True + + + False + + + False + + + True + + + False + + + True + + + False + + + False + + + False + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + False + + + True + + + True + + + 0 + + + True + + + True + + + True + + + True + + + True + + + True + + + False + + + + + + + False + + + False + + + True + + + 100 + + + False + + + False + + + False + + + False + + + False + + + False + + + 0 + + + False + + + False + + + False + + + + \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..ef9df87 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,53 @@ + + + {semvertag:main}{!:-dev} + + true + false + true + false + + git + https://github.com/AndreasAmMueller/AMWD.Protocols.Modbus.git + true + + true + true + snupkg + false + + package-icon.png + README.md + https://wiki.am-wd.de/libs/modbus + + Modbus Protocol for .NET + AM.WD + Andreas Müller + © {copyright:2018-} AM.WD + MIT + + + + true + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..3daebdd --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) Andreas Müller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b45399 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# Modbus Protocol for .NET + +Here you can find a basic implementation of the Modbus protocol. + +## Package Overview + +The project is divided into three parts. + +To be mentioned at the beginning: +Only the clients are build very modular to fit any requirement reached on the first implementation back in 2018 ([see here](https://github.com/andreasAmMueller/Modbus)). +The server implementations will only cover their defaults! + + + +### Common + +Here you'll find all the common interfaces and base implementations for Modbus. + +For example the default protocol versions: `TCP`, `RTU` and `ASCII`. + + + +### Serial + +Here you'll find all the serial protocol implementations. + + + +### TCP + +Here you'll find all the TCP protocol implementations. + + + +--- + +Published under [MIT License](LICENSE.txt) (see [**tl;dr**Legal](https://www.tldrlegal.com/license/mit-license)) diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..e219de2 --- /dev/null +++ b/nuget.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/package-icon.png b/package-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2f51991c7376e8f9f4d0056af4488e5d9c19bacc GIT binary patch literal 13820 zcmaib1zcOrwr_ANR@~j)rD%cTw763=K?4NW0>#~F@#5}<;85HP6nB^6PLaO!`_4V* z-gnM@@Au12_Ut8l)_={cStE&frzVeyPKpiy05BC5WHn&FgMThmWY~A5UR5>#fY@lG zrRS=rsv>IP=)h@a>1b}n>FMAEqXPh9lAcax7Is#y)aF(o8?ZR-X=^7fwT-1Xt*(G7 zx2ltjm9>q6H^fTQTTRQt+s;D7l2%dzUCdJyroh3<)r{KH!5-`)>M2h9mtIlW{h!BN zwA6pGxY~)+>Z!h?mT`nwQ44SiaB|a1pi_%MEPh3=1vzjer3xmZAKoLp@j!PI|rnwdMg zxr)=$!syihP;TXE^DpgSmw%WK1A^-hg^P!io9n-`yV?N%7xq7te`9yDc64=gv37L& zrvd-t75^mvn;;Cn|19EZ=JcPKRaO7r><$k9!weT!Id>Qk{{Z!W)ak!o;G*T_WW}Xn z<>KfDv9OYJw*tG;{e{FITtwg5cv{)($=Wzrfn8weiqrCPbN^pd{r`)(S$WC zD{)$$zl8o^C#vXR2C~w%v2?Zmm$rWqRII?Df1~`VoxR&1_iBS}VD|9-OPk)mXyUX& zys(D#$LW9R)Blg8fBHi7ullJvTEeQw_m|YaNQyEt?;wsq8+#bdMMM5IwW6GiAdiTk zAO|n!-=@GECkm6b0eZ=rxx%=3xp{dwxP>@)xwW`OL}4ERVK#1F(SM-z7dNawSem(- z{r~v?v}$TGn1rgTsDh1)t0TnguSb73bxkYhze|4??QQ;Q2K9uwUkOp2iEriWSETD`*GHG`m%Ls$cMcnf5Rxv|xp(;;+rqFi)ul-% zRzL#O@ig*;2-pd?aV%Fb%rI0D!RqM2MPE?*?%giJ>bh-sNVxVUo{@?2&!HFfA!ENM`MAI~Q)tmU<%RHbt%j3XG>cR|^Zv&h5;s(LAya7HT|xk3^qN`5k<8a-MJpvKeQN#OyU&;v00}G= z{`XsOLyzIe4e+gFa~}f2EU8Wn))smD3fSZEnf(a?d#0!sI@!fu*q+4D_c!OZwTn9a zqQmeJGUt4FcRWry32&c-)|D0pc4>2(RM1#3dS%b~D50cK;&^2@l6ArLu)4U$m&W-j zxGWfm?;bNz9|^1*_7k(Z7V6@P*;`CLi{T!F16G**J6=@ui8`B_*j0KR^I`#i+)zhS z5uIVIYh+|xkgfl$iz^vBW=;xLXTj-<11!TCnR*zioFH;0`|Z066{xW1yM9)v=QnLWvWQv1WN`^lXTa&3;9u9yUEM7z$RpCDewerQ zkQpWxK4vkn^^bPxgL{XuZ0SKaOm6z)iaIhU4#2gr63Z^4c5@!I62r{b;vK(nW%>Nx zrLZ!3EE+wK*`D{g+)Bz64sF<1)j#a?3^>YI;Jp_iI>(=gXH@R9CP zXT6x9A(X-?ftcguZ_4)%j^qe$3n1^WOM#!kx!N~h=4ZxVlT5;^KY9kjwJxbsW7fri zTgl*Z??@2X2L`9#qiX@3=K(dyo~WL(Hobd-;gnyVXEvX!r+?-u{AV_Bd z(N82SPq;Sffgcb$5h>lxCx|B$az64etpw0=PgY^D`AcAlVLT#OaO#E&bI1Ko_UZuP zOH#3&`7(eCFnTr1@WR{@i0EbtMW5ca=@?luN9M3Z=AZ;#6PuV8u6wRa!U_bEno6!Q zK_mz83o!nsE7f&8AMCwMKfZ;$WR);e6<3a)BLP7GNY8bMF937bjbcE7NI?-?<(EFH z+MWcs8|Wh5JrzlGbfp-TsH6u=GvIlNMdn-v76&-%7*AW0pCxa4n0SuCgs}THY}D`7 zCoH`i5PHr_IGya)5O+@`A~SrjX$y#s=gOoHp6c->gEsdVqnABBN~_c0h0f&rCSueg zEh#7Ad2|&ce<7~oUthF#oGW(DigqSU zN*^~txcw3#NtCIqHCi|4&=pJ)O!)hkP98kt*RCb8eGV=zqQHdWj1MtBOw~W-JU%WG zTX7qdcMXu`aEq51>m zU6Xay#Q8IiP8v-HFGs(J7GsD{=I}YKu||M9s~&)X&u(v^2)siRtajQ)kj(hgA$E`3?>V zCsI=iC#ti!!xTgSz9ePzB17y-F4;GC)5aq@%Yi<5Uu<&-)0tTZio9E(Upm`vJJk=r zL7S9XXO9Q|&zKvetVl6-hwc~Nmv))z3*8po%b|BI@JjvC8aji-&Bq=H4uOOxs14j0 zJ#n7G;RvRz^PmfHRz%tdRCwJTAK$DJh_Bq~`dq!S^mwH$sI>Ui7Yq{$QR>iA$ft(^ z@Mcqt;lWH@4m`{8yCC%@A}Efhyl!*tK8TBBO-Qqt1Ehu8yG^+s{lC=+{EHmi>&mkXB<#$Uf|60xwO%~38%!dCmA9N8Je$Q7cWD6Y5hf{ zE=Hc#Q26ykkAv<0cUwvLnqIu6C^6hJ`JoN7VtMM8q(rPr0OAOra^yICIhU|4OlX6D z-OZGTRMwqX2*?wj6Lw|&@;4etD0MO)XjqrgLlpe3Y_WaT%qw(1oJb)T$uT!%&Gd*D z`-J@`Zn(Wbs9*>rv6xKcN6e7(m5c>6 ziR-+lqA4%Mw}cTaw2v<9L6Xpt>f@d46Q44Uc(Kc-)#et_*t_KoVkINJ&(7lvJQ?I^$anY zy?LnBlvOsTKiMblyKBvEQST*LR`QGeac$~Txppyb?o?-uWHj^MJKacLlgM`|^8U)W z#9pw$LgiaH`O4|qVzhciU5Xy|+^rSW{Z0{S!#hOh-uy5rG`QmcSTsgjFv5k9JWzZ8 zfZj_~x?LL1!3Dmct~06Hk?q4B{}SIrZf8*tx#QqsJ(oCfRE{L@hFj8Mo-heTlQy(d z3SW};Og(!3^YjqEqJ)&}`6Xg#*iY64`PqlzKtgbTWW4nXv3nt@w_gxt8)wXVe8NwI z(p4V#A$Q!(5GTyyuMi%1NLU5ekp-%ciX@78%Ph`wTA7k%!Cq~})8{9u zHBi?mV$+upZGF&F;M(>6FsfJ62|Mr3+2V-L2+2lM%tgAZrtOhvUH8#f{-&1ZStgLM z1I@^=z>YAaPst;ixiOrwF_N;#u93dCFPAM;p_f1VC?#*0YM|q76XRs%(C*0H??Y1r z3YK8J8D-A+>$>VIO0#o(dRX?M5ncQHYLlOdMPgm9Zvvr9*OKZ10MAhY@HhDObGPs1 z*CY z`goEj%uuaNazkVSTb)eRp71$F**RuMoh!G=b+e3m4&2r+s%(sw_(YEP*ontO=H_=bW?;qW=hvH7T%S@W%u@zt_De^`0#2L_K)U#jq(f(#yM9WpR7*|k+jew5-Ij$ z^tcsb@I58=2&mtB{ad*W#Y@iSZBBXxk~!zvs?5Qm+;(vJLi2+2K&ju4-oA2STY>Vm zPf-Q5xyqTd60iEFtR-`9u4;gfhWwGWiOgo$7jG8^_zFe67$NtiRRcwB>snBzz;|XI zY%dcgMR+*ZZL>b^(f}s$+ZDnX>kHgCpXq@fAZ_=vchj#FJtmd;Q6{+?G3@EsU6U}p>>^AsyRmqvR*j|BaWA7$?y|8uZvx!OVD>t_VC zN?<1Cj)H*u+it~6oUXx;1+?mG-3>eOXbPoG&+DRJ$B!lc@>4x>>$ClpzO9Y>xYULL z6T=-wc>_u^1~BV(0YrK~QiI}|ET5xi*kd!o+Nfu~@70{Ie<(3i9}rvIYHOo+1=}ru z6S7SjKxsjW@#zO|eml%dV?RJpOY*}%Q87Z~y`~ldo|DK^>xepPv-vj*MRsXorB_s^ zkO}8QINP05XjlJzYYgyLMm_A=5?sX-~ISg!Apj7IP}I&5(QI-jy6}?U?64ai*@Z zbW-3rN%Q9P`w`)tG?r~=MVnVIw5~i)oK)9oC%&L5*IT%Te7NZxV|p#l63b3<3oo$% zGL~DjS7eGeoAEgsIOwTp56YM;ybAGD8X7xM^c`_=dL6qZEB@^;P)I}x6KBQB+bv}^ zcAsM%e_go

s=tG}{IUN9o{f7#XCM1nqESVk#3K+~-k?vMWU1Etlio9)_d1^Y7y~ zSdMVk=4-&gMp*+Ux=Z02Pz57U&jgB9LB;EF(X<_@61t)pUh*Vq$*QcvI%l)=cryl?v~cKZyyR0i%VH zCoxe{&mKax6Bd=9i}2E&eO-xy*DP9(wy@QRPzuITK7(x7LUDe``LE24zV%_k0)BOf z^uE`A&u1YUVztUSUUg(@Qx?MlC+l&8Tdq^1cVPY$--5uUDBz0D8$&oB9gN%D<-`0t z5pS!Eu&jNV%2$X6%nmn(6S;_~-tCF1DA3P%Yzlsk4@<0q2WEFr!hM}sju+#;H^8yp z7(7gA(@CbP3odvWzT-2^3h#lE4($N(wk8r+!MWPKOw8q*OQG@jVP?V+l>)9R{Umz# z6~)!&oMEtAh?PhA$tBUrL7i(EgCQuBVOiOIoOA*Z@qHbI^NY(7cqwAMI z=W2<>)Z9vJox&S#&;0Iqe8vkg8JX5oumRAzdEGbe`1=IK_)w$=D z_|6g!Ue>t@J-6gTX01d{a<^KuVRm(-`1|ABywMv;wr{`1Gx`hsEQ(ZoflB+fKyPO; zlZN&Zvo?|;C9GC6nxZ+p>vu>a#Ebq^X})l?Kni0Vl|w=Ui$O?a(tXkdZ;xcl zXk`BuDGjwsxwMYU2x$J^Ob7jpp=qVC5QUm)?LjwXRxZ^R)PH*j!AMyx9$H>m>jmA8 znQw+s?Ofd~EaMVWY3k2{lXk(3{0>5K(41w$%@0uWN-nP+-6rF*oO|u(dK+E=xuojprk)3~^1E z=|*@=$z;JcDXp_ ztdnM%t{sAbg&<_s*HcduTGC-|E#G>&oAAuL$p>rj6)s+Ue!2eAwW?}~m&(YK?CKkv=@wu1!<1-tuLn-fm8RmdK*@o!6EZ{E6QE=O5an(y{t4ns89 z%)B9&EqefGrNjus(oVC>Q`l=%(qw$g-G!dd9qYDo)1Z~k7{#8gXF#*|PSq=?^48Bg zDVM?pzpObg$cJSvh~Wtt*g1I9+?J4t-e0N==z1YeC<~yq50W<1&`h5Ze~n8@;cVH` zsSib`*Z#i2&(XUWDD*ik2DjS9$(}1wiF(3}_}Oqa+-}P|p)xY;75o-TCpa-L^ZiQy zTE?o?L;>bw`+@OzH8@{!Sd8xUrRDP`>4?|rXL6$__3^9m4XimtcZ}w_`3R=)!KW%l z(Jk=qTecOR&gGcI+HY5$%jnv|CvT|%LLp6X?{McV6!!PKQV6E+)aCM~H^dwQ29Q_H z(-C|FT(JlEEwKA0D2O)zskKh08}`JTC6n}Tyg-}fKMEAbC%KP){U)$qhlP$+ z<=Tx;k@vQeBPnXBEXL&7prNIdY#HdpOz*%CiBy)X%raMAISdz#9W(oQNL1%w$V;K0P>l3%Y36#bIZMB5d)n29$rrw%Od<1<9tN*jN+vaMk0f)ZmS(YQ zc{^J*FSW@#)#utuN4M`!+6GL>E!~3?&EB!Lwe+(+Rr5}=OI?&KcQvmrd|V?^pd324 zDa`PZIo)vEM1JS)s$JciVDk9@aT87u?!Y)oxr=O4Ne7d^j&*);w))gX&Uw!O!%inwYaMN{3!-DCPu3*9OuCJ|eLc2k_Eu)J!3yR0!L zO9{y=IC`X`#TI`}#f>Tq=X}IXj8&-a4VZZO!yqz|D3z{{evxaf(Sao-aXG?YdULQ0 zsR2{u6jA(Je^x>RI6$H5N zl-s5SvPZ;fXQ=(jSNn%)zDnziU_REEqdN{Xv#(Nm=S;|1%*mM~+v;g~=}ifGeivp~ z93nRUq8>LD{yM*k`%TTRKiPVUooXYvvU5z76(64OSEdAbK? zud$|RGQ`N7B%Z?nVM1}+Wc_iEp` za_9P4w}gC(&$_DHSpeS-=3V4=ifLtr0XplP}C-FmF@2Rcy^R?cXpev^IHwV zU8atMtBr+|W*zLVr_w`s#L{DXh~#4#IaDvbD@C3~XqFsTik?DNig3687B0pycMfZ= zw#|Xu-cm|-PEPz8Gsl7m;7 z6h4|S(6ubELFYN3UOH7WNFBru770^X@8HMPQK{nuObDalP7$i&{qDomb_$I9CSI?j zMJJ9m=7msSz}>gn;|~hDtX_nRI4Tm@wB~r%6Ad*OWn%m+H0U@M5tgn<`pT{RgR_Hb z)h2>Rwh@&V%2>=rYXC1AP;W`~cF)CWJS$^!53lPZe)YD?xHVk3FRB_(%mFO$(Zp@Q zMi`r0gQ^#&+pTg62DW%cM%p|n4@pNQAI-deO`oCo(hs%ub0Ws+kMvP?0+94r9-!iL z2$!T!EdE7iS`=S>)$&|FWdvd^5Ru`?f?WhIm2Z24Ju9A|lg-R^X(M!0Q}4R)j1f+p z-mZJ!CI>HLbL)&&p`ETrO$ss<&d|;h&vcR3RNSzw^Dd-4LFrD{@7KMs{9{fgB}Ge`JDei&3wYWvzwGsF#t zch9^~tFppALfjpcnA#Oiwzn*~OW?6Bf%e#QWU)m0895lzrr0hhuqA! z-NoO1jl-I|iId5Hs?euh7e`h25WoRjxR#%%LWgDG8C?@c*7CJ_Tr-eH54HZRlc(sp ze0%h^bmnOTUa0RtIl9UN1rVb6U&O+8k@7KAbL3# z!mj|5y13-8yY_RQxgisP54Ein_lf1gUGx0Ql=Jat&!Dz?eKsL(^*ASWORnD(4l(+K zYO_&d;%A~@V^F2hglIEOx$4N5@UBT)swmZN@-H_;uA1Q{P8o1xX2!Cz11WipEi!js zkCYwqju8XNvD&~MuP)5$_jfwm_+XIJh6m$@qthn5=+vpMsuenWJ?i6M8cUGkVj&sU zzn6FHD^eG>0K8N1<*L&<*bH26{rLVC?d4m=>mt)bmsqNdTzS0$R~TfwnzkOhQ>f0+ z;vj3Fs=RC9)(vGhxo-ToLhALyqCv6)8Vqc+^Oj zjk6@Lg^WAfR!_Dv8-Ju#4WX9qV>dr3TSC~nw=JG5RM;oi#a$n6!4?_XV(zS}9+WUh z^y_gC1RxsBzZk7)rRdwdi2T^RlC}D~wfwZXJK{pT%GsA8rgHxs(3+;LWtdDx@Woq= zmV2MGtmpxE4Bod&ZWSqHo<>z~Ygop5wKzs;XY>eONgs5RHPLX)eEgX^Z;{v1wJeS? z&(jMs4JF@e#>!toR0JwT3Q-(y{Y-{8aObTxMbE7T$y(88HD# z8v{a$PVwcs-nb+eG>Em_0-Gl@qT~xxc&e5GD=n`$s}*KM`ux1V-vv*Nn1798P$JU& z>NGrbPX)hq2LT-+tgqH)D5-h-Xwgl6p^ErgzK>Ic!e&F(sA;6+*q;KIdN)C z6Jk7i29!5NfMwM&1WC<9S>BFc)pcK*x5=(oc8%EMwgVY05m4;RDA7BzJRV*leukwT zvr3q-$zyRen{uBD$Ka6LO6JkAxtW~fXs?mw4hloko_VC_oVZiU) zQB;n)$D2VJq2oj(xK-8T<_o)e3zP{Op(rrWtFkJDV)9x}p#~!o)I2rhK}&UkaVuSs zNQNTk?sA8~8GA(WxZIkTc3^<&fh))?ux?e_|EX00(>}QjB5D^?0?8{5E6nCpyK$dp zmxGpnASd$Zy`e2nUp0%E<8euNKPb_G`@2XJaVmUcdq3CA#@)J0SBx()y_rL^1j$UD9Dk)-DCv;DpBzZqs=OzuTZda15P>1^ zni>#DD9Al(TW{A@m`$>rCQDw-nzc-_%ukFhQ2XoCr^g%Jhxa=c+LvgUxMP?b4zL*V z7`ONRlgkrl!{-Ssmb(R(!N*mBK;=9ih)F01K0zQ+0qN{ezs5y|xw)$|rvGJ5%uv<}mKn1Iz5-j|_j@fW90+O<2mXhoBHS^Xb zq4VjmbrcQYLE5dVu9|saam=J4=7Dw1;#QhW@70MzhkolTmr`)jK+v^)H2y3G0onkD zrTDt%gg;UsMtj&r6aD6$y(?8G24gifTmEJJcN8PhURiMSR0K+l$Rc15iznulOz@^S zBLIM{`R6P^gz@tW8laW2EnAEF&z+=fN^r&6c=;Ha*N08E$1-QOC_a1i)hUpo`i=@c zW|CX9RGIEeI7(R9J$Q!${j(yYpiy?eZ2hV!M34!;d0}Eg#_&F8fA!NXEP0bt64DLx z=zXNABLRxUSPt1I?Ql-6=I9M_9{b->Cs zh&*d5y7e?Y^5F-m56-|Rrc$`3OHuZmnYiKOB932iAPECf;&E)FPGM zfn@Q*^zF#SMi;r_{f)O#Ry2hn6TXy~jE%a8oTUpR{kwC*GZ~Lx%<#rfrOR~l%!s9h zLs8-1UyN@i&~HMi7l%2%R5IwZN$MY~gu5vTHn^aB@_2M z+CFCd*&STWQxHtxPoGnV=V?w-DUt}l`C+a*RIkTc^}EWPIrQGK;Jd`Xo+MJ(g7sTTuJW^b@< zZq~?YU}rW8?wZl=h~hhJt#EP5bIn^4;F@yaq_^2mGYeKV*J6AJwFLBDw5p%N zMw-j@m0rc3tBxmTBr+%+54gkDvuy)D0M@=Ny%DwK9UKd+h@6yLu;*EE>X|1#)bOkb&NDj$SID!KHT-T4 z&tmhE*_e~>RC{uh!t_7251y4!d8-z+gf^ndo@-)M6a^Q}ecqp;SF_3Kxm3y%uEKEK zGgLf8U+jMQm8}SsS=i@OVR`5Rw8txgU9ivrH{8bk38W;vhI(jj5S2lxYVNgUl#R_4 zxfM!7bD%~&!_7uiFIuiHTK8V3DNtwq#e)2sB+gd<9wESpvfG8fv8CLDJ#xdgq)8KF zeT4%j*PAlD4v+epm}=R?{>p`6Co&*x4fi9VQb(sL9qzj8LYnbt&JJudFH;GPX&cUX zv!PK$jG|0=@uRB^FH_Ul4s34%wTmN$>g=nc&tUy02Sxpg7u9Bj08(a$O!-I!{S2tW z&AIPx9Elz)%taV?Hl^ch<%*e8f?=SZep{_a9fM-V`UVHi>RziFw61E>CWzv-Nj|zA z(2#B9Jg=4?{OPM2*y)NJ16p~}=?S>wuj$)uWbR_9i)(ce89ZD&3F#V*&Kdp~z*!43 zX9DxHruDBtO3NJB#tcj;1MWa&j3Kn7#qCU-W$uhHN|=tbw|Aqb0<&ul4t5R+Fkq^s z(D)I{G~sBg(FnUig&L^ZW2fx)OreBCwi&AWU_8DgK%{K2ckZ1jEW6&wV+hR^bsp-A zXdk34d_~jS`=zJCeZAr^1!b42E>3OTGWvD8&IO@U^ifaFM7Pcjbs9WF>v35~?>s$$ zwXQKcIBO(ha-LHf@r3wNVo#gleH=a;HZ=KFh#BvwMxaZXZemR<>qGdkL`Nu1vc?kY z4V)w(HpS0=?3P~V87QecoTSUB*tJloRa4?X={OJ}^LlTbC*%ILw$C>no}7`6&Cgc! zhGX8N`aKnF<+>M^E!cw+vjBOxJ-EKujR^BAjj%xp@Sv7C2VUy-M`nLU&Byn$FKCPl zz}AQJC`gX3!{bd~izJC_eg2s?K-55-4o>L;oPMmcn4qRw{#0g9X^}a9#3QVHQN6 zLZJS5i$JvF9e+fJ_y~9RakCg*FWR|twC}7eUCR9UlUg+S1x1&^y4k`&W1C?%a=CZB zTbE*ChuU=5!1r`fOm(GQfZ5z`QU^mn3C3mNw=sWe^r*D;ypqmf<@6Ba_wIjrms&cg`pIo&MV~8DFhLA$u?viAJLVtChPz)WVH}JxXQKjo(j(68X>W;9hOU#j9Gd zr4g$`#ErOq4VJLme&mco-nI-oU*<~Ub*?SVHBJvzSr3&`rkgGrX?cHP)p&A#f|nu= zn>1K3nx%^v$Z_lL{NZ30v0~spUjVlwh^tWHGa7L(kiu$m=LVLEW-?h^7 zNJA9Gq~3XPlM40RoFgb|^NW1a!IWi-Km?^~kzvxoBz=p(XRtACMbxs8yC%^26Dq{S z;_?xd6q!GvEs6 zf!lrXII_47i7ixbd`N6KjedNm@HJ&xn}$6vp_g~b2=}PB(BaPNbM2$R+D01cNhx9> zqi?<{`8z@dpsPh^7kYt#MPeogK~O)7^Mh#lM@+=9yG@g6J|u#`&TFPwz9B;C{-2}+ zjs%ieqsc5Bu&OE!@rqc?EXz2N$dnsJtdSp4)umr+6r_hCznDHAi!A=Gq=vy_#^0#P z(kx|31!sD<5b>Fw?S&@#wzK7D@K{yCcfDbAPIDJvYfvGy&RZsuuR$~ zn3yzj6HcnjJhp1_` zSDLArl*5t3YHDZ6mbm9v8ks+A^bCSj&o3DU$I=Gh#HRYSiCx7=VT1wp(yN<8Or$6c zKlu#17X}$3;6eGgCCtX*`rmB!@5YcDrC)#?r0S2z7zJm%%)d&>t`nGcq|A+de6XV0 zD|(R14I$}b8kwdHQ~N*TT@p^i(4sY?n&lc)E>*_6JP`|G^_*Hr*UE2%yu07G;H2*$Q z`kc=6N{68v-Z>zoS;E~ciXrDnW}qgV<=5~#xaF{~?FN|ZQYh=0%oqh)p9-thkh1H` zF=adfu#*N=+R=#l2qQ-xN8fZbbr+Ttn?ibI)f~ zz{dhQ!Z+rP2Oo3E?(p7Be#f)Sp(8}P*=lNqLpn=8%4fSA2o=KOo>hs}&$~5QH|cxJ z5GwF|KwQ|C9;hW4bWCjgyOXE)+HnC?$fc+z7NqXPSReQ0lDJXPsd@c}Q(QE&e;e`Z z&*AF1&O)J=w>6Ll%||gf*yiM`3)8@(ErC`tbzAbKkCxwzQdev{Liw=y9ue!Z=qKUm za0kYu-_U%px^sZ8IBZQp3zLz|`GBGq9PUkYD5A_}l|IGlgyDQpwET*Br*-cIAz#07 zNFh583iZQ2G8neNqkjf>X4pz*#$XjF97Y(OcdNEb2DJWO@`W8I%yiYWcw-sR|1-LGzP2DJt_)Y}LhE`nncZA_R@qTxK)$=Q{H1>$&WCtep|^6owdZD6;-3&%b_$2t(pG@%3zy!pwh%{UBCvJ1;zOy`-hf;VI( zCw(!G%@%oH(7Gcyn$o{&r+%=1&)_0v6$qP{&h;Zli&9qR`!SULZ)e#5al9R}`5S@q X^smWHoHVyhe7(2m_ literal 0 HcmV?d00001