summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Brooks2015-08-02 00:59:28 -0400
committerDaniel Brooks2015-08-02 00:59:28 -0400
commiteb15f06896aeb208d19f6f322905c7782125356e (patch)
tree6f28ac50e476e83b212e2827a10d4b6dee0730c9
parent65b511e2d4f4ec9864167e414e76b967eda32dba (diff)
parentb7a9655a695103b3ca2e4e6edfe305f9b44d9250 (diff)
Merge branch 'joeyconfig' of git://git.kitenet.net/propellor into joeyconfig
Conflicts: src/Propellor/Property/SiteSpecific/IABak.hs
-rw-r--r--.gitignore3
-rw-r--r--Makefile14
-rw-r--r--config-joey.hs136
-rw-r--r--config-simple.hs2
-rw-r--r--debian/changelog55
-rw-r--r--debian/control4
-rw-r--r--doc/usage.mdwn4
-rw-r--r--privdata.joey/privdata.gpg2844
-rw-r--r--propellor.cabal7
-rw-r--r--src/Propellor/Bootstrap.hs1
-rw-r--r--src/Propellor/CmdLine.hs21
-rw-r--r--src/Propellor/Git.hs1
-rw-r--r--src/Propellor/PrivData.hs21
-rw-r--r--src/Propellor/Property.hs35
-rw-r--r--src/Propellor/Property/Apache.hs1
-rw-r--r--src/Propellor/Property/Chroot.hs37
-rw-r--r--src/Propellor/Property/Cmd.hs23
-rw-r--r--src/Propellor/Property/Cron.hs1
-rw-r--r--src/Propellor/Property/Debootstrap.hs5
-rw-r--r--src/Propellor/Property/Docker.hs140
-rw-r--r--src/Propellor/Property/Firewall.hs24
-rw-r--r--src/Propellor/Property/Git.hs1
-rw-r--r--src/Propellor/Property/Mount.hs12
-rw-r--r--src/Propellor/Property/OS.hs1
-rw-r--r--src/Propellor/Property/Obnam.hs1
-rw-r--r--src/Propellor/Property/Postfix.hs19
-rw-r--r--src/Propellor/Property/Reboot.hs1
-rw-r--r--src/Propellor/Property/Service.hs1
-rw-r--r--src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs131
-rw-r--r--src/Propellor/Property/SiteSpecific/GitHome.hs1
-rw-r--r--src/Propellor/Property/SiteSpecific/IABak.hs7
-rw-r--r--src/Propellor/Property/SiteSpecific/JoeySites.hs8
-rw-r--r--src/Propellor/Property/Ssh.hs41
-rw-r--r--src/Propellor/Property/Systemd.hs173
-rw-r--r--src/Propellor/Property/Tor.hs9
-rw-r--r--src/Propellor/Shim.hs6
-rw-r--r--src/Propellor/Spin.hs31
-rw-r--r--src/Propellor/Ssh.hs6
-rw-r--r--src/Propellor/Types/CmdLine.hs1
-rw-r--r--src/Propellor/Types/Container.hs30
-rw-r--r--src/Propellor/Types/OS.hs4
-rw-r--r--src/Utility/Data.hs2
-rw-r--r--src/Utility/Directory.hs2
-rw-r--r--src/Utility/Env.hs2
-rw-r--r--src/Utility/Exception.hs1
-rw-r--r--src/Utility/FileMode.hs13
-rw-r--r--src/Utility/FileSystemEncoding.hs1
-rw-r--r--src/Utility/LinuxMkLibs.hs15
-rw-r--r--src/Utility/Misc.hs10
-rw-r--r--src/Utility/Monad.hs2
-rw-r--r--src/Utility/PartialPrelude.hs2
-rw-r--r--src/Utility/Path.hs2
-rw-r--r--src/Utility/PosixFiles.hs1
-rw-r--r--src/Utility/Process.hs82
-rw-r--r--src/Utility/QuickCheck.hs1
-rw-r--r--src/Utility/SafeCommand.hs64
-rw-r--r--src/Utility/Scheduled.hs3
-rw-r--r--src/Utility/Tmp.hs1
-rw-r--r--src/Utility/UserInfo.hs6
59 files changed, 2240 insertions, 1833 deletions
diff --git a/.gitignore b/.gitignore
index a2d84e4e..19bd3f0e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,4 +7,7 @@ Setup
Setup.hi
Setup.o
docker
+chroot
propellor.1
+.lock
+.lastchecked
diff --git a/Makefile b/Makefile
index 2cf15b98..8b713878 100644
--- a/Makefile
+++ b/Makefile
@@ -17,11 +17,15 @@ install:
cat dist/propellor-*.tar.gz | (cd dist/gittmp && tar zx --strip-components=1)
# cabal sdist does not preserve symlinks, so copy over file
cd dist/gittmp && for f in $$(find -type f); do rm -f $$f; cp -a ../../$$f $$f; done
- cd dist/gittmp && git init && \
- git add . \
- && git commit -q -m "distributed version of propellor" \
- && git bundle create $(DESTDIR)/usr/src/propellor/propellor.git master HEAD \
- && git show-ref master --hash > $(DESTDIR)/usr/src/propellor/head
+ export GIT_AUTHOR_NAME=build \
+ && export GIT_AUTHOR_EMAIL=build@buildhost \
+ && export GIT_COMMITTER_NAME=build \
+ && export GIT_COMMITTER_EMAIL=build@buildhost \
+ && cd dist/gittmp && git init \
+ && git add . \
+ && git commit -q -m "distributed version of propellor" \
+ && git bundle create $(DESTDIR)/usr/src/propellor/propellor.git master HEAD \
+ && git show-ref master --hash > $(DESTDIR)/usr/src/propellor/head
rm -rf dist/gittmp
clean:
diff --git a/config-joey.hs b/config-joey.hs
index 2a173776..32b70c14 100644
--- a/config-joey.hs
+++ b/config-joey.hs
@@ -25,6 +25,7 @@ import qualified Propellor.Property.Obnam as Obnam
import qualified Propellor.Property.Gpg as Gpg
import qualified Propellor.Property.Systemd as Systemd
import qualified Propellor.Property.Journald as Journald
+import qualified Propellor.Property.Chroot as Chroot
import qualified Propellor.Property.OS as OS
import qualified Propellor.Property.HostingProvider.CloudAtCost as CloudAtCost
import qualified Propellor.Property.HostingProvider.Linode as Linode
@@ -45,6 +46,7 @@ hosts = -- (o) `
, gnu
, clam
, orca
+ , honeybee
, kite
, elephant
, beaver
@@ -74,8 +76,6 @@ darkstar = host "darkstar.kitenet.net"
& ipv6 "2001:4830:1600:187::2" -- sixxs tunnel
& Apt.buildDep ["git-annex"] `period` Daily
- & Docker.configured
- ! Docker.docked gitAnnexAndroidDev
& JoeySites.postfixClientRelay (Context "darkstar.kitenet.net")
& JoeySites.dkimMilter
@@ -83,7 +83,6 @@ darkstar = host "darkstar.kitenet.net"
gnu :: Host
gnu = host "gnu.kitenet.net"
& Apt.buildDep ["git-annex"] `period` Daily
- & Docker.configured
& JoeySites.postfixClientRelay (Context "gnu.kitenet.net")
& JoeySites.dkimMilter
@@ -97,18 +96,18 @@ clam = standardSystem "clam.kitenet.net" Unstable "amd64"
& Ssh.randomHostKeys
& Apt.unattendedUpgrades
& Network.ipv6to4
+
& Tor.isRelay
& Tor.named "kite1"
& Tor.bandwidthRate (Tor.PerMonth "400 GB")
- & Docker.configured
- & Docker.garbageCollected `period` Daily
- & Docker.docked webserver
+ & Systemd.nspawned webserver
& File.dirExists "/var/www/html"
- & File.notPresent "/var/www/html/index.html"
- & "/var/www/index.html" `File.hasContent` ["hello, world"]
+ & File.notPresent "/var/www/index.html"
+ & "/var/www/html/index.html" `File.hasContent` ["hello, world"]
& alias "helloworld.kitenet.net"
- & Docker.docked oldusenetShellBox
+
+ & Systemd.nspawned oldusenetShellBox
& JoeySites.scrollBox
& alias "scroll.joeyh.name"
@@ -129,15 +128,46 @@ orca = standardSystem "orca.kitenet.net" Unstable "amd64"
& Apt.unattendedUpgrades
& Postfix.satellite
+ & Apt.serviceInstalledRunning "ntp"
& Systemd.persistentJournal
- & Docker.configured
- & Docker.docked (GitAnnexBuilder.standardAutoBuilderContainer dockerImage "amd64" 15 "2h")
- & Docker.docked (GitAnnexBuilder.standardAutoBuilderContainer dockerImage "i386" 45 "2h")
- & Docker.docked (GitAnnexBuilder.armelCompanionContainer dockerImage)
- & Docker.docked (GitAnnexBuilder.armelAutoBuilderContainer dockerImage (Cron.Times "1 3 * * *") "5h")
- & Docker.docked (GitAnnexBuilder.androidAutoBuilderContainer dockerImage (Cron.Times "1 1 * * *") "3h")
- & Docker.garbageCollected `period` Daily
- & Apt.buildDep ["git-annex"] `period` Daily
+
+ & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer
+ GitAnnexBuilder.standardAutoBuilder
+ (System (Debian Unstable) "amd64") fifteenpast "2h")
+ & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer
+ GitAnnexBuilder.standardAutoBuilder
+ (System (Debian Unstable) "i386") fifteenpast "2h")
+ & Systemd.nspawned (GitAnnexBuilder.androidAutoBuilderContainer
+ (Cron.Times "1 1 * * *") "3h")
+ where
+ fifteenpast = Cron.Times "15 * * * *"
+
+honeybee :: Host
+honeybee = standardSystem "honeybee.kitenet.net" Testing "armhf"
+ [ "Arm git-annex build box." ]
+ & ipv6 "2001:4830:1600:187::2"
+
+ -- No unattended upgrades as there is currently no console access.
+ -- (Also, system is not currently running a stock kernel,
+ -- although it should be able to.)
+ & Postfix.satellite
+ & Apt.serviceInstalledRunning "aiccu"
+ & Apt.serviceInstalledRunning "swapspace"
+ & Apt.serviceInstalledRunning "ntp"
+
+ -- Not using systemd-nspawn because it's broken (kernel issue?)
+ -- & Systemd.nspawned (GitAnnexBuilder.autoBuilderContainer
+ -- GitAnnexBuilder.armAutoBuilder
+ -- builderos Cron.Daily "22h")
+ & Chroot.provisioned
+ (Chroot.debootstrapped builderos mempty "/var/lib/container/armel-git-annex-builder"
+ & "/etc/timezone" `File.hasContent` ["America/New_York"]
+ & GitAnnexBuilder.armAutoBuilder
+ builderos (Cron.Times "1 1 * * *") "12h"
+ )
+ where
+ -- Using unstable to get new enough ghc for TH on arm.
+ builderos = System (Debian Unstable) "armel"
-- This is not a complete description of kite, since it's a
-- multiuser system with eg, user passwords that are not deployed
@@ -222,9 +252,6 @@ kite = standardSystemUnhardened "kite.kitenet.net" Testing "amd64"
, "zsh"
]
- & Docker.configured
- & Docker.garbageCollected `period` Daily
-
& alias "nntp.olduse.net"
& JoeySites.oldUseNetServer hosts
@@ -281,13 +308,14 @@ elephant = standardSystem "elephant.kitenet.net" Unstable "amd64"
& myDnsSecondary
& Docker.configured
- & Docker.docked oldusenetShellBox
& Docker.docked openidProvider
`requires` Apt.serviceInstalledRunning "ntp"
& Docker.docked ancientKitenet
& Docker.docked jerryPlay
& Docker.garbageCollected `period` (Weekly (Just 1))
+ & Systemd.nspawned oldusenetShellBox
+
& JoeySites.scrollBox
& alias "scroll.joeyh.name"
& alias "eu.scroll.joeyh.name"
@@ -295,7 +323,7 @@ elephant = standardSystem "elephant.kitenet.net" Unstable "amd64"
-- For https port 443, shellinabox with ssh login to
-- kitenet.net
& alias "shell.kitenet.net"
- & Docker.docked kiteShellBox
+ & Systemd.nspawned kiteShellBox
-- Nothing is using http port 80, so listen on
-- that port for ssh, for traveling on bad networks that
-- block 22.
@@ -316,6 +344,7 @@ beaver = host "beaver.kitenet.net"
-- Branchable is not completely deployed with propellor yet.
pell :: Host
pell = host "pell.branchable.com"
+ & alias "branchable.com"
& ipv4 "66.228.46.55"
& ipv6 "2600:3c03::f03c:91ff:fedf:c0e5"
@@ -371,22 +400,21 @@ iabak = host "iabak.archiveteam.org"
--' __|II| ,.
---- __|II|II|__ ( \_,/\
--'-------'\o/-'-.-'-.-'-.- __|II|II|II|II|___/ __/ -'-.-'-.-'-.-'-.-'-.-'-
--------------------------- | [Docker] / --------------------------
+-------------------------- | [Containers] / --------------------------
-------------------------- : / ---------------------------
--------------------------- \____, o ,' ----------------------------
---------------------------- '--,___________,' -----------------------------
-- Simple web server, publishing the outside host's /var/www
-webserver :: Docker.Container
+webserver :: Systemd.Container
webserver = standardStableContainer "webserver"
- & Docker.publish "80:80"
- & Docker.volume "/var/www:/var/www"
+ & Systemd.bind "/var/www"
& Apt.serviceInstalledRunning "apache2"
-- My own openid provider. Uses php, so containerized for security
-- and administrative sanity.
openidProvider :: Docker.Container
-openidProvider = standardStableContainer "openid-provider"
+openidProvider = standardStableDockerContainer "openid-provider"
& alias "openid.kitenet.net"
& Docker.publish "8081:80"
& OpenId.providerFor [User "joey", User "liw"]
@@ -394,39 +422,30 @@ openidProvider = standardStableContainer "openid-provider"
-- Exhibit: kite's 90's website.
ancientKitenet :: Docker.Container
-ancientKitenet = standardStableContainer "ancient-kitenet"
+ancientKitenet = standardStableDockerContainer "ancient-kitenet"
& alias "ancient.kitenet.net"
& Docker.publish "1994:80"
& Apt.serviceInstalledRunning "apache2"
- & Git.cloned (User "root") "git://kitenet-net.branchable.com/" "/var/www"
+ & Git.cloned (User "root") "git://kitenet-net.branchable.com/" "/var/www/html"
(Just "remotes/origin/old-kitenet.net")
-oldusenetShellBox :: Docker.Container
+oldusenetShellBox :: Systemd.Container
oldusenetShellBox = standardStableContainer "oldusenet-shellbox"
& alias "shell.olduse.net"
- & Docker.publish "4200:4200"
& JoeySites.oldUseNetShellBox
--- for development of git-annex for android, using my git-annex work tree
-gitAnnexAndroidDev :: Docker.Container
-gitAnnexAndroidDev = GitAnnexBuilder.androidContainer dockerImage "android-git-annex" doNothing gitannexdir
- & Docker.volume ("/home/joey/src/git-annex:" ++ gitannexdir)
- where
- gitannexdir = GitAnnexBuilder.homedir </> "git-annex"
-
jerryPlay :: Docker.Container
-jerryPlay = standardContainer "jerryplay" Unstable "amd64"
+jerryPlay = standardDockerContainer "jerryplay" Unstable "amd64"
& alias "jerryplay.kitenet.net"
& Docker.publish "2202:22"
& Docker.publish "8001:80"
& Apt.installed ["ssh"]
& User.hasSomePassword (User "root")
- & Ssh.permitRootLogin True
-
-kiteShellBox :: Docker.Container
+ & Ssh.permitRootLogin (Ssh.RootLogin True)
+
+kiteShellBox :: Systemd.Container
kiteShellBox = standardStableContainer "kiteshellbox"
& JoeySites.kiteShellBox
- & Docker.publish "443:443"
type Motd = [String]
@@ -457,12 +476,25 @@ standardSystemUnhardened hn suite arch motd = host hn
& Apt.removed ["exim4", "exim4-daemon-light", "exim4-config", "exim4-base"]
`onChange` Apt.autoRemove
-standardStableContainer :: Docker.ContainerName -> Docker.Container
-standardStableContainer name = standardContainer name (Stable "wheezy") "amd64"
-
-- This is my standard container setup, Featuring automatic upgrades.
-standardContainer :: Docker.ContainerName -> DebianSuite -> Architecture -> Docker.Container
-standardContainer name suite arch = Docker.container name (dockerImage system)
+standardContainer :: Systemd.MachineName -> DebianSuite -> Architecture -> Systemd.Container
+standardContainer name suite arch = Systemd.container name chroot
+ & os system
+ & Apt.stdSourcesList `onChange` Apt.upgrade
+ & Apt.unattendedUpgrades
+ & Apt.cacheCleaned
+ where
+ system = System (Debian suite) arch
+ chroot = Chroot.debootstrapped system mempty
+
+standardStableContainer :: Systemd.MachineName -> Systemd.Container
+standardStableContainer name = standardContainer name (Stable "jessie") "amd64"
+
+standardStableDockerContainer :: Docker.ContainerName -> Docker.Container
+standardStableDockerContainer name = standardDockerContainer name (Stable "jessie") "amd64"
+
+standardDockerContainer :: Docker.ContainerName -> DebianSuite -> Architecture -> Docker.Container
+standardDockerContainer name suite arch = Docker.container name (dockerImage system)
& os system
& Apt.stdSourcesList `onChange` Apt.upgrade
& Apt.unattendedUpgrades
@@ -473,10 +505,10 @@ standardContainer name suite arch = Docker.container name (dockerImage system)
-- Docker images I prefer to use.
dockerImage :: System -> Docker.Image
-dockerImage (System (Debian Unstable) arch) = "joeyh/debian-unstable-" ++ arch
-dockerImage (System (Debian Testing) arch) = "joeyh/debian-unstable-" ++ arch
-dockerImage (System (Debian (Stable _)) arch) = "joeyh/debian-stable-" ++ arch
-dockerImage _ = "debian-stable-official" -- does not currently exist!
+dockerImage (System (Debian Unstable) arch) = Docker.latestImage ("joeyh/debian-unstable-" ++ arch)
+dockerImage (System (Debian Testing) arch) = Docker.latestImage ("joeyh/debian-unstable-" ++ arch)
+dockerImage (System (Debian (Stable _)) arch) = Docker.latestImage ("joeyh/debian-stable-" ++ arch)
+dockerImage _ = Docker.latestImage "debian-stable-official" -- does not currently exist!
myDnsSecondary :: Property HasInfo
myDnsSecondary = propertyList "dns secondary for all my domains" $ props
diff --git a/config-simple.hs b/config-simple.hs
index 4f0fde8c..576ecc73 100644
--- a/config-simple.hs
+++ b/config-simple.hs
@@ -41,7 +41,7 @@ hosts =
-- A generic webserver in a Docker container.
webserverContainer :: Docker.Container
-webserverContainer = Docker.container "webserver" "debian"
+webserverContainer = Docker.container "webserver" (Docker.latestImage "debian")
& os (System (Debian (Stable "jessie")) "amd64")
& Apt.stdSourcesList
& Docker.publish "80:80"
diff --git a/debian/changelog b/debian/changelog
index dc3b09de..2decb1f0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,62 @@
-propellor (2.5.0) UNRELEASED; urgency=medium
+propellor (2.7.0) unstable; urgency=medium
+
+ * Ssh.permitRootLogin type changed to allow configuring WithoutPassword
+ and ForcedCommandsOnly (API change)
+ * setSshdConfig type changed, and setSshdConfigBool added with old type.
+ * Fix a bug in shim generation code for docker and chroots, that
+ sometimes prevented deployment of docker containers.
+ * Added onChangeFlagOnFail which is often a safer alternative to
+ onChange.
+ Thanks, Antoine Eiche.
+ * Work around broken git pull option parser in git 2.5.0,
+ which broke use of --upload-pack to send a git push when running
+ propellor --spin.
+
+ -- Joey Hess <id@joeyh.name> Thu, 30 Jul 2015 12:05:46 -0400
+
+propellor (2.6.0) unstable; urgency=medium
+
+ * Replace String type synonym Docker.Image by a data type
+ which allows to specify an image name and an optional tag. (API change)
+ Thanks, Antoine Eiche.
+ * Added --unset to delete a privdata field.
+ * Version dependency on exceptions.
+ * Systemd: Add masked property.
+ Thanks, Sean Whitton
+ * Fix make install target to work even when git is not configured.
+
+ -- Joey Hess <id@joeyh.name> Fri, 10 Jul 2015 22:36:29 -0400
+
+propellor (2.5.0) unstable; urgency=medium
* cmdProperty' renamed to cmdPropertyEnv to make way for a new,
more generic cmdProperty' (API change)
* Add docker image related properties.
Thanks, Antoine Eiche.
+ * Export CommandParam, boolSystem, safeSystem, shellEscape, and
+ * createProcess from Propellor.Property.Cmd, so they are available
+ for use in constricting your own Properties when using propellor
+ as a library.
+ * Improve enter-machine scripts for systemd-nspawn containers to unset most
+ environment variables.
+ * Fix Postfix.satellite bug; the default relayhost was set to the
+ domain, not to smtp.domain as documented.
+ * Mount /proc inside a chroot before provisioning it, to work around #787227
+ * --spin now works when given a short hostname that only resolves to an
+ ipv6 address.
+ * Added publish property for systemd-spawn containers, for port publishing.
+ (Needs systemd version 220.)
+ * Added bind and bindRo properties for systemd-spawn containers.
+ * Firewall: Port was changed to a newtype, and the Port and PortRange
+ constructors of Rules were changed to DPort and DportRange, respectively.
+ (API change)
+ * Docker: volume and publish accept Bound FilePath and Bound Port,
+ respectively. They also continue to accept Strings, for backwards
+ compatibility.
+ * Docker: Added environment property.
+ Thanks Antoine Eiche.
- -- Joey Hess <id@joeyh.name> Thu, 07 May 2015 12:08:34 -0400
+ -- Joey Hess <id@joeyh.name> Tue, 09 Jun 2015 17:08:43 -0400
propellor (2.4.0) unstable; urgency=medium
diff --git a/debian/control b/debian/control
index 2bebd6f3..51107783 100644
--- a/debian/control
+++ b/debian/control
@@ -16,7 +16,7 @@ Build-Depends:
libghc-quickcheck2-dev,
libghc-mtl-dev,
libghc-transformers-dev,
- libghc-exceptions-dev,
+ libghc-exceptions-dev (>= 0.6),
Maintainer: Gergely Nagy <algernon@madhouse-project.org>
Standards-Version: 3.9.6
Vcs-Git: git://git.joeyh.name/propellor
@@ -38,7 +38,7 @@ Depends: ${misc:Depends}, ${shlibs:Depends},
libghc-quickcheck2-dev,
libghc-mtl-dev,
libghc-transformers-dev,
- libghc-exceptions-dev,
+ libghc-exceptions-dev (>= 0.6),
git,
Description: property-based host configuration management in haskell
Propellor enures that the system it's run in satisfies a list of
diff --git a/doc/usage.mdwn b/doc/usage.mdwn
index 4030628f..1c306aa3 100644
--- a/doc/usage.mdwn
+++ b/doc/usage.mdwn
@@ -71,6 +71,10 @@ and configured in haskell.
Sets a field of privdata. The content is read in from stdin.
+* propellor --unset field context
+
+ Removes a value from the privdata store.
+
* propellor --dump field context
Outputs the privdata value to stdout.
diff --git a/privdata.joey/privdata.gpg b/privdata.joey/privdata.gpg
index f677d4ca..4dcb4aa8 100644
--- a/privdata.joey/privdata.gpg
+++ b/privdata.joey/privdata.gpg
@@ -1,1425 +1,1427 @@
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1
-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
-x+Gna2VvWT9pDlxUPbrqFUtcY7ddJ7XxUaVJvMwLf+syWK6VxI8sUhP5RC3E+nf0
-ucM9awE8yraWAZLsN8XEN5jANSNXLQ8LZjyV1ZNPsaIS4RjpcRYlXrcCHLLOKE26
-D9VuvDP6jyclCP7xPNcRu58FoM0EjjzJ1/I0Icql7VhkAApBLlbio7mijXOWphFw
-VQMOl24M38ge40/DxMpxzFi6KkzvcAEPyBtzKkfIo5/iufdy3xOFH6rMrgCFpGK1
-wqVq1F1AD9BbXQlyAFQWCkR++DNHJpAeIj5wNukb1B2jKxBzRjACmPHYp5jBVkma
-k0zZcIIZZN15jfVV76OHCXsaen2UEXB8b1BHnvZVLydn/MLu/jlaQWvfJX2m3pk2
-MLvKtPHUJKyB5wawVupV/UjH/6YmgPU116axe+zeEnzU1oKROT9KulEVgO5RZM/Y
-T2Ls0yZIrhx3WFzXXfdKJPJffltI9teZSBU+vDtu1AiaFMdYV+yI/0ZKy9YVO27u
-x3/3jXyTP84KqKVaT6POIFWGhNJ4uLU7QVGYcuS1yGyQtPr4/PndOcY6TmSin0mN
-nhlr7RxiLDMYABaJ2E9pXVNPEQCNQ1Ca2GY6ksdmEcM1ERkEaFvN2gLUtjlKEuJx
-U06y9K3WU8A7kubra7VcqTHI50sxY0wZmMRGMG/Fwumw+OqOvLezOdQ+8ZQwRqAS
-P2GY1B5rNFaP1pi5otij5emF4Fn9fP4d7lHUgZdcrq1syGyY8LEF8h9BVq2HcOLt
-iSyZ8VdS6xvWbZDI3qVyE/fYGfZhSw9kq0zBbv0fmIXepw4g69A9QEbsuFFZFlrc
-DfQaqcXA5cNw6J9s3YebFdnZ6eSA4gCQImIOniCye2BguK5l0+0up4XzCbyCXKnm
-3quPGKCXE5JqR5qGnmizMe4hIsgzNKq/ktlMiLYMNTixEkUN5Hh5n4InH7gm90ja
-+7CCFPJKZbXzndwvWoz40bFLy/LzbcBPSPVVwXY25/f96s6lzp8wsGqeZ0OQ9XCT
-2sosDlmQXxy2Xxp37YECERuBqzPMQVpy/Kes9PGbC6dGmy4qP7GssYl8ztIDWic2
-R3XfoEaAAI+gR9N4RXBT3FxGjf7S/SzoiNYIcegn4GKpT7rC58fVTpOpJh9YBcCt
-89MOBaJ46z6vCs+kd+jleDHngYqHrrYGgVdQmWfB3dK0eAF7KLQvii4zEXmo8izH
-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
-xTN1saAlAOPFBaRJjXr2
-=YFGf
+hQIMA7ODiaEXBlRZAQ/+LQZ8ufDxO8DslCg9ijoSC4+PvvxE2hih+BsOA7UBEVNh
+3Z4ojpjHlLSzTKNd5eYQqCt4w3cEYFc7z4/Oy4McZ6yKwkhMwd5PUqZg94NJvPjE
+gpTh6tW2USk4foQgqVbZ7rbbwmkJ89lj4qRAeGoju9z81D43qxl9IS5jMqmYURfU
+JAqhjVAuxIaTlT2fEyCaIyvf/5OWRnWS1gKNz06B8FIpigoqipbdnchQN6HWo2Xm
+uuuJumEJUx2u2TjR3iNJgOq8wE4SM4dUJYBa/iFwmekpmg2gX6OXcmxWdw3ZXR/p
+3VtLZpgjdM+h/QUM9C/XkSWoMJTlEamIM5YiskQokQkCtAzOQ6V5EUKaD5Ux7FBi
+dT7LgabUdsgBOXLRmjxC1oqqoYssnZN5LmvI/0jH+oL0WX93gSenCZQuKqzjGnHL
+SEZ6kNUA9uPdNXED9mDQxMabgft4YoSXbbwuELXchBsrfLwGeXfV0PAE2fqQ0nZO
+lXW6aAiakxzVvkS/FT8yU6Vo8kzjCnT0mALPg8q0X2WdHD7bF011w9OOnDcG3Mda
+vd4lJWL7/SMPrcle9U0cFPn2LiqZr9IDF7FilG8xDzugNoHM3eLRC+wMSd/qEElk
+EkCjKRAFU4EdUKFU/tFQYwxJFw0HMzvVjwh3J7vM4staS/79OeM4uR/ZGpJy9FTS
+7QF6klg2drWPV41AHETMqWiPmmi3i+ZwMYoVvVfRMWFCEgPwuuFmNujnmGMfTxka
+CIvjIukZhhNHy66m4n1bhSO89DVYr768xiJp4NrUr+Vs1J/oOnHMZQydYnPNlKLp
+AjQk5t3QoBnXbRvBZ24BBnRLn/Im4jfi0ypPVbSxmnT08hGPuVD9eYka2AHoacCN
+m+dQVWGVImUV6g7TzRzI27tKA7HqKK2NJrFcLdAdOhzHYMfsMWH/38eiux9rnxlR
+j6Oy1hSxX4TPrew1A3DavkzkYuBvvEXf3ne1wFhKx4t+gZ8f1iddziKgV2PErX3p
+mn+zkdUwgjhPecV7KMLsueFpZfBAyRddtRLy4V4L4iVye7wlgJOcuMzrtNzB1JCv
+ryejfocmKZ98q6w6JG5a5QGnBVk03uzhYmxUBhMQOfbj+q+MyZwUB8LKDjt3vpVh
+gXszfZaGcOClAJNhd/F1uXC9pni/6vMP/4acgoKuGqHsmwGSRwum6IvkFuXjob5K
+Xr78RiY7rtaClIkUDbstrMWTQeV4my2Dr5aeUrhWpFA4U2JVzGo4Rku894u4mwWI
+RN0yC/+moozybykQtuC4qnXP9GOq8yAoHrUOT5DirvxG55HxHuooWGXH0zx677Qi
+0kfZxSsrPe1ErrfEdFKwF6gfGA9y/a+5PFivjl3l9hAIxa1zQ1RIUnRS1pcIwzIB
+QXEHm31Oe/OHM/vCLLg/T/sBEHca/eKuEvHJCSmSCrvoJo9hnyfor8sQj/ZzBeGO
+h6xpItnkjWnZ5jrySZiqz5ldVIe8ZOJhxmb51i6ztPPOWu9ikByxVZm5K3GXVCwy
+QivVm2Uiou87s8UNeClPkLa7CnQmiiCLaRDZx/PK/D4yQFu7jwjy1ydCrmpbvODY
+tPSvDuqDpJYq0ASLPf5SkbPH3+qm5LOcTeI2RufDM93o6nvtZyVp6jmeyy6kiWO+
++B9DrwVWgwYOXV4IR9XEWdbxSlZOJDOJ6shVd+uVxDLbEUVL+tsm2IsoJ1z+qNsZ
+S0kBMABLR+dzPATdvivBvoMDk+R8c056TRGe3q81b9QZ8nlHzRnKjWZbCDp/dlfz
+31E4wauOpuam73iATYFCPc84epaRJd1NKqvPzSCUOw32qLu62mmC8Lkr+NXmSY87
+zeNIYmG6I0O7MzBN+UuvLAOSZQoaKG4nvk9oINqb9SLE6l2Pd38/TG3HFSKsMkox
+O+NHVaoAl/RBBWWLqmlG9jAJH607GHHtij7v4HxsPOZ9gjO2QQETOK0mr4gcrZm7
+N4L1Gdrd7u+BKDMge4RLllG5nLttvG42fD3SXO9ntL2aLH7310kVLYV+PVJW0Y6T
+x1nL4dYtm8luDip0BTzn/ir3GtV8BS9XO5cp5Y+mKMtlR5uAkA52h0JcGXEj8nBK
+YdcD4LxvBOC2lrKMkSsIdiHVWjxK4cBOMAHNVz11LPPSQKmoVpPjz8sJuExlrfBT
+CelMBaiP8NRAkWGaG8qC7Lby6Coc3j48BCQRe3l/ORvu3hjLifDNMXehHAsDDPoA
+OWA+6y2cJkdu9B2L+83eF9pc4+hV4BywJ2emREyE/zekfVacwz/0eBcm9K0oZYSQ
+IbPWtTfD/V2oqLEaFquVEruOOBE84O+pBKPP67N9mw38bbaZ2UoyuzW6ewc0j1/h
+lOPudp2+Ob0ZsNf3kvpYrB+QqSOPXMy82FNidI3UPL9PvOxDMSLjBwfqIcx3ozIU
+AoawYbghJssYBBYa5wO62nKCx/R+FC4/QZtxUKr1Icx2IHtif6cygq6R78UFofsd
+P7NkmUPfyEb4PUm07caZ1cXeBnOR1pEz5vL1Qa/fZL1uTfXPe43dqnCdmXqryUBl
+w4wE8Uktk59bclLF9i/cgo1gJgJ2wEc3592NLbn+tWSkCLp9dVhrhb4GWgoV5neI
+Kd58SKgeBxkgVxG24l8tRs9fcESQcz7WAGYRAkXNCQXrItjfJF0JBdE6Sy/o4uwK
+tHl/j5xr2SCRFcDhBtWjBaHbdc7obGTdsHxgGyU8xhifuLA/N2aRiHtbiwVBuZ1C
+kO3lmQppqFFrwDyRy6cB9rYabW3dsotiTE2xplWO3HBekmg+Sms9ucEWPWfzBo8D
+ssrBtlQTCiwWUSjRYIYz1WuSVOElx8t8ATtwchJ0Cr2L0dQaNlZKgUEQor2l83ER
+SL/e5A8f87hC5XOPmkVrpYQmFL9Yq4NI/HhiadxshvxuuTPVj/sYWFcZGv7MqvLa
+rFLVzhc5Kqgyv0JROGIRxwxWPjnM74CEciasEs9rBlU2ZCwl621CRutfDLZSpp5R
+CV6/5ZUXoy+aW15f3dhIgx9P447Qbw7HJdeYCUwiMw8GzMbB+tVw4nQ8VVSNY/27
+hBVGKt/UzM4YKYeAXp7A7l8xaQYxdT16APitgcAXeF6dEYT5nYrWiDfrNI8NuRzz
+S6YR3aXbUuOZa19ut5L2vQ3XJ1v0ksJTVh+74F/w/To0DQGTcTxCZR1F8xrWsSso
+qCicKS1yjb0CKgT3jhgdwcg580vgojSySea15KRMvgSFdnRR8gKDma1iyxxal+KM
+atG1YCC9a88+p3k0kVxWrWpPhOFvXLaMwYZaC8cS63QnB18e1A8pCDeRCbcYmzoj
+8sv3HEnGMMvXGGsR9Kyed0CjqsHevnMthoKB1vjtQzBrT/BjRTiy3Ejq30AU8mps
+4+qm4ASxAQdMtN7vlnJrC8A5FjLuo/zW55oEnqW64hh9fEpBX90G2RbJH6MPqZKF
+3d76hN8oMIP3FtgBxoS8fzAQmqEXGznZ8ujHpYtDcSfvCMVlX3caQiwCeVfb8JtN
+bA0BUwBRKmQjnprzbRr0Q5cE0z//fkTdKmikQahdCZ9pUU5qdhH+0N9FPNTcgOk2
+znrHPZhWZymojxP3LHT0W22aUspWwGWi2F48MeeOEQCn/lmS5a+5lNDHGl8/bo6w
+k/UMZU8L7Gl8zo6KMKRA2MVjk3KquuAlvgKwXkVOfnLLrYpe+D7u+Vlacg9920JE
+D2hy7ZVWB0XzjKKg8LaB/d0cQQNbwAoQuTGy08Nm1Pg2Z8BeAvSdu5X3U7KA5gGf
+8A7hfxUC+EP9djq8gXKligB0yuSbqIUBX7wDh0zYVE+kbas8Q5c2nWD0ruamI7ys
+TYWr5yq0Fvm3vAipjkwUyrLKFwn/jD2uC7NaIC5fUUEPenrjIe0+TAR07sal1psm
+DODSDv0kWJ1Q8DGBq735Cgc9/2+gg28ep8k/DWEthJ6vF/AxO3jI8I9rOkFo6iRn
+wK9Q9goMIFCKZ5pvsX8ye05G2+/0yLXioN6kVf6RGajynmEqBAI0AijuaAri8aW6
+tRjPhHq/cNOn0vDF1hWOG8gpfykUEnynhNKCGFoAT2x0tc1mvjZu6I6MA2hYIAps
+PA+lR9leNjRbPtXn9JPACKM24zrhIUMYEcjxXLf1Hoa/uIR8Aj7Ugf/JqajU9mkz
+muJ0pNveVYvvrqVXqnDPVUmGr93xD5HJJ1sK/rtJnuOJLLhaZmw7dBckTy5gGzly
+LXjr9pZL91PoRZtiUxtEMmO54ypy5bM+pP+M/svWcGjhRON7sMHz8NeHK7aYnEq3
+/XO+GLO67XwfOPEsV0GbOzv7Xocktu34qHVVVS63kN+wq+3wN0q8VRrt2TFa4GyV
+o8LztidnCCZ0OL3VPJZxi5TKUOFEl3SW9a0T2ylSwCB6GavTayvRk42E609x7X6V
+3lOu1z1Z36V/J2p6VAyCHyiCtU/7O7x76jdfwMAx/LVS5YnY3JwOMo5L0CZnszaB
+ZgQIYodX15W/HB53P3ZKRwnvvMlqHlpWExDf+8R9Q/YVVoKSNM0JOtSzr+4Kx2cB
+zIwlBU4VLzzG8CiFGa3BcRyNsWJP9Hg3tygdXo1B1ivRXkgQwbhAimvG4lznSGTd
+w+NmksHkEB9eV7yPwouO+rhDS50Fdbc2mr+vEmPunyC4fIyC87gM6VMJsmWMp+GR
+s2GsUGyxwYhjumy4Jg7IKja6jzpaLAxzz29xljCJMTlNwHt2J3diA0AW2gHnO2pA
+H/MLxj7iyxS7wmNUOchBgS2CVFPttvzkpwJJ87VIWVD9xnWQcmmqNtpKUFICZ2H3
+I4Hnd7grqZ4pPaet9Hc4Ab6sPbMpzYbvPHLd3EnLvqqD1iq9u8i3al3WcdPwAh9z
++jB83yHzs7KfATTNtlSpB2fDM5ADrSkOn7u2TsCDySJ2Ie07TBeDbsLhn1MwW7g+
+wZ2IpgdDw6bG541FqRuHT4C40D3kQZI8etBK0S+HSL2okHMxbhz8TNRlUV/pe31D
+LfyOY0K2u0gwAH22YoNiaFor4O6cFDQw413PBbd7xbRAYpzcBHfW5C277lXToRx/
+VgG0S1tsCjM/BfGo0P+gfnqOMKkSlfAgcEqfb1Bz1wEd8fgkIBj0B1ywjPhS/y0q
+RRsL3+syY5TFAfSXS3nbxMRRRepmDDbVtcb7Ypac4Mq8E27SdoJXXFZOGHy9+O5t
+L4OCfNSBbMWXHlR5tD4urFZcE48B1EaCkBvPhxPGO04zu1Ueh8R7M6DshaaYUHQr
+enSjuDSNJ0xsxSb+yO7MgIpQtt3n0tgDMADbchAZPY4tOeXqV0VIVMVOHkbuDpKh
+XLvzlgu6craDu+QSkWCNRMj9yjnaEYF2AKhifsDltBmmM39SnaIy5AUfYDra6yG6
+EAc5bJ0f6EOoUz8FKFM+UkGK2ZFjdhvxTgIsuC/zBBO94CGDyDaSmg3zvu+ekOh3
+ojMkqR6NWd51wzGIwq2P+9zAcH4Y/yoHGQYj742DNo/xowpNebHVFqm0P1cIWe/b
+H3xlWvlTmlsIT808zBroGX1jez7COR2FF8ICCqfh0Gx3CayjZ0TsnkiacTHYaDpa
+00smoLBxITyoLs7eOyDDSFGEBx/KEVJymacvNxj091lwYaai9tCqkJRaou4HR1CT
+pZkfX2gMtIFapID2h/5V6JsJVv7bx08uAzcRN/agN05EZf8+q3hn+jzS0KEj7ugM
+qhsV8eV10bfASix/orFwkS8hxctlINhnEtMi021huE8C1XKfCxeAjUQQSxxFSY3U
+7gCcAB0t9SuIfoWh4LSaF4ce9BAPWzWnQ7W3zCfANFyhFqGM39m/4uBeD/mkTL6Q
+yaOPjLK7GZnbD0YScrqUwZZ9KvagMEU3VZqKFM9kx+zLHlQraCxkiFOe1z+uqxWP
+OvWc9XT2ele1+heY4NVlegUCu5VPYDsTtDidUamb/sCP3dpjjJ3LKu0mBqivDb8Y
+tM0JnpX35oyXzwFI+mDNCoVta3o7EYJLcHDj0ZaR3lBj2hBQit/K5laX1wOKMXbS
+qm+zxtl/6++kfpPrz49jAOsfka5kuHmS5Va3b3ltIEJfA4pHJqUDOHPevroJJQds
+kq3wQqPsjoQujPwfyT/3gOyMoFihlVsrti1GNXpGEi0mf9hDTqRxJT6YdBgUqRmD
+nXYqCV2+hoeYPLHekmBmilAFE1bgalCaNFtfFdxujxPA7ClFEUv3IQ503kpL8ps3
+30uOOFfZQVQuDu3vTv1y1Xu9BcsJsoMm57mEvIQPaOSp+pPnfO2yJuEiWTZAdhZo
+PN20pvYqlnzjZXjezyaYHxiKkf6YFW6fEbyTktP6oHUjXhkH96OuEHurNs3FcXpG
++HZVPUYiUgKm07T9or69KqeUHoVbtYufEzdutY7rdAaDx75S5uZf7hFWg0dz0YEv
+idFs8mz8OENguQmLj2KhhPP8e9YmXN2l/NAGAedCD+JZZBS15AxFibbyWzFdRH3Y
+/NyuCm9+w/T5m60mzdZP6eLWQKWEzR3TUML6Ppri70xndQJDrVTaYYwht9HhmxP4
+Ihmhur5lTcuoAA+/71Zgnwk0oBt11MyB8LGuHD2x281Bqt0OLgUGAuScIekFo+1v
+Mf4XAXZ1itYCWFjxz4UIM7v/Km3aa7bIAd24euFB5y9wxTUMVw8QENOQp/chtxQd
+t31P6DeLqMTf2d9p5AjChNpiS1HPEQhUXiXHynxHb5Zzprk8QOaIlCfvLRfMEW0+
+6NjQoUKXY3NmT+If4/QGZQQqacDo83Ng5rzV3ok9ezu1bS3sLdWNeVVT55XyQ3hb
+78nr8NvfNaoipDoz1cfh38cSlLPhNnNHtqfwb14niYQXPDs4/wPNNPqhcRICBPKl
+AL/up4tN/ApSmSfWKktcN+tWb/XnxFfw9bOkQWYJD/nd6H9Cbm0cVd8+492Ow+kL
+xJ8Zq54OPvLBg/0JpBZuPQLhMES5qYa9UiUU3Y/1lXiv4C/FB0IVRH11dZAV7F7g
+mpn8IZWWFrWWhTGya5oK8A6uZM7E6B9QXjtZisUlpkbLbvzndG/Wee7AEmUI6NWM
+xgjn4lXzluKWFdZGkmefkSytPLxm/5rnur2HGhTGHC0Lkp46HTrpWGwLv7qAuFZc
+nHLm0iquFshgSGJ0hX4Q2VHhBX39joGCGnI5iJwsulB9eYPSbAHY2IEUzjrz1kTF
+1wKbHM3HpMyfg7GgcUuvG83KR2M26aWRkiqsDr0QfBJ8uDCluWfAT7xi8i0R/dP4
+wYX/yyCHMkAFZ2Pb4a32U/5429A8o/x6HJG2Jt4pnjGFF/gnasbFKrq7Dltdqyi0
+EguhCv0W2lKvQqC81ZJNb416pmePTVMO/vqhchZdh5Ufu4aTAnRKWLxe1X+2KWKG
+cyTrjxQXEILi16p5z3mWFeNSCeXQ1NowfP8Xxg3JSX8Ebb2EZqAa7UD3+tQpDbuG
+xlPYUvpV+6Y+HAyKLjRGsYjTbY2ibur4PsgsK6AJ1DGgF5vxBC1NGJphWy9n5YGp
+xRGq5VH91Ur6wxrAOOZ7MS9PIvrEi5/51I/F5aVrl1Vr6PjuXv4i/eCPcmZ+iE50
+iLqlUs+ND2I2v53PVqklZ9CV/BKsPDWCMIvp/z/75QQGQk0tRQp0D5z6lCBhJFiR
+ubLz11yZlNtk9hbB/yPxVpd83j3mqRLm4ZosPEvOlRIdra3LtrqioVmt2ageVaxU
+WSuxWG5QObQBDQuAuNCXi/afny5NTg29s9SiO+z5z2rMJ0Ph3yOANXGW/A9ZN93v
+RNbtipAQBAaua84c8v/rBs7BlehTEk/ED8VWEee5kYXQOG5taIVqt1/Rrg6z2MHS
+3bpalWjJBZf1Ui9fjLFkUrbqIA42zdGOEITtfG1qhJPJ1kjc+411pqjpIF36HL0N
+idUgfkmMznBkgDI3f0bAkn2I9mO/k4HGGllxLeSHm0s77YlaW+nVbCcAva8B5yn6
+ob0iKgw/M/3oIQ4KYXauZNsLtcMqb19lE0rpstHYF3EBfwsm79ZP6zvPsmnFDwnz
+NeEOOaKsd02mm99BZ6Qj/JcsE8iTRCPu1HvzqTX57B6WeytEj//YBYWOjwN64SMO
+903Two57yyj5D0OeykEgUxFpj6aqG1BJErv12BirW3DHJoRNUqhnz2V7TuUiDPiv
+W2qIlOlffJ89A+VBz73mt606jeCgD4BvAeVN1F1iTCaOCpAxW9GD+3Dq56ZJ8WVD
+2nlhkvn5pCiUFnb5cWKnMKp9VYDe1ml5u/xj/rLoUz4xCpSLsZkAx7NGPiBdxswv
+7lPHVvwsCtEt3J7hpBUak/tmde1lbVZEeQQLj0KCsYsktMC9+wA6D0FE9x0KpJmi
+o4ONu+q4minbzhAfcoUzCikLOdEqqy9xpH2fMlhU42prA3pxPlPteMkL7wjBJH5T
+2IC/Lr00lLykMFoi/oz5envPVlWLIx9mdOERJVDJMkm+1vvv0AeKpuDOOc3CruHg
+bt0D5QMFo7rcYiO/DR4hOtghhmlitp1wekhgctXe+p41QI5OB5pdP/YId69nI1gg
+zobt5yBEUSN1gebOVcIpFXYkQtv6w1f87+eiBe84dyx8IvRV9n02T/s8EB12yuLN
+OYvRr/z/StrX/58bvQAjuc/Ny9jw9FJ9ZhLoo8PbNaFnXTJtIn2GwfFe9dMkTuke
+ofamLhI7+x7VRrgbFABFaolHRlbM3SUns+2q2F1EB2/hDyo2DGqhiAPsxR29D3yp
+gqB2z4gbepGtkck2fL1X0oLe3nWKXS9W5NwjMitOSU0A697KsKdRe31fNovISdc+
+TkwdURBF69deZ+26j1yaVFBc56WOxNCh6aa0yLT2rpxpI3YvAGb9Lt5LT5tDYB/Y
+95NLgWGP2wnNJ/IcIV6n/C9QmiTtBEVj7Wy7T6Cr6M7w6SyupDHOR4j1D0iN+Wv6
+WOQ8+SVVVLnX034n6/ErlgNtgU2DBYaAWxHgtKnSAGbMwria6+ObQ6b/W4xYdmuY
+UeNkKfX6uGko1xFit5lCqbVlxp9NgqXlWIMsQV1tN5GTxPwosr4ZZENv/mJjvvKG
+VdZxTz84GxCZ7mGBt/DNhqZw0+Xjx35L1IdB0355RciicG6C92vfng8/kk8rW3NW
+Q3QP3EU/onzH4IpVdNSUciOCRQKX23rU2SWFpoY5lgsW1yPQlYwKquPZ0oquJ5h7
+WhcKXjFCw9LMkiS1VNgh7U4Paq6W1OVthlnfoGPL5MmfTVy/TBBMDaq8um1/4ayv
+DtDMsAGtrpsbf3kNvjHyfgAXx+U8om3Yd5vZHFFkPOHvr+4NhIRMWAaxyqKSGOvm
+Amx23fcdPITmqhxwFZ7Adi8RyG59wqeULi3db8G/sOexX+ZEzpGZAhiiJAhduUJt
+4nYAg4VFAOKDVo1paWUMKL6DO4CR6NXVvXpiacSYyrfqkyXIn+zbqMaD/6t80l/3
+oJIYaC4R93VZDU+v7dCIOUyvjUFi9Jur05py8Onv8BTL5zXIX4+pTUUl9anEhpkC
+5GYVibKaK/4MWlMtQIkFuwvWpWT8YrMk+ik8QDAV3AHLz4ofhz1ZbTEMpIH2V8iW
+FiMb3W3LJiIbXmniwH4nR/esb2g3DD6QRrE5XKeCYptG/4rqbYfohlQDrmdqfSmm
+4bLESAwb8b40ZYTpFAmGtYZcoKkGFCI3b6/a1fjlILVhoeDYbBQqqjRRFevib3KD
+aTOJaXR1jPy9zu2V5h9WCOlx6vEDJC9hJYZp2bIDDkWbWiOo0lUVNz7NSYV30lJ/
+kXf7xrvd25CzmUAZ1mmK5n89knvVfI7M6O34UbD08blT5kyGj2l/27aBGo7kCh5r
+SsjupDdJIMVrISq0g5/Oyigm8yCjiwf/RG6ZnQKplk20xX+sqs563JEvsBkX7JpF
+1CHFhAZlASMk9MhkDb9StOyUmavJR0xenp+cp7gStbtcPXEGJveoxMG7TnW0mvKU
+uRIo3Wj7Z95mSckuVPp3/P64eLL+nRB9RQTmcwgHWXsEur8D9DXd1GnPwBIXG6An
+Aip7fSNen40vlUToGQj+xPZuLgaSlcFBBh7BpfZdpkUI2k0Me0QDjU+5A8FZiBcy
+hJ+he+33k7uQmpXznefrgHjehJ0/Mo4NGOcziseY0bNR2GYJChodq4bOUPqMSg30
+BMsIWUNzfaFSMM3P1AeZXPIcDit4ZuU6oQQjcvllqaI5xoQg6j+xrfnaHAPrrqEC
+svnQ5sJt+pMAhttz7CFpzwW6azTDB9bux+wQDV+QSxcYs9zfgJiNEba3gbOfrk2L
+xRq5+tKLjdJ3IFLUAUstdXpBfrj12nPa1UQw+QwYAWz3ekEuiL06nFKtGfL14AQZ
+dRHbY2Y9FAr3RlU/gFW1gQyyX6BNFNJtj4WGxbP8DV33WTrrfZ9aeSQaUQoES6P/
+IkJrk4P1e1QXZMhOQpvC9BIDge/foh1NWXCxZWBGPt/XpTfjjPaMgNyveT4Fm2Yo
+WO2FwYRp1rUM8G8R3Ukq7ktpsqkAUslWg0N9YeTMeMbfcc9BIZqV5JvjXj4J1Cwr
+UAVrA3TKRuOOmII7WbIy8lYtvpT1KvCfM4PGflv75ijOqovD2fuDS1NTTuOGFHgv
+2ZiJNFwtXvh/qrokFcUoUAjys6hJnwARGaez7hmQTlJ7Gmm3ejDLJUv7u1bWeC48
+EQk0quhXmUEY3K5cRYEDyeoddmA/KkHHx4KZ1EKl+X/8/SRO5X+zs12Se7bbBcog
+w+jBdKCJ+oSE9eGvC0MoQYhRAih+m4e+rwuKZGDWjUspL8RITd5Ams/7M9p07j2c
+ESiRTQxmQ2c3k6bABonNottQia1zunkpDf7jhUwLUjH5QXN7i1ATrqUrSULRcB4m
+EAf2WjPzEXfasc9JhIxPgMAL3Tfc8lirCoK5omL2SAcESzDRS3kddo5Nilu7QAoq
+DzieUbC4T5XFuMP5EiK8lAIi6T0HIuAaZGv0IYcLtDrsNhmMj1Y1tGND7+hUZP6u
+kUyhk/aScX3xdzlKwrL3B+goyiySthJ+UbfalT3n1Zm0VQaezbZ9VYu4OBj16xqU
+EWGqL9mhvQ9QF+VZtO39KYtM2DvTJ7DaPDfbgq1M7G20kQTEqBbhyNHSJJ5JCmuf
+pv4PvOsBgoUpkFZIvP4Ju5jrph4LeaIvpCeVCOblLw8bmMNdoDwzfwK7ksa3Ir4M
+9T2bcyO2ZdTUsR0ST26B6wmOtRbsmCuPWBr2J9uNRUiyQrCKpjpQ0MvW7hVTZMge
+OhbWcRfX6AdlUtrgQg3hf3hv8voCi025uxqM+iPqLjQRSealk722ep62l+kqoWQL
+S+7B4VbYi56NCosAnTem6G/1oIeFuE9kQMDZ9B/GEXpfxOtnhynemfElQCyK498s
+HY9fHfwUglUspXjTvcdtMjXb/bM+HFXP2T6hanqqY8tT7qcNe9uFBKMmn6JzabhY
+djXFcVCjytzWVxtScJ2WBdQP0GeFhFPGwzzOkmT4OM9YzGWBmspTqFgmVD+Teyh5
+qHmxSOZV4cmX93HX2Vib+hbbV0/hkoLOnORAR71ljsgUBXws4NpoOzGFD6Hxe6yg
+tE5LRmEeSgP++QsV0wwC7ubrpZzlmlt7BH4b2sRo9GvUWNPCZOVIXA3SG1pOv0Q1
+eBN+7uRGCeiFnV+iPivisWSZV19ZVNlzGTMye8RcRZDT7bevJ1n/Z95euHKQETiS
+jtr9umh3UYMk/GisQsruB1HrYT5I5DKQit3mT4oDDES9RxodiIomote/n7et8dL9
+vk1rby5AmvVK38fxhUpydbw08cxqdEm8HCXfqfPrS0ukpDcHI285s0Qt8ciOaIwD
+BRdFFsWHlnFOY7pQrVC6CcWM7dxGJBPYzX2BKY0P3flHYl0zPqd/5o7BaaOKBRpV
+1zoz7pfL1uEZjr3aNZ1w/8mTUUUGIMD8g2ud32u/fQvvE45HX+/a6cyqlMgktYOV
+yuQl6BaerJPtURSX4U6/aV1luPsP3tvjkPT6bdxsiMKd2LxIK61WTsbonsaWZwKe
+jlnLCBdy7J7ql8V6oTS/KApsmfJL56sq+fHPc/+RJ08SXKgmdgIedQCziJgKCp/Y
+sKguQjqQ9NvWLNTuamS+x4Y8N15jod60sJH8q+iVuyNNwqVpUHsGhj613jOKg93G
+i6l0VQs/5hCZLpKO2k89cpwh+E/wfWKZ/F5PONWa995AoR3DFY9vN/WUWhmHGkMK
+JGuKPgiQeMLMsebEIS+uCc9S0/krkiDrvVFHbTNPpvSvZf54x38xiwHtsNAQJJfL
+GJBxGE7iUyPTFoz2nLIow3Oau5wrnTVTEWumnvfBPEAqrCS7MhJqv1AbZgMCuhq6
+mu/54u42Prac+DdBDNd07HoXorlt3V2VSs3DEsNf/YlkPuLPZnawzm92knNuL0YP
+vErdFoO7R1AeSj5u2vEh5I0ZHhOm5rUWjBwgcfOwNF2yrr+9N99vTtCNLeUaN52F
+TvVcVIgMiyTTXZsisI674rL+kPDMmf3hXX6qbNf7bhAIywpBandRJelxH+5pPQgP
+elgd6OFc1zgn7alDjWWgaXbBnTHwHnA2umfQtqdysiE92AiqoQ1lZB/sA9L0SiJY
+FoNWAEQn/Pe3KPy2WDDuFOnZRyb91eWlhqoF5BWCrqw+B0ekDyYHCc2uY5ZWkvTf
+0ANszdpFrxYqNgRADHKI84gBOeBDsIzrYeeOgguzm7Zc3HXPubQxaq1vBoBUBYIZ
+Pa3RPkDjsjD/dsJ6jpIO84CQZskIe0fIdrXXOjRBZLO8nc9vzLAaqgtFL7ftfzkX
+R4mgUkJ5VG9b/psf3C9W7Vs6gQl0cizS4fCP9ysOVvELS64cu2L4ZDR4SV1KZPtN
+qrAvetZ9IKSPP18i01PfaY5hIRuEnu71uED843m71ptDCOxziFaOC//8IXY6KmqT
+HQ87lmIr1Tjl2svwjBSpOLurmyS9viLa48wf4ZAJDyAnn/H6lW8QFrAYtsgzbrS1
+sLEgepepo9GUbl4tJhsmMVl7cVYU/O43g4ZSnlw7c7UmBZ6WTI4/ygJeYMwRPrQY
+5Hmdj2cJgR8s0k/MKmXVLKyiHykOCOVUoVuA2+BmEnKjSsjpGQWTyRzLrMl08cen
+a0udhfboBoXr9hJbRVktzFxkJf9TTCk+Ny7g7oSJIrR4WHOvdX5GAQgMoDNBjCnM
+3BMLEUNY95RUZemYZ+Vpx5C0BRpCgbRg4QNLLzSBI338pJBm9W+xt1nnwx+yN5Lk
+pzQ38ba6V1v2awcU3O7mbPSxEPijOBbRpOKZV94Yu49Z1hprFmqFnbvk5Itnt5r5
+kNzZl7qysDMjeha7ako30ETybBQQvk10Br9aXi1/b+gaWLb3GBhhH3DVj6yHfu8C
++IWNSVnbhvS/5mTy2ewxYOWIsqYc3a53G6OBxF1XYrnq/DpnqEJmxYgjH74aS1jJ
+wdFsktodO/bEvzGmxuKLRmLrYmp6X0XOR6bTqJxSr1qlA1iPww/932IRyKvc+UcE
+SdlntjchabTJkyXruclUOE9M2SxqLIrPfOwuNnpN7hQvgx3/KJcYre/nfGgSEz+S
+JhFuNRi+FHee2D44+PyVPXAG6SKEZ2DXGEnblRK755L/c45gZoseASywbNBxOL9H
+2RFDh4tKLaMztyaGOmeZMHXDXn6cbU7BTWLySsb1a2bZMMNJRVadEAdCuGSahyz0
+G7xcbW+xsDZbKZu54kNgPuaRKwXv3fI9Ht9Fh7Bb8Y4EciFb509vWgSwT0s3xYVm
+Qh3/etX4CDTnnavflw8vLvwq5Wb6LZTjsPSoCb3RLnrNmOYevMexlYdg0RlB3VXx
+7pNAAFDD3bn9Lj1WzN6p6PL2Lv+iRqdr9rK+GarnsbKztYPETo8oFkhvz+4Llrhh
+sP1etZZNBRCTlJX77tnK2XdHoOwX2mfM+7lXDh+q9KvI0kJd5JAfkKnh+MLCpeQT
+LJub+kt+7ipZ0CbEIcOTRQ26NYdeVUQXHJ3jVTkxpgLJG8A+wPK0r+mAnkoAGo3C
+SLskErrchI8LSvWoEZC+kf5Q5Y5rBu6cclpfSphfKUBn6xbaSmaFcwdPnBod3nsl
+WBv0FxunIBahUIlqnIrD6cQCmaiFi6BSfkAX7K3qiD09vpzNNqMa+fvnYOfekOKg
+bdRGGNALTh+TNGL9hEA2ToAkfJEWSajW//I8DnE77AhtSgHjnQYg0qRkACVXls7X
+mqt2iCVBuwUiwgCpiB7Sop/Vt1Sii2ZNGOzJmHUVxrck2LMzC6Kgy6IpAkDV0VZx
+pZBQ76GB+svJcuf9Tl3Z+HzPplJJiwUyXFlAbGyEczoKZKYfVBYvahvSC0Lw3EXl
+iUuAvlPSdkj6vJkFXfIbB6dU/O1nfdFTXS6EmsjqFEGeMAosJC3M+8F8eultgikr
+BDNcagL6caYEdj8k3FYMQq+iUeVmpcPb1Bgn7V+k3sXW6CIMr7CzzoPTgyw0glNT
+jxuZWwpzgO7kPmxCiXlvXmwC9burw/WqRWRBCG/K9tO72GP1fQWgE34L59T4jsT2
+ztKQGfLuTlAxcxyXB69EXDlJEBxRb0QMiouYPDiAkugIxqVvIoco+aSuDKa8STOI
+Hunf1ahl0PiLI0U2H3PN1ffzvmLiCom2FZRzSsXxweDbBlHmruA5FY/DhdMFYncj
+NOCJoriFgz9OwWn2YV3nhdgGOlPz0rTjaGQlFtlkqg4a4c1Fi8EbxM4VKlwm4AXq
+FB+DxEk9dGu5qRrkV194Jj4M9Dfe1VdDhfFzqbRTnboJVfOTPr5QleSnhxo7SXtX
+fH90AvE58pnDAnJsmR1gGBvaltSXyN0vweYkOy3UmIHCWjTSDt1lU9P9eeQpbHIe
+tG+lmePEvQnPtXiGbCO66bfe3WXGliLnIA0mrLJkckLxvzdsACJ6mx2d9PAXc2cK
+fw261+HSxBu8yUOOX3vq7CF45uTMt+hktrrhKsPS85xlt8JQiJ+3gusJMCyONAHD
+EFadjsfwy8Ej8YWM8FdeH4EE8e9arsgRjMxM4477dLgTybxYCGGDa3PC999pmqZz
+2RU/JoT76yJBRo0zo5yZGVQceT2YUW8TYGqjff+MIDj7mjUW22vgaCyEfKyPqq5h
+pFs23Q9qSEcGWlbsGw+40+JembXvQdtRA9RWCZ0IcHZ3tkdFgdBTerJ8fNp3g+kE
+A1/f6/FUfKoYUZQE9SfUaQ/D3Iqn9l/85EUPcmNYawBleYtHgVxxguQTSVTbUCGY
+Ce6pCO5Kd3XlcodjQmQBXHttiRRp9y0BHvl8AC16yhVLtuCPcWaDpIqMRO9Ypyuc
+YaElktJOGjBpR3PvB3oSK6geCtaMOS6k05x20fNNuSRtV34Lb3SkSEZxEalEk/nd
+68S6keGQMWMheyVghcwRTaXyRgn9F9ApUVmJAkTYrMtg5zUuq+PbmX61RwGQyD2v
+FbdS3B1OkXRe7BO4U/6ndUQUjiWt2mPtuunx9WUwqmkv19GYhcAGlwBKIcj3vpXR
+lSDZuzLQIfrkLV5bUFiIIQuCXIPI9pnlXZHFPLFT8ALPHQiWC0nnMisEWVgYSFds
+uzTsiXW6NOEKQP6GargIQ53XdXOgpiErel0iK0X6u7Iy5JAdQ0iZjmpbTMW5Kmt8
+WRPfofxTLlrAKzBrrts898q9H3F7C8mRHuDiftoJ8uvGNGWWnjctXvHJ3c6XKgGM
+1MEooOPIVwBTVO30DD+DDvMsceCNNU85wgZlLi7aFsfbYuJiy0sMr+rZwwsfhBSY
+bsXKy3XQ600+F1za9iZATEJQRx/l0wVX72pgw8w3VygEzk7pzYThKcizAi39i/dp
+VY7hLbz/SdsJtSSBU3R6Gwd52oFBYJmDJ/3mjh1ktpfwLtB/hlP6FwjHph0ei+pu
+P8KkrqhJp9XivKGQB6FDYOBwFz8FwIK6kP3MB7N6uAzwJN8+rlGjluucs7yyZ/I8
+LYI9nTEKRHpjJ+aUC/OUoSDGTus1zPFz4euoSltcJaAkCGY7eDaekz+0v6fivO5/
+K7IaxQckMFjaflgpQ23dniaNYkrTeFsOR5wvL9sWSmGm7BIYdPrjKchJuscPZJPZ
+t1kYYeFjSJXSQe9FhJqINx4Yjw8kWxtf7EY/G6wjqga+oqFeAA7Bpj8ZLbb5403+
+N4rJtiVjbaijzzXDlEQRM0NSrqEJG11sp8qAJ5ZEBFiLUkA1uVThfOQulnxxzTgd
+61A6nIby133mrRbDi29UR4qKEgN+58aDJP0B1i/LJa5oNmH5dcDvYcU22Hv4Sb6C
+wpRRREQaLJk2p3JMIcdHBs0CWkEkv9gMD3/JpztIcFh2MPaGfK5v2Jt6TPPMdPnk
+RZHU26aLr+syj1NfXCOTu3v8UZVQHgQ7AbKWhtdHOMUvWJ1+Gz/AgZ7ZTH0A7FZC
+1I5M+kW28xJqqEUnvwOcmhNH7rZnnzovuabR2CdN2Wp3k4bP3LSkfh42PB/QtIKD
+2q1CNBlGeiPWF+qPVyrqoziMcKOCMn73g0elmMsUN8cj7kbzsEWDWbMNGJDne0ut
+chHOnAXlJynO/ni6K0hlLdFxk38KQtp2Ix9/22K5immUm5Yu3wwTgByvanoO1Nmn
+tSqPfOX92cfPTDs50a39AvjwKOVcC6ify9LWsgx+fjzTdQ8p2P2YVC7AXFqwOIvb
+pv5kWC1N5S+l+8PAykkfvlBckdKxWDdLuthpdycjvgzf5dSXeybGi1C0jccKu8jJ
+UeVtmHF/R98aie33xd6ZaXEyZaPICJ9WLliIjGuIMJ0MxuwhiFGDNiASKTLkZcBS
+98VVwsIhf7lmacAyfLGHZQf+4d11edcb9K4FhPBJj7f03zRY+QAiE6Muj3TQguu5
+lxxli5iQIS+y5glTl0VLe9hCkAuAH8rDs7nW4nO4Idz+WGsRr+vLkzmVIgyhixCF
+bceaAZhSjRwZcu1ed7SVEOq2FLpw9vpvg56rxVaidNMTxFOVpiAfwik2hZoltzVj
+YUlgsIOULTS1OdLY8Fd7WZDxaQZKoTmzEO2dL3X3g7/7epl5MpPCQ4fiR1+wuEeY
+fXTsyYh7JJNFv7CRQMxJJcqVrfLAKxL8W2pjc9r5sCboSwS82QVy8BYPssrmH+mH
+K9V9YAehpVlVXV3LNX7o2J7EVUgdPkeXqJg/HJK4alGzEWHvxqI3HBXdaZ6bcG50
+wnxvqim1BzRPMb+opx/S8Zi2BEetlqq4kOmBD8lcTeXXb/Og7HlRb2ujWsECiDvt
+fLfY0mDfrCtQ3J047nheOkv8S9d1p1/PgDScFQ4oeSMCOOWMrC6IT0UbiMIcVmyu
+URM9Fch1cbU8iNdRXM8IScJAo6hZqqj1mKhAfb6+zG3Uqk6EgadRh2GiBJApkKK8
+WP8JofT/5QR2blWhJ/SMZj/9sywKWSJblcShKKhStmPAS4WE5X3xaYrx3pzQMBAx
+ZueMPqUDXdLKi5cvo4WMTXO7lrN2Vjtvr7pwyYMCTDKW4W8zMStjzlBbJ0MIGKM9
+EvqPbMfEGzfUjlTTxvV/KThhTv3HqgHT1cCGIU3ipMooZz3qaI7k3zj37c7Mw/7v
+VlDDh6KU58+DOrMqEEajO0K5+XQ7tkSFmLMpwnUSqYRF0SAj3dIQlzvWOspXY/a+
+gshWScnUdEoyeg5qiovbUBcB/c4LQDWThB9Z4jEomrU+PuxjM77GkndTdOGQnd+Y
+wRcKC82ZmKLIqS8vVFmKkGnJzC8kHrOmrO9IIzNLv/5fdXsX9iv9z2LejAEBLpdc
+SCx0N+aP8NlvhfwRM+CrgDfA0KN76PAPzW/ugkTO+CMP4fxvAC4+QzFkRzUgYek5
+a8wT4mmcI2EH1UzyMq/9aib2XjH9N5HUEMG2rJYWrGFCuVdYOf9VTejvnlD1MoNw
+hKFPilM5vs9+FJWLw2G5iNFzYTwllrjE1NHK5OsTxbb8RRRV0wrdBFnrGXPK1IA0
+WRRUz4K+zJvyXCWRPvGRDGg2D/QU9i4gxWu+sJp4hKgEVpSOCiranasGR+oeD+DB
+9kdAZgLYnf0OMzj9ffR6deoT3Sp2geATVsdmq1B9mkzCycRqNlpjXzKhqIErKrHq
+7904UqR5iQ7s3c3gRaknETScHrrTunQV/LKVdKCaWU/3tZVFVlUTi1xDWKjcBvNu
+fwmrQxb4ggy8jKq7oh9N39Wba47ArBL2cMxhohhxzAxqK5m8lK7seL7gcZGMjG9l
+wMrkXsnF1FIzWI9zBOIa5WDGloiHcZsC/GJl67PUhp6Tz02agsdfENexTnrnX+fD
+lc8QaUDd4KaIaA8Fpo7MyZJqCpfhUvHQCTgbZ80YAup8ge+At0Osr+zz+ib1Ltcl
+ZqlmSCVcNYyuiNkebSydcH64rWgSHNngyX0VhsrlB8kxahQqy3wDtpppW3adNOPF
+WwNt9GqYntTKs36+ZStvz+d7W121kxNYzShbpYteQQhpZ8wE73o0P5E98lA1qvG/
+PXV/g+6mWMC4z+RkOweUv+71qNzhZeh+6SGw6hh2iE1kFIW3xckv1QUMNOCnNFiG
+Efds05TyUCHh45S9LF01h7pFFEnzR8q5VtNsONEoB2Aj34mJsgglI43XTRK0gUrg
+ETctCmaJ2788EBu3PBNJ8nwOdYpSjmkjkEU7NxCTeqdA9Qumai8RZauGGFhGFiBh
+djF6ISxU1KrHopRHdQcfNEJTl7xD5FgpzAu1qFiwzn+PEFMIeyRNICS/JOzVfSHP
+jBRpMC9DajQCG7u8dCOZyQWKKqIaxWcUeitxXgcUjRt1kbzAa46Ju91TQi/0bdDQ
+GCmFzAYFxNBJYgqdtFb1LdTANRE+XGeZG/Ch18qCbbDJmfaMNJzT8Pv17IVOwoEY
+U9+FGvS9LTzo5T87+zzbsMmjZSi8cyxqJhab9MyCXihIn8uE4CERfXLhhTWY7G0j
+Xd3diIVUDUaiC8pObN/dfy6oU8+wxxzqm3OmDMi82Tu6KZoj3VijwSajjwOH9Cb7
+gZH9G20NsATNndM7inUJ+BpdT7wgZnRp8Gy6WQ/RyHlwJhSnBojCDEYU5jHQ1uo8
+wpyjUcgm7vXSY0eDci8JBys4Nz7tVYgt4xcStWkOt8+cBql58k8OXgL/cfNm6VX7
+cEWTsc3aJOztdqhaUpX6FOkpHhoCrg1+D+zMQhHtxvjFd+NOPLlgDT4GvKrjNwYO
+7uHupG+nvd3f2VNzbTzq4oylXHooareOUsWQpIy6LcSo60zYuiLQ4QhggkmzNdqm
+21/OsrOFahrHE0VlS5TIH4eVASXzsCq+AR4Vg+7nxJ1scNcWckJarDZQog6sHrBv
+Qas8NM4+iBs+p3B47m0wevH69KN9fDbqWi+vS0/j6PfpLspMZdbOTnGNb4r68bVJ
+6SsX7dUxr4c72+80K6OHOHIcZAaV/wfg5ptcf3Y64V8yJ2QSgQvThRB1Dz3OFBpg
+UZfiU3F1Kw5tBD0DLavuNB6oQ3XDSw2egZJb9H1MQ/s2n0SkpVq9GVHA5lWwHAxq
+Ty80CgghmUQgl+Nd9bpg/dwYkQebMb+KK5VYHvI8v9gHXz3R8bTEzkbAEw2LcOXG
+sZyvbQOVyrMDD2p8XFKMfX4T90k5N8yvO6G0JAZ77AVdK072ZEv9n5qrSUwA0Ros
+jZ2MGwFB2BELr6A9hGT7PpIuldPXrYmJnd8bOZh4SKiKGctFegaHWfiygcDm3w6p
+cniqZvxaDrXvmr1iAKyom8KWEPHVQFs6VUCmEf82Iau8p/XfbD/vOCatwTus9Dek
+gfs3ZHiLu2sFinLVC2MzXP23xgrgbPP4A8IvoUBdauWn5+lPntS0ZD5eFWoWmiMh
+z5IU5PP8uSzE3X4v5+emcctR0zFhvmdHkgSRwZ9lrGEYsMLgqj22WNKAqykIPXQB
+tWbVGSu3XzxRWPo5793sYeZJZnD9FoLrsx+cOPSlim0ag2Gbi35u4Er61Xqqb9mJ
+J0RLltty3sREEhpNOe/UfAPaXMxRh9nziq1UPCR7WS4P27ocCXfRpE3ZyiYUQSse
+cUVPkNPat1MefKX5iR+I/+Y2brMw0YVX5GXsfNPTBaeLTWak2mA0kOh589VRiL9K
+lv13QNZKANKFl7w7N421Hmjztv6W41XJH1LnWtPFx9ocKKwTsKdkofr3cNj+De+g
+y3gdKHeg86/5MsKrewry9fH7r/k1uTR82Kt6ApwqTwX4Sa1w8QiCEsskwgpKd6PR
+wt2U5cgEOkQ2y5P7YwJ2PDBeFP1fD70y+JUbr4PYVcqq0xx3Zf8wDYax+Ec2b+ZX
+0ZzXpBV5VcqLfmc2wBFY8RA6gGVYVHIbTUtDzRZtgLzIGv9+fjvPobqVn/+ZAT14
+v/Qeu+X0dM/dj0w/VxmDbkZmEgRCu5suYIrqLV9YQlL/S+Ng+VdsWClmZcM3fZZs
+JRSDH4Dj7clTvEZnvukxQLfk+Npz5pX9kvVTGHmJ+laf3n/cHGgC/8o7FkUj/BeL
+nIqFA78adDN4nYMtb+Xv4EYFD2NdAfGm3L4j83esD9zpplDuL5M2lISs8MsTNHfp
+7IErcuQ6pgbIIZNDmsflBR4ivA0ZudSQxrxQ26TOZkv0fGIT1LMAS1+DrUaqruSf
+uNquzhIbnv6XEHpvtjzUfeQDl5KgdUie9EsrzXSEtWpxgHybd33Sa0k7MWtls5mg
+1mqg0dTH6Ruc2pd6SKvlZmUlvhoGJqiHnzQh+9vYMX753SvErqigJBs6YOgiUfb/
+iEq7amJQy8tkMx+iQ7FkuoWucRr01SX3A1nnNL4Us8v1mHhD7OVq8tccz8IB1YXW
+yOK8fapMA+cJPjzsl6v5ZCz8I10Mtay1z8X9yDEBdtdvvkIyEKpcRcO9rcUm1IlJ
+rj5pE0kLH3J3fdDn+cgrI/8ID7LU8LXuMSIm6wP0Sr6UaQwqagEFSR5Xz0dKD2m+
+oUNpyPu+mz1QPy/1pFcaRDa23D130i5XSYJyzwQWMMXzrivv3kxYF4NFngK8xo89
+GbAiEWt98cUVGRuw7rdq0+sycyksNfm1qOR3aflT6zKVNKvfn2z3N6AcysTIdpX4
+aTLSG0wxAv1WiCpgx7yRmpKjbz90NHpRvoK8x69xk86P7CLVM2t2A4m2vHUPcTu1
+1IOLLz8jjlhCOw6ZZfDETD3kcLcsf2xZt+6iopr9vIt/NRJj1LNLB8rp6KCwiZef
+svoXteCLXqE1XzL8mkK5oyE+pe02rOHhCBp1l2ZcuOqEs/k1IVjsXU90aAW61Inh
+LFw0GboP9D2G99LElHUb5CNNfackrDPXRAbq8q5c5lyDkiKAMQoari4f6/1JbmP9
+md8MzLH/3yM/8IlNGIFtwYKRC2EXiv2phChLWP0yoyxHZu0oeukax8v5tMUpS7sf
+JJpFc/oduvSHE3Kh0rLhpaTB8thiZYJJMqDHSskrKh3DVWjENntdIhqgZ8ncyApC
+vyYe0hPA3eBnqPGNE1BY6Cxw5gnVQ9Xym7WAizqX+n/uuXuh2TW9SFwdIjOzBtu5
+5vb280idk38qV7cL/CBcicomaE9JDh2lzLVWc8yEPvqKqKOfwNox/XMQh3kpXsm/
+LwEaUncIDIpADEQe32cvI/6XAsXl4KGxC5Dx6vWqFUDUV8RQZofLFGkJHk7SE7Z0
+IK4UOOYS77RhNvs+LFgGFmDJ8VlFpPTA/utTtdA+IaJGvmYNuiDe5AkvIqoJZGPn
+bMqxEhyJe9I9IPENSu/8s0tu6R94k0MJPD/jJHnyxZFGths3YkzqWOzMXBRBQBal
+uGlsht4f/9+KaIqZzWnV3Ankya7PhWev8/pQTopdh1YmyIjkZ58EHTPYoUQFrGQP
+v3B2i2Oo53jaYDJ+9mK7HoETE57NRhHo+oHRuCaeOnESejnvbEqRZ5X8qDaKFP4B
+x26fGcjziYpYdmrP16XYK0GO2WoUwNVGcXXUGdXrv6/2sbLdecZ5TCJ8bq81pAN3
+zAjaq595Ub7KlGikS1xF541kuRg37Gd1tE68i2e02gj0sV+rYCszGsO3DVr/H601
+YoLlVuq5HxIm6yYG33FUv8QOIaBBlVtdb3aG8WrtC3s6Ohjcwwy/3rgXONMJjT5Y
+jxu5IODOg8qBBYvR+FtwzUs2jp8yVjDF2Ko+8TTPfrQr0KV553+9hYeHdrE+oF84
+grySteZEFYEZYzND0cNYmzi8rAUcBcvjyLIFz9UcGTIhHWWNxmLGbiDQGwKf0g56
+P83FOKu85PfIv9bneSiCAGrGpwb8rCbXJS0RHHZ+FFWXhckWFUA4vvdN//y1RwTE
+uVAgk0YuBk13cHHu6LPn+B/vJWM8cZ/OUR1essrUfbb1fQ1+AshHWLc2taxZ9Vpv
+fuoKvCKzElxRbgnm2mveLO4TAmHwgaCQxuFHqA8rxoMLR8zzDQGHMYng9b45BChr
+1uw9WKFy6Mnx/AoSahpMkmit3AUfdf19FIRDByfgZwn0b+AWQB1apAkiacNo68Da
+nKmQK/UzFR8wqk2Gyy04kY8Jw3zF90qQy2BqsvdBD/rB3WhTWxxKreqacCZIWkW5
+b2K4w4ZlBVHPFd+BicnFSRfkDetNGRpbSICbs7xTNADd5Yih0wTZJHbR09V3sT2j
+soGoG+2B9hTsuTHfOvcdBVjNQm/Y3pNcKxx+1qjKlH3dX9GH/0sVy75Y+WWx+2Ky
+jCDkJ8yQssLqZYMPkczFNpu57XC4hKw0lIfGH/iZwLNNN2HLbT+Ew7KLNdA08f97
+uqt0ashaJvLvB2WdMHDASyv6sRZpRICZekBkzT037XGTL6qR42w5GYcfO9PBwfe+
+XnbE1t99uNRROuiZw8b5ghzfQdd2SO9bIPeLwx9C/JKEUzMDUs2zKP8YYwj3zCbC
+L4vpp3IiMxizAi1QghGzH7IjT612w1adcDEEayhKLJMtfg3Rrp7hdqFQid3Xhxgz
+bdZhACvi95DAjIan9ghMPGtThCZOg2TyYZxf1MSl70WQQYS6R56gbyX+rE02H+Ro
+pzOLnZjh5pV48GpLDAr6k73bYzp8HG8hs9Vq8fVGSPnQN0iUtsfVKTZI3g3ULazp
+c74OLQFJVpPKjwvNYtqpu7SzyYhDu9iZXhUJCoxDIpTx3+PU3GhlUR3B0ysfmVVm
+30Yy0D2P8IebYzoQQFWoV2K4zHQYgz6+vmNR0mYo/q5nJZ6L6mkhSPhzTkrO7hT/
+d3EqNRHtmxrNcbBp7WUbdvYlxFAiA/VWiUAkK8jE1qNy81tj68jrr7kygWJJ9JNP
+04H2frnfld127niGbRy4CC1CvXCBo1EQsrMGepA3lCSQdOjTn1ojzH9MH2ZPVP9s
+IpCauCIdKTO7fJBMB2JDqzLr+GcTLdwNT+SYtMdH87via6guZNsnHhEhdRFsN57M
+dUyBfgD42umht8gMfUxxa5QlJgq6lRNyfcM3f4d24SMNM2R8y4oTZwBDwoYf1GzF
+8H7563/Ny+g3Fo9lrfFYsU0MFbpw91iGQfd7HC7DoUavJkvHTH41GaQZZ/D0PfGm
+qmZGSMIuU1UuIp+z/fwC60FDrQ4wLTN0GG8Dr/qDCL5hUdOsdbfJvVIvN3IrdXtO
+54WHt1QXNBkzFGgLetpPqwZxUqWSoQ7t4lA24n2p0yq+bG8NAg2UixYMl77mwXDG
+FWHkXXHR4wBZFQzbxgd+lH/cuA9jxJalVNy4+9vLiTMIV0o6+n+BhnD0nCpOjzYu
+lAEISFkZYwt9w47M1baEdTGk/ZXiQuzxcOyEMa5/8+8pB9yk5DaBFkfQt/6RfNLE
+jH1CaUaWdKtK3dDYiQ93+I99U1WDYpVmPedtKSVFcC3M5nmfQvSpIlrqZfSR2/dc
+sWtRs85U8cetjex6B+HItghRY/tvQKUOzhHVYiBp7KGFODeS+1NdnYfD4fcfi/LT
+RJSJwaGdRJ9Uv+8eUfZ96+T804fyWyjKJEq4KWbwp4fQVindlX3lBktfTq40c1MZ
+ye7SVqFP5FxmW+NkUudqyU0F9mGSaeOGNz2Zto1XsNt0z4za0UxYEPM8hmAWMtG8
+g3eD6dBkU5NveEmqc1mTQfOZ3Aa2jtwN335N8yrxbIcO9YTxHf1yb7gLg6sWGgZT
+vJ/f7LaoINbbtRS5TxyKeNlYuRD/+1xk9M+iPFBkGudxVGah2rHYUe9JCVmRHDbf
+uSvh1tDaANnsevp3QikjGMKzK0nu4aRAnpNzN1PKSVBzZddJ26X8a/SHxzD7tDo1
+ij7gXJL1SBrWxgOIChFDvrvrw9eWvxLKy8oOw0EK5G/nhceU3UJ8ahTOaIC2zHrD
+8O5t7Uo75nXWQXgYwDQcgld/KN60tnRqia91K+M2Sngy35hs1KXiL8ysEuVo3h7K
+sNywjReUF9R0giSrGrgNBCnCiVZFWOm4lspdib8/nlzLQ/okUSN1KtWLFyZOErCg
+Dxg59Kn3uBKarA0otC9r84KhJHF2vbcthNjyU9dHqLEAh+6WuHDCoRT73ePD8fub
+5Hic7/g+TOJXLuPIdeCtZvuC6XOu2lbEhgTIlgFA+HLle0m8+J94vX2v3yvyLDYq
+Y/KC8IXVXIXo+9sFP6vwu3uXXBmKrGncI51rRMYecniWPYtVF8OvxJEa7sqzoATK
+WewuSRK58b5HXeQVN7URV7cufVEO7V9rCYl0Lpoy5LQhBFN8wswxA3SNp6VyCi4O
+iYuDYSbuBIyxHIchDmwqFxDLa23YJOcWEZe/e8Jx5s/msxKWVALUlHsqb+1YPFWQ
+wEdH1+my4Ip6A3RDA26eJ+MiKOgKE8yfISL0oLVvnpjJOQrg/c6pBhPS9S5E6+un
+PbxkNGOcJb0spIdq+9j/Q+vxGeq+VLMcuNpBVNoQt71FrJtMxjqb3Tk+5CoK8Iw4
+7idTkiSGUAOu85/p8TNDpcptr1YmQh61VzQgrQafY3ACu8SaeNsxg/uQZWyeuLLS
+tfmfEXLRS35Nxz6hrAL7Hu+/eXykwNDklSqtw9eeKftzCf9XLlo4mN0oWMXWxzAc
+sfsCo5eMWiRZwgrlf7OX0Ur1fJsMLxTKhiBC25JAkWwGfEEzxPh0EWaFIggoWarf
+3pMC7KLhp4yH1odO1aHaex+KyZ3cNE59jyN0ofkR5n/VWsRASztZqKtKbcR1lND+
+PAr/fSQpg/8BUi9Q9eC2WIWs1xqkmCoAKsLhE1K3mH2r4yGBLt8wLmQnwy6bfySW
+W34Nh1Hum8DTuWtBSZ93R85fTVyqG4bV6/ivN1SLTNqCA6Io1nTBlU4NwkL2CmSm
+dpZOMfiCUoIrsSRodmDqb7MGLpY5neYzS6tRfS72DVQsMyK3lGsa+msl9aVZAEC1
+nSpD98PYeOw3lLe7dyiZeck3Sq4Vec1OZVxoIWJoOPS7qr7XBPiJJvYtmrVBh6tX
+zwLnGia0U5/KeRcy7xNYw498HaDpomqMgUpQxHYW01NZi0wXgDtCoFChIeaKUdit
+/rOTYVflv8nIVHb2ygBLYe9H3F+pZdMG8fOXMS3KelCPpbNpESvslhjdj4u0/AGY
+ilMQD59si/UHhzVrKTRtS5+PoF7hwh+lSPLQLGylCSbFCaUgqmdRS6YH1TAZ5f0g
+SfvfQlGrfPZAGcAHJoc8c9ydBZt4If7D7wgQJTB6caG2M/Mwgf4n1rg3jq/i/ZwN
+sDkPIm6MIdW5FNxyKaxgMmXp4PyXaeY1eqqzzGfeDE8J/S5xGyNzK3hZdmoIwCXm
+5l7kzI1GTp411ugyCwHe9aQcPzbcNXVC9hqSfL1I1/42OUu/AlHV0l9rZRtYXNAY
+bTk62yJQf9w0XehxqCARRWS7wHRN0ybRE06B9Lm7ips1sqLsCh9HpSb/ckp5PuU8
+21Ee6MX4cs9t8gV6piwRLgpNV9w/X9HeFzYE9qubvowL/6L48kcAkn9COkhcW7m8
+u32+LPh7Z9JSZiRqpiegTNLpkOgXct6hALVX/Yo92MuMNqjTMOScUA2hpHxeHOjL
+6EL/XNCSGf6Axbb4Imkg8QZ539e+CiMv5480sVM5rDIXITK8CUCGd1Ygz9ql05EC
+hDNMzzIbjDIvoOAo1fNQfmw+y0nR43W9vzqFHlf7LmKI5BmdzlcLEQhzXxj9mdZP
+DeMNT8V/CVt84KFzMKY7FqkXbVQn2W6nwxr+7z6zLxckvdVz5JKwHv4I8Eiz1/u5
+krzOWqWJc5ir5MO5qk2HftY4y7e+SYWoMurU4swTNwXJM5Hzjlxuzyss2Lft08Dj
+neeDjZadvWz+YbujdbR50+warX0Qf6gGvgC1oWDW+48UScw3PQblxCh4gyYnaH5i
+9Z5CAvmLZkcJaXHEodHScNRUTv8t6SNvJBgJR4uXrg8br7xB/hBzLHUtx+yAT3w7
+BcngVIrinsuAO1CDDKdR9vlwnAQOHZEAs4W9s3H7ZoE+W8jdMtpn/QMmuTzU6YKI
+vIRWBHB8ixem1ns6M7GXBXp1YoIoMIew1K8Ew7Q5gA1+MROtSsRR6PdMKDMjuzGF
+lY+cbTXn6pFQ3Pbi9VMxSBjV6h/L3/za5qwxUjp7XbGgw/hfKWR7ckj/76TY4sdq
+IFXOBht9HPmZMDnMR7y9XmDFBIfBuK4lWJz33eGDg8mhKaHwHrqFeKEmbmBNbi07
+7d2az91qiPvotTELwinSXzxrPgAgScaGhLcBMdIO1OJFQP07JenmblGRBd5ngCvo
+5Js11RJnoMuIy2QBw2jnHMnudYoHOtawLwzYZ0VOJNWDLWEnwdZ/sttcYP9EGI6R
+MO91ctRZuRIZ3p0wrUygXPQXkQUz1i5W3gWROPplQd0Hg+uQKMUiu06aUrWJHek6
+/WZH5ZCrhXuPFj46f7qe+nXi4mVdsTMtBjaIVu55HVMwouiEjZeQiiyPGiJ6MjmH
+uRAhjOGPeh6ZWnb8CzwzNKn8qRaAq4TDHVsyEABUAydiIKhiaLdJNlvlIbXeJJ0z
+ItUSRF5aspZq5DI2NMpK5ArAadQHMIA6uI3UTLKPcGoPsDpqjvwfVuMgJR7VsHEz
+jWmeQx+oTrHuiXvIR/V1Z2Uf8czLcRezFVDbHrBkPfhMwVuSDErzUkFu4W3eSitb
+IzWsIq8TPurgKeIQczQbKE3r3Xrc4FCWmfotrzYcUMQhnCjD+trJ4+S8omIxPWRY
+82BFHs1GfIMgRsXUsSYmQdv/zBxgvYwtMvVec/XF3fhvPvrbIka2TwUpdoNgR6WE
+h5PkoBBZ6dFZEjDTPdnIBR46OxGgdxoMGvVPu9Dna4aDmEzedEgi/VN/ks0TYxS8
+3RcbDvRwwB+tgMStnSGDteQXycEZk+P863Pl0Hh8e5UIDM6nr9NDMdkuzrMd5BBW
+MCk+VK3WdkQZMcJlv08I5CQh8Ms88JH7DAv1xvYiikVeurMHNWqJ/FkJDYEePTXq
+ZXvb8VxgI11G9bh3XuVuUx48nGCf01gb3MRIBp/co/qSEENtSJhxSsbYY3vs94DX
+DMn0gOQ1mYTh4c87T8eycKtwPMOytzZXbU2XqykY5CqeEHEUbjLR595qFL2nBJS5
+7hz6w8uKQ9bXda8DviJZoQQpEy+Bj0BGiiXQ39afV7yuMUbOAvU/fBSzK7cIH6Pc
+AqudjSWWC/UrRQ/Caj828Mq7rvn3K6ZF2QIQQk7C5teeemkgT0k4Yut6WirTPe1A
+JcJ7vamSe1RDjhzYa/ozVc+mOeC5PDY362mUHM9ywq7iUa+kcohdESbvdgoJyeCY
+JJ8jESzJXt8+BdEjg2zS6c+lyc6zeMhoF3N588zUQXQwgvMbqQPBc7okLIk5hv3R
+eLfPUPjMrbfF2yQ+TRv2w73QCafBndkHRVxkbkzmIXqcYpQHdT+uccg0yjEdSAm8
+JU692ZiH+Frnv/69prC7kyjjpzKPQU7hZaFrycv166HSm0NqUaHwzWadNLlBlZDQ
+/POdsZzu3kihBZxk7hBKKM0cnlpZEwb60fShoNP/rcq+feuiP5BMxXcYIQQ7VnH5
+C9IJWM/UZbEzEU3axu2CQD2NkcR3kose2Go1pdYzqK7fWg1fZZac/j51h6t2YN9t
+JjonQ7KP+sdNe4DEAx/JwP/OZRAleWM5E+4Um1+9kQe6S6IHk5jhhgIavehDhL1G
+tRIH/BK2BkgvePscNYbhUeNjGX0Ox41s33EXV8OTkshd5W0SGVctGqgMOCZeyHBF
+Z/tqmfc+ytjUidtNnFzpVX/h8kgH8GPLc2Ce97wAt51FoFbxGqayi9gSvsIwe4qk
+fIdBs/7T0Ckovvxxdxp358R5NBQPDCIoV5t58LfTwO2DCIhxDEkCwtyyxLGgmq5n
+WP9PkiNVRCKwillWeyL4tDA+FF+bxDket1XoBSbt+vzn1r3DPZWU2sJgShCMuLix
+XS1wXntaNuyNqV2gZfCI6TNsFHxE2sRrZMQURwIs2ocfFJxovv1fBl0PUXRkvIy5
+MXaqO3iFIgL30NMxzs5YGN/33Z1J5FZG2zMhXoP5kNUwsM/CLWpIiU+6mVUE24Z7
+BkuFWHStlcV8m4DilxP/uD1bhKKNuMrWD6PqK+6lq7uLODOGBK2Gw4bMhPEYSVHK
+D7F9gojIr4a+fq+pXH2f9ubG4O8nA0GJB7gJf3XrShwH4dwIihUz3eaOcJbHusGa
+mK3lGzx1BXUc0iBiSoB6OBpMRrztG0G+UFh0XnnmZcOXRIJZAaoSEsrMdg7sDS5D
+0h5nKRAwgLaGFAuMIxwshW/khPc27jmHSVO9KQoNiWkf9frC6VCGOKnbtQG3d1Ee
+c0J20bHro1xBdZyU79KiBFaliMgb6QxfugdphufbPB8PS5Mao6LHgYB0TYVOWePX
+mfYK51LZF8GhLceUZrIHDTfLACBQbUxSNDWGOkNKsZBO5uLE8YhjAzhmq9X8TtE1
+Db6EWRNAnkVgvgQsLkbYs3a3aL7ioqU747YShnCdpAmP9PHaW+BO2yi9+IUwa/Ym
+nPeOAEaUGwWtjyO5yFif76dD5V1wLLtq3FL7lQQ4ua5+gp8zo7U3KwB7QqHKxlv6
+pUgNh0PQAGds0cAfmgexUaKdY7/H6dmX/9v1o7y+JYt9c9vZxAHcH5Uhww4qrbif
+tkQMfkjVmvTnVs9GsG6jqYJMX4Hr4PsCQ4xlr7YP5rbO59MCuIPNck2VcJjTAlNk
+ePtko25vC5pC3aOz0Jt0XBzItWVigZX1XpBQ69zj9AqDljVoa593YCkgCotYyZbz
+Eysm+Unmrjw09jQXimx8Ff0LjHucQom4mwq/D6FGceQJ5OnusSfLqkZ70RnKBCGN
+phIYtuy81tlyz09nG+NbNd4/px+Mg5AXHN910l4rFuvZwRVwfBcIFde30xlbING8
+QbJ0x5ejHjATJ8733L3w0+DcQKRxhaS5br24RaDp+SfHJysATPd0xgGHNp1XRpM4
+oEODwE7abI7xgQpT2AGzrw4GN/x61fp0vzqh6WGjLfGwOuz7OOVNI4zCqVnReDB0
+ySrnbAgM8iBpeV2ffmx3yd3iVBKo4zTDBu9SJ0TuHNJtbCG1uFt2OiN/q8Uehfjl
+WWIzQbClefXhqoFGLY75kusYzxY3mc+mqHRPz4EKN+nq+Mwn7ydMOebNnv3Fye60
+RyCFLXj4BBsW3dyT3Z927TGugr3RxtEFsKTUi7le06FsDRKROiTN+G2iOeKtejcV
+gjJgWN+3AtWB6AJFEdZlOg60Or3xrCbUq4qv0dQAnQTptkv2/LmQZEySc/anjp4h
+w7ol0xsmg7eI1D9tHPFVrvTp3VHxxmnSEW3/3AjeDXyb/wWECHaVlXsaQUsN0sqe
+yngvBXtiKJqYUPVaKgB1bbdUvcx8cRvN9k0dSByynElgPM7mXObqNuRJNUojyoR8
+ItBXsDdRBSdgU9+a/8CnuyA/Zp7f9tPv7gzTjUD7c1+3xwCER+R9IxiCGzdt8DuC
+9eaoqOo2pp/IDVKq0/nCHkFE70mfetBm5q0dilp2ZvsSVpo7W3flrgRBLndR4DDQ
+jRrOa/8WWspH1RxrH3ValGnqauQgpExqKHBmMb5JUYpNkoX+e/yPNxGBtA3rsQ+o
+tHI67rYgz7wewKRUv6e5bX0pB+nUTNhDknn2mdTuNBLX3f6rI3XjQFGYH4tB1VI1
+ZDNQ9qFpXiL1VsRlDGrtKlijh2siQ5AEOUtRf2fLLlzTxLIvSmWmh9WG+01gaLso
+6Ykwu3tat/5xoOmgsccpmQMhhXGXbrR8eL+25Nl6jETGZMyhDTrNdzHPwIT8oAxT
+AqpvXdN9AdZwqleWh625mvL/ezH7yqtRhTFZdACLSyfhPEx9TnnV4lEnHEAF7Ylq
+88TwPxxDpzr38HJqT5SEnnbuvpO3N45yNtwc8+doOsAYEt3TFyZB8v4Y8p9YvXi6
+8DSLD94MiGT5Lq8ZOxLf7uto1rhiusMCNsDidtUAaABgZBqyIA5YDedKxvAg+5x3
+Wg7nuD6Htv2sTYhT5v9+x+Sij0iV7G113EtSI7iqXxSNudQ7IQUDGS7FxXIDLts6
+ySVk0BowcVXzLXjf649TUU2ClvRnNBZk5lQvgYbegL55d5bv/aeFLY2ACB6oDTNg
+ewdenqG3sc3zyHm2P6uh44ZpkRPidJD+ox1A1rCYKVHKwgtP1iShzZCPwB92zqeM
+WNx6oOvl2cu3E4U4x6XzJiSUBKVQQMRczph7prIR1uUtQ9FCKuadZrOOEGtrJGYZ
+nbEs//W4nyFzVu7AFleg0ia6A/UI9ECLpG4WiLP2PAuLAHAHF1rN6HdqazX76wgp
+WjELO9T/7qcJ/tHQnFSj1lAMoi8oENFyYMz+V3kBCPFAkvQeMgRwOEqw4HeHDbvw
+kok6m/p4JMOnAR/lxdbpYZpEVdRsM7TZ49LlJprCA52ecrru/XdOgoR5LshInsp+
+gQ4yd3o6ER61NzvI1+9Ff+THK2hSytuOj4V0HWPmOQuuNhc4LOQJvB5dY+FM194X
+VUn5pLHQXM3jJX7Vag1iTDy77DXwGpmPrXCirUw4ziPwuaWq6EN/qqMzmxJtBAfM
+l1gMtGCTN/LvKLClg7FWKEyVQVM2FKjngkjBHJ7HWFMAG3YIKs7nV7KMMoYXP6G2
+DKFVZ1clepV9TlKXelxTUgsa1130n6+Jgz/iC6d/+6uk/E/+Lruy4CQ9sHjxWgHq
+T2r+zpaTQ5jasBQlNYpwsBUaVrEyNFYBk/9oGniVoGOM11WOKa2tmD/RZMYM9i3v
+obuEECh3iBhFk2zKWnVWFxFQCFaKMxAcB1MIMpXwODO3nA6AZyDPlhKebl3TwWa8
+p9cKar+5jO3HPfGuAdAq6nzWQabyS4kberVOn2czG4mkN/7+FOLAdCWORr1FDL5r
+FHB6aKmYfXQ0SlIgI6FzzG13UkYqJO413QjmoODpAt97ufaQgLgOl+MyTBSAoFb/
+syLiEqmwQoH4Yy0mB60g9fGi8fDj45oLy5sx1wnS9St6sAgw1f5sDOxsUuS4trTm
+3Cd/izcCxt/p9rcCy+L4xtiCd/4srMblh1YcpM74174WytFNqP6WdExHOwXkSI/1
+CRXCHMQfRMbMZffeMlsliBJP5G1KzWZ7bxqCIVaKKpJs7OkSaqfXDlUH86cyELHR
+cfxh5fvbCHPCp7CjmFa4qE3lJWHHd3HRhxvsH4mWpFl94E6egAedggLVO/lyCsDe
++ZXNjlHLypDFOaeYb5VHJAACE0ogWg68LqVwcti6Nkded0IlQqTHDyur+pF+LmRb
+Lfmd3kcRmVzgH44DubX7i82J1sF/ryDOlaOLgC//sx89I4lZ2qSMp5i+wkTKg69N
+dzQtQnx0L1KnSadAigNlI3G7eMXidS2OuiX/eQw1HZO9CVqyGleolpIUCewiv81t
+Pucky5d4rpizljG8On9ZHSbspJ6iWzY+IHNJ5wONNBck8iABYgvCy8/wotXEUCFO
+NuRm/LJH+sM2ZFduek4jRLoey7SiauZejPHm7JaiBvZZUxAJ7m2yXsejOlcedqWZ
+tfTmvwsV1va9YiiMyqhCCD4ieNiH3a8fsXMrhL9QNHJkDnwC77PGsXsXd2HNNWdt
+tQlDy3Q8vN794pEcr77HGK4UIkw0IBoAS5jaoUzoiDeqMnAmLckwm5d26emTimUy
+w6caxE6z6dDl0zpMXpvU1l1HS6jRDVD852kiObJaPktzFWMNb+d58wjO0qT/Bbgo
+Hmu8DiUUkv9vAREnFUlTEUc/lmCgLVROFToLXVOxYpHKCye0YGnUkv4xTiqsilsz
+yLfcn+HiOQwHWKUvnF0sBOfv6nhyraQgLYUzm04MvJjpJVkO76Sbnd4SugPKs+mh
+JviG09qrV11KF3/A9HfwvFZlSx8jc9HF2z4duphb2Vw3n5ElSqMvL0OyjpnScGfF
+5d4byivS3hIfuSOGRibRpkZLyNQPypVs3ag7fqhpxkEPoSLpMNqYuda23Ua484aO
+w5oPXgVEi62jseLSJj4eNrB+Lmxmdmrj7GZwUjMPgtDS2/NjmAIw4OD+RPHxQq0a
+OZlBH08hV18N094B58Ng4kzwJ9lWOemQG+86wsLDHELSMxTgMuiDQ7gB447sRihz
+1bFVDn8MmECb7o5EsFhpkg/b7KyAyY+7pkKByu56cfnjjcwhDG4R0bHafyr026al
+rNsT451i45vGvMEcL7w6AqhzM8hsvIVa/VfVth7/bVR/Bj5nWZcdD9QIdvrvr9/b
+DaIQtIXhKQmmDVIC1g4mEI9m6J0tIP9LCHYH5He9jaMuxAzN1Wwqr+XbHw2EmWK0
+pMqNoWN4WMudMCsHuxCk2iK5PhpaKf2tGDT/l2i4vf8TB2V7OWPGuqqV9kKAULCY
+jMwmaHKVUmGcMEPaRQ7hMrb8FeCsArTVhgxWwpFaSfx0dtxnVK9AOpxEQwRkMG92
+4U9fydJZ3n/HMaOtulIgLk6N75aniQa2k5CbkPJ+PrkIRY2ZzS141egnpZ2Ebxeh
+GmV3edM7TxivjCjbVVCKgQW8g2d+9wRzlamQ2kQ8pzXNr+KZ0foHVrUNsWEhqjPS
+A0S5R4+mCSB3xxgBFQkK0ulEbhLZoArThPfQw7OtMdBvGBlM++G7MaPYSheg2Cyr
+BNB4eoown2k6h/yPWI7yy8QA7dz9sKWEGtptuzCBVJNFBou5MuAEhV9AV56RdFrl
+4uy343M87EvbS1nnTaRgvuSaLjIF3BJIiHpkuET4o3SEvIuLQe5PZMX7B9xKqd2H
+wpW41sJa2WrG1PjvANbx0N3K06Pusih87yo3SYhoS8Kwb3hsZRGIkmAPOnuO6tSX
+umT5ed7k72cev/Grq44J/CwOVf9hHQSPvXX71WTqj74Ib7H5odLB1xvlW2WvHm5h
+fjBl86t7S/qThbs0TPF32mJHBMrLQPPTAyD9tHKIf7U3tvoNcu/QzQsPWrltOYUF
+UJBgYrcYw/OhS2Do3Iy/18F8lyKkLWC9XbUFwPq5maYJ/M2tSqAfNaaCkQe1NvX1
+XLt+bypfCZAxQl1kmENUHec5R2v8vzYj3byWOJR+Axr0ohIG4ZiL/QppJDsoggf8
++moNmaTAMD9oVC2E4/9Q4knlSeW4cLWCLYkUjhkFzasa/OZqmfUbKkja0f/7GvId
+C6Wq1otMRmuD5fJppX4k3OVfukXMX0mZJlI+U4A8cTiQp/jNt42rEqovr7VrLKvu
+yuCBQgXfIhuGEtS/KKXOdpzsZSL2g0vQBO8KWWOYn/4f6MV+EsFj3U3xGNjXj/Sz
+OhAi7biy9ENENleyLOEDC1ItFrZig7Pm2LVAkiTcdrhCOIqscL5GdpJ+FRYnJTJF
+fC7XakgJ9oFCEMSOKrZhnXX1u61Y1dpQcmuwrYwa84xHY+m2Lm8ePTy/vfeNuvlZ
+OQJFqk7QpciX/lBWgdqdG9w05JG6tXqM2vMO7WXVazOnDIAuG2K+/POtOUeWlN8v
+3oJuiy5x0sFl6rmJpqtU1ivbjav4RxHoB6hJT0ewYlbgKdVccBV6Su+UiKEXr3yx
+Ao2yO6uwyFpmkYn+9b/G7M9uYNQ9CGGKXTJ3QiRIJkU2+VmHEDqZGP4M0He8rzTz
+3Wy60EuJaNmpnu+aX2Ie4aOIGcq0bwq+50QuUen9a4Oxo68MnTw13gaiyuXE+zfJ
+tWxx02qYUOWe1zOWybViHEsSuFURVAggkcE98tao78g/z5HuFDSc58CUgZ273e1y
+48iRgUTPQU38W2fLIjToN3p4LBTixP6ax2ntWGUdlb3iSbudZGOeiM+WnNOo0zUJ
+SkqmooiSnKl1VSs9StJGfH8hUN/gysykgIyN8IJGrLAd481YpmB8fsgFv2FNq6eZ
+gHw0Iv/3coMgpC9HtUoyWsgRBhgtEnvIS+XYNKlNvEHLcO41AFBPsibDSaUPdFX9
+HDkGJvcEJ4k05FhfrkoVfR2l0YmTYh2YhudehYW/xcwbqdt83IZz5adAph23rFgK
+44J7W9+wtw20BqqiPC2Yq2vWtGJxmkq0fB14gWd/IDDbGvn56Os6Sbpb3misJ12C
+evkhrsWx6WdRJtiHe0Gshnb6DONnepvfOpZk1Wp8CaeEdcMgg26fsnSVDS4jfUPq
+UsRx705FCLE6MVdaMMTVsPq/4wvrf66jmOTUfQjLNwJ9B4Uo1kGBIucKkOart0do
+KOPVLbKL0us8OmqiBKChlc6z5z1i3TscB6uUwCjbIMZ6voYlOFGu4Ko6YeuoLdKu
+vgBNVE1uKI2PssA0oqY7nLHYwrh9VJicCTKEWc4MBuhJoSgk4pNobJ4LOD/H/Fwg
+fj7OMkXfZmYi/oGBLNdmUOVxEF4UQfsKB6CEAdwPIlT0XQtOIyOyvfeZdjPMvPhA
+GKHXhUwHps6Yao/gJN/S3DyXCZx5A4CMZYy5gBU8qRJG9yRlgRNN3UgXFAk4smj4
+qvUWTHdUgeTfhEblP4xwPenLEH9W36VXdiNLFYR3V+cFQFIWRItAjAHcfmimnNq0
+STVjaalG8befgylptOS40+YFo/jHgmeUuA9Gkv6P7YlUqIVWeFwe9sfiGYelLf6e
+9ktjXlhb3v8GvnZwF6dmZAj7HnXpamyU4VIg9wOjL7caKqy3j5nIDYnPZhYqx0ay
+NefhgWjUylNGdV7Y3lu4ekSH8v2tBXcH6YtcBQvssikakjYwQcZrirHRjZO0RoJ2
+pkHq6Y4iMPxS0t8TekWGzEC+/1c9w4Lib2pM5/icGqz9LA5poYVJJphJx0HoeQ8I
+wLv5WspS9CTA05lhJRa0p85bMyk0uF43ebg2xVm5nBGTmPimldDAxWFCLKgtopl+
+J09s0FnaNXXCqK2z0bYrTXzNpoA78WK8vtPY0yuLbffZySzHNlhwwl4ytSS0qINr
+PP3HAZMPr5kt1PIDyydAYDtkIbawNBkE1w1VYaRWagzYjJ0dS6EcycKHAipe8os4
+aBISj0h+wcNWUnldvjq/a7NKYv6EWnImb5VOEmeRdjJyx263KyzcxAz7V6IIA00q
+5hAfTdpdBLGe/ObvdKMluTBnpB0sFysSIhSLhPCFEsUXq8gut9YiVsLQoSpsv8Eh
+cvtAVL4G4ZtTbayCFxB0VMoIuwNZJaxuWInEp8SaipREj4EFNg06B9Wi8Iyz/m8D
+dP5kSvjiBW46P0Q7CnxC37aH5WZSshNAVVjjqtH5MKDZmHvJwSjiVWM/fCWuwNLz
+kUmnZt3UMZ0PtxCuV1rNq38XzuNBfKDtdSS3Huzt6hEvsq44dZXlVTXjkC45Bwuo
+8A2GqfNHP0gVpuNm2nnjO3Pkh70dDo7vHwJpgf/CUMwClOaNLL0bYyJuIhmByRLo
+c/YqFdiYn/21o6mmbCTrXYiE+gqevtfo1YHPbB+G1LGd5upnIR7G5m9PXgHMYk2O
+HJbgsxTd/SRHg1OvEcLHP4j7Iv2wpGsYKzUZv4uIDwAK+Gcb6BACwskd1OgYP59C
+kzu46vQpEdZPxGf3wzTmNs1R64x0K1idNKjMdyqdjX/YG1JWYYWTgkVFm8EipD19
+RIawwEBDOcMaTx8uGnTxVVQr5ClvpbbwpZZU+1vY+fQKj3H4rfMKpYLJsatORo+C
+dOGAKZtv0KjHl102AijfN+r2CP8hV5eYuVWYuqgJMOBTzEZuGFqn+Bb4zgs4zkuH
+pTO5+KPSsGfnGnqgSpVMVD2h8EFMGsZsyib99g7mqYEeuRFyS3SKSzzi3bXFVFN5
+4ZKcFclYymYWLrEZgpKbcUbZlU8lP0evlNjtPkyxOvarffdWNxJiiLO2Yag1pfNm
+mJ13mgsVVTINR65kO6hpsDRoFpWrHKiA9HFqAXMWuhIuNFNc1msyyvLEyJlnFJyG
+9mcPwoRUIiGYVduDlrmawxtyoNEnf6RqVWK/Zg73GoD7gTdYxF+tsB2fsW2WTcpQ
+2ADcfbgkNhk094PBoLhadz78HHUrL2em90vXQMPx/pcY0oEdEQqjHeiOUopboN2B
+Tn5UUfYgsLGCSW7FNONxl1009QYd+m6eqQ4z/O3v/Kt0N9j3tmIxsbQJC1bohw/l
+Rzp8/ubQUcJueKV0bqH8GLgVEuTcnLcdZ8o5VGvP2Ii/MZKR/T+6qHfc9fH2P38D
+mmbzxoJjMXb+fmLCLZS3kYmnHNX1gJ51wGR3FipctWQGtsfPBIOzW8PeY/hbumrL
+tBmIkLpGUSSDCQ0dDi9cDYf8e0F+5krgbqAU+2sef7gUSJufp/FoueJ0y7BgU8/L
+7MSM4+snq7qUdDOm3ScV6g9dKBp8f3ahPnaMdyv++HE6G8BTtC4mkhfNuHgDQs3r
+S6yEFpvYcCGmM1Jy1quxAi9bkOGDs71JPIDcdimT48Ouk5yNkkPapXci2bHOJZdY
+IXSfYHLUR+O4+zB8MoodZxZUM6DZgKta/GWTNjy0+UC+Oj6bbvO/4cLh/yp6XBCy
+1Q9yK68pfcpHFhTRPRP2bC7dkYjD7bzmxmVsS1vdwzdPT7a7LgbOKFWhpG43gIeh
+0siNepuDwuWsY+YSEYk8PvSHALiiiQCFhzWY+Q2zpICkM+mnQkcCjFdwm7SUH+FS
+XNZDY95Ax0zQ9K1iOYqG5iWJerEzK6K7EOQitq/d5BTl0Yj8hgLZ6rQDMnGz8WwT
+Z+g5/C9DNsBIgPapifBKd3iP5UFYuYss8eJc55hKngg4xcUa44ldZ7DfYpiDnRGa
+lAq/QJzlQVOqLPpLJnxqDrLn1sabEzFbNnAJiDvSN6/2W547eOgWh+QI+puoKB65
+s7X+pH5MgOBI3RgEvzlQLeE75vm9VhCoGMimRC8I2DqLHnabzDLUIgEcdrrg/llQ
+hRt5f4NmqQnVNrEjK4Ph/OnXnjrdSrsgESlDPTOb1wnbd3Wu+2bFwLBkKM9YgRY7
+SbsDsIcXdHHdlwFAA4E/Qp7UFUTy2B0koO3Z48SHLq4kGNJcXQYrNpyENG7PCZBV
+wOtN7SpHueSDzmiwq88PIRChVsIor++S9dvHRbxYm/r+E7zyU9vJvjHKi+nqz/C+
+1eeTtDErMUHA+5QGEJYOqVhw0XZCNhyAWgtSKvxPO8vAinnIHIm02bHlJsTwkJ5V
+XcWH2Wp4BVzRD/Jd6T3c/eqvWPlBtAJqDpL5NuQ6GyyhPQ8E6/0/NBhWtJ0mrwNz
+wDqOq9Yx8pwgvoRku0tLdJWOzEVPrBJs7amN+MyjlDNz/flplW9oNHmnufdBQTIW
+m2U9FH9fPcKdJgq2D6grn0cqzr6LaIo2UK9P4BiuuVJa7dY5FPh62x4p5NILW/4v
+a/7LAEDlwgvrYRpPZLmbaSwON5HPEr0A8/TT+lFom/Fr0kOYg9SipiYiL3ecqxre
+5oNH5EbaUMZ7ohIPgz6xg/PkYlogEJLy2/+mzi76p4I3CQlbWlGPaIHm9w/uw7+c
+RPnWIkPxrIspyePXV64xxGv3ol+3GVXn5khubcBrGuFViVHHMz2Zn2FSUM4bxBmG
+h0dc93HnXye7M7CQtrbqS+vcX+3M2ob7c53+tPTCbqGWVspQ6BY+57pR+e5wNEEq
+zHRHI5U9R0q2qCnw+hd2OdX/QnZGyf2oem8OjykLXmgZj6czlhzSwoyZRQY3liQq
+t0MpO4CI1FDidFz7SG0u2ZIROIz78c+rVQnqWWqsTWabYQOZY6oTSRSxZviTKwPl
+qKo99/iF4HTmHtwGm/8HKis0rBN0JOq0nirrbQUMsD3vCfEX8enUTyRer0atCADP
+R6aOVgZjAfVRp8hLXtkjZI1kj9GylvGXyWEPjDVoRlkz9ovLdE4gbCrj1oYZxfLo
+T95wMyz3b4FLeStnSd8DnwO3EcxMsMGngLIT7EvRZPwQkFkfgXgZrreqwCCA70uq
+eILCmNhy142YtRWoKYt25/uVa10kqOOauprQJqz4weli2vTpo0AubIWUCIiCZ1/U
+HBkW/WLuWDxi6GrvFN3zendiD4peX0HGEPrtLWAz47xx0ozx9IetorZCwKJbrhcB
+VYx3kOw4se3Nerzw4mNdLySzKJ5lFCJU/0FIzLhuRElLu163kCIr2AzOf4Dku1m0
+wgkTDTvBVOx0iNz7GhQJqkhWwgXfinEScBSTMrCnRV/5ZQTqgR2Hc289c3jADisa
+fz76F1HPjJ87+TnSKGT4z4BjPRkTs1XkPjQK3Kcu2eZMvJeTsDeosQWTYTTXBSXK
+E7qPfyKVB2a0cGI+o3Lp4kR3lMxhHxnYKv4E8boCc+hs68MvkquGadU7l5CfHoUp
+32fcGg9KWxuUa6/w3VEb+Ntw7Z213YVM9hrzv0vdHgWDNzkruSammdrrvPKg+v3C
+VapI7NH5Kj0FjHj3lYPwdAGokk+reqz6TNLFdWDY0nMRlhqW+aWGdGPE26M2Z9NN
+lx6TCwl8mgs9Z8XRUt03/FdUBhBcC1YGpbgMkwcQlD0TjGRjsC+Ufh8FPbFBnWph
+skmcq/tkqA4HivEuyp3uqEB0fiQtoNDkZ5iu7F6FaKj0Ft/9bc7nfzm/OVs8zqhJ
+Hp1TVQ0o8mfGomWFZJlOQUT2B9uerLc35SRbNiLAQ8f7XUkBCsSXyoEhKKLYnXe2
+wCHhP8TNMH/VkK1BtekzAdsO4ybmlw+amwMmmRr70LCO1q3nYef2lC8uFShA+MhY
+iY83JOvjqowB6YonfxbAYVkPHeDJt9rpXeOy7d072zBtkG3/ZWqeQk0738z8O+Lb
+mK+U3K5keClvpssEf9+dKpTUM0mreTu8DL0Jz5zPbnQrFioYmKMdAcSMkG3CncAD
+Y0F45FbzTOITqCGao6QbwJc5DA3GTF4U6A1zd81a7b7+G0n8/wnlXJh33HsoL0Oa
+/CyIr0VxOfxYjok9GPrrg6lxXeBZTHmRGx0DH0uycrVvZs8BR0ZS7IkXSBzNFSF5
+48im3pj/XpaRtOZf73jA2OtZ8jasa3rF9lNY0mzLsQlT6+NZf4xoMK15S6hdM3lv
+mrYrXdHYWFrNAsAdVw7voSlNh6ObfZcRYOdafsi5hYc1/gcqueXfSaxkhwQXvM+1
+nYDrbIJTQz9JwtBjB50M+ZrxFt2ucySBWuX2cy70fCwcEXM4NinsI+LpL98GaBtt
+tRFkoDW+lMgvaSEM92OIdIORIu5XcQiESn/PJpYo48XIjwOeqggK8K72mdHMITYv
+1e3ng3fwQe+2A4r6mjy95o7a5nU7pTxXugmG7HQxZvWVRxvqE8LhU9j3pDVSKLaV
+e9ZQn2fe3oD6rR3xrDPzlTZsFBJBwcQWowgWe7IcsaqW/UHbDctwSRqimL1xClzt
+UOFT9+CpEpxkmyRQgjBxVBVbnZZsxlmXwyNu9Ytng9mig1ndPRm/tcc3JeKeQQ3m
+Az/c4baTDaQs2w3yoFKLvMSXbO/HDA99b5Ucp2lYIRQqOm6jlh/aw3qt0d+4TA6J
+crR56u4jMZ1POS9VWDr/kyyJ/1zD3m33Z2I3RnlpuwpAIUSQsIwWhOt41ckGBTK2
+9MrBU2cb8IL56mJFfa/YkG5besllr8AGNZib81bKDAX4ngpWE+xDzc7k5mYdKUnd
+zfoUZZh8IKBaXKFYjaVFEByl4rUe0hMhX561aEiAP6bn0RuDps8Q3VTooYuh5gDH
+ccFYZAhuzU6pwSa+yLGbr/KQMwrtxT4xTuzPfNrLhAPC7D6LEkRg8LS87ijQRigi
+EJ2qWEVVFOTNynCF4NAZfv9rbHrDm/ZybEBIf4joLfLFJnMuxR9kaG7FTDlTy6WQ
+wmdtpmzS9kSX1gHjXSBENGv+PN8F4EgyOFctqKkyf4abzIeDr+6wZ8EMZCHZECrv
+iNbIiEKYnGBQQgljWC4hjZmb0IDjJ+TTFuL9GKBEyKWclLLvY9l/1pAFv+3XtR0q
+V8gZXZyyhLJWZ0jl5YHhkJ/+yDg6qmIzOgbeH3gjtGNxLXZsRDmz4ASBSM8T9k5K
+7kYtRPE6gPe6Ub6erX23Skf29Z4/dUt2Zm44wPl47k1hocES5IPu6edM1ffr9O7n
+i7C9twCWqz0JDm6x3SA3Zvg6NRzmCnhCXMiwYcgNtcXmSp5bkbkNO0LP0T026521
+3wMBUhcy4fA5X4QY60w65cd6EVlKJjMDrEc65WS9FRvEeq33vKeDngTJdoJNmF44
+SvSOjcUktx/o2WfqwAmruqyyGeKaYSx5auVmkcHod+AM+UyKIjMSmm/xCYMSYLI2
+CvwdAN3dbT977hxh93Ld7DlJMlmRNZA4/HU9T9oM4MxlYwhLGJcRhvzpRx055SKX
+HcsRWjN7JCXc0ijaIInhtr8J9CFZwLVaE12avlzfKaW2eo8cnJgLGANozF6GHrYx
+GnVT9U0UJgOOuA36TuC8bQUouDiTAQci6ZVAntvhn5ivcMqVGjEHU6+xzaa5dG42
+cEyGdBWud/ZHzZ06o4QHBQF2P9xw6t69SZHXQL8kaONTHKpCuPJD1A9U7LL1PFYa
+ePg5HU6UqxpywlO6XcnmV/Lpkcf5JAPr+rW0AMDzmydFvN5rs5Bfn+wYDo+9H+2z
+qgz9gvSCw2sIpL6oxkK8ls428YOqN5Bo/t53wetnDp5smT1nl1Q1AMpqoeGZtAi7
+MkT0fgs7Q6GNS6Ag6oMuqUvu9R/3PYcP51OtqYWytn3bhBMzNN8PaIMUMJ8b5lr2
+WprE/FhxoRQI+CdxrZek6+Jldy7u/HuZvFHUhtD5XY6DFeaVSoT0BsIST9XCmB6p
+oftAwUr4b+6O77eW44zUUHfAczg9XXI6grIpSGH+1/YqTX0l7pmfS7RrHGOkuztH
+v6Ku5slbACsLDD2KDo4vuMYqF+VBPbsE9WUl/UkmVmZgQbLvnOken9tHkMc/SiPa
+g4WGas1OhdIYxfCaMt12uNLwFjpeSVODxKE3+fe9xbbJSKI3Jo9l0Rr9kArzCGdH
+gXxJnzmCoscMdgNj3fRLHXrIfvD/zA5FPNLJW7mDrnj9fpKC8Hf9C70boc7WagoJ
+nxlnUFd1LI/7C2gV5Ldei9PkME2b9tdXmxNjBBBv3kDfvNjdYjXW3Qn0mtn+44vW
+u0Mg8LfQHq1zU9+FH7Or08abqsK6UOUE0yZbxLG79ehp9+4oyjHp9Uic46IrEh7B
+sf55I6kX2kbCE29+9nsVBzUVfXIrFco/4d8an3fEgInnwEY7dKYYDTLufwfdsFTT
+XeVigkBn4kPtrDEJ9ef61K1bWW3+nOWUMeP/9h0U8YmbpdXAzkYrp2HXLMYEUX0b
+HBmpFo2oTlzYcXBzvJcBlK34vgnfB8fz8wlbAge9U/Baz5299DX2gmnH+BnywsPl
++rXcUzNc9gVrySI2/nbwITUjQeyFIpTYR5CuMU+rFE5RB1w/ckAAL+pgJpJNJsIA
++n/yqtw81zptIsRPbO0yWc57HvCh+uo1Zy1H4/sg9r2o3FBBIGub9NkraCuCFPis
+euyN9X/3s5bB1YDjjdC2zR6wep1EwQ4Ux07s4qtWGsT/6NMgJxhHUkx2uyI49D+t
+bM+QNQqwB9gg+6XWx0ucnbdVIrRXowhuBb8LF9cvRncq/nfY6vz7LrL3rkO2UKN/
+NWaf2sa8YhviwBK0NPGNUU3TVUQV0nxqt52xGmKO/m2km2LTK+TSiBojXGphgaFK
+Obu7ldR41BOmFiFPoDg/1K/+4d9dUpT/WGinr0XzHy9Uq63mJn7CQpoxYlVZfZp9
+Oq2Jp7Eb2oHeEXXv6M2WEg3RlrB1f0wgOORK4cvPaP5Bogs/xkXFEk0veRnBkT/O
+GZhZGzRCn0E+xMGkpx440fiGdAMmm9Ts3s/D0kd4/2ACxLs3jBEcYhZ7Bp3cWzVo
+jyfGgC/N0UsFAFN+pWhceHYA/g8KqnDyPVlgmU41MEBTGhGbp9sg3OAFGUj+rV19
+7l7rvOgRL5YVcwDh6oOzeSRYyPpWpEigqChZLa8nmJs1zgYLpv75i+8x8nOHUerw
+yzuWVuyWGE6Qh5vSJmHY9lPhP1Is+0BhL2N/ENT+gmJFJz6xcv4H5D1IiH7ez6vG
+3I3PatcoQHRsRmU8AhJVpzATDV79y6B8H+Ikvena6/QhzUq98lHP15lq7jNkmD71
+SleRVLNi7eui+JwUKEEbhSKmc3lKq+6/GHyeFWrxRDt3UDJwS19vrXmugjv/I2Aq
+clJn3n9nMrDHcOFA8tnGC66TwjCge8B7Sw6Q4YPIaWtAnxLraLT0X54qRuXD2L7k
+MMdQsLASs5Rso4CgYlHA7FnYTeHgZtNmy5RV80KG4sS/bSdi8eR/Pf9kryXrfgYp
+/Jsx5cXJBe3mverVSEat28lEBsUhEDIxwGBU54bGDFyManxHz7Pgwi0P2obPfdSX
+XCge1mwqSTWZRTB5WC6Fa/VUYiBN6gbsrvn5jw6FTVnVf78WhxLBQFXFPrBvoJzk
+9eYkxwHWNkqw4gnLzlSjqVQCZAwr4+vjp/nx6WfWhwG/WEmVk9N4po29WEN99rVo
+Abp6f6XxwunzqTlVV3S9ZA0kbF7qGDy3nAMAsTdFEXfpMxy2TF4+Y1iRMdKhwc2/
+0ZzaIs+SssbKSnL0U1+7RaoFNnuppm8d3sMun2/mPaZ/0X6yq0BWw+8bn91lhjS2
+EnRmFNxt0kheVO//QS/arTG+5PoByRcGBLo3y4r4MQXaYG86LtS4bNyJQYtFv+DV
+bh/3SUMXdH78yOmAhs4kJS3NwBUQnp1GaU14ELcsnH0cP/2uHREtM69n/FAcqRFi
+Up21T7Z1B9bwxmLS1eVy/0jVQljFT7alOjFOPRMZ16tcZcg+scji0Kr+4ZYJr6P8
+TcuLtvja0C9AQielSG3VzB5oc8iF6cYhf7CLuCaKF4SwR7ugFfy85+79DvBvPB6I
+MfM1YUe3ASqSnP4+N3qgh6YKDb0CLXAQLLyaJky0WNusH4dXwIhbq5+aHbUWpgsN
+kqDXYjZ65khgPEveByj9JzN+woeIiDqKOFQTtRWyhzLV2H9u5dvIJ1JMDncAv3iA
+Z3tcKKYJNPwGF/wsSAc5LpWmveroo+FYQMN/DjPo6j7mwt5K0u4LEXwHLBLi3xKM
+HfBrwlRiK4m1ZDpBCIW6EE0QR+nbG6UP2ih+xRg9pU+08Sv7KaTWPBbDCMdfzyJr
+qpuALGN1yozpQrdLjs4rLjceqhoo3eWuEJsZHynxNb09f9GOfES1PhfT3bEB85bT
+qW/TNYs/qZyNrAk39Xv6WsYLxAIMVUU2I4oOtOT63YvaLncWDPA/7OczNEtsLbM1
+O6w29n+dKVKEb2+aM9AoRBBK9TKZvFA5zn5MuY63CTg3V+uEOcvGNCt9QoVgEdL+
+VWfqomLUCs5Gt+bk5PQds6pJTx5FcaYV8TcGkOaT5zww2mBG9hmvxM0L9xxgJJ3K
+UM4YTMBy5om5itMsQepj/s8ea2caxU+63TnxcdP1k6+5fIweTwg40Bp4JixOPCsg
+rjR1Wm+ZXDxURDd5DY4gTfqKpTsR7vaws3gA1HAzkW5Xm/5o87RS7QVcRJcewMW4
+Qfi/X1m31MOnJo2AluJBYjOpkAiXiIu3lD//Fyi84hV3hsuBYZG+33D57U04ECxz
+uWTk85C56gI4wyW1VX8sSV/O/V9SQ1dSYN6D477OPg47FJ3WMn48QVe+MtlVxLKj
+4RmXOFiu9EuOY55fSsP3YYS/0k5tYEyYUJ6sw58U0LFXSjddZwt+Cfgxv8iQHHKH
+gcUPNYojz5ZYLo6KFyOGMAwFZwkvfeviXJ0Fe3wuIo8jADEe/lvfNswcfhAh94/a
+CUfBASjAAsnkqnf0jhRjCmf+KPrCIU9NZTAnv2I4L9/LcAbf/OYhC/+wMtFWReHh
+xxgY+gTG418EDYQbME0AQWHy9bTSh05pkZ4gQQztVmi8kFN8MAOJ+P8KFQvlhJ/d
+MZ46s9E6QVx3Iswc4On+SHwLfgasFRMbnklXrbe91WWwyDyx+vwurut5DYCzbsGM
+bvSZFAwpL3DLdabDBzpBpU93Chm7IyVKInimBOPqx2LGnQWNh1PGSkFfPvsbJR3I
+EzU7T+YBxmxlW4ePGJ6m1kG3PB4USVlIKWcIkxHTVZEsWiGAkwVaMkXhtXJoqPKW
+hf9c+oSpWmVj0GcShEkaNLDZx00lKpu46epy3nEH5752gxmFIiZVd9oy7+A2JQBi
+KFKXvsgJM3dRcwhKk3xLunVlmIHOq7x1tKX3D7IaRZR269pNUEZSDQ4KL1cwwAnI
+3+WPezoPaQhUxbY1vsQVDdeX7wMAEUroKBtuCpykb0yAYfnggsFHPvPsKQXO2CIF
+Q+MEsfBJ43nUPwQLyBpMTEa4qp0rDXNcbD0vjpLnPS+Jiyy97eWoi1Gs+13gdKLZ
+DgWwWynZWvwq71LVkyyyfqNZYYY/uCxQnp0Y2GrhB8S7JxDSJy0TvUKRzgerv3so
+QJU81I0uFouXOmGw6kDVVFF864/6b3r9jJsZXeQyWmXzCVErXub0bwlkaQRaMjPF
+45X0gITKkS5DuWy74ANhJFFwiUVPurlVIzhkLRtR/T/VEKME+DfJHfM0xK+PyUBl
++nuGbF/lO/duvME9L7G29vY5KXrtT/aUa66GFTCQS9MyD/9AF2E2braN4ru/H1cj
+d+QPzARY6US7wzti5G7DsdsdOGJM42s9grhC+5YbxAw7fKtC6foyIwEdhymYN3Gt
+vSNqugXxuKhBCquGl/VEYbbeg9fi2sBODg9vSNTQudPpaKSmpQYBQ5UDKkE3JLTK
+Kb3XXBIlShacHCPQV3/Gl2dzKfFFruuf7h5WFp1VQx+gWqyFrmsanlCZTCLsw7lE
+fELGpaxSZimTdzDw+uFqrZyZ8fVAjN1xCO6gu6dNkorMjaM4VxRoJA1pyn1kEY7A
+xN+vpsRNsGuqnuEk5Vk+oaor/Zlhmn2RoQPmL9oKyBIyMthmzN57z5+AO8wxhnUF
+t+qcypBh7rO9WH7FBO5vYcdirDv9nGrorxUHT29okiUHC3Vqvcv2/4CBFbaMLnbp
+nhz82AdEMjta23yGCRt7EASpYyrqW9jPXK9Vp1J637i8NQ8apn4n86bBhsfmVU/g
+jTSfHGe2Qma2ZrLQjA2eoe1+wQ5CP2+Kk0mmEB8fQEfnMf0V+m/ePAWnmhMthvm2
+QkUuSL31ZXZHxepOQ1ECa83kRISU481s7joz3vDqdFgvuh0T0FyTpFHBZDrXg5qF
+7t3TDrVKJbYhwrKb8WFVgoUunDclb3VzZXO3HUIybbYAKTreLjRq65eL8+IHNm63
+iRPs1awMrLxkOiN9b7jtYajd3rQzy1N8UKacNuU0vtgRuqQTHgBLB9vobuCqtSZf
+I/ZJXJQRwoFHdQ2oEI9KhXDkRiQVRgwFLras5gMUqzhB5OZ8DethBKPgmldmNleX
+5CHuf/srDLgmYOZfOtI3WxuX7O5BR/x/x5k8Quvaqh2MVXpZPuZDAryaIOiJbEgk
+JVdPZPEqh7cASYIVrGs84dyc9VIkj6BAk1DP7zuMkkn0U46V5bJvsXv8y0UHqT7U
+DiRaFz/OCvFOVWGXanDSsh9elshBfv7iJ1ljCFy8cOdliWan6s3Won/lt0rdHKLg
+LbcbXTASQY2sbOznUpA+dYDUpEz93OZwj28YM3gtFa6crZFKEE/AkYvwRR7feqvb
+dToVtoBXz4FgeASFnMIl0RVQsLPZFfXyX5XZcnwriBngoWAP6rl6VcmfIFpj2RBt
+aZvWzdAUE5s0HBToudE5sDiZc8S94sNH4ZZFUgdq4uJ/Kb+GFvz6IMgSNjnS/8hU
+Wmm5xpe8j/F+TuFueaD8FCz2CmFZdSk6WiCmoD2HXDVOBCHar6oSObk9w5h2+YLG
+nMn6Mv+GzhYX61fUM8mb+zIBZqdpL9JR0Zou88U0W01MLkDOPsuAbC5FZfhs+kSg
+L3G6VXYq3I94YxOwFCc946dzk20ZSPNCHzGyDRjk1zgLPI4G9G9wJO7gjxubYDGO
+CFPnW7Gyi+rvdXm5BIVZcNLtrr/Jeu7LStCw6D2DjbmvYIaH9mliUB59JVRC8vhO
+AKMaDzh5VSxmbhdxpZC2xuOFY2oj1MOwgVhXj6zk0PaAyvRnCAiDT1Trv4ataztP
+1b8bgDzmKiNH9ehiN8P+0Ryvs6G+qAncOPnzc76/qLxc964cLgdFsga4vYiGjJr3
+g7cuWRJrdjA0mtNytaYxZ5hhINUJIoxlqVlPUiiNExfy94xVIQ2DIMoxM27eIChj
+zs+GCxPQDPedTIv6tN3gq/vZ6grAms+pafoygvWTqsXwfJ7OAdi97G/QUerQ7sIM
+nJmrA2DYstzx242WF9/Zgbtf9yqzr+Q+ozdlLFtKyknaufH7SKUAVAPT8r7x+vmQ
+m5G2FxO1fd0GaGJsgCapow/9gFZY15VadAw3SindwtSj97sJFXsDsEyeYA/hDVQB
+AXTMMhlOvfxEaH2+qyTYkG9rnZ1yL9AaKS4Dak0ISn42hhoLzGELORAi3+s7b204
+pA7fZR+4VyxcD4XCcMuMos8ci+FSvX4/hpP2uaf7qhVklVbgDbPKYKxh+AvAoTtp
+UFFEwam+SWqUHe2ZfBWKK+z2Ym/jwuU4rGKP4aazJmZk3EnrXG6dJ5Tq78dxE7qH
+hwxz/d8Ay1ndrhYJjsXwBcw+04LCFVodcvCK5YKwORfIQwZ1gHsF/CBJLDtnGKAP
+6G8hpRywT7iQ8rLgfnG0ltUKYjej4L6TfEgrpkFSg+BA26nGoA1R88BwyXO9/j8P
+Or4gdZlmIeW0+w0Ql4dRp29ARvaKCUlvCvHMe3A0flm4vzOO81Xr3WY9H0pIkzuI
+E6pIad2gsCsfuspwWdZ3KZrC6BXulhKkeY0ucwpLJBIQR46kvWLpGabHAGRgEjUz
+C8liaHm6iyLA3g9yyzjjUw0UUcrJzZhahTrRixmxbbIzONS0set8GCBnrHU1QhK9
+6yuciL9lC/uznvJY0SHq3+5cIGLHPCMN1fLay2hHAY9uJiD4T7DXLM6+/1yIeL/6
+UC4jGSnycy88DGSO6nC1CXAnq3ei9XPX9OEYNj+soc36ejryn50WjUVv5Bw1RAZE
+9EoyNPWr6ZL11AtSFXYLuwheHAnwNEvM5iU1qjqUut9so+8OgfdPpMPcC5oaD/kM
+aenp7yCL4FEhTxgCdC79P8HBbuSWiy1QdV9vpxxI9YTM6yldhr9f4zcQTcr6Sj0b
+NgoRlrCgovNnuB5WgzF5idbhCtfyOpnFAll3sgJYLh0Uap4q4ucuOqr3WfD7q7TX
+7B5p00U7hbQbppTru3WpRFXn3X3fGrN0yl6GcY9qimqvnJyLcVmtDOB7IAnmY+vS
+4CRjJpqwtC+8gsoADTe26n8R4BmMqHJaoLZPdlea6Xte7lVGdUct/fR+Sa5srx57
+eOAKGkUywOo0MvO3A6Vq8cGkGqs8mxhTEsl5tHXmfKOf6qeN6j6DGI0F22jHY/vG
+3h5h517YACVbSHSeaFvbkg1LmlqyAXSlj8F9TUsM+HbVXM4gkLXhkYixozPpk9T2
+cwanzXYj/AvblBy+wwrIuG7YzWyb5c00tObPqumLE7vG5ogF4UXH/7EsFtDRThhI
+pgLiY7kU1zYhYQL7lf/KNFCufOQ75Vhe2ZesB1Bg1xthuOrPT1/adCWFOuPPT+vM
+Chp0t+3OC5sthKBhLBL05Cl+AGfSWpFBAbueHXtFtYTN16oHBQt6j7OJcaGh+CWF
+uzresVCwbTGRtSFPdPiVvvuEtxx47c2KCwEFVokH1+z2Z9OKWrl3g6/PtPkm0WNG
+aZOnDjSbv1uDO/TAaGc38P00XlBasobuTOMoWLxZnp9GrYz0H9dzfTKMUltmrYD0
+dmmfZYsP0bon0UxzH0mjQxgeAu+EstZmpXV5CFDdXX/a0VCwFewMAY40rw53CG/J
+RFBWVHgiZpAZizXvvmTwF5iAkfjtzYhZv9OlsgeYBXcdY6GDRUyk/DPMVAewkmjC
+GjgbWI0YYFlehQ1leEKW2YzIENow6KJQVacFIJhlSiqG7i6raV2i9BWxrJJAIiK/
+HbS/a6S9BtGlaAYBrrzDKMiOOVB9H1V5lBRdgbkoDww4SmSiZQ4bguYnzMgCh9P+
+iCDsgZbeCGLjpj3PkbbDyEcTwKAOWTdP0iQqFuvFgUjaPV3HM1esGwqxfcKSfFWC
+aWqxCnuvS0X1IgOWfDcFcapXMeDsXcS7FZ9xhoX8cUNlwerWfk1wVz0fp+00jyS9
+UNAQN1mH9x91C5R/IGWSP82ULGeYtXfVl2khb1wTal/ojiknjRorjRM0/vORg8XG
+ehQj+6yyNQZMVUV57Zmm4y0/0rf8uXhsm8hwQMXIjnynOxWTBN5M/CJYmIxkcHRU
+lC3UPAUIIttA7t05ZYtiwRiQ80oZnGnP7QHWE5UW6E4yGlXt4c05JaFwWcIs760I
+4R3MD5coW1JWMYoLFXwRgRJg24YNOWbLGRPww+80+J6QzrPLXScXzlRvv6MDgayG
+LMVJXAy724P5I7ymJxKmltTTCsq6BaGU/JKKRJRuf4tngt1jyIhPwLG90R5GQsbb
+iSq7DN9Fya4nvvPxOvXKC/95ozwvRbtINhE7n0Uwu9pJlsvaFSgch0vn+n5nHec5
+9p5+QP1RuC9w6rNMnYNtcn49rOo7ijXrBOEmqn2qu1iLAO1pENBVhcNEGqOcMs0N
+dLd+IJSoB8cbkbgkJgSGaP8txzG9uI8CMxMNHhlGngSCqHDUTKKntNetqhj9rkae
+jJjPqlKS2JfndS9Sz4venkdyWDVaugY7Bq5/4ec8wHia7LVBM6AUEub0VgiBrSY/
+BS9J9qkCS4Q96bgeT0aEsneWmld1VU5LRxB68qlqraogaAysSFhjCraLsgCBsNnF
+oMhx+C0IOFa6J7mATW7oY62BHkV53v0AIGIQ0clKkbTlesz6xMo4LYxg6VciqBtI
+Z+sOJcStwEeLG4Wyep3K6dKBpgwDkaTnctkjyfz72Lf2YuegoCdIjIsJxJJ4Xkwd
+aHeWQnkk+P+k6FDwK2Vg4g/B+fm9wvXso1N3f5kHic3mVgvr7LIA5a5plMbmOkDa
+4AKaMLddPRCb2j9yo8lR4zgaZNVHlelHwNsCX6lolNCr+KxYVk6U1BUfo9YhJ4I/
+MTlbrMygXBaTUUlICEQn6qS6MwW0nJy1w++Yz9v15Aqmr3H2vYpQa/GzKXsmu7Wc
+DtFDfrvTkpVKMFo1monus79/lMw0PV8YXQC2nI9seaqAj56npW9/i8MywizZBSsY
+oEDNYOFim8XtThvgJXxeBcLBiMjMBYVhrTUfhJiTUT7xnaIPUYeB/3kO7q8Z58US
+0zHOfrhU0yahenbGM61LUf1E8zWyEkWFunTntCIuqNSxCqa0RoG/nSsERrLKljwn
+Tq4oynUB2pMR8d8xhyOEnlUthngtfx7ThkpmMFcxC8hnCItiGaCOT4OqexFtlGXf
+iqnXzFA9lRAfQ5LXBS1NPXEJm5tFVPYewrO67A5jOFMGAIIis7gWh7dGhc49NDWR
+6AKNcSpAwPmNV3uwjvriEZAnAkF0vX5MYnTc3NwVQJ1dnWyynxYgA99S2Wif9TUv
+PC03Tw8cNW5dJnARDotbz5GJVx9Wr0uScLAJVay73myHrV3ZV8J6ErVpO933xh4h
+C2i2hylADMdeL0EedRtfDsHfrPNgwmgnF6HrKcwk6/vnl6+XFol+MPqar8Gsz4Z4
+v3ixb57FJcjuI07+SPYW6F35o1TEabvqnkcQq1bpZiSVAdDSSZ2JApHvCus2q8gy
+lnsr0GB+pYZy87tTBvnOVeLrgIpHQKR1TdUL6R0XpUTjDGheCOyEZxuTs1NrpbJr
+wg2zU3Exg80OJMirJ+dSwIZiqySp946vMPr1fOrNvUE8E+P4Dgb9Y8WQsTfkzvGz
+oqCqVae2ax3+9SOVFme9o40Bm3BYZOZNwBdG1iGropGwIk2Xpm6/RU+LeYbheOC3
+CVRDR0wHx2sT4LcofnUcqsfqKZUMP3H9Vwk5uLa5M3M6LpZLvIDdpNb/CI8Ikp+Z
+O3RNPvsBWI1Sfo5fFkEXdxZzWBW8zayztf6Wl9KWhEgIywTb4HwhOe38gRmKjTVv
+aYf4AYN5/8zvI400OJG/+umUHg1ngm/C/zm+C2jCDMhvPrbgK2mF+Auf8rmEIKeS
+u0wxmz5nLjQOYAZxu73Vy75tPsxX6eaUtXl4h2e2+FhjiAchbdpFN7BhcUu70rSo
+qwhlTPqX9r4AJJnddm9IJn6/1hSjUxbrug1GNWNDMsSGFxVACwBdsQ+bg+wSM1Wh
+9uENH1qB7uuMyc8rWj4RPwmUJeteD9HzUSfX37nm8ZCtc6duzeLtR9JRNVZK3Jl8
+2YT1VEMmKrHvViNIPPnXyB23KxPUSfX7PmPL//Yudpr3lbtwgy7XCL7ntCagSeeS
+7RDgeuNrkSXRc0zAhx0+WaW0DDHEJLy21xU/MammlT/c/8zE92JzbVx9BvIs9AWa
+auW9RjmzxG5d0MqBKe6hfzCLbpZCwbG5HkvIz0rEwbvpSqvjmW+vcxgUWs0EYpCX
+vozvCyh7YNnlrovjHBVg3dkc0MpbgjyOdaLQKm8R2XNJHlOc0usDtSPryxzTfPX7
+vUuyYmrWmdj/5Ae7dwy62rfqPO0RYGHPUUA0iCBo89JE/O3PFiAxlPexM+W+5a4f
+Ow7SgrKjn9dpUweGBK8SX/2xLohahSTO4esf3XjUBaI3/4CgUhUp5FCDZKhjd9k4
+GLdIPa7iVjwbdqBaQl83etMg9NJq7yWDKHhWm9tGTZhvgkZ9cJ+agKQHuFsADm7p
+6W22zrlubJbGq/uxaS7Ll5PiJSPfpF0oM30hWqN2vcSf7E2TfbodCMFrd5GhKS6I
+CUqNrcj3Wwy8Mg5eEr0Ahxm8fz4+sH3hPD4Nhc/nGf9yxrcKzlmWXmK4sDqgOI8b
+K7DjVSKB5ZQLr4YajM2ydCvYSQHqtldYaJNsytVW4ZGU5iBCJL0x9CeHT/0wzq4l
+PLQPy3UyGZ+Hy2HlpODp08foHSo20NsTNC8o91yXdEZziuQCLf0W9KrONN995wbG
+lS3YD9tHJ1pympoxwTGVqSVtzo6CWEOX/ERB4FRerIcBW88AAomzN8DHbgDNTf+p
+9F7EughK1euLutsB9mZijJJgBa4V0j+AUa3O3e0VUkeKelHQBikbGirBGCWObz8g
+aesWy3V7owclIjq76KmfzskjLryOV8x5vnfgJ0FFrT8DtNAKhPgkoL1ym/pOXmYT
+ouUSmGUJbqc5lwU468+dUEwK7H8KvlgFb1EzU/jzZfLDFkzbztr/bWpPKMNHeZDa
+pPVHAxo37uLrh37KkxhAm5MB3yLNVnEsubGfxaXAcWTdkkxgmti/35g4mYkRhvua
+7anddQtdAnQ8OW4cznlF1GTnplcTPDt2zZ/Fiy9czBHHWkERT1U7A+fHP9U/xCAk
+VoCUTozW29FAwKT6Kb5Bh5C86MbVffIfLYGEdpOHd6H2YWvuLZCHxYFIVRqssPg7
+Lf7lo0nIPCaiu2twbH06UAqKB58GhhbguHtYQn+tXnvlyLdqdwPGJaZpXQSgcVWP
+B8SWGg8x7rmpqmKCwZ3sEU/87SA9soQ7RHBPMwV/KrXhjYD0YKvKvvMky8JlQq9C
+v0UTgNhmxhGffEAeDmacX3dBLhSw1rM0JCnw+q5DVZr8kwA/STj5Eniw6Pi5qgr6
+98/Sst9u5WZC9u6w45v0WXNnjvqB+N4vO7jurnKQFVgi+l0RZX+B4FW1GWmmQuje
+wfIfupXeISJqLRBrKlfwLensittS9biAdzD5No/6ccyxkis5GX9Ft3J4zK5IM1P+
+50j117f5k459TK3FpT+bR4D5spx0Gx/7+2SekqUmcakURmHv/xZCvPkv5CG8K+5y
+qghLeUYK9JWguTgLez999bu3ofrR1JtkP5CzWmg3wrKC2Lx+f3KKfKGvGXjkqXJj
+GG4+2XusopCc57k3YNxbPX7wQNOmOJ8MviMl9Cag5+Hur48eVjPexbSq9k62V6Bg
+4h7UZLZUJGcu3Z6C47wtA4zKeMlQGmVq2qTnrKtOCP5Fyq7umvL8N8jH0bSTLQUD
+hIa48deTy9XR4wj12LYcu5YBuwEuMDB2M6D4tT8wTStyULLTkERXbjU71R0H6xpZ
+Zf2Icd1SgYb6tTTZsZ9jqLjYFHn64JYWpu2AI+TBiDYExnv+Wh3k/IOKO7BOkH3q
+1jY9CfJ/VXmhLQvzhjFGPkLgy1YwRMfJcumbiyfpJwhAdOa1GZrlyKZRgRxwlnq9
+VkoIMiVyaaWJAOYOSsZjqj0vDayXACdSbFYuqXhFz5kmnp2v6xfjfXqSqT/HE4Fy
+7+bHBHbxn+YAKkf1A9yqtEOFy1PdmSPemSUWWuhSJOyGVj3ezhRObtXRgPtqm8Qu
+DbIPL8seA9ViJWdW9S1c1uMt3wg4FGWeAX+6ubQsrGkmzWmNs2V3MqcIwk8POkU4
+payiDUSR+KjGxirsO/KLQFi/12BlPxPvkgXDIuvKb+gq8ywWkwRVHfup8j7GXQcV
+cwdcUzb0iDTNzydIU36aVAWadrJJVl2HQY4lZHQc4MhX8UsW5seuSu08JtxQRKA8
+iPmmbKAv7TF1AoedopS5cFv9qS7t7CVUKy9Ol6hH3QweU31DaP+ahzGu51DkryOm
+R2g22gFLDRRshX8MVebyyP7cmxN42nKlvNc7ZZ+azQuJSNbwQKe0gY135Z/LnO2Z
+65B5RGgDAfGlXNI5Uw/XMYTNo+Z+lfFGA9eAfv6OaWkmEq49AQO+jVvxPbpVoKl/
+BSAH/P/xkxeZI2fvd69gJdFKGoSQiK9u6SFDLJe8LJX85Y/B1RLuDaDTCU0HCIDp
+3oQECCec/IumB894ieXLULhLCPDEWIIBD/F00R+Hmwxt/SiRQX/5A1dY7MrqY+Z6
+qtsyCFpqG4J86sw6LLOpoOmzcTwE2LtYpALGaAe/mEqDBRj28ByRjKVQ2374o++k
+LopcQsl+a89MNJRh9kFz+NHHH/XOhlspGiwyqO31SrDRAUhfGohLL5Fh31krW4s5
+YMddVjA7z6ARaIPHHqHXhRVlnQiT5SYTTvUrk1y9EV73n+OsUHR0Od62w6bLWAir
+aMqmBthRwK3vH85G0rCrlQIpZk0Zvzr27Cm2kO2KPd0ACEdPc4YtPT4uKAooHs6g
+4jPzTL+bynQ4KMFf6nn6OcKPLfFs25Lgr/bmL0nG9RCrAoBIeRgBpKwHGZmAS+l7
+V8k+oBR0ntdhZud/0US9EqXNRsVJyMi2zT3DfOeycUpKnzDe29pUSaugVGt1wTX/
+d/AjPZiLLWDgDnIYX5iPLfF0m3RMFBKWYDgIHEmbDMCo4212QMFrjhLVaU12WrFc
+fENnhoqeZmFkRQHqDZNIbSQjbVGfwyYxkSx1PnU/0jFcNF6jcm3uBrcY0jj+eE2W
+NruYq54AVNXc+zoqkaBkLJJgCt24TQ7lWG0zO38x954uWa46U20ztatDsbRrNwTh
+kVjtR2s9qjBwWQjyqdCXO55eR/TRycHSKkWQ3r80eaLon3ed4bc0ZFnKa8orIfsm
+smNkTqCyDKV0lur522z7AhWDLkfArjJxtHA5eeUbMpoLfCuLi/NjBhC6CuP3eCVW
+PCp3JZ6Lw2P2QJbd7p7633wAGkEm1dFR9P1C3STZpI1bmTPhWBjrFpZvoJdiVaq3
+D66lgalw+1mDJNF6H8BzQlnYSToeo0Yh0WL8WVaOUoLsA+S1JtVKST5uDUJIG/kJ
+2Htj258+Ukg/KUubdJe1OjkoKySkM5blBfLxG/EWRi6xWSTRzVWxptrVysYTf8bh
+ds4PCo7jFnw1F0B3lGGYxtu4kciOtMrqoShdtljyvcvra8f/3nxmint3kNfeV5in
+giQAQz9cvJKsa0wXIASXW/Cy1cocAVgSoYi61bsKQTB/EMaLS2QYhq8BKyGItJ1H
+oa5ZuJF9+3hfF4JbfVCczcMVCQLd3M42rg2L7sKLSbicFYkUaegfoM4kTQSbe9/9
+6h2PRlvQPGbgcywEUgAJuP2xmQdQ3EtIGvi9aVI46+0VMCB5EzpZSSLr/BSSACs2
+8dK3xY7sG6Jb4LCOoGq2wb8UM3/hGe8/FGCVQ/5EKET+QOYSwvHJ7qP+Vn2cBC+W
+Mp2ETmxJ/T6KqUyIlv2hEqZSfrBCFAe+80OyDq1Z6AZJSpRjJTl8SXCALw1e/1tp
+pBEbnP65UO1G3epbvcIEbmW+ldiS/kxIL3RaSYpCXK1fJS1xx7B0Pu+T9I4/lT/Y
+NZt2MzB8Ms4Qc75V42REjzxXXCkmD3JyppC3N046HJne3+lJJnuTujieJHQJH7kx
+GaT7oFHI4PNmA2I+2/92blwJ1x63CGG2gC3lAGt+NrfYp2dpN5l85sbETXBABrmP
+ClpVbh42zGsxPyVkzO6XDyaanOaC38AZZWHiGoiK3YXf4xJLyz68UrwC54GAL/HN
++RLn6OoIBbfSLY1I3C5A2oMaCzIhPLBfx+/yT6uglGTXRo2c0cVCOeN6DPAgiLhA
+cwHdm/lfGI0gEDYgT1gpJvLdWAcnv0EyCdimNKzQ7oUs1rFJJNRGXjI6Tcp4VORG
+lsVkb2Zi3xGmsI5xrPWODMInvOzgWtskJNExf4O7Ph2PoKnznppCtYYaqdegcALk
+C8ol6liHUK6Vn4X/cLL662LQmdX+fb3PgMr0ku6IcH3Fpd5msjKG33mXJz1nJ5g3
+xCqspTEzApFQEezDGUOScFRDOb74/QlHrAwIsvyN4QDHzT4nu1kJr6+mAlukzqdM
+bMFnJS0ceFawgthwx1dmbUgTrB1k0yEhkGyZaLI9vHyI1x0sCHplQgGjYVkxpsXD
+UUoY4DFajNhsKxf0OVc5NctMLbwYReEWjftAFFtQt/L2aZGhhPuo9YmhiyUS31i3
+2WMOsqaBbXaKF40kt2zeAvet726H6xGb53pqocCjZjJk6NvHSIaCWWLxKJhjlUaU
+dI+jKh2HhL/g9upNKnfrVIB61tG0AFJZQWDGriZKEuibdiz5B+gP/DuZRJDafXVs
+I6SOVMwYIyFF9Uss1dttrSighFD3O64+ihNlNhKizeI7w7n+T1KTEiSWczPYmbAb
+8biVQtZWQAXUJ4qjyNjsPeDP1Ngyi9TRV1hxD23tOuD1wDB4ehPI6MNewB4xbyDA
+lPunvYDbFY69CsKli3/CTbA3hYwDZauedKeg5ATn2xT52QU1fsmpiUB/UpqO7yAs
+cZmv0+WaKcr/JdKqsz8jG/2N7inbD8fgyxt2jndaZeNZPzugBRDconEzWLaaXJj/
+vZuHDISBlxzhPyvuMz9ckzPIEN5O7bn6wEPlv7Sm4rHzB85Y1zEfo2DEXWVgzYMx
+GRM8MYZyHwGw5xlU23nBWMHtGg0IbsYvxsaCoX8zMqe2LtI1/VIRngXj4AMHHUQl
+M/DRWpxUEYLd1/5AFusByC4ZvjmMs8Gr2rhEwbV8vpCcwGpWVQLmJayb6e7Do3Pl
+7Hl41Njkh7lH9x8t6CM/xZuDiu/j730TD+0aFDgQDg8zrKheOTXbKG/0KTLcxZ60
+juUGl1uMKmReJn9Kdn2CCmhEC5Jwrq9jaK+GfQUf41lVbrjPr4Gow1Q/6i63EFmz
+LqSDzatC/TZcC4Dwc+RGys6tcaTP1x+AhpM5+wb+eHa5HzAUZRgwxGpxCnIXathM
+vmOKMa9N48YqbW//mUmXuaiGdsi5D2qlIVeFL54pv1oG+sI1vqEmor5aSCsjsUIQ
+ym0xobYktPINq3idkWi/Xbfc7Tbd2sSd0yW8DlnXPMceeNUBk72DZEPVzLaIzj8V
+ftEobMzRZWoeFeQOuG85pVRiaRwv1fXLanjSiy2YIhDXkuMFnLZhy7dLc7qAUo9y
+pt68r1VAwtTO8Xlw9RX9VGzS+DjarB1TTA1ubJBdOua6bZAq1HXD4fzL7OiHimWs
+euietbRvKpTMmea+MLIcLspazxQDXWAu1F3j6lRNJrQn0k2/Ta1KCVwCGZf7jpow
+Ltbh/+wZVCEh+icUwwwqgl4iYvfFHHaDLez+YqIDZrWdL8TEuCuwjLHrYH30eA1a
+5dzY84ZfllPfKcR7VE9E0p4g0kZPQoK6ndG3TLSrOlypO7zMJW/NCyAzeLiNyUKL
+HoHPJlzLWyKS2oy5EDmk97kfzZ2qdhzP6jpovB9kkgVZk4hStGtjXZ+BTqT9PWKp
+k37D7t3IhK6kXKITJcNptmY0yZWjd7U0cKiSz/rlaTs5iq2xuYTMZvIrZBZnXt/u
+l2PmOyJfwKo78DvQGaJ0WdIWoayag22kJYa87ofgqyXpZfoW4uz/+cjCsLR0rex+
+t20p8bNHlvMXmkmqzW8zWal+cxdv4mQWDmlU0qoNX+iuP0HEELrX4tt0oS5lajnx
+CAx7EClHZwdN9Kl5RLt8EQj/lGIrIbbVsMKdzN6stlQDeH2GyBnEbgZRN4kMcFcq
++VqNxU23AAWzy5TARsfOtkzz48z990JDRbMGwQvT1kaILd4uCi4tjEH3DGIMh27G
+zSJTH/gN4SazDEECO5/fzD5//fRKV8MYopqkuh94OM75swN8VtONbJNwot5ZLclf
+B64/P8BtfEzNdQ0P1WA5fs10SNYgdY0Vm6HQBLL9JxBtS/rrSCD5BrpSSXBMtraU
+Mn2Rai4+vav35fq2W7ANKXhkf1Jth/m0s8dyjDZobdxNDknNi+MMWQJXGvF35kh+
+QEiXJ7WGDu4cJJqaSmr134ffMzbwEA7zkac+sLlkNKpEiPVewsNNS/Q6ei6Ao5fo
+ufoeXmAXaxjWAGiyFccNDqTscT2RJBfSQI0VZLkEcy0u1apg0qm9s1s+Vyqpl4Y4
+Mz4+J7KvqvWx/goVEQYD24gZz1O3lj6imUlEE3/aFYB9OeM6G0yiEfMmIDmorrNI
+HcdWUlIFi8EKdGR03MbQ9Z+RtX7d6Jm/VXRKVbiGk7GMv1TP2NQO37IcUCn6Lh/O
+eSc0pHLbRXHuocoL4rorRVfU5lgzbg/Lej17GvQRz1veYMd8GVKsIkcOQs3sbHnx
+qh2FIW0EMvmdFNNk0UGip4i1tiHwwMtVfCmMndbpMu0J0zzAc4Dm18Gnk55lM5Td
+IGtkK05ZAlDw2aJ4RKvyQsKioYy9kE4zjGeYV05EaA5BBBVxhirFopR612NWR70o
+fgfTn1Fh6ybgnpRdDrEIgwlzoY0hNeVDpEGFPbNs1hnc+HpbPDR8lce4Nc68eJYc
+Z+PHeu8La7bVIkcKbQMmC3HFdwtuLLPOWCUxBFtO7KDWCoc1Wy8ENaMkrIW+La5L
+BJmiS8ww9Wnjb6xvd70rlgRVC3zKAVi+YBSgc00C+iKzRC2+ZWkMZK4crzeD08D2
+6yvlBmrVp6bqjxmdBmuf4bhv9o7uf9FeVwMmYE8mXLZ/01ME9I8K9RJzLrDzwqyD
+e12eJhElRcc+LJ2ukGcWH1QJKkplLcKt40QQUYadinjqq10BXomtNXVK+P1BpCab
+wktAZzlKRyJzt4sae6gms6urYdBlRe1Vs0KjinqUyyss0Ppx2V3T0NenbS9/6xet
+QWTBr4PkinRJ9q5OjsZg0TyWyf41/g076Y28NbbALAj1GTW9ON4W6/BOD2OnFgix
+oIg/gb+Df5L+TRYVQkbYhFxtR9uyEKaEDVm0OWCyD/le9jLRVvjreotKXpktvlKQ
+1WLa4My0372qn6bXRnrvtfp8I60Sc9dzSZxMVkJrFT44m0BwIMEWYVcIdGb60pxB
+qb7AaCv36i9CeyM+cnXPYnxqSfdX9h2rZYh1VQYCphvhJUYieSdzT/wzhk6qhh5g
+cWmMMJHae6vslU3dCz2h5hNdwGY7A6IehP80TGPOuI4wuVuWQsPnwES1GifrDEwn
+qOprqGa+oQXMKqxykYdvVToRocGXPIPrs8mjg0SZYYCYNp/MehZR/Dz+ZqUbYXtY
+WaCFqhjG0gPeQlvBPK1wT8BJTUb2BfqNJ6d98ARF2hDoB1LTnjE3cyhTS/mKTSz1
+l3beS2BCexkk+d4s67zBSVMjjjp4jBiQs4wAuWVJUljTxdpIgZs1S+luD7RUz1RC
+Fg2Qm5Icjq0nZcoHpg0HdZ8rZmZZMJi8tW54LLzvMuGM6bdOMavA5qaa/dW3U8K7
+fwbCR6M/dYg+ZDdvJ7WrQFSqjVIL5SUxSkiMq6HRgTOROY5br4w/qt/YV6P2kYsk
+SM/gK0w20Rv9wLau5gOFvULmnfwPnwkBOcxqjR68E3AGIOlg+rgvWKFpyHXWh8cr
+HjUTR4bovy0RpjsEyqIdS6fF6GdFEYWbITVyWZs4dvKLJIUXbJG2lEY3wMji+3BM
+1K5Vwx5CfX1yRk11KdRtWjDlGOmMUoins3Z6cpVq0EgI5BHrQ3HoVSHlcyuag1mW
+5cley0BdTzby5cmrARgPf7IebWa+BXIKhhICFHZiO8DrQogs4BViS1JD2yi3xoyh
+gLMVuFa3oDKeZ+ZsKlTp4Xzi0SAD1HQFMvjNLPmmj52CjpIiBvSYN6uVe+LMnGcX
+A8+6ng7uTmFa+AMfnRhbVy58sepB/jtDzzZUBzmbhXGUW87mRhWPsY8zRfsJCDRI
+6YdasdnEPt/7ODzZivI/1lxcgx7ARY+eVoJhr4EDsRTXwFNqTaqFYYfiZ0jBJPek
+/P7hJnflsGxF+VniPnumSzwoov+ScHvM+Duf4Cqcv7GH/GqiLxIGH0EgSvBq79QN
+WnMeputEbmL9LDCbDwJTSIYGzn0sOrt1dmXD5EZ/pbvGHtXsVckaQWUglKgDRrxp
+M4mcyPeUh0Z8Ds3IrqgFUcEHoJ/IbdjdcNzQ0WoPpLCQot8nroKMwsGvK/e5k7gm
+r9A6mAhLxi2hwhdGCLZHFj8VbTypASQ6dOBz4VCg0xOoxOxJAY5wxPTbKaPEj0zF
+TaIoC30wvrVl2uv4VBrPV+GiQo9LZBH4I8GIHeDG0qFmCHtKQ8hWfkqCADxCr3Du
+oPWei9SSMLdbqPKCEXkH67ZxlRseDZ9gIAsCAYO0+qA5DwL+urDigaT7mVfbhUFX
+E1eoAyRxzqz1nIXwIbeSyPVoxPQRYrFIN91P8QX7uGOmjCtrwqiSSFUzKhPk9pSq
+EmYAlnDkCDYsc6Gi9RhiaCNxWdTZLf1umIKFuAT5ZTy68YAEnjq0OKa5CwiTDLt7
+jkDQHMI1yG9K7P/cd+bCEI/tdsN7i+80ciNu+KkdYxZe2prg71LaBDQd56SNeQjk
+aBBOvj1Ia2p8PAZaXkjByggZDlRhvupcR6fkrOCJw7SRfEejtGqLLtEENHFBSX6e
+0Fl5+D9Qj3Rii/v6QPfsf7bjcOZwVSdW4Lzavr0Pe8bayDUNKlyrjEtv0jqXQygj
+5Ps6dIuuUCM8JKxNePypvw8B9h0hlxfaXewbRELBvOG5EKY7J1GuOkhz5PZpbFXq
+/WyFhv+SXrUP+WUKKmX4dJHlX1cU26/wIt0GOtN/yC8SsX48skT8rdPq066oTtbB
+EDm2XjxJgNnpQcIAJTupr7JMWVzqRCS1LzQH/WyLpOO/7a77xA5k7cGDPFBBWKo+
+PYYxh90mOooh2cFOQ7RHAGSTnB3usY1sAuB/1lg8Xi1a/E6ok2V9yVMSerZ5KdxX
+toTNOCevxWJkT1uKRjxqk78eI6QNcnEPq9E8zpIQFdz+V6ywqOD/leJTIkpbPWsN
+Qc7kEQmzbJN4vMATvawj9QIfyiFm8Ko8DDxXxo916gFp+169bXXdD5S58uIv3+Bf
+hqFuCpdVafajSxQQOXRcvYCE/k/uEcXtkm2p3WJolLdYTnXw1DuL+N0/2vWLuc6v
+VL4k5TWXgOqzmfe/mIj4bKWXm8Glm6JMd+PNbPKEGdh9bLc1i588aFiUNtramL+E
+PaPswoDaJVmGjmyawQLFqxyzBHrHU3VW96z66ADcCtqePb+uxo96QOlPnIiW5gpw
+sT+hWOimr4rA9WcSGjPTGhxSyt6zwm1csQpL45hT4K9DaBOoheij95QyCZQmxdaa
+0Ybs88+7FoXUwClaf71kxNdzcxEmHDJFJ/9YjwB7WgJ+116bi4I7Wj/bUppQi9wd
+kYdSysBxmu30olxy70b1fYiYYCf1wwdFAyrX+it/KD9r+JVUmpj8AbTlBELP3E1s
++CDKTRo1F1uADHLHjeoT+55oV5UFZUWrIg0rnut7y3+erQzxnJ4n4DXoqah8Ramt
+sMh+n63+hxuHs2ye0bmOXTC4JFMM4Oa1s3Sz2RNODOkpY3IRTEXDgvBlAbtmybYE
+dtLlpCkZO0MDYjGL8lcEu7OTlat/prGQT64wnNaJJ51CcotD481IjPA++8vROF+P
+ZdrrXsOGDjZxSItP7VIAMGH4SneA4I3r2181QVefXwH2u1UADFxAmdGyAvTQmewE
+d6W5rxR+Jp2HssPH46ROZPZyBsyNOxLBX6c3rC4sR65UgNMdvV45gdchOfGAIvC1
+GOjHvWfpii2ymK2hwXv/GlR+7PnW9o4hOotmIfJdXc6vHzjx0jCDqD+YeDTG+8wl
+rHDJM7HM1sv5YfsdFdiS9jT9KSCjKw47sOaC/DL62wlzC3QJpSs8m/9QrAsp2e6Y
+GGuFtz9ruhYeqZ0yrckCxc7N9KB5iWZCPta3cBiX7rP6b3ZXJCxDtgEshVnuqQ59
+xIRo7R4UmzilpNv+3nf6zH8SIKMP1CjkJ9KTrauxaNqelVZFG9f99dPH6RLBUEOs
+0jNHnDmOPu16Rl1/Sn8qdAhnpgOPnm8/uZt6ZsAOwYcA5ZUhJ8oZEIPHBm675mBJ
+5UDN5b/Da40APSPjHV+h0E58t5sJ53ojtYG2qF9CjGpRCwkdlLQx6eHxk64cMj2c
+u6R8oMTvWUUSVYzZloAy197/1a4dLIe1my9sWkGfP7UzbLsK1WFk3vGyDbkZjTRJ
+PYGAie6PQv8MglEWjfBDoA9+8xokHOb0nbnYX2iZ6OiDIUl+WMGvZZBEOlGIz73P
+Q5HD29hZjOA48r/EUXGD2EBxlAVraHOL3LfWYFhnjiu9m47QoBRFinhXUhRrYOnB
+lTLdFiowRbnfB2u6ZWucZ9MK+suqVxrDuSFyO0qh/GZo8+1v1AjBwhar9VGv0wlI
+P51xXpcjJDMZ/9pqbcasbi7Hu3krcN5IjZGy7Ji9HQ1jI80PBcVD6yLkuezE9hGR
+ztYWSwXtgNUCXuIHTzSIDkXuAWMFoxnOcB+Y1I7cSmRFkx+R0HeZHlgLv26kCkE+
+WbRNrB+W3QYopbyBEsEtvza7eE3M7LlG4gs7+BQW0cmNBbmKt3IwXcCsS0HY9XaI
+PoTaDth8c16DdEuPNMHujOj7XAL1P9ZExzIszKBvbRf91Vd2BBexjYnUYOkWGAom
+JYhKEIFllXIabYYXpBdDenhapyK6h92iGkgzNmAQpDDttg+Avlt4goHg6fC2CmhW
+E9RxYA9l5mAwHZNwngFUgh3Po0GMitN5ik1rpjNzqkufziwbB/hTOnSfiKHsrUYy
+qgqDlw3SX9t6bl/0d6oTV7pKwnjyeY9/UXWbOXGtcGwx6S6znHI9bRVMcTvAoRAb
+wOcEBM7hUtzeB0yD+VuXlO//6bS4WHvO240QV30AwTWnbUsdk/rQSzNpXeua6yx8
+zzrIv29P8kx79Lzfkpejm6nXNl4bOensm8fMMZ7d0fkV6j2Z7eDJhpzCT+UfM4Lj
+FMTYj3Cx6XvW/U/Sn66x72WfCHZBHJDU5bCJDOgUli/PDK3baP+CuvUO8f1Hib8q
+0f2QtSqpo8j9PotZcSRfqvmajVBL1U6PwPf/mdu8/BTuev2iK2SxDApTlmfrRohN
+ecUlLDzSLQUtCzbx/9Lm/n94jl3GI7SIK07Tf6cVDLptH3AcczABOQc4ZKDiTLCI
+vGkXHbXLayyeHXBerNBdHstwHY4NhdW5BMn81diEO+YJd9Ac1qVzvnYldQIT5Fjw
+8T1891MaDmFNH1fEyHdY8Pry4h7cPMjfGniFiUrgxCej7MyEyEWBflhYeRxjIkoA
+WEf0RcqIiRmy2U3XdLE4A+EtlwqJbEqNRKmDqySw354mL8Z+WYswSRj+UOvwUODA
+wAH//H6biIZIxK8+yjSyXt3i7p5U64xTlTdaSQUoNF+XzuCkcH2viL5XDBuEANZe
+6rj/8WjUV63dOwEl3+GJ2zetTN6UyaN5L96LrmgP0sLnMU60leQXWYEGSCq+/ZSK
+7SLP8StAoX8Mc1+8xnKh+tM9rVeWzADuBiQ6blwEskaMSFvzwE96oK1ZtMjVM1Ub
+fnkNeeZZQ3nU0fVQzqt9RY7Yg+A4PFRblfHwrRV391XiN/i7L+BmO0juR5+JmDdU
+HBdsAgx0HvbPSiwzNgRmXE+yw8GlJ//sECpKtPCpXHll49orWaRVQKa7b+fz6Dp3
+wsINqEehTt0xTM4rZS7vdeWUyIGFpvUxYRS+2xEawZ66SmYnUMwO7HiOLeRF1l4L
+MMj+BGjZ90CPTjisb98WW/3Sy3YIITMlPN7Nuh6wDI3di9g8GMsPN40aPFoJFHZB
+cMWkzgOV6Rix289n77jLVx1gMcy+28/jvm8P0ADKafOJ8MyFJeZsX34yQPk8GkrM
+fxxx6mZwq8Wx37YTHb3almaIDkAFD+4KNQUgYY2z+BFqnLsTJWPewIYZ+J6qRUL0
+794MG0ljTnolWRh3waGW1fYDjHFOSeJF8wDR/m2Kr6IOOvvf6RsmmUrYbWcSZ1qf
+0PYc8OFBo1gDt0762/oCJ7kDDhlfXpmgx34XizJUOuew/3kKZ1Mzn9jCow4pbTuj
+scS4Fxa0BuLyrJyi7LqsIpVMUnJlJBWSP4u10U9F6hVuYQvFUQY/g+k4S4zeuCud
+jtt2hIXDkn3jigKZKqN9OKjqSpciZESVARP5tHB3OJGyjYCWPpIKxOWuDzI1+qoq
+SSAKHNBrEy9UTSbDek61PZ2rIp2t2hhJJoEcZt8PIi6dOMBJXoCcvZU33LIrFq0s
+klQAmCSayv/bczM1MeDGbY7jWbdZ9sE4pW2v0UAiJ16ySUYnkpDhiNvAQdXZig4r
+2AJDi+HZEWb7E3cFGzcqGpEeaEiN+F9EstRBIDVKoFr29TghyT69VXJlXZpNCWC1
+7pMrkXPR9BU5Td8UcbS5EuNtQ/9UiPkq15nW6jkEF4O9JRn7gHZvjz2LM3cgVfjm
+UI4wEWWeb99YSC/vIxY1qLxMQF/hPF2JOyISfsAEhDGsglrpTDGxGSkHBRdjDlAF
+kAp41zymI4mPl9UpzZgKchhcLwXOnQLNRSpgs+Cx+XjDd3ASLMfKqAngjC5NxnN4
+zaX87XU5qmfik4WTEBaapDL6qnKa45Rw+PY1NEJxqFdhIovhOWG/CSWSeKwY7YOf
+V0jgkfVAnbKjJMlsQQgSkzoItLLJFPhoLMZYIhczT0MPayKyBgyuoiz5tWxERUeS
+Wz5wcUt/9DPL+a2kHCd8QHZ5kzHC3tDF1nqcn/hs+Jk7tHO1bWSv/rI+G3pv26LH
+ViXrLW9/NsNjiiMhgk6myWt0aw/dump6VwfqstoobXeRFOisRMNHwH+O5sG8Idf+
+6+Iz4sgkFA87U34tJtmp3n97VobSjIeowEFlaN1M0yS/SZ6SyA0viGuEfwWQD9Op
+fkTZQjdTMSmeL5HsAxvLlKny5AhFeRCdpIeed4GeeA76fmDwEPeKHN+zn6rt64gW
+a+Exvaq6XcNQfn03tkGrOptyrsV+MdV+tsyiobQ+ddcjsQTSIjq/9YihnLChdpEg
+A78htqSZLH9y29RIkQuiaYQ7+EyKnU4bk7W83lEVQ9H4Q/7TCdgIG7gqxBVTcuzj
+LZC2Jx+GmTycKw5MDnOIG55yjuKmfx9gccIXP99rjZDEJKxOxQkQ/QheiJGPeCBU
+smr7uyri2CjmZ5YBQUVN9ElsxpKixVxw9fNOMJbxAcOaNDVjUTOxS9yH07XmS22e
+KGw+10mi/gJbJW6LDONu8ow5XZl9geM0CfLOljIqUO1J/ts7E9KBhz+T2bIlL6//
+QyT7LqmdbmOKpQtKE6jK0clGKViZOti5dDGO/wIwayk+bVlwdfZk1qAEWnc9440g
+UUTSymMMfZx6R0hMWsHJbPM6tCSl/t4TUWw/NUiTni4stOtICY3QlcV9msHpWAnJ
+L+nP7J2Ps1BJzj5WDRkT7iriOEda9kJQF4R2Ki5lNL1sUVJOCqjueJ9PkUihJMXu
+49Ip/HM+FxdpYPurXmA67Uya2kW+ip9EnP10rNfp2WUWp4evuwvlwmrgswJzLh1M
+CvQ8AOfL9gz73xErefa58vLtp7N6MXaW6v5KCnBuL5upXot/EcZj0MtNLWmMoeDf
+kiHcMvVNx9gVeFiKabqbI5Nd7WPpOuWwnMqwLE+yv/g7Hm9TDhB3WnrnJDWs9MV4
+DfdpUWZBe6J7IHfMEuLReA6ftWxU+1l5W+l4tstb0IoE0q7+0Qj8x6nbjYxWzk1V
+FgW5lUGmt4kH21Kpxuu7hHz6DSLpfH4t+cw0sZYj3NPDLf5IGz/DoU8qkE//DYBu
+E9h7/9rxtJjmCO+2aSZn9WxWgl7nk6sEex9YI13zf51JS2n2vc2vIe+2cl5PVJd0
+5imwAFys3luWVV10jU7j7j35r8l/9OTtX+cxkfTssTq/KX/qGvmSrxDwX8UWVqeO
+D0+efg4Q6QherEdyEsi4gZ7jvpkyEdkLWRwJ/DBNpmgdoSfPzo+JFsaekXQ1oiYF
+CzCW1DbLvGtVbLvxYU5oPtplC2IS8R6E5ciXZTTbBfaAVVcSjDarIkJizSYLoDoT
+/yrblyilJ8Wb/Kb5k/DSQMb79l2v25x2oDi6nVTCnWwKjvAvRS+o5fAhVFk7MpyV
+3vMAinFJMqZAK/UzqeF45YyzjnTlRPvxnPqXenl3L88Tobn3HRPCpX7iUKM1+ueJ
+bgvYwKvsw2+4wRjSEhdIiw6+N6vVF9CSg2dD7rjhY7JFrH9HW+c4Kh59KSh/zDbf
++/MtlNZnVs87B/d8oz9eH+WEsF9s2I52FhYI9eEXZzGfzo72YC9yMBZxUo7mbcyU
+0MYg5PZJ3/9te+EOU6yhZ8DaK+9zrsCXEOfIC76Ru1+0UmoMrBO17Q2YUKpR+zky
+U+Q/K0rHLBT1sP1kIWJXetKu8Mx9TVlkFxlZj99J/00OwyEGi+fOR2g6I/iaLo9C
+XExAYhblr5oTyDTVT53iJ0t2DjY4paU2Mg+0ggOZLdVJmNoq3UDwoTgp2mwR/tBy
+NY2VOgQCypALJdrV7AlZWL/FXk1g8K2D13PkJ6wvT6Jw0eSKXKMdHXA0S5xzIOUh
+mcxUWUBRTSTBeFqKEvo3YYcL5kF1lCoOf32sv6/6ORSsIGV0TJxp+toYUsOLtYPU
+6Xak+3zNVfXexHUwZYZ44GbidihpX7zKRvSupQiZPmSWeUsPT7dClQBSTRibJbZd
+AR+zIpbB4HWMjK6eYk8tnjpNwscdq0noEdIFjaNrJjUe9LLERNQJg1y3VzRP/ngu
+1wsuQkv+vH6CrEaJ0Y6qcHh0HYVnhUi79NczZly1JUCPM4sTky0TH8BlyvpEaqFz
+K4wj6y8p/x3+MvxW96LyF+bcEGXb3sWH3tdWPiYqMqJK3pNW8d8c3ZpXCTtokfBy
+zsm2d3+B5yhP6Iwk6CCptt2ACGo0jN6HuVX8owmAOZ5ClHH8S4AFNGFZTvuEwZsq
+iCLQ1uL2D8DdQYoEwim7lBjwC6dUTOPwhI8DioJFcqKueiAb/qTZuGM+2GgDq7iW
+RmG6aCk5VnN4WW39hQp6mfFvAM5Ql9Rgypzf3UIHOyeJxgF9ggPRVFhSdb4ihGKU
+4gSJFd0o/yu+MsAa7zXgwwaDuDQdt5VlMhaAvmJiygokq0nJwsBWkxGvTqZ5fDUu
+UzVx+eqb6YLcXgWkOLrMhPQL9fwy7jbxqFW6IiPowNaSJFWyGas3YoZ6x3Xjlr2B
+YJt5uMLswIhU9WxeDY5Dd2m59pg9GDL5AaXgggFlAuxtIHo+Vm2bxKKmzqCTIykS
+t2Qp7rI9bAsJGRT1vqREoQL4HBxn70U1WDMQZNf2KnGm/8F6YpGA9WIJl9GJzFOG
+88YqAXgOC9gFmRczBW8VhOm+A5om6sa3HvutfOSA5ZnIVuGdfa0skSkbFhDteFeQ
+AcyIRDRii3GKlysz6n2k8o4L5EcFj/YJKsYpdE0mcHSA2tDsSu7s2EVee1k2wyDp
+Yy1gwex4EkygFC9jRbs+M0V385KtqN0ETer34ZFxnQuJ4NGYQALc1L4zZN9n89SI
+ovCcFkBGyPmFw5NVycYGItSNaB1S6VjeEhFyyWVbgrgQBDAjxb8uaM9GA8weju5F
+SdNxHksp7Ysqz7TLq3mHbphCaol1gd9++pBvHkN8q6iOTlUluuFu8Wd9zJHXYpN0
+w4uSwUzQ6SdYNMdJra2uS8eWu/tpKy7aBXOY7cZra6lMpOiodEYbVLEBtLwijwlr
+SNmbVzg0ew/dcOUgGblEeHbUlYkSoMYwVeNEB9GDUcIKHNG7Lmr2aqtwmcWSsx9v
+AElv1bTPpq5OjsAtN0yHEcM8GKOD8kW4lWhTdpf9sh+kv2g413pLjKRh0XHH0d9G
+1zPVhtqMRKId4a5Qxq8Dh3EHHft41iI4MJbof769jkorjbsftgmn4220scQYKD2B
+ase9Q3Xm9GUpGb6GbyPKBvcgO79y9kqiRXYgj2605EXD+wQob44mxRq33BSKMIYm
+tp8mpDqR76O4RKrDnKTrHcOiaChF0rtIoz5SPM17Id06V8DjQai1h7LC2R2gpd2E
+izspbx22TbA2dPjVIZtOKPAgRTO7tmvXdJcty/Oxh/r+26jQV2xf1uR67SmKcBM7
+lrpklCMZwbYo+BPzbXbxXoNP2VDh9MUb6PY4HFVTBTwZSQkXsqi//QKXKHbVd3q1
+nlEG8mmNUGLdJhzmcxgVS5sCz6wN3zIVLgutHR0MzHvBEPEr+fpwzUJiP86l8p1s
+QcuRX8UVY8sVvhJ9/pqghT1LdjRdOYxtGMWpfIZO1iA2XOKw+sA2wgy+H6bvSYhg
+l0XOxe+lcT2WLFrHyf+eiV69CqAWIDnWNCZp5tQXtQ5jw9aZc1aB6rP1NBR8wc8l
+jngAAPnJOikIfc9+MQHkGLqp1vypdWC1kVEMHdtuh5UO/3QJm5Y0n8ajRZB7K5Lk
+/1jA5GUH63+G4lOe/Kn0NY5FFoz/WDM6fyuzm+q1gg1WngWCBTDOm0BtCanMKgtL
+EhbmLTVxX0l0rHbHyIHu5itYXviaKsetxY0gGvn/DAyjhMX8rcaosns232a54sbZ
+BhYXRkSSaPYT+gUQYlpRkqkgca/J9o/yqRTrzrXdGu7IRtUj4Li7kPn9JxN3cQEf
+81eUWV3eHRxXwiTPfjgPNGd1Fn1PZAAK8fPMr0+bbtNhrQJHjLeMVpitcl35YU34
+PTErHuueMniBq15EXcLElVVHlhBTXTdEy1nJcK2hWVRcKZNOlFizdgwgnFNTjFH6
+Wlqyf4kahmjS6W9KxVSlRZQTl3jCcCGKkIh2jAphwbRKIvh8UsTS9+IvrxVc3hTf
+oeviBNm7fScri0Dy7h9N5M+fwttGhSb3i5AvUGIK/Km4KXUi8DO6ZN2LR3lcPKMP
+s5oXxy4zG4SEQXXzNby7rFNJtcppH22ltgfaL0G76DrHDhbRcPzFZc46B/DeqR1t
+iImNy31OMZ2q3Up4ZFnPqVw1c7MEQ2ugWW+k5APhr1+S1ZN2JVInBdB+Y4kFLKzr
+fcFahwP4KPlx7LsrA0ZkzkQgPfzKUuTD2N5bG7sy1+NCz5TSVHDLaCaMZ0f1r91h
+WvB1hw5SqQK+egEeZhPOR3jA9if8CPgnojMizhhbqTXArwWmiCvvA4dIlG9ApPZ2
+ll7UEt8P6hz1nN1/GkgZxtJ5I7P8DqTJ/2rbR1mKtSLnqbPvKPjW9BqEU4GByVjp
+po5Poy4GzTAFSSiFrJ1/ZDMuWrYEi5EHxKsgHuFIx5lTsDe1Hiad6Jfg3nKBjd1G
+S0m9S5pkhINX2vzIkVLb+R3X4j9O6rxl0H8mqXRYUZoaC6lTKu3X1qYXYT5WcyfU
+lE5HfEOHzyhibRcewqnjsYlb5artAcL9lJYfGOadXIPerXCSKGobU5qyry62U4+2
+3scZBBNAaloXH0dDtiRCoCqq0X+HD8+41iv3+8wN7Xc2cG8t9rmuNgvqE+oHUjsr
+8Ynigklzo2wYlMqT1ndHRUs9Hi3tdHhZ9Q5tqMHgAF2lTx8Nc9Kfml0Z3i01vEUt
+5gG0vd1o65cKGjlqoTpr7tyJUdcMFCJQ1Prdsu0nGx/TldIYEjltLhl0T07h8cRh
+1gFaTp4CVAcvSE5yAkNCVnHAEE1z3xy7Kjsp5X5//SQ43jYDjujB0nMg6el53JeD
+pjwowHSJTvSgoZoRRqPzjFO6aKrYO8e00Udcn6+quj1lX+foFUvHm6r+SxP8BV78
+OWVSiQz0F5DN/IKIBmDPm5A6ZogGqmSFy09PoCG4zm2otJn0Kwki82c4t9LRVG35
+xBzetyPRB6rMYaX0t98P74nLjxsliLgMpXPxunAAWzuqe/2tODU0KMz2KDboUja/
+/YVCdlGCyr4AmrTxJ+jpeiZwKdV1bG2Km5X+Vw0doYI8mqsamCrlvZrb7Dqfu6wb
+DN+Lcd9tGsA523RSuGhcsUpaEqPd4JVTKBmylxxybhU4fy2Xb41qXcSAonBQXPqv
+wC0j5fTIVjCcpHMnTMG/FdV7XfbLTStmaHI2puqflQtl3bQ1uXf6AExHnCOudOww
+xLV1hUu+hSEWo0EkX0On1YM8M+Mu9zIRm8m+W9bfAHzzZ960eo1WLiPoW8uWJcfm
+JGD30np4QKwQ2OsvDgfrJq0pzWy16dTlAJPa1n8u12h3KKimki4TG10lg/r2qSrM
+15/SKmlpAueHdNQAw7zr85YudcX7x1Am3zrFO1uSvhJUxmfgksWRovzo101UqrO7
+PBPItfk8FLWgumbFyzeiD04bjwcYs+zEW4RiRyZmimK1o9dqrRE1gCKAGekQKbPA
+G5LQ2KHlK+xvAVO3POQasysd4mKDBefVeCXGvCsq5JD8wA6WcFxVQii4DMDFgVoE
+0QzGBntSQDfoA0XffrZGdSv4vBMbkd2NfOGu3woRPDz76q2AzOedX6LWmd8lXhbc
+6A69yrg2LuHMFGY9idEFAi8HkGIUttRRaLUqTVWXjRXpgogBJc1sAGHe0JA7sCTu
+15URUtFaz95sjYDXzyRT8JLdjfD9g98GlJTv1NZOeB/sTxILOBRnEG0AkZHTuddz
+BhiyfKGFwqaHRtn0w3klS4FLewkvSociyJy1ldH0AkaMxxY3O+ifsi38zZ5Xb/85
+k3R1mKvs1oCPEpCxEOKu9Ac965yfLhYNtQ0NMHjqC/nJLuaTJJBcNNkQvz5+CqVr
+m3gwRk5HSei0Pp63T82x98ZOONgJXKTA2m3sp213Fjc1Hl2KiS215qK5jDB0orVy
+nmb//EjXmgusxTk0cfKPrqlArcAfMQgpJRVxAtzJQEI8lM3qRHagE++ZmLBqoc9d
+wKv+umVl9qyNqiv8WNsdZGjWoZb7ElouaI88Kby83EFrHxYWvS/AmpA3YH3rUb9u
+88NMM20Mhkpqbr72PqN+YEQjDYg4g1fx+3yePyy1WwK2PH4+BAPb1qinLhhK778M
+agICzHQYoZDSwMHSWxgUfetweT5K8wToqjvhNxat91hcEIxsG9Fpimk53cARbg+w
+e5OV9z5+s9tiacWOnW1GmKNYbwzTzV68ECQNunWQ7EwPucZmnwfaz7za64wttnjw
+R+PCA3WK3PpakoUNlXVFHi6Ut4uQud4dbBgYHP2Nd0idJ42JYqnOvANP81YiVIOP
+cOq8FO2diAROTg06d6z8Cu4v3GGyF+s3lL121TVJCAuyjiCZJ4rWlzN5IOeD649S
+LWB2kdsC3f55fTiY4XpV9s1uDt8hSVGEh/m8Os4BZtMpefjIZrkARH30zapap3br
+Lv1y7YzPsNKEbAQF9hfYVDRttYHJMMLNQP+mCgH171FdKN3MMZBfWmKbUp0zJ7Ts
+vsbV6g5CRxNV4cc0PX9RMxYgSXA82KycoJ49eePauSylBNHgaauPYpQCY0iJIeWj
+LRrn4XtEJgy4UakNhIDvC1gkG/9iAxYRI9CeDUvT0APJQAC3uzsHo6eRIP8K0zp3
+YlxcSijg//w+XUu5IxX7+cTz1doEGLSMlsVtPaH8cmUlaD9EWYYwFwb2dm4Viqxe
+ufLy1vkvRKjFNit+V8h8k8KX+iOUQ54jBJ9DnQykUpNPVNU5mqnndLCMU2T5Mt4o
+I1qTRH3OwVPuZlDV/b1EaLEm1QIPVeh3r3iYKIPkhkW+xRoqZcO0fDEeW4R1c8ny
+/WPz5Rqm4mMi1pBl33npXLLy2L9AJh45ZJgS3TLNwGR23j93dtqU4OFGkm+kJ3hi
+NCl2+H4HkM3QDTXiG2aOZFvNG61RRFjbWddv71r4val0lFqb7yiYc9e/yTB/HN1y
+CZWdvInVwKAHko04whhl1BWwdWWN7Ldv4j5GMu76iGZJnwEBrCIN9PkA91EMkytC
+rXxqNq+/pdM4pVg/5/8+Trbcq0QNusv0mlzBaI9vYDePVfr2GQQD+UfSkrgCTHbc
+BLeSF8v3QvSVU+DuRPkb159aKUSMRgffQAOe7jfCy8n5FD3Ieju+jW/Mk6CTuKvl
+EawYL73ZpIYaC/7T2z/ZwqmRV0AIwcNx1+0VynipP7zCeEx9M7Vgx2hEMD2t9Mi2
+I+aPbROFHbaDY0azsLYm4pTn1yQ558zxWY+kQn5DAzP/1YWgeB+r8G6yR59aQDyJ
+VMAwGxoA6t0cg5DepX7bod+W/JgodO/JzSQ9KHmmLzbDYSY128S2h9MGkoJ7Gy/s
+JmJw+fjbybCDEXIblanpBYL9KmBsvBAC11W77lbH/P+pQTm0reJWzjqjlXy1Jgtg
+4Qe8VEVRB3JedmxHs1BIuvVOKpfenKC3TDLbDXzICzSnGacdCJoI9zfD3bbCLfJj
+lUcSJuF9a7Hdl1UeWq74Madbw9dm7f4hVRqF1SAgyXZiFW+qePUWWedZlfUVfD5f
+HF1QYMDbUNLYYtcabBQuGH0FCpKGmjAnlVUw3aacJ9h9ZOJi4WBtQeAJvH/6eEsC
+oKiMPyp+qbz6Q64LFLbplBu9r049iz2F3hsrXGXIJy0GYJnHlefbNHOa+CTPUzeC
+qzlT0AG8yBBMHk2Z7pu/vCYAsOzNcKtSCDyxX2b1QWwtDljZ2wkSdMBXqyamFfQW
+64YLr9U1PAGYG0C4sccdKwzejCPFV1Bb49ETzf1iSzOskf+0mBRkhqxLEr1oZAeM
+Ws9l6UYQUNdGGtVcXOcGG1I/PWH7yIM7xqd+n2K1CWVEFIsilUskKSsy9ztXLlz8
+wTMCCeOJimSpGoejCwEKKKZvl5xKEqI/EeGScm4woHqM+sJiOUcHCbAcYikLTYGd
+s+Jv9nsJ4paBQxNvvkLWpi9sf9LsmerdPXcawJ0EPqftA8/UbRsomAZdgfs68hb6
+d9NJMjncCasAWSfDSqw5WxrDplaVRD7TT0Kmn1IWiIJ0OT09U4zIt6FHV+5l0GGK
+8C2zY7RrEyAZOnymXxMCGBxyBQ0OnWoqxRlbb5od2hROouu0rlbATkNzjkaBw+q/
+dBMF1UucdgEsBHF66qDIACZhXivKoWN4luFdWweGLBIvPXeGV+/JkQuPjUJ3RUlS
+AUkdQtzcrQVih7H+W4RXoxqS776pdn8vLtv1yZLpJaNxyz4T6Rxzu4LRWcTeJ1IB
+vTH5g5LWOK7cYJlwNhwISPJi3DD6m2JMa+dnQ6SkGMbDhmxKjtf7tbcgNJ4cqiYR
+MejcpE21ArJ31+Vvpd+l9zYawP/1a4erRvwE2Jgu0LOHxVDP5OlXl5BpKPZV6C77
+n8uEXTiBaDlP3mxTAlUwzTWRV2kRxRn8XW9u7mjC390C2pS46N1oGsabC3WZRGOC
+q53KxHqeTgSZVETNuxcv4MpXMjNvnGMAFY7XjYKx37IYsvEH/e0jsDmjFEzxcyH4
+nBh3TLAIe6eeZgRcmbHcaeQ6NAOkw9Vg+dxMdZvfobArtOsBLmKYy8nsS1vw4kOO
+b9BqW3g7av5fP5UVwI5vr6rZehFEegCfd6eUZcWq/jKa18x7ablpO6HWXTLSdJrB
+PwFw9zSfq2emS2lDBL8+DhyMPbujnFRMccFSN3LljEtp4Bur/qVQlRROJCOnGnJK
+KSN17+yWaA/qJd3QJqtVKEOdofvYynfOxH+ZKGZrAvkx3LfKYACKu0fAs7SFy2xp
+IvSR6gkQ30T0j26judhb7sEkhRWCUiOVpTMbmfJV4qxtL7jDjvqKWnbv09GjHLHY
+xqY8VY7OxhRZ/fl9oX9uHriPqZ0O4lro3/w7izCcjys4fuTDx55J77SiAej6ltEo
+lQKcO/Ao3kzGcjNYFCtPLVZC4LJQDUcvlK53iR0dqLGYZLNMsPe7fpp21GkeYyVL
+cbvUupjz7i/N8qAlsvZ/Lydz6bgA9S1ztnAO/XibBm0dx1FYP+AcseYIXBbCuxNC
+NCjHrII6tIklP+YSaka0wSMp2gMBtJzIYaPj2cu32gqtRIUPu91KqzbdW3sxt3X7
+spR7LrmHfmTLsNHNCU9uI6PSfLdfJwh+OIDGTJrStGe3lmuzOZXwsNeu3imHRqsK
+7xZTNCfMTSKIzKpURxTdJByVGASlR3t98sp4Qh/D7553/gWDCJdOTDQ46Yuc4B7b
+mFSHqo7b41kptjQ0AQ/TQ0qgNFQvVsv5WtvfOptZISGlPRVbEAZPDn98yQhMJKnT
+dXro1fohYKBzNBhP8yyBIP0UwODX6wak7ZqLqq/gvtGpCo8PSmuuSKRs9kQSCZ3o
+Gn6AlrWvVseGxHZcELSTW7km43yY34sqpGohPV5dLc6beMpXM2ejLbjJk9Mebow3
+7Y2fw2Z/h4OoBSQazDkYFLSa2h0iMwMyz1okqhr/lYaurTp62v/SXDB1ykx2cs/b
+dJEKMeWuPBqcEWJuHzRQOAglgjtixxWKLoJB8r6y1/D269X+IuyuKpxSZ7CD2iLc
+U8aLORpWNlqaRy8X8bjz4POCevqcT/2sbykT+nv1rcCBnyPmhbNKLgWeoTW5lNcF
++NVZoANviqBCHx5E1QFbWD39ggj8Zxolnr7XU5F+Bqan9yvUPf4yXDjgrmq9YrPf
+Yfw/2daxFTyv1aAyqsuMTfYrTufGdKrC3lb50Mbx9/JsyvnuVjp0f/YvL12NJuFd
+ggHNRzKTUQVzPurrGwYMWvQqxnNJGiX4HIaywR9QsavltbKxDIWHyC4MntPM9FPr
+rPYHY9xQIXQ32sHWiARVUUj8ARuz8ZNd0s6L7je7S96WjEDVNE/KUs64QWFeiTR7
+HXXABSCELMMHA0I6L7+YcAbCpA6FE6TLjv9QFKcubrYEgg86W93HAWylUjm+ElVi
+O/ymLlmXEvSCQwRXskMGTeP8S+TfchrVVP8reFzOK7nuaSxPRpu9iduv03jyFtZF
+IqVyc9WITG9pEnpCUQm/gRzRTX2Bf07U24Mh3GjczeXypYSg/EnLcJgsKbxVEXH5
+PZ5SKWRU6nqgEvp9ThJBXjGa+pZ17XEW+427DqfnJPG0YONXiku9l82yp+Lkh76w
+bAOSeX9h79CKjzgt/ki4Q0oYtUCN0m31FXici3dK6rjyWje7vZxxCLrPvpen8tHN
+349AdsYfevCwso70h9hZisRk2YU6HM7gvXcsobNVAJOdC+BvpA2kJcXdIb+uGdZ5
+JteNJGwyHfQqaeKHIopgSB5E+9ZuQ8af5pNDyxCd/KURhRzodEJ92L5XupncJwEL
+lqUYrcxOUc0tbOKyCuMTTj9XrJZyPOazsT7Ely2ovYnF0lSCppRY2y0ra8MQ5F/q
+9MtZou8jqBIGvVlemac1UxvDYhIKWTX3UV+a/CWKTQRSM6lJd5hu8qAVtj2AmqZk
+v7hZCbxAO7iKSDP2OipIhTzPx0C3zLQQiOkyyt7/VPSCLtGVf3d2maqojL8gDwsv
+FXgvRvYt0fHIZGLWaB6clTf9YG2+2bhpgIjWV0Vej2BEEey1kIzcPuGvdxosJ+Ix
+hLr2YBjrvGaeu2aadPENETkM4UWAX/cur2HNPuRERWd02QsmuYsvVeM4KzzYrXTf
+z0PUbOHchmK8HEcRBW10EvL28ytwp0qe6vgTP1TLgR2q0doPSS5cGFfTLjYCSny7
+uN90jQjJs+8AQEPi0yeFN0udZ6Y9mfbXoPE3hC/yQOSGvkQBmIO8GYigEk3Dk6Mt
+kxWaXMiGxMBgGgF7dEevbuvVqgnEQljBi1K7qahP94ntdoluIfxqrWYTKFMiLizj
+iNGIzUxDFlEExukxX0DOYhXhlyHMv82v0M6wBy9WP9Op9OTHlZBJz/AzlAl8xWB3
+4oQZoRn9IUHl2P0DzKvHifwQigdWzhngFDnJJfWZDpolhDd7iakKKhKtGsoxo7fj
+FHFFGN+AsQBQl+LMEHgCPfHlvRU9JBSe54IZAUwCvlOhC6806hE8Iuf3W4pXhN4X
+8XzHc+42N2xKtbQ7Yzx6+gu/t180akVSKq3pOB3IWlEKO+dcQbK7MjAGLGCdOdQl
+G/+zDiZBUEv/m7+AaUylTcQqQHa1Ae6TbluHRb7a/Tc2IhBPRbDidNLQ3d4pD52q
+VaEYE2DUUxYl2YSDnRzEfxbpqs/hmnDisODT3C+EhixYWEQ+vJ1nxqHwM6SI7KZ3
+t6cGCkiDI6Co2nRoJ0WENoL0ogcQXdrrORUwCVtp7JaHJRCMi+GQ9Rb87qm3Ch/m
+dnWUVa+yBWeXSoxDePBgoFbMS4hiig9cODI0u0K5BpStEoM9yIni2t+2heQ7wA9K
+ACyix89ODe4hiWWTaQpmq35KC65PK18Jg8/6f0iB0E3IzeAxb4sjuk6VSXLwVX2W
+WQs5aGAH4Nrxn45G67+Bnm/CrROJlZQUw9ZSFn4GOQ3lFJTUFraVK5S+ysGtERBC
+HH15VtE/LBaFZ3tNXiKldMRiT3bOn+RxJSkGjzHnf9mvzvTRpZUuFOQfzFLbkltw
+QczMesm33jKS2khmhxcheY+Ef9gxF2jFJK5QO9l/TkTDbkAAcbjbmuAQ7kuF7IMk
+bcr+z3oxr6iZNh2NDsEJtM3wLJhfBAixnof1Ac73+TuJaymirSFx8h3/Gzn6qOGU
+zFgml4xAlMbXIyBoMJwo5HfRI1ddnK/rVq+kfppE608e0Gx384RFLS4jN4oIwOvf
+yNipAnnbCK2LJ8cz+sUKWenq9NWA5YFSTMO4X3UGLcJq42aJl8VAykIYACwQaYe4
+iCSMh/W2jJ3TPigvpW/AFt1nsO2F/+14YYNxluQXf4H1xPWXSIe4WjAa2gONCXRR
+T37mFDJy56Y43cMoPndyA+kQgyfWoAQ23ibslZvlk9TLN9FwhpaVFJwBMhg560ia
+L/t4n+nZB6YYuqukrOABy7kfFK7tqcg19L2ActIEENVzgTIYdQJJGJP4660TPcpU
+ZaVEszsMOs+HB9o0kYdq5C0hvDhewwCkgNHKkSzWYWCJsJr89WqMr+Ma+dkq0H2s
+Z/G8sb8a6SbmElbqH+0RN4hLdXW/j/FSnhGSTvSX0Sbe3TL9W5dXiMaNo6LO25WL
+35TkR+SHzkdmYE6noX6GaUbjMHFFc1Cv5C3iT4D7KYApVqlnwp9gc/UGxTDfEc3f
+Ru9JW7m9z9JAxnZMqMO9oLqr8swTBRagsqnz3S4FN6gQct77PBJOTebTyxW+YaEe
+2KUFx/Iyi8Wp3ff3VYrQnb2sHkuXA62q7CwOYEL/M31CtR5Pbhjbx2rjMUb6csvO
+VHOgmPam/XEbdkw9pIPBEFBM1cltDRy0XE3qPqPizVtF3iR6agSbHR0ljz9tl+Ht
+w6u4T9YeVSDkaxfI2lcBOvlTpoRsZM2qVpos6vuqxq+AQQaz6R3LmBvgB6WnT9D+
+DH3dEvoy2JXOY05SsSRVlsZ6lAf+r1fMtP5IhKyqdLUbLEvc/D2jS6qBbb4ZHsWV
+gf6nAtVXjg3NHGzEz6+cT5KzzXDLyG5P3JcXWaU/DqAZBBghzrA5VvyJ1P4m5EcH
+ajRJ57u9v1s/V5oO5up6EAXUyWJsC+z1YcJaOXXtaWCy7VWE3KaOK3vZL1EX8LXk
+xKV1U3bE0fOOZKBvlC8+CJOpPEhuSsyqZWqTD6V/HSY9eVB8PeQMJ/9IzIllZHjt
+lyKzdaTanDPxLb0By1ScjnOd8Q0xcNoLDCRRyodsSt9oqOlArB1Jj+27RhBa2Tvs
+bM0ZdzghWQKs7/XYNB2QkU+JVoMpMBXxyH0746fEsNVyY7i78lbAV3smhczrOC/S
+41pqKJe4PhiOB59BIT6rzZVywn/6aJbqAZvwaNnlG6+d8XiSfydwaB/TNQL32H5i
+Bq67s2sUEuOLDxPe2VbIQRdorjW6DzkEDtFtQ+GdH5ajRt4+fxo7Cz4n9CMXo9Mr
+mr5BvbltCAuJ+0g2UT09QtiZ8YYoGjD7Fuu1sIunz/lluZhVbFNOPcmaEN8lwXfb
+kUe7KNywX7VZFNXvyRS8igzJnhpzeXREG92x6wmKu92zZ9nT6T44fV4XO3Yf2/Nu
+4ivsp9hcsUbCIwcmyB2DW38go5UNlZXrMKQ3/UlWzC1S4yicENHgh06SatYPzQdw
+7oxXDczHP9u664y8Fqwz4HeNyVnARdZcz5CHFo0juwO0ygePzzcu0O+gOfHwhJo4
+Ml4jQ0Tk0mq3ickB5zYAqzH/Q5JjDomTKrwmmLxqHWcwUbGk9rEue/7Ow+fU5N01
+IhTQvZYv+WZbkkR23FjNUkKLHYfhZl3jVwFcL6sBp2hllrH3cMsVgZBc/N1xHHYw
+CuJZHiOscnbrBxnX/HwL/VOrBtGDupr1Qgi+YsdBM1Avf2z0l/3U9OOg2qfAAX+U
+9eQ71MrUh0VEkRtdWG92noyU+YbBQtibsBVm2C8OzYkV4to6i+1j2gcrLhU+594f
+gckbKWtHTyqGwvZZcgF9Mtt2WhVSE/POWw1j/V8Xnymrjzdcm2qg9E51vmnTLKSs
+W37VYNBe2wPdl1NjiCiJtEij1CK06e6forpD2hBM2rTMnrFjDb3ghEI0CNA/28mL
+Hq+NDqhHtlq72fOl9TQWcn46qSnPWN3jVSrqhCL9p5kmE79iqOcJ11Ecd0mErvbP
+LW6ymkYWbM3IldzwyOEmCqn/eFRdu1mM33DM+hOev4p3Zk+WqAMDIGu/2ZqcSTHT
+uTCOHR2lju2qIntSHgocnck7TlvPdXH5E3KxbWDqX4JQRxhbZnrs7ZVP3Mqh/2p3
+qa21mO9pEzGRiRz5EUTqpvusJwZ7cgnvVsPnIxWbr2FiN3GTeF37HtPfA+TPPt/b
+P/MevA9F9A/3X5GBnQ/1vEYOSsiKebAm757KgkyWXliBP9Gw3Q/C2KMFd8MmX/B9
++9xM+ZoXAkKNVxCMqs4/U6q5don/rLM0G3MhAgx3iZ+CV+f0tw9mevapdcd5Af2n
+ZyuPiNF3zemyS7hKt7L+jTNwYk5e6QogyOc44GrKN42WBBiUl3rSoKDJ0hXFu+A9
+55jFGJ5bMw8YK1K8nHkoRJJctcy4ZmPD5Acll+tvWPFMdLSDIIJRsBLTSqIMrMo5
+v1v01lxKRV2q2bi/DFeBU8oDmdteQLgDEmRgCbVUOEU4dqhzoZx+cHax7VnLc5n7
+N3rYVi9gtQkdPDj8Q83L2rc6Uj8XcN47m02Y1NKhBR4OBULfpTRYLLjKA6byMdUt
+wseieySKzmfyw3sxLAXEOZ4JYeWdbhbD8RcHfEpo3OhDCtftiTLOqijoQ60+9jB0
+EkOssEh3AaemwhGCUA7m2jRtD0cX92jtWBUoSHu0HsjxQZfCcVK84w9EJsT37OZZ
+hBCH8J9yjXG1MSfyo5Aqyv8PMChk2PUBOUuWfABzoYz90bl/EktRBd2wDzJWruaH
+QNor9A9K/En0Bpa3p/RgvpdkpfhAAz1iksCHBxtKNJL6wlzjoLGn80qc33kDtXHD
+atpUkWY1TSwYu5nvAhby4HNvTK6RR7EtUBoL9amhoPJuiqnrO2N/Zgv4DAnpTNC8
+nLbXJJ+UHEw52bRXJPsJ0wDVbdWMcxqzztH7jjOSvqYts/KKPy6RHpNsaEPwZaZM
+SlYjx6MiQVBWlTInbO+4ScJ09rETUGQQrpyWekSa8QrXB3iSbLnX4oArzEfKfvi2
+OxNLqBI4sa++bYJp3JgSU8RrCwDqmSOZBoUjAKXW7oKfvIJVNgNs8mm7JoqCxpZK
+KRSdj5SfSdFUDznTpLESHjfRBGzs02CfIvA3j/eAraiIRU1mgMnn3Q4drJk31Z7y
+J5zmHxRfitgP/YKJcmsciE/xo0QVO0pbB+Rz+KCLTQKF7Sytm3iwDL1WdT9ZhfFR
+Ewl7wkWG9yT8vqBICPLlScYAOGhFuU4Hm31CcwMNrvPqhAME3YYNVu6ILfnjZBQY
+s1D4SN1VwjcVx7Wd3DXZqQw+xVGUGlq6Quf4MV7IzL7s4E42+lBzlTOApSnxILJl
+vJIZqYb7/tXxDsAcj5OAwBFjpZBD6CeIgBcIP9IQQ1l7xa3U03664M0NKVs2s7E7
+RuKo6DS5cp/5KtU/2+uUFsvfj385rNLvIEVt2HjJYxcdTaAt2+3koQ6ITMaXrzyU
+gt9SoXJCtXFbiZewvM1sp1zetVbDXLWnL3XyoD2M/TACYv+M5BsXNO5YOq9AKu7h
+SY4h+N3ZYvshPsqBoNOli0sXkz+yDuo0HH729sJ5QjkwDEZDRNTt62rvTKm+rxkm
+keSjnBylGs4zFi5KdeCz/GKXCuh1D/Fsuk0cgMvBuH3qA6CaoeYs0ER+ZhrSRxqT
+wXnXxz4bImERMr5ddH3unBq8dDKoU/FLN3ZMB+2ZFvyiC2jhkSEfG1/uRCt329es
+dcGBWT7BsIg5BDL8G1beMig8X5am/zblO6H0L3UutInrEgGMMwlx5Z3GPIgHSrhm
+1Zm/68hL6InCaqmq/ZtSpN/7y+Aif1fCnxMeRkv31lDBbsQdq74/l6uOzjHjFBP7
+YUqzbCzANSRTJvxotOBZC/d5rMpqm8mqCGykSHIdFGeFy6FadQD2bJC6xJQAwua7
+ZA6BIxiUwWQHYQqhf4btAEU6c9v1NV8Xylx1uEds+z4BizwEKfUF9vRYcOkdILgE
+zNTumLrIPi2M+FnZT8uSv7Z+nAGGbGQUcp1hYinrCmfrEz51q+M9Zr3dxnfdzlX7
+lIIef1vjmELwUT9ABePpRfj61DEM2W+OqcidWUuKG89dNCZF203HYQEinFTFeZ0l
+Sc+LCdl2p0SrhV35vMDljvpwyYnuU0eRhPsxXktZjrbNDunAKfgAZAp35yCmw67+
+0V9nFRB2RfU/P71NqAyjMK6X6VP7yhAqhuCPIbjU3pCvK1uO1PB63DeARlTJhxq3
+F4mdCkLl1t7cLCEJ8gHKngoM487pY5MEuJ4yknZeRY/Oly5Qmfb50rNFu7e+pucx
+7y7ClrHMp/hMuAVNDDQruNqmSpXO21cmewgUqIAjpFTT6esUhnLu6v0JoUMZGuPt
+n+YWI3wUqYqkgEfN6qy5Py7gu1ARNOg0AEZriXWaveAG9h8yBW/VOfVPQdg8v9kz
+1jaNRxvsboVZM/GzjqIGwJalIA7gLtKI3yAeQC0fiGRq4q0To/k0fbw30OuBOyup
+fPW7XNu3RiSDej6fdLAp6zUJXX9N/bI1d+ixDYvYi1hzN8mfDce1uoKZmt47Rsvc
+BHUWGim30o0ubzO63tyYLQQI8BpVXYcxuPXz72vI7rrk5VliRmEyCC3GTzRULGKY
+CcExAf0vOUdOUzIZqoc/N51gKIR3k61lQZKuvl/+XweWsHDCRLjCpI9QX6mAYCce
+l2V2Ue0k5q4UFVrPqtI2kt5H+96UgOk1vXyF3rErmOJsdHbHJyeF+A7sRZM8OHbT
+6wom3s3SdJZdvymooVZlVhKNzDA/Jy5T4xJchoW7Eg+8OEOQ+Ip2jQlWv0Hp+m/i
+qlREDTvzB7tjhtpJoYVMGj0mglkufEM8EqvUtgfl2lIYwuUaIcVUOM2gIhsCytGR
+POQR4qymaUUspOb6HwzI9pC/rf9RTGalmRx0vqr9J88eja1gWFiLpNFJ4RSp8a6X
+wSCF9gCyLfEn7wjJNcrq2+YBwEEbT4u5hJ67PrlOnCCrj+HPZnhaKupEp2B8G38W
+ruV9+x3NByyF+VWaj0nd56WN6oCs4NB1a0ey/kiUvFcuZQ9SgUBr81F7jsdE6lGn
+i5Gez6wlkhSnqjtm7dtPQP8Gjo0KCy+RLbFoE42SEs5vsoPNBQJ6n2o/ZwhbvCaB
+kiWc+5sP4eNn1OZLQiHLSt+2/f0n8eP7JKcW0wLhuq6ixOKAa4jdhuAVsI49IB/N
+lyuJ8COEI07wMqviRLmVLhrkbntgXdhEu0P2irBpilG/EuTTomLXJpwdrl+K2VDg
++afhOt7EzattHAP74zkXgoBWzwVXaaGD8iquSR1t064P1rbe4t4nvWE/M3LLaIzX
+X9Qdi8vFGnkmhCDt/JaDIduOGcwoGP4ACILDEYKw5+LACOYmtZSTJAbaH6JnazM6
+fXoZ4xP2kliLtzsDLYLAW/pb/4i0WtHLDvmu4EKWPtw2St4h19P5CV10qASib2J9
+mR6NzzGXJdcdmpQezTBcYyqUctEKprQZ82mAL8CR8SaSE77p77B7ZO74WBPoXmHI
+GVK7y5+m5ej93t0xamNOggAu3azNCvKgeuOJH5bchGmPCnCbLYXmDDD41v/iW2oP
+Bs/aMv3f9wyn4YQS1Q3uKoShgcl76Nizw6PthbOCIDcg+/vqjvWWu1ZFTlwXiwD6
+CXaXQorx5iy3X7v6VcUB83mBICyh4jqcZJ8utf8BeRtNQViIHp4+POeLU2uY+jZ0
+rqa363AftY05lIWSrIRrNYQ3gUBx/wyraKkygUezNTaBtlP5d1Z+fqstMPk1TOI9
+BjBk4Wyke9zVq4tHPxLPZzu7GYvqsHq2cdcflQt99Jvo4KVMKWB6CTUCvOXN1gjD
+XDDyVY/R+VyAe92V9V97n6K1K3IAr/alaBX+t24YrLrUV6eaTJrPd2Krf3ValTFI
+S6Ab9CmXf2rOips6AWmDMEs9jcPnnvZfhFqnXZ0E1jnbLiwVG6AABUdwomwNdVbE
+luFJ9l+Eat7e9EWr62zsemRgyGRGlU4w6HiZUNpsQAgBXuK3FlYULQjx24UDdJ6E
+/Y2DNKBig+/tja1nTvPB5czRSQwZ3tjcAHpBC9u/RJigVuj9UoN8dfYupQLm7Gap
+EUqs4IOomIF600JEKu8czM2ryl26aIS/7/cshyiFBXKIyYj7qEt/AiMMDpDPT8OD
+lpJXJ3xl3PRZFwfBm2g9m6BGDeJIcuHj8cEnufBpxIMe/hry3rgFqA9u0qfvD0V4
+dYbKmhhPX2JElC5IuOcpCSS4XmUqcFKT73WEDzGL7/+UA66n+FvZPR4rSX3mUzPM
+H135/JBcjbDWVZTB5sh5dgUZNTI+DA3vNXsY0Ec2xAdv/lLc1/oLxLyPGkcpheCm
+DKM53u392FvDvy7ddc2sMKuajzDWKhO3Ac4yqhWBtn5lL4exeOYfQCcUU3vnXH/G
+B/Adr8DYcpx3SvlyIDO7WpQBsVMLy0I4EPBb4fWDUuagtXcpP5DIiqiOa0Dm+rA/
+Eol3GUjF1TtAnv1QbXiULXiGk86HoPK4wd0wwrpFrA/TyqpcHNb5LXjC4BG2pxV5
+n+9XHWUN53TeBYTeMNJK1kr9OPjrhl1GUfyuktMfw9ck3uIO2AxxEcCxY7QHg5A6
+3yd10UWQUWEClOrbZm8Vmpq/m2gcUUstYQi+DFP0MyTHFLt7Y+BCNNNrYthC8KE1
+YiIazGzb81oIC66b7C/nNqsXCgTOzR2Xpgtjcd8IjKm+3k2U2Yd9R5Ad5yoHwlx8
++5wyIn9O0VFrhrrw+wEvKwH0xai0CjN18tZc36n+5YPhuLtuus9NvyE6Aw2OQjCt
+03+BgFzpY0vqsUAkIIO96Wy6cYOdaKKxy3BhmaAqh/EGJZignGZEgvNNn9y1lOkF
+GtYb6vaQ/NzY9Ln7AiTblGYCtIE43vE63oXm28qdXUVCA8NkXgpJ0aqVmfxnte9V
+Qw3sE9IrwgdPotW7QOejodirxokPQevV/IpM90lhs8EaTCJlShKyatg6DaE5Cepf
+tepce417hRfoCbCkFIWZND5VoIOLKV2sA7RPaw7fmbZRjlsIIDE/9R6MSBplCpzX
+UbUIlV7rsTxHNXXZf/n6JAEGY2yruc4An2BdEK06HCg2LMLtSHDsRO533e6fMtmO
+y77nzwipgidviWs3+QN3nlrRWwOW09f67hDG8o/iHuRgStrB9x8jLyqzCOZR4/U4
+gknzcfSM8WE+QLKYsezGBe/83Mn8lwn33NfiMA9+VgFCfzqnZT0pRqS0BaWSQAOf
+8AhZovJJRmKQGUA6l3M8zsBvv4JvyAA862FiwYkyUQGl09didf5quil9DIS+RBwy
+8ymxoVr13mYkLNEbT4de6OweVK3YT3apOg9giOlMjOKlrpINJPPTS4GvnUyonjd2
+mCIrus0KIchkqhUKK9Y8RY45zXKX8UwYk7XhtaXmwFSNtMgXs43muvjMCuTjy/SJ
+NGLrxVqhq5etWY9y73Jll07akpb5iwSwfUnizxS5i4OSE83P2KyIAS8TZSMBK0Or
+nSsCtnnSiN81IjmiGcMZSrudieb7gAG3/gaaesN8r3oC5nHCoGA6lgIiLXQkMAZX
+tmMQ/YuUGR22NKCq1vs6QzVfpbG+TLmWkgRXAWOyGOT7+YPvcazMR7dck0rxfOqQ
+sZKXfqg5aQYk5+6LjJaMPCv7BnPhAsNsFEOXj1jG55IfgLj7NuNOe+pFFjfxnYS0
+LpCneJWzTq8BCNK9MH61uY1cGXxGK7+Ob0f0gffOu2/rF5I0gNukWz6eXXuuNm0v
+uQ7QDYB2dspE/cc8Gff5My9+SINPjY4NyPhBf3ZbverBccvcSH0UZaYZyUfY0VM8
+D1U/FhPTn+gZghBslIwGnQQRWy4TOBsaFhNWu1qtQgnRfhxtB714k8RgRIsDUGK0
+qRjJ2qrcixKRA6uTss1auAMo03HbgnaKekccpf3d3Fy6mrQqn8Yvdnpr6UoCihwZ
+W1B67X1OOOvCpwu38pYbUPSvktGymJ/sumQmI5wI8MOW/mboSY8Qk0Xw6mX1lhZ1
+YjIzRv80p39Q9tAcdvZRPIWG6zYuGr4Iy5nPKecx41AOU7z4C3ikn1SBCHqXSSzb
+2uBCSBIhOw5s01SSmyIlRQiNRSQzrwnAKpqEQXIJ2krFJyVKTaYzsovikTZ148aK
+BKzuK7mHPN/BbJJH0ACy6y/6XEaNhHmjXgV2VGBmd9ewyyFBqf/Nz1X7s1IuljMk
+Bdj91mxlS34oNeQtNICfWtuMCb1K1FAQ+ed+9+Zp3LNRExHkEgLTdSGB4zAaK1aA
+VVYRoxghRnps0g2atlpQM2xZ1RRSpcf9T/I48UwtUi+lezcPe2EskyUIvO6zZGz3
+bZ/EA8Ud8KoEaLkmBEHMWx5h036b/7znNjY0oR0hT85hn+avLVUErGrPK+DRwdB4
+VFKag/XxRHonezD9xBcrhy4xKjWIKppJavH33SX4sc2+KNPw3NJXsL8XvBp/Pr92
+Ii4ynVU7AHuEWAt8J1EsiKwdYxE3LGd2a9t1GOuimGrBEdITaFpWU04SC730nrJe
+9K6uD+NJYNmOMJwTohpFUOr6ini0FQwt1OHtkBJARwrhbRl+oAhtcVGDSHsg1mN2
+IZqxD/cxjhkuc3bZXrE8JWc7Hh1ZTvdB7w6vhpJwT2Qfb/MYmI4dRzwj46PHEjVt
+b1o3ma3gHF3AJ3lhi/l9ePiD4Fw1MoWlNR+o6Bxz2+zBHsoTbgMHqEAKtWZdrEwO
+Amwxj7+BJ/DhUOIux8tDI4klHqQiPQFQOGd/KyeXg4LQw8XaGvZKzsR4ACenbYsi
+sCVTH5kBfQfl2LBvZZbecySJ0Jz8SDmKXhdytm4AAPCOqI72wDAjgrN3QD1Fjvnl
+JM0ufrOZZlMHPMBffasK09lWPtwvZeNmaCrBh8/pLzMZVWgZ1LhDYC27+ZuJj0gN
+Shw4lkep6PJfV8jOHCO/sx6FPUhMTFY+XNLmrlPfoJqIhXcClO4q7pH37ATidyaH
+i7mUpJx4PniteRjZ70H53LNcFt4gqEmKheQxIc3EG99K76z5jl986HpQTspQ+w9M
+te4cKRoS3IV0G3c7Vl+nosujE0Sa/BFLCK1qF0OG7JaVadBjiKYGS6FBXENQGR5J
+5eqyVHsod4+xkybBACMqdLwlMYv10+4CyEAlRGo6PFfB0ABQ4dWC1x9AYtHhcneY
+FmxAwNq5yJzQ2lug5rsXkfY6kmmM0R2Q6Dou32ovzP0Lhrrl7iDOnAdcdbbuhKSU
+/p6LFPZ+T840G0PzYh7Uyz51LO54SRrExH62+kwqMphQSIbXkXpt9XUvbY8oje9V
+lX6eKvdWhzEeQ7PmvDXx53H9WGQ7+9Kw9JjkcZzPvBM2FUxd8tSv5ujxZoK/EqX+
+HskuKjZgALTbdSI1a1ZGdj709lBevxR/2MkKWyfCF3E4uq15Qk7Ye1lP6e8iX3/I
+Hdz9KG4vDMv4qg/oXbsxqSJpDy1Nu9Ntt9Uon2EaM67wwHV3g0zHwnSVnn+7JWpB
+jivPDOpkiettemKnBqG4iIbgIB2bOU/NXfJY8WA3pAkc9TOg22bnYuyOvIwAh643
+xO0zlSJKSh+Rx/C126Oa3l7KkE5nebrLzz3CydWCsvVm5PyxBk2t7w8JjP+ZASvG
+HOlZZzUAsRf9mRyMUfu5Dbo3drWGXa83DeS25TAK2k7vsijJsrk7n22qTrepO9Kd
+edm2WsXsHF39p8FYc3NReIG38iEnw+w2UL97cFiZ4dfPYxQP44WB4TqihEdumJZ5
+LLjck0ncbO2RS/0QqMXpZKJZbfgrdgNQDLKCP1WJMxYuUTy96RoQUVcTgKQjt5KP
+lqEcQamtFvgWmGc4oo2sZd8h9B2payNqO6Jmf5+8Z0Usor58j3QqexSSsZrtz/d5
+091tIdA9339mOb9QWaiOLQDGLFWMcx7nAO4S6EOwi9lNm+BaVQRxGGYQRUvyBZTS
+1zR9LjbL7dgn5aP4kSFNaU8L72vAQPsxrxgkQCzhgHUIDNN69E6blNUpRSoUkwN/
+PdtjBBw4qm7TP+/vgq7uNNgz1JF9UE3Dq2lJGAReZMcgDbYLwTUkKRkMqqYCgCxv
+PnB6qd0PKI+qGdvIZ/T0Bpi+1pgvKi0h+zz7ZFw00h8FucZWnecxVczIk2NzslnT
+PLaCtFCxugjQYHtKz+Sr0InoeHKCRoOEypIlP9JB9SBDG6mOsHcIho7hDIIl14R+
+Xbph5GXHLD6uhQidx/DjeBJYn/1mFL46yK9D/AqyCQIT5rHUa7fPqr/tbO4VqnLA
+w13zgoAhYqNxqnkOoSKC0DawBuqFYnOXgln0z010IYNRNy/IGG0qAWcn9+eJ28dv
+Oojl+S1Xd+6W0vsv5YVnck1ViYs3mSWzVt4ZrydgB4m57v3oZC2Muk7rHbKS0UTB
+mW2nUfGjyHYqmTMkTLfIUrAupezEUWaFoqeXsAMMFO2BGRXhARxH6R+BayxRvx2H
+aXr6FEHCXInGlZaXk/6wxYDhGbpNg8XQU6rdDpjqzfEzJVJA/M26TV0b+uN9MUI3
+MbmNoy3ywYT3hJUdmOZXc75Yk/AnOVw4if+N781d2lbLD8pkbyEHzo8eMqPFkeZ6
+OoHJ+7dipbCe6aKtVmiDA/rDzjk4DzjOUh4Udz0ik10bX4lsGcbq9vxxpoDQ7PUN
+vbjTfRMEg6GWB68EQhFJb/fi/m5Ae8P3yJ1IYw/n+1ki/8EQsLHHyhKYzfIu8g89
+GoK/lyNFKTOw5uGOEqBowIiqwcZGHGpFjJFTQHPlGtqfzj/SrcJjVLXSnF40RU2x
+IMfGHnlFcO3xLjT9uguV0UvN14stKJokEqDWUFTNc3bE+Y/KOfBZXK504cvB2et3
++7IdeyaQN7xcEQMa6FDGYzEMqfF3rAbosF92N7HW0WhNqUp6bJ1QD8qsZ9DJ2r5i
+BydCco6xblo1g3yAgzmt/376giaRFOVZTEyvO0FTf8HmC+e3AF+yjJw+bUO/8BoA
+kmEfT6yRJKPHSmwEC4sJOubZ3e4sUFSSfPfuPoEBYZWhf8sv0Afy8EAqwA0lipVN
+iGRZEe1LKegPk1fIhcbW4Wj7uFutovxTMB1844dToBfMalhVxY61ooPKLX0y2Ir5
+Od+PTQvn4EjCOGLunO2UuhZMrrejh6AcV8y/HdMVeCPrhngeLQdfDCL+fNd3fOnR
+74PvqziztCgm6Oy4FSaMaRPNwz9lS57CfumfPc+q4026X5brwGwaVvOrw1vHb+CB
+ReozXLxCYnUnX3pVRy3RV2AiQmhqaKaynTHhRmkFut6kWHqw+H3YHKXiX3j0C2aA
+BQqdQnb17Om9+nIEN5+IyQ5wkDYPEz7mPmA3BLK2gT8lq9Ny8e8BslGYUYWgc0RO
+Lt31pbPWBusnVhF73/waNlibJ2nmE1YB9x8P+R7Ths/x6HvThl1/PLKV/MWX0Aue
+T8/AeJNSplMKOOOke2Xii/gtfE9nXeCfjRVmi9kLSrzuXrKok6uhwAi9g+KDn36q
+A005LlQrZOsQBN99jH1ogZc9Tknn9VxU8BXkmdKZ1BWgGuyMT6HHMysxkL105Md+
+NqbEiNu6PHohHF0lWdc6GziANjDYJz37q3e5zzdxISidQP0Oa86IFu3anANDIJq8
+J7HGCek9gx7PBmUWUe8BOZ4mnmdWIJyiUPiujAtugWIyjutXRTMuqjl03KeBIE3r
+fGmUs9umLaNFnoxAAW1rjkiOgLCLop8qFlFgjVjjjflX7fDOIykTiPL4ZZr3xfHa
+q5oM842K+rwwcexnOr3Lfy7gdX+e2lazZVJg9+Vr1nvN4WjHkbPlzHLE6YCIB8CP
+uHwpCsh4lmjOoJX9BFvgcH3efL0fnKlYqGFA6FQ14DYLuf/6tgAlieOlNcHltuY5
+7m64miHVpPqvf6uUVhk040t+6mXuuSy5zWyAYWEDXmsgED1uUiFCfS2nSICQMdk4
+W21aW4Zg8BX5iuvyqHJDi9M3MnYynXbyuG6M9w/N6Z8RsQ20jvvC9dh+mIHzsIks
+Jrkn5Zcl3NWn1jtNDN4BxwpNmTCJYwyLUpiN98/3HJ1mB8IGT6aHh+1lr6OrZ+0l
+A3eX2HeaWRwrEFy3zHyZCdt+c9woD2a0zyNggtnrqJ+QQZtfWII21JFgB2YSF52z
+KI2oVKcDTb7sDnBpurDJevSVifQxw8pjv1ECuB8+cX0AK46bJxGm7wpgfi2eah8k
+HvWEuPOMa878VCAm/sh6R5UMyJwI0RjJQ8Bvys0IZGnpXsMRqBWJ4+3evwBfohz7
+1KS2DBrnTjwu9BMVlY72D2q1cmMC3WoyFS3VKeb/kMuXuWf0xFYh41772nq7oOeX
+w6dzJ5D336jrWtdACQM4xxGeE7FISzU2E4TXyRVAi/+12yK2azF1qlQUzSesyQIt
+98BBunLTGCtS++Jdbv3UVe7m3KCx4pvvQa3/yaP3Zd7ZP1z4fLZOt3isJEdZ/LmA
+XspVFjKC//cbYn8oeQK9xWzjq0Cr6XgKXQm7EnbNaKTJ7YOd3uNbjyUb8Ev+oAxl
+ye8AjREBha2KmS9fnue+fk0LsFc7iBbhLYbyKqFrFVq76AJGzexdP1VVOs1fzl/r
+hnR6kRiIXYuPswAqjB6qZMUh7ibUagoqXvuQXfn1LYnN5qgXIaNgjOSWqP9r+j4f
+9T78rLKZtYdymc6+oJgcudy5CgS6b60usKfpNysHgSaWLkMUQ2dFz253XW7KuOFc
+FLSWaSfFKOmkFds53VaDTElISvltn443j9KZ0VCjs+oZ4YSsGaMwyLZHLy3031Nm
+BW4K0TmN2Ri3nWv/JpT1ZXD2kSSgn+IJ2eGgm0Gb3EiyRJot4uPDlt3TUpJN2RMW
+RHkZUzygMnLRgAIUNee98rx08P037iLOeAhHMPg1XUrf6P3aDDEnUKMH3Zh0Zzv+
+O2mnMpGYFemNHeZycW94AO5an8BQrtzZuGzSbVEw2mCKunubAId2rQQx5am5JOJD
+j+AGXXEzYSg5sghc5OzkXVXiwPMOh4wwzrZfn4p22dfhXLh6uDUt3BwxmQL1jof3
+4ldw898TO/zJtjegp4a0oeT/5/iFcQ1w6/W2fIfH4uHjqdd5Du+zVRjJzMxYJQdu
+xmVGPgI463sTFC50AyIOgoOVTbhM5iF5mL2gNaBFPDLy37j/ME/7wv+WeDz4hfV0
+C9kkFeYdB8hXunZaHXtcpHXsLJGzgTexjxEyi+aRXsG3bYmlMmqERG/TWBbTPoaJ
+QkWD7g1ZppNX/yJKi2iJjixVo3knuFTAqSiCW8jOBBpxqwvDcr/70WLa8GBZL6Am
+gHOA0dLIOmNsyPEn8vQYRmWIMIZ9Bmo1K+JrY8wTLgo615YHBToC9xN0gUQ4wQhJ
+11IzmLfe3Q90LeJ3gkraKxByDvSfmaOdG8ucZqm94Mw16do6Zz8pc0LhQ36GWDB1
+fXRPGYXmKc4LebZ9YuvFiIxupheMW/tAGgNiwDEfA6dNkIvED4Dh5Yjq+auY+sci
+i5GnYV6YkpFrG3/px1hFKOza1VxTrI5aABj4rg1pFxthrtAkwm45sA3Ubieh6tbf
+7diqUp5RuV6xYnCDBp5890bu+rlgit8G+qp4eN/TS9ZB2WQ4GtNPi4upEbR486q3
+Ew1xPHFPlXWjwRwsBWNapFfXxKkXQOZ0VUAxzX1vJCFbWTUbzXVuBE3WqXe6vrp9
+kT+Siz7gjX+Yy7v5GuBPgcZ3x3F0+Qoe1FV1+1qv45KcFGc5rkH44eKzl3jynLIv
+yySRyi3QbszykiG2j0mmKGI/ouQc5XzO5tuVRe3shwVsXv6bymxkj7G94sT2Jusd
+yStm4I6bIqjtdd+C5yKTVFjhihRE8EzBVN/fVmanpIyr5lDJwoghIol7KiSaiRW1
+1pWVxoRcX3XAsXpOF3jkunnbRn9BTjx/aQhJO52bskPie6AamdAyAP34z+bclOwd
+X25+9IWSDlyG8onSSqYHr3bPQIfNpH/+qSnyiqQQBOuZCSVZA8lbtSHs/sOlPRvS
+MmL1qdjhyniTJlfuNht2nbtOiPqyKCJJ5wCpnxP3fccnDlzPinfZ3FvER9MzliJT
+rN1Lp86y+xq0oGreufjE2GZQjL2e1s5iPv67ft5sjKVEGU9kUChE+3nbZ4xXHcTj
+zYMtxoAksl6vIpPNByD/JaGYHchB0g6LJMtHZ0PVNECFnw5TvJgw5buP3qTOCHoL
+Gs4oC4P/a7IriHvoUCPnatiDfkb6/pUJkrbPzfLVOfM1rU6/JbSxZcKyVrMs/xdx
+LHC/1vJ7Z27nYaQwYLsJrO47OsKriLZc3V9WyyvzqSk+nfdvMoaeg4Ix/sCCZCy4
+RQN/dvg/TKx+v9wqYRtWRVueQFX8Z++zhYyNuzNtU2UcpOBp7ThVqOMuLlBTihBl
+y+q4apjsg1XzRX0UmTT27gWnSshQ1/pw9IOltuksdNV8K6YXTv/iMDxmAKv15jvS
+USb2oOn9yqUF17u/DlDLcoNDeOsWsIO7nGpTfNMTQEqyG7z/G2TYyFl0t0Wl/7Ui
+7yDjzj8cr9S05LxPd7zZZLnhYcm1LYkYOGBpXB20GEG8tmW1v0KvZev+I70rp8Gz
+ggU3OtUJstqiFRUtN4tV0c6IoPWuDgrprH27DLTVTO1f22ZnA8HBlESM4Bk/8Pf4
+BiEjPFEkqO+DvCZWPael0H1nq4CzXsi8pOY9/nWd7pwiR6PubgydqXqabdG5Sqmm
+brTLlujPiCBwqofyUTTKm4NHQG7BoJBqpj7E3kUB4l7tYNYg7h14IbTA5TcBJray
+Y4OorVJjHnORoHryIgYPIkJfeb1gykVKAPM6BiPjOyTnIy/YHp7sMl/KxupkY82x
+8UK4ggOXA+vY7bA4pu2etpVe/fbTTTHxvPmBBzquyJL+pyyBnn8PZS4CYiiMQ05e
+Bvt2nic+jAVVCymep0KIt3R2o91WLGfB21UgGi2JNpk9weXB6xEpSPFgPMgvoK40
+prx/kbxyCgYTRGlMv4noCuaG7vpwlvR2sF5ysqZ2l0mkc5C67wSTGNIJNkXxcBCu
+FchrUFgvaiC+31oPDWBZ42sXBus3eBj8o+iEwCBJCqqKtw8SJiCHUx5CP+3R6INX
+ShZ2vZmev2RL30q0NSt5MeiCwsKf2gmrZdW6mSCEubkYrqDKKepkmsYoQ1QpuD47
+8xAMeIReNr2jUfn5PKavhcSUHiRtcHpnoDx2dWVmz7fHcmUY6nlw1NcNQZx3LWp6
+tXTuHZ2/U9AXGWmIckIEC6/ywnPS/qt7TXQEsq8PfFxWwM+VCAitGDIfA2Ukibg/
+KIXqio7r0L6mzM10k9clxGwmCkTMZFDec6kCgGOE2PFcdLn2fn+Gxe7dj5VvjKUz
+7tTgUwkv4qXCHxS8hwDff3+2wu42VX+uZ08xKOLb0JcwqChbtgp+DNmS4iERI1EP
+W1QP1it3qK1ZXjkfcrXkMDMUYkcwhXEuJ+rOEBVnZR6qeJIt0NWCRHNEmIpX8fyT
+ERZzqYQgnbS+CdNXto9mKa8LgP+mN9VZMr67lbFl806fvP0dZF66iH+eJbNsxL3Y
+HNcnKe155bnALH8CzrCbkDDvJNXCrVPQhEaqI/yB17jHw9RreBAPHyykjXFwfpog
+MEjfe++pHvjpMsfi/dtkk/B36NmwixNe26ilmSdFASkRq9ac21Wly5L9I94iYqIP
+IvcQmiYlLN3xJOn90Igvdqngw1saReedAH+SfFtDhMZAWGHQIHa1aGPTGckLfJuA
+KHOQzM2gWu4gzWyIxXJ9rKUQfrXLiJyU3kDpr7sFPoJMJFZpW4JJdHca6OxYeOcf
+fMPuC6uiZU5MZnBpjYxxzjOD+cYfyhDZPwG3DSfoJ2T6HBgExAt1qJ5xaQbUDtvJ
+VOuELZ7B+9hWsWzUoQDqNBftp6gRbtI5pkiobmExrpJZ80ZZ2gQxhYt8alQJhSdx
+QBJeSTqTRVf1SqlKvnK+Vw==
+=wcvM
-----END PGP MESSAGE-----
diff --git a/propellor.cabal b/propellor.cabal
index 16dffe31..01c867c8 100644
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,6 +1,6 @@
Name: propellor
-Version: 2.4.0
-Cabal-Version: >= 1.6
+Version: 2.7.0
+Cabal-Version: >= 1.8
License: BSD3
Maintainer: Joey Hess <id@joeyh.name>
Author: Joey Hess
@@ -38,7 +38,7 @@ Executable propellor
Build-Depends: MissingH, directory, filepath, base >= 4.5, base < 5,
IfElse, process, bytestring, hslogger, unix-compat, ansi-terminal,
containers, network, async, time, QuickCheck, mtl, transformers,
- exceptions
+ exceptions (>= 0.6)
if (! os(windows))
Build-Depends: unix
@@ -121,6 +121,7 @@ Library
Propellor.Exception
Propellor.Types
Propellor.Types.Chroot
+ Propellor.Types.Container
Propellor.Types.Docker
Propellor.Types.Dns
Propellor.Types.Empty
diff --git a/src/Propellor/Bootstrap.hs b/src/Propellor/Bootstrap.hs
index 51ba69a4..1cf921cf 100644
--- a/src/Propellor/Bootstrap.hs
+++ b/src/Propellor/Bootstrap.hs
@@ -6,7 +6,6 @@ module Propellor.Bootstrap (
) where
import Propellor
-import Utility.SafeCommand
import System.Posix.Files
import Data.List
diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs
index 1298daf2..95a633ec 100644
--- a/src/Propellor/CmdLine.hs
+++ b/src/Propellor/CmdLine.hs
@@ -7,7 +7,7 @@ import System.Environment (getArgs)
import Data.List
import System.Exit
import System.PosixCompat
-import qualified Network.BSD
+import Network.Socket
import Propellor
import Propellor.Gpg
@@ -18,7 +18,6 @@ import Propellor.Types.CmdLine
import qualified Propellor.Property.Docker as Docker
import qualified Propellor.Property.Chroot as Chroot
import qualified Propellor.Shim as Shim
-import Utility.SafeCommand
usage :: Handle -> IO ()
usage h = hPutStrLn h $ unlines
@@ -52,6 +51,7 @@ processCmdLine = go =<< getArgs
_ -> Spin <$> mapM hostname ps <*> pure Nothing
go ("--add-key":k:[]) = return $ AddKey k
go ("--set":f:c:[]) = withprivfield f c Set
+ go ("--unset":f:c:[]) = withprivfield f c Unset
go ("--dump":f:c:[]) = withprivfield f c Dump
go ("--edit":f:c:[]) = withprivfield f c Edit
go ("--list-fields":[]) = return ListFields
@@ -95,6 +95,7 @@ defaultMain hostlist = do
go _ (Continue cmdline) = go False cmdline
go _ Check = return ()
go _ (Set field context) = setPrivData field context
+ go _ (Unset field context) = unsetPrivData field context
go _ (Dump field context) = dumpPrivData field context
go _ (Edit field context) = editPrivData field context
go _ ListFields = listPrivDataFields hostlist
@@ -166,9 +167,15 @@ updateFirst' cmdline next = ifM fetchOrigin
, next
)
+-- Gets the fully qualified domain name, given a string that might be
+-- a short name to look up in the DNS.
hostname :: String -> IO HostName
-hostname s
- | "." `isInfixOf` s = pure s
- | otherwise = do
- h <- Network.BSD.getHostByName s
- return (Network.BSD.hostName h)
+hostname s = go =<< catchDefaultIO [] dnslookup
+ where
+ dnslookup = getAddrInfo (Just canonname) (Just s) Nothing
+ canonname = defaultHints { addrFlags = [AI_CANONNAME] }
+ go (AddrInfo { addrCanonName = Just v } : _) = pure v
+ go _
+ | "." `isInfixOf` s = pure s -- assume it's a fqdn
+ | otherwise =
+ error $ "cannot find host " ++ s ++ " in the DNS"
diff --git a/src/Propellor/Git.hs b/src/Propellor/Git.hs
index 34bc43e2..0b9b4b35 100644
--- a/src/Propellor/Git.hs
+++ b/src/Propellor/Git.hs
@@ -3,7 +3,6 @@ module Propellor.Git where
import Propellor
import Propellor.PrivData.Paths
import Propellor.Gpg
-import Utility.SafeCommand
import Utility.FileMode
getCurrentBranch :: IO String
diff --git a/src/Propellor/PrivData.hs b/src/Propellor/PrivData.hs
index 71aa820d..d0426e75 100644
--- a/src/Propellor/PrivData.hs
+++ b/src/Propellor/PrivData.hs
@@ -6,6 +6,7 @@ module Propellor.PrivData (
withSomePrivData,
addPrivData,
setPrivData,
+ unsetPrivData,
dumpPrivData,
editPrivData,
filterPrivData,
@@ -143,6 +144,11 @@ setPrivData field context = do
putStrLn "Enter private data on stdin; ctrl-D when done:"
setPrivDataTo field context =<< hGetContentsStrict stdin
+unsetPrivData :: PrivDataField -> Context -> IO ()
+unsetPrivData field context = do
+ modifyPrivData $ M.delete (field, context)
+ putStrLn "Private data unset."
+
dumpPrivData :: PrivDataField -> Context -> IO ()
dumpPrivData field context =
maybe (error "Requested privdata is not set.") putStrLn
@@ -192,17 +198,22 @@ listPrivDataFields hosts = do
setPrivDataTo :: PrivDataField -> Context -> PrivData -> IO ()
setPrivDataTo field context value = do
- makePrivDataDir
- m <- decryptPrivData
- let m' = M.insert (field, context) (chomp value) m
- gpgEncrypt privDataFile (show m')
+ modifyPrivData set
putStrLn "Private data set."
- void $ boolSystem "git" [Param "add", File privDataFile]
where
+ set = M.insert (field, context) (chomp value)
chomp s
| end s == "\n" = chomp (beginning s)
| otherwise = s
+modifyPrivData :: (PrivMap -> PrivMap) -> IO ()
+modifyPrivData f = do
+ makePrivDataDir
+ m <- decryptPrivData
+ let m' = f m
+ gpgEncrypt privDataFile (show m')
+ void $ boolSystem "git" [Param "add", File privDataFile]
+
decryptPrivData :: IO PrivMap
decryptPrivData = fromMaybe M.empty . readish <$> gpgDecrypt privDataFile
diff --git a/src/Propellor/Property.hs b/src/Propellor/Property.hs
index 1801902e..b90d5b86 100644
--- a/src/Propellor/Property.hs
+++ b/src/Propellor/Property.hs
@@ -54,6 +54,41 @@ onChange = combineWith $ \p hook -> do
return $ r <> r'
_ -> return r
+-- | Same as `onChange` except that if property y fails, a flag file
+-- is generated. On next run, if the flag file is present, property y
+-- is executed even if property x doesn't change.
+--
+-- With `onChange`, if y fails, the property x `onChange` y returns
+-- `FailedChange`. But if this property is applied again, it returns
+-- `NoChange`. This behavior can cause trouble...
+onChangeFlagOnFail
+ :: (Combines (Property x) (Property y))
+ => FilePath
+ -> Property x
+ -> Property y
+ -> CombinedType (Property x) (Property y)
+onChangeFlagOnFail flagfile p1 p2 =
+ combineWith go p1 p2
+ where
+ go s1 s2 = do
+ r1 <- s1
+ case r1 of
+ MadeChange -> flagFailed s2
+ _ -> ifM (liftIO $ doesFileExist flagfile)
+ (flagFailed s2
+ , return r1
+ )
+ flagFailed s = do
+ r <- s
+ liftIO $ case r of
+ FailedChange -> createFlagFile
+ _ -> removeFlagFile
+ return r
+ createFlagFile = unlessM (doesFileExist flagfile) $ do
+ createDirectoryIfMissing True (takeDirectory flagfile)
+ writeFile flagfile ""
+ removeFlagFile = whenM (doesFileExist flagfile) $ removeFile flagfile
+
-- | Alias for @flip describe@
(==>) :: IsProp (Property i) => Desc -> Property i -> Property i
(==>) = flip describe
diff --git a/src/Propellor/Property/Apache.hs b/src/Propellor/Property/Apache.hs
index a7c7e690..fe81dcd8 100644
--- a/src/Propellor/Property/Apache.hs
+++ b/src/Propellor/Property/Apache.hs
@@ -4,7 +4,6 @@ import Propellor
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Service as Service
-import Utility.SafeCommand
type ConfigFile = [String]
diff --git a/src/Propellor/Property/Chroot.hs b/src/Propellor/Property/Chroot.hs
index e56cb6ed..ded108bc 100644
--- a/src/Propellor/Property/Chroot.hs
+++ b/src/Propellor/Property/Chroot.hs
@@ -19,7 +19,7 @@ import Propellor.Property.Chroot.Util
import qualified Propellor.Property.Debootstrap as Debootstrap
import qualified Propellor.Property.Systemd.Core as Systemd
import qualified Propellor.Shim as Shim
-import Utility.SafeCommand
+import Propellor.Property.Mount
import qualified Data.Map as M
import Data.List.Utils
@@ -56,8 +56,9 @@ debootstrapped system conf location = case system of
-- | Ensures that the chroot exists and is provisioned according to its
-- properties.
--
--- Reverting this property removes the chroot. Note that it does not ensure
--- that any processes that might be running inside the chroot are stopped.
+-- Reverting this property removes the chroot. Anything mounted inside it
+-- is first unmounted. Note that it does not ensure that any processes
+-- that might be running inside the chroot are stopped.
provisioned :: Chroot -> RevertableProperty
provisioned c = provisioned' (propigateChrootInfo c) c False
@@ -69,7 +70,7 @@ provisioned' propigator c@(Chroot loc system builderconf _) systemdonly =
where
go desc a = propertyList (chrootDesc c desc) [a]
- setup = propellChroot c (inChrootProcess c) systemdonly
+ setup = propellChroot c (inChrootProcess (not systemdonly) c) systemdonly
`requires` toProp built
built = case (system, builderconf) of
@@ -94,7 +95,7 @@ chrootInfo (Chroot loc _ _ h) =
mempty { _chrootinfo = mempty { _chroots = M.singleton loc h } }
-- | Propellor is run inside the chroot to provision it.
-propellChroot :: Chroot -> ([String] -> CreateProcess) -> Bool -> Property NoInfo
+propellChroot :: Chroot -> ([String] -> IO (CreateProcess, IO ())) -> Bool -> Property NoInfo
propellChroot c@(Chroot loc _ _ _) mkproc systemdonly = property (chrootDesc c "provisioned") $ do
let d = localdir </> shimdir c
let me = localdir </> "propellor"
@@ -117,19 +118,21 @@ propellChroot c@(Chroot loc _ _ _) mkproc systemdonly = property (chrootDesc c "
, File localdir, File mntpnt
]
)
-
+
chainprovision shim = do
parenthost <- asks hostName
cmd <- liftIO $ toChain parenthost c systemdonly
pe <- liftIO standardPathEnv
- let p = mkproc
+ (p, cleanup) <- liftIO $ mkproc
[ shim
, "--continue"
, show cmd
]
let p' = p { env = Just pe }
- liftIO $ withHandle StdoutHandle createProcessSuccess p'
+ r <- liftIO $ withHandle StdoutHandle createProcessSuccess p'
processChainOutput
+ liftIO cleanup
+ return r
toChain :: HostName -> Chroot -> Bool -> IO CmdLine
toChain parenthost (Chroot loc _ _ _) systemdonly = do
@@ -156,8 +159,22 @@ chain hostlist (ChrootChain hn loc systemdonly onconsole) =
putStrLn $ "\n" ++ show r
chain _ _ = errorMessage "bad chain command"
-inChrootProcess :: Chroot -> [String] -> CreateProcess
-inChrootProcess (Chroot loc _ _ _) cmd = proc "chroot" (loc:cmd)
+inChrootProcess :: Bool -> Chroot -> [String] -> IO (CreateProcess, IO ())
+inChrootProcess keepprocmounted (Chroot loc _ _ _) cmd = do
+ mountproc
+ return (proc "chroot" (loc:cmd), cleanup)
+ where
+ -- /proc needs to be mounted in the chroot for the linker to use
+ -- /proc/self/exe which is necessary for some commands to work
+ mountproc = unlessM (elem procloc <$> mountPointsBelow loc) $
+ void $ mount "proc" "proc" procloc
+
+ procloc = loc </> "proc"
+
+ cleanup
+ | keepprocmounted = noop
+ | otherwise = whenM (elem procloc <$> mountPointsBelow loc) $
+ umountLazy procloc
provisioningLock :: FilePath -> FilePath
provisioningLock containerloc = "chroot" </> mungeloc containerloc ++ ".lock"
diff --git a/src/Propellor/Property/Cmd.hs b/src/Propellor/Property/Cmd.hs
index 859302c8..23816a94 100644
--- a/src/Propellor/Property/Cmd.hs
+++ b/src/Propellor/Property/Cmd.hs
@@ -1,22 +1,32 @@
{-# LANGUAGE PackageImports #-}
module Propellor.Property.Cmd (
+ -- * Properties for running commands and scripts
cmdProperty,
cmdProperty',
cmdPropertyEnv,
+ Script,
scriptProperty,
userScriptProperty,
+ -- * Lower-level interface for running commands
+ CommandParam(..),
+ boolSystem,
+ boolSystemEnv,
+ safeSystem,
+ safeSystemEnv,
+ shellEscape,
+ createProcess,
) where
import Control.Applicative
import Data.List
import "mtl" Control.Monad.Reader
-import System.Process (CreateProcess)
import Propellor.Types
import Propellor.Property
import Utility.SafeCommand
import Utility.Env
+import Utility.Process (createProcess, CreateProcess)
-- | A property that can be satisfied by running a command.
--
@@ -40,15 +50,18 @@ cmdPropertyEnv cmd params env = property desc $ liftIO $ do
where
desc = unwords $ cmd : params
--- | A property that can be satisfied by running a series of shell commands.
-scriptProperty :: [String] -> Property NoInfo
+-- | A series of shell commands. (Without a leading hashbang.)
+type Script = [String]
+
+-- | A property that can be satisfied by running a script.
+scriptProperty :: Script -> Property NoInfo
scriptProperty script = cmdProperty "sh" ["-c", shellcmd]
where
shellcmd = intercalate " ; " ("set -e" : script)
--- | A property that can satisfied by running a series of shell commands,
+-- | A property that can satisfied by running a script
-- as user (cd'd to their home directory).
-userScriptProperty :: User -> [String] -> Property NoInfo
+userScriptProperty :: User -> Script -> Property NoInfo
userScriptProperty (User user) script = cmdProperty "su" ["--shell", "/bin/sh", "-c", shellcmd, user]
where
shellcmd = intercalate " ; " ("set -e" : "cd" : script)
diff --git a/src/Propellor/Property/Cron.hs b/src/Propellor/Property/Cron.hs
index d2feaf3c..e9bb93ac 100644
--- a/src/Propellor/Property/Cron.hs
+++ b/src/Propellor/Property/Cron.hs
@@ -4,7 +4,6 @@ import Propellor
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
import Propellor.Bootstrap
-import Utility.SafeCommand
import Utility.FileMode
import Data.Char
diff --git a/src/Propellor/Property/Debootstrap.hs b/src/Propellor/Property/Debootstrap.hs
index 5d6a8bed..8d974eba 100644
--- a/src/Propellor/Property/Debootstrap.hs
+++ b/src/Propellor/Property/Debootstrap.hs
@@ -15,7 +15,6 @@ import qualified Propellor.Property.Apt as Apt
import Propellor.Property.Chroot.Util
import Propellor.Property.Mount
import Utility.Path
-import Utility.SafeCommand
import Utility.FileMode
import Data.List
@@ -107,9 +106,7 @@ unpopulated d = null <$> catchDefaultIO [] (dirContents d)
removetarget :: FilePath -> IO ()
removetarget target = do
- submnts <- filter (\p -> simplifyPath p /= simplifyPath target)
- . filter (dirContains target)
- <$> mountPoints
+ submnts <- mountPointsBelow target
forM_ submnts umountLazy
removeDirectoryRecursive target
diff --git a/src/Propellor/Property/Docker.hs b/src/Propellor/Property/Docker.hs
index fdc312ce..05f25c31 100644
--- a/src/Propellor/Property/Docker.hs
+++ b/src/Propellor/Property/Docker.hs
@@ -16,22 +16,26 @@ module Propellor.Property.Docker (
memoryLimited,
garbageCollected,
tweaked,
- Image,
+ Image(..),
+ latestImage,
ContainerName,
Container,
HasImage(..),
-- * Container configuration
dns,
hostname,
+ Publishable,
publish,
expose,
user,
+ Mountable,
volume,
volumes_from,
workdir,
memory,
cpuShares,
link,
+ environment,
ContainerAlias,
restartAlways,
restartOnFailure,
@@ -43,12 +47,12 @@ module Propellor.Property.Docker (
import Propellor hiding (init)
import Propellor.Types.Docker
+import Propellor.Types.Container
import Propellor.Types.CmdLine
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Cmd as Cmd
import qualified Propellor.Shim as Shim
-import Utility.SafeCommand
import Utility.Path
import Utility.ThreadScheduler
@@ -152,8 +156,8 @@ docked ctr@(Container _ h) =
imageBuilt :: HasImage c => FilePath -> c -> Property NoInfo
imageBuilt directory ctr = describe built msg
where
- msg = "docker image " ++ image ++ " built from " ++ directory
- built = Cmd.cmdProperty' dockercmd ["build", "--tag", image, "./"] workDir
+ msg = "docker image " ++ (imageIdentifier image) ++ " built from " ++ directory
+ built = Cmd.cmdProperty' dockercmd ["build", "--tag", imageIdentifier image, "./"] workDir
workDir p = p { cwd = Just directory }
image = getImageName ctr
@@ -161,8 +165,8 @@ imageBuilt directory ctr = describe built msg
imagePulled :: HasImage c => c -> Property NoInfo
imagePulled ctr = describe pulled msg
where
- msg = "docker image " ++ image ++ " pulled"
- pulled = Cmd.cmdProperty dockercmd ["pull", image]
+ msg = "docker image " ++ (imageIdentifier image) ++ " pulled"
+ pulled = Cmd.cmdProperty dockercmd ["pull", imageIdentifier image]
image = getImageName ctr
propigateContainerInfo :: (IsProp (Property i)) => Container -> Property i -> Property HasInfo
@@ -240,8 +244,52 @@ data ContainerInfo = ContainerInfo Image [RunParam]
-- | Parameters to pass to `docker run` when creating a container.
type RunParam = String
--- | A docker image, that can be used to run a container.
-type Image = String
+-- | ImageID is an image identifier to perform action on images. An
+-- ImageID can be the name of an container image, a UID, etc.
+--
+-- It just encapsulates a String to avoid the definition of a String
+-- instance of ImageIdentifier.
+newtype ImageID = ImageID String
+
+-- | Used to perform Docker action on an image.
+--
+-- Minimal complete definition: `imageIdentifier`
+class ImageIdentifier i where
+ -- | For internal purposes only.
+ toImageID :: i -> ImageID
+ toImageID = ImageID . imageIdentifier
+ -- | A string that Docker can use as an image identifier.
+ imageIdentifier :: i -> String
+
+instance ImageIdentifier ImageID where
+ imageIdentifier (ImageID i) = i
+ toImageID = id
+
+-- | A docker image, that can be used to run a container. The user has
+-- to specify a name and can provide an optional tag.
+-- See <http://docs.docker.com/userguide/dockerimages/ Docker Image Documention>
+-- for more information.
+data Image = Image
+ { repository :: String
+ , tag :: Maybe String
+ }
+ deriving (Eq, Read, Show)
+
+-- | Defines a Docker image without any tag. This is considered by
+-- Docker as the latest image of the provided repository.
+latestImage :: String -> Image
+latestImage repo = Image repo Nothing
+
+instance ImageIdentifier Image where
+ -- | The format of the imageIdentifier of an `Image` is:
+ -- repository | repository:tag
+ imageIdentifier i = repository i ++ (maybe "" ((++) ":") $ tag i)
+
+-- | The UID of an image. This UID is generated by Docker.
+newtype ImageUID = ImageUID String
+
+instance ImageIdentifier ImageUID where
+ imageIdentifier (ImageUID uid) = uid
-- | Set custom dns server for container.
dns :: String -> Property HasInfo
@@ -255,10 +303,19 @@ hostname = runProp "hostname"
name :: String -> Property HasInfo
name = runProp "name"
+class Publishable p where
+ toPublish :: p -> String
+
+instance Publishable (Bound Port) where
+ toPublish p = show (hostSide p) ++ ":" ++ show (containerSide p)
+
+-- | string format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
+instance Publishable String where
+ toPublish = id
+
-- | Publish a container's port to the host
--- (format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort)
-publish :: String -> Property HasInfo
-publish = runProp "publish"
+publish :: Publishable p => p -> Property HasInfo
+publish = runProp "publish" . toPublish
-- | Expose a container's port without publishing it.
expose :: String -> Property HasInfo
@@ -268,11 +325,21 @@ expose = runProp "expose"
user :: String -> Property HasInfo
user = runProp "user"
--- | Mount a volume
--- Create a bind mount with: [host-dir]:[container-dir]:[rw|ro]
+class Mountable p where
+ toMount :: p -> String
+
+instance Mountable (Bound FilePath) where
+ toMount p = hostSide p ++ ":" ++ containerSide p
+
+-- | string format: [host-dir]:[container-dir]:[rw|ro]
+--
-- With just a directory, creates a volume in the container.
-volume :: String -> Property HasInfo
-volume = runProp "volume"
+instance Mountable String where
+ toMount = id
+
+-- | Mount a volume
+volume :: Mountable v => v -> Property HasInfo
+volume = runProp "volume" . toMount
-- | Mount a volume from the specified container into the current
-- container.
@@ -327,6 +394,11 @@ restartOnFailure (Just n) = runProp "restart" ("on-failure:" ++ show n)
restartNever :: Property HasInfo
restartNever = runProp "restart" "no"
+-- | Set environment variable with a tuple composed by the environment
+-- variable name and its value.
+environment :: (String, String) -> Property HasInfo
+environment (k, v) = runProp "env" $ k ++ "=" ++ v
+
-- | A container is identified by its name, and the host
-- on which it's deployed.
data ContainerId = ContainerId
@@ -397,7 +469,9 @@ runningContainer cid@(ContainerId hn cn) image runps = containerDesc cid $ prope
return FailedChange
restartcontainer = do
- oldimage <- liftIO $ fromMaybe image <$> commitContainer cid
+ oldimage <- liftIO $
+ fromMaybe (toImageID image) . fmap toImageID <$>
+ commitContainer cid
void $ liftIO $ removeContainer cid
go oldimage
@@ -426,16 +500,14 @@ runningContainer cid@(ContainerId hn cn) image runps = containerDesc cid $ prope
retry (n-1) a
_ -> return v
- go img = do
- liftIO $ do
- clearProvisionedFlag cid
- createDirectoryIfMissing True (takeDirectory $ identFile cid)
- shim <- liftIO $ Shim.setup (localdir </> "propellor") Nothing (localdir </> shimdir cid)
- liftIO $ writeFile (identFile cid) (show ident)
- ensureProperty $ property "run" $ liftIO $
- toResult <$> runContainer img
- (runps ++ ["-i", "-d", "-t"])
- [shim, "--continue", show (DockerInit (fromContainerId cid))]
+ go img = liftIO $ do
+ clearProvisionedFlag cid
+ createDirectoryIfMissing True (takeDirectory $ identFile cid)
+ shim <- Shim.setup (localdir </> "propellor") Nothing (localdir </> shimdir cid)
+ writeFile (identFile cid) (show ident)
+ toResult <$> runContainer img
+ (runps ++ ["-i", "-d", "-t"])
+ [shim, "--continue", show (DockerInit (fromContainerId cid))]
-- | Called when propellor is running inside a docker container.
-- The string should be the container's ContainerId.
@@ -536,20 +608,20 @@ removeContainer :: ContainerId -> IO Bool
removeContainer cid = catchBoolIO $
snd <$> processTranscript dockercmd ["rm", fromContainerId cid ] Nothing
-removeImage :: Image -> IO Bool
+removeImage :: ImageIdentifier i => i -> IO Bool
removeImage image = catchBoolIO $
- snd <$> processTranscript dockercmd ["rmi", image ] Nothing
+ snd <$> processTranscript dockercmd ["rmi", imageIdentifier image] Nothing
-runContainer :: Image -> [RunParam] -> [String] -> IO Bool
+runContainer :: ImageIdentifier i => i -> [RunParam] -> [String] -> IO Bool
runContainer image ps cmd = boolSystem dockercmd $ map Param $
- "run" : (ps ++ image : cmd)
+ "run" : (ps ++ (imageIdentifier image) : cmd)
inContainerProcess :: ContainerId -> [String] -> [String] -> CreateProcess
inContainerProcess cid ps cmd = proc dockercmd ("exec" : ps ++ [fromContainerId cid] ++ cmd)
-commitContainer :: ContainerId -> IO (Maybe Image)
+commitContainer :: ContainerId -> IO (Maybe ImageUID)
commitContainer cid = catchMaybeIO $
- takeWhile (/= '\n')
+ ImageUID . takeWhile (/= '\n')
<$> readProcess dockercmd ["commit", fromContainerId cid]
data ContainerFilter = RunningContainers | AllContainers
@@ -567,8 +639,8 @@ listContainers status =
| otherwise = baseps
baseps = ["ps", "--no-trunc"]
-listImages :: IO [Image]
-listImages = lines <$> readProcess dockercmd ["images", "--all", "--quiet"]
+listImages :: IO [ImageUID]
+listImages = map ImageUID . lines <$> readProcess dockercmd ["images", "--all", "--quiet"]
runProp :: String -> RunParam -> Property HasInfo
runProp field val = pureInfoProperty (param) $ dockerInfo $
diff --git a/src/Propellor/Property/Firewall.hs b/src/Propellor/Property/Firewall.hs
index 66292c8b..d643b185 100644
--- a/src/Propellor/Property/Firewall.hs
+++ b/src/Propellor/Property/Firewall.hs
@@ -9,7 +9,6 @@ module Propellor.Property.Firewall (
Target(..),
Proto(..),
Rules(..),
- Port,
ConnectionState(..)
) where
@@ -18,7 +17,6 @@ import Data.Char
import Data.List
import Propellor
-import Utility.SafeCommand
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Network as Network
@@ -46,8 +44,8 @@ toIpTable r = map Param $
toIpTableArg :: Rules -> [String]
toIpTableArg Everything = []
toIpTableArg (Proto proto) = ["-p", map toLower $ show proto]
-toIpTableArg (Port port) = ["--dport", show port]
-toIpTableArg (PortRange (f,t)) = ["--dport", show f ++ ":" ++ show t]
+toIpTableArg (DPort port) = ["--dport", show port]
+toIpTableArg (DPortRange (f,t)) = ["--dport", show f ++ ":" ++ show t]
toIpTableArg (IFace iface) = ["-i", iface]
toIpTableArg (Ctstate states) = ["-m", "conntrack","--ctstate", concat $ intersperse "," (map show states)]
toIpTableArg (r :- r') = toIpTableArg r <> toIpTableArg r'
@@ -56,33 +54,31 @@ data Rule = Rule
{ ruleChain :: Chain
, ruleTarget :: Target
, ruleRules :: Rules
- } deriving (Eq, Show, Read)
+ } deriving (Eq, Show)
data Chain = INPUT | OUTPUT | FORWARD
- deriving (Eq,Show,Read)
+ deriving (Eq, Show)
data Target = ACCEPT | REJECT | DROP | LOG
- deriving (Eq,Show,Read)
+ deriving (Eq, Show)
data Proto = TCP | UDP | ICMP
- deriving (Eq,Show,Read)
-
-type Port = Int
+ deriving (Eq, Show)
data ConnectionState = ESTABLISHED | RELATED | NEW | INVALID
- deriving (Eq,Show,Read)
+ deriving (Eq, Show)
data Rules
= Everything
| Proto Proto
-- ^There is actually some order dependency between proto and port so this should be a specific
-- data type with proto + ports
- | Port Port
- | PortRange (Port,Port)
+ | DPort Port
+ | DPortRange (Port,Port)
| IFace Network.Interface
| Ctstate [ ConnectionState ]
| Rules :- Rules -- ^Combine two rules
- deriving (Eq,Show,Read)
+ deriving (Eq, Show)
infixl 0 :-
diff --git a/src/Propellor/Property/Git.hs b/src/Propellor/Property/Git.hs
index 0fc22616..48871b40 100644
--- a/src/Propellor/Property/Git.hs
+++ b/src/Propellor/Property/Git.hs
@@ -4,7 +4,6 @@ import Propellor
import Propellor.Property.File
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Service as Service
-import Utility.SafeCommand
import Data.List
diff --git a/src/Propellor/Property/Mount.hs b/src/Propellor/Property/Mount.hs
index f4d10302..ff47f4d9 100644
--- a/src/Propellor/Property/Mount.hs
+++ b/src/Propellor/Property/Mount.hs
@@ -1,23 +1,33 @@
module Propellor.Property.Mount where
import Propellor
-import Utility.SafeCommand
+import Utility.Path
type FsType = String
type Source = String
+-- | Lists all mount points of the system.
mountPoints :: IO [FilePath]
mountPoints = lines <$> readProcess "findmnt" ["-rn", "--output", "target"]
+-- | Finds all filesystems mounted inside the specified directory.
+mountPointsBelow :: FilePath -> IO [FilePath]
+mountPointsBelow target = filter (\p -> simplifyPath p /= simplifyPath target)
+ . filter (dirContains target)
+ <$> mountPoints
+
+-- | Filesystem type mounted at a given location.
getFsType :: FilePath -> IO (Maybe FsType)
getFsType mnt = catchDefaultIO Nothing $
headMaybe . lines
<$> readProcess "findmnt" ["-n", mnt, "--output", "fstype"]
+-- | Unmounts a device, lazily so any running processes don't block it.
umountLazy :: FilePath -> IO ()
umountLazy mnt =
unlessM (boolSystem "umount" [ Param "-l", Param mnt ]) $
errorMessage $ "failed unmounting " ++ mnt
+-- | Mounts a device.
mount :: FsType -> Source -> FilePath -> IO Bool
mount fs src mnt = boolSystem "mount" [Param "-t", Param fs, Param src, Param mnt]
diff --git a/src/Propellor/Property/OS.hs b/src/Propellor/Property/OS.hs
index 11fa6c82..5364456a 100644
--- a/src/Propellor/Property/OS.hs
+++ b/src/Propellor/Property/OS.hs
@@ -16,7 +16,6 @@ import qualified Propellor.Property.File as File
import qualified Propellor.Property.Reboot as Reboot
import Propellor.Property.Mount
import Propellor.Property.Chroot.Util (stdPATH)
-import Utility.SafeCommand
import System.Posix.Files (rename, fileExist)
import Control.Exception (throw)
diff --git a/src/Propellor/Property/Obnam.hs b/src/Propellor/Property/Obnam.hs
index da27e263..94b023f3 100644
--- a/src/Propellor/Property/Obnam.hs
+++ b/src/Propellor/Property/Obnam.hs
@@ -4,7 +4,6 @@ import Propellor
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.Cron as Cron
import qualified Propellor.Property.Gpg as Gpg
-import Utility.SafeCommand
import Data.List
diff --git a/src/Propellor/Property/Postfix.hs b/src/Propellor/Property/Postfix.hs
index 073d5dc8..b062cbac 100644
--- a/src/Propellor/Property/Postfix.hs
+++ b/src/Propellor/Property/Postfix.hs
@@ -22,10 +22,11 @@ reloaded :: Property NoInfo
reloaded = Service.reloaded "postfix"
-- | Configures postfix as a satellite system, which
--- relays all mail through a relay host, which defaults to smtp.domain.
+-- relays all mail through a relay host, which defaults to smtp.domain,
+-- but can be changed by @mainCf "relayhost"@.
--
-- The smarthost may refuse to relay mail on to other domains, without
--- futher coniguration/keys. But this should be enough to get cron job
+-- further configuration/keys. But this should be enough to get cron job
-- mail flowing to a place where it will be seen.
satellite :: Property NoInfo
satellite = check (not <$> mainCfIsSet "relayhost") setup
@@ -34,14 +35,14 @@ satellite = check (not <$> mainCfIsSet "relayhost") setup
setup = trivial $ property "postfix satellite system" $ do
hn <- asks hostName
let (_, domain) = separate (== '.') hn
- ensureProperties
+ ensureProperties
[ Apt.reConfigure "postfix"
[ ("postfix/main_mailer_type", "select", "Satellite system")
, ("postfix/root_address", "string", "root")
, ("postfix/destinations", "string", "localhost")
, ("postfix/mailname", "string", hn)
]
- , mainCf ("relayhost", domain)
+ , mainCf ("relayhost", "smtp." ++ domain)
`onChange` reloaded
]
@@ -57,7 +58,7 @@ mappedFile f setup = setup f
`onChange` cmdProperty "postmap" [f]
-- | Run newaliases command, which should be done after changing
--- </etc/aliases>.
+-- @/etc/aliases@.
newaliases :: Property NoInfo
newaliases = trivial $ cmdProperty "newaliases" []
@@ -65,7 +66,7 @@ newaliases = trivial $ cmdProperty "newaliases" []
mainCfFile :: FilePath
mainCfFile = "/etc/postfix/main.cf"
--- | Sets a main.cf name=value pair. Does not reload postfix immediately.
+-- | Sets a main.cf @name=value@ pair. Does not reload postfix immediately.
mainCf :: (String, String) -> Property NoInfo
mainCf (name, value) = check notset set
`describe` ("postfix main.cf " ++ setting)
@@ -74,7 +75,7 @@ mainCf (name, value) = check notset set
notset = (/= Just value) <$> getMainCf name
set = cmdProperty "postconf" ["-e", setting]
--- | Gets a man.cf setting.
+-- | Gets a main.cf setting.
getMainCf :: String -> IO (Maybe String)
getMainCf name = parse . lines <$> readProcess "postconf" [name]
where
@@ -130,9 +131,9 @@ dedupCf ls =
-- | Installs saslauthd and configures it for postfix, authenticating
-- against PAM.
--
--- Does not configure postfix to use it; eg smtpd_sasl_auth_enable = yes
+-- Does not configure postfix to use it; eg @smtpd_sasl_auth_enable = yes@
-- needs to be set to enable use. See
--- https://wiki.debian.org/PostfixAndSASL
+-- <https://wiki.debian.org/PostfixAndSASL>.
saslAuthdInstalled :: Property NoInfo
saslAuthdInstalled = setupdaemon
`requires` Service.running "saslauthd"
diff --git a/src/Propellor/Property/Reboot.hs b/src/Propellor/Property/Reboot.hs
index 750968ff..d45969a8 100644
--- a/src/Propellor/Property/Reboot.hs
+++ b/src/Propellor/Property/Reboot.hs
@@ -1,7 +1,6 @@
module Propellor.Property.Reboot where
import Propellor
-import Utility.SafeCommand
now :: Property NoInfo
now = cmdProperty "reboot" []
diff --git a/src/Propellor/Property/Service.hs b/src/Propellor/Property/Service.hs
index 8da502f7..9cc010e8 100644
--- a/src/Propellor/Property/Service.hs
+++ b/src/Propellor/Property/Service.hs
@@ -1,7 +1,6 @@
module Propellor.Property.Service where
import Propellor
-import Utility.SafeCommand
type ServiceName = String
diff --git a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
index 511fd888..7f893431 100644
--- a/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
+++ b/src/Propellor/Property/SiteSpecific/GitAnnexBuilder.hs
@@ -6,9 +6,9 @@ import Propellor
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.User as User
import qualified Propellor.Property.Cron as Cron
-import qualified Propellor.Property.Ssh as Ssh
import qualified Propellor.Property.File as File
-import qualified Propellor.Property.Docker as Docker
+import qualified Propellor.Property.Systemd as Systemd
+import qualified Propellor.Property.Chroot as Chroot
import Propellor.Property.Cron (Times)
builduser :: UserName
@@ -48,8 +48,6 @@ autobuilder arch crontimes timeout = combineProperties "gitannexbuilder" $ props
tree :: Architecture -> Property HasInfo
tree buildarch = combineProperties "gitannexbuilder tree" $ props
& Apt.installed ["git"]
- -- gitbuilderdir directory already exists when docker volume is used,
- -- but with wrong owner.
& File.dirExists gitbuilderdir
& File.ownerGroup gitbuilderdir (User builduser) (Group builduser)
& gitannexbuildercloned
@@ -69,7 +67,6 @@ tree buildarch = combineProperties "gitannexbuilder tree" $ props
buildDepsApt :: Property HasInfo
buildDepsApt = combineProperties "gitannexbuilder build deps" $ props
& Apt.buildDep ["git-annex"]
- & Apt.installed ["liblockfile-simple-perl"]
& buildDepsNoHaskellLibs
& Apt.buildDepIn builddir
`describe` "git-annex source build deps installed"
@@ -84,6 +81,13 @@ buildDepsNoHaskellLibs = Apt.installed
"alex", "happy", "c2hs"
]
+haskellPkgsInstalled :: String -> Property NoInfo
+haskellPkgsInstalled dir = flagFile go ("/haskellpkgsinstalled")
+ where
+ go = userScriptProperty (User builduser)
+ [ "cd " ++ builddir ++ " && ./standalone/" ++ dir ++ "/install-haskell-packages"
+ ]
+
-- Installs current versions of git-annex's deps from cabal, but only
-- does so once.
cabalDeps :: Property NoInfo
@@ -92,46 +96,60 @@ cabalDeps = flagFile go cabalupdated
go = userScriptProperty (User builduser) ["cabal update && cabal install git-annex --only-dependencies || true"]
cabalupdated = homedir </> ".cabal" </> "packages" </> "hackage.haskell.org" </> "00-index.cache"
-standardAutoBuilderContainer :: (System -> Docker.Image) -> Architecture -> Int -> TimeOut -> Docker.Container
-standardAutoBuilderContainer dockerImage arch buildminute timeout = Docker.container (arch ++ "-git-annex-builder")
- (dockerImage $ System (Debian Testing) arch)
- & os (System (Debian Testing) arch)
- & Apt.stdSourcesList
- & Apt.installed ["systemd"]
- & Apt.unattendedUpgrades
- & User.accountFor (User builduser)
- & tree arch
- & buildDepsApt
- & autobuilder arch (Cron.Times $ show buildminute ++ " * * * *") timeout
- & Docker.tweaked
-
-androidAutoBuilderContainer :: (System -> Docker.Image) -> Times -> TimeOut -> Docker.Container
-androidAutoBuilderContainer dockerImage crontimes timeout =
- androidContainer dockerImage "android-git-annex-builder" (tree "android") builddir
+autoBuilderContainer :: (System -> Property HasInfo) -> System -> Times -> TimeOut -> Systemd.Container
+autoBuilderContainer mkprop osver@(System _ arch) crontime timeout =
+ Systemd.container name bootstrap
+ & mkprop osver
+ & buildDepsApt
+ & autobuilder arch crontime timeout
+ where
+ name = arch ++ "-git-annex-builder"
+ bootstrap = Chroot.debootstrapped osver mempty
+
+standardAutoBuilder :: System -> Property HasInfo
+standardAutoBuilder osver@(System _ arch) =
+ propertyList "standard git-annex autobuilder" $ props
+ & os osver
+ & Apt.stdSourcesList
+ & Apt.unattendedUpgrades
+ & User.accountFor (User builduser)
+ & tree arch
+
+armAutoBuilder :: System -> Times -> TimeOut -> Property HasInfo
+armAutoBuilder osver@(System _ arch) crontime timeout =
+ propertyList "arm git-annex autobuilder" $ props
+ & standardAutoBuilder osver
+ & buildDepsNoHaskellLibs
+ -- Works around ghc crash with parallel builds on arm.
+ & (homedir </> ".cabal" </> "config")
+ `File.lacksLine` "jobs: $ncpus"
+ -- Install patched haskell packages for portability to
+ -- arm NAS's using old kernel versions.
+ & haskellPkgsInstalled "linux"
+ & autobuilder arch crontime timeout
+
+androidAutoBuilderContainer :: Times -> TimeOut -> Systemd.Container
+androidAutoBuilderContainer crontimes timeout =
+ androidContainer "android-git-annex-builder" (tree "android") builddir
& Apt.unattendedUpgrades
& autobuilder "android" crontimes timeout
-- Android is cross-built in a Debian i386 container, using the Android NDK.
androidContainer
:: (IsProp (Property (CInfo NoInfo i)), (Combines (Property NoInfo) (Property i)))
- => (System -> Docker.Image)
- -> Docker.ContainerName
+ => Systemd.MachineName
-> Property i
-> FilePath
- -> Docker.Container
-androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.container name
- (dockerImage osver)
+ -> Systemd.Container
+androidContainer name setupgitannexdir gitannexdir = Systemd.container name bootstrap
& os osver
& Apt.stdSourcesList
- & Apt.installed ["systemd"]
- & Docker.tweaked
& User.accountFor (User builduser)
& File.dirExists gitbuilderdir
& File.ownerGroup homedir (User builduser) (Group builduser)
- & buildDepsApt
& flagFile chrootsetup ("/chrootsetup")
`requires` setupgitannexdir
- & flagFile haskellpkgsinstalled ("/haskellpkgsinstalled")
+ & haskellPkgsInstalled "android"
where
-- Use git-annex's android chroot setup script, which will install
-- ghc-android and the NDK, all build deps, etc, in the home
@@ -139,54 +157,5 @@ androidContainer dockerImage name setupgitannexdir gitannexdir = Docker.containe
chrootsetup = scriptProperty
[ "cd " ++ gitannexdir ++ " && ./standalone/android/buildchroot-inchroot"
]
- haskellpkgsinstalled = userScriptProperty (User builduser)
- [ "cd " ++ gitannexdir ++ " && ./standalone/android/install-haskell-packages"
- ]
- osver = System (Debian Testing) "i386"
-
--- armel builder has a companion container using amd64 that
--- runs the build first to get TH splices. They need
--- to have the same versions of all haskell libraries installed.
-armelCompanionContainer :: (System -> Docker.Image) -> Docker.Container
-armelCompanionContainer dockerImage = Docker.container "armel-git-annex-builder-companion"
- (dockerImage $ System (Debian Unstable) "amd64")
- & os (System (Debian Testing) "amd64")
- & Apt.stdSourcesList
- & Apt.installed ["systemd"]
- -- This volume is shared with the armel builder.
- & Docker.volume gitbuilderdir
- & User.accountFor (User builduser)
- -- Install current versions of build deps from cabal.
- & tree "armel"
- & buildDepsNoHaskellLibs
- & cabalDeps
- -- The armel builder can ssh to this companion.
- & Docker.expose "22"
- & Apt.serviceInstalledRunning "ssh"
- & Ssh.authorizedKeys (User builduser) (Context "armel-git-annex-builder")
- & Docker.tweaked
-
-armelAutoBuilderContainer :: (System -> Docker.Image) -> Times -> TimeOut -> Docker.Container
-armelAutoBuilderContainer dockerImage crontimes timeout = Docker.container "armel-git-annex-builder"
- (dockerImage $ System (Debian Unstable) "armel")
- & os (System (Debian Testing) "armel")
- & Apt.stdSourcesList
- & Apt.installed ["systemd"]
- & Apt.installed ["openssh-client"]
- & Docker.link "armel-git-annex-builder-companion" "companion"
- & Docker.volumes_from "armel-git-annex-builder-companion"
- & User.accountFor (User builduser)
- -- TODO: automate installing haskell libs
- -- (Currently have to run
- -- git-annex/standalone/linux/install-haskell-packages
- -- which is not fully automated.)
- & buildDepsNoHaskellLibs
- & autobuilder "armel" crontimes timeout
- `requires` tree "armel"
- & Ssh.keyImported SshRsa (User builduser) (Context "armel-git-annex-builder")
- & trivial writecompanionaddress
- & Docker.tweaked
- where
- writecompanionaddress = scriptProperty
- [ "echo \"$COMPANION_PORT_22_TCP_ADDR\" > " ++ homedir </> "companion_address"
- ] `describe` "companion_address file"
+ osver = System (Debian (Stable "jessie")) "i386"
+ bootstrap = Chroot.debootstrapped osver mempty
diff --git a/src/Propellor/Property/SiteSpecific/GitHome.hs b/src/Propellor/Property/SiteSpecific/GitHome.hs
index d6dce7c0..40f2ecd8 100644
--- a/src/Propellor/Property/SiteSpecific/GitHome.hs
+++ b/src/Propellor/Property/SiteSpecific/GitHome.hs
@@ -3,7 +3,6 @@ module Propellor.Property.SiteSpecific.GitHome where
import Propellor
import qualified Propellor.Property.Apt as Apt
import Propellor.Property.User
-import Utility.SafeCommand
-- | Clones Joey Hess's git home directory, and runs its fixups script.
installedFor :: User -> Property NoInfo
diff --git a/src/Propellor/Property/SiteSpecific/IABak.hs b/src/Propellor/Property/SiteSpecific/IABak.hs
index 4ddc6380..8ed3b38f 100644
--- a/src/Propellor/Property/SiteSpecific/IABak.hs
+++ b/src/Propellor/Property/SiteSpecific/IABak.hs
@@ -35,7 +35,7 @@ gitServer knownhosts = propertyList "iabak git server" $ props
& Cron.niceJob "shardstats" (Cron.Times "*/30 * * * *") (User "root") "/"
"/usr/local/IA.BAK/shardstats-all"
& Cron.niceJob "shardmaint" Cron.Daily (User "root") "/"
- "/usr/local/IA.BAK/shardmaint"
+ "/usr/local/IA.BAK/shardmaint-fast; /usr/local/IA.BAK/shardmaint"
registrationServer :: [Host] -> Property HasInfo
registrationServer knownhosts = propertyList "iabak registration server" $ props
@@ -64,14 +64,13 @@ graphiteServer = propertyList "iabak graphite server" $ props
, "pattern = ^carbon\\."
, "retentions = 60:90d"
, "[iabak-connections]"
- , "pattern = ^iabak\.shardstats\.connections"
+ , "pattern = ^iabak\\.shardstats\\.connections"
, "retentions = 1h:1y,3h:10y"
- , "[iabak]"
+ , "[iabak-default]"
, "pattern = ^iabak\\."
, "retentions = 10m:30d,1h:1y,3h:10y"
, "[default_1min_for_1day]"
, "pattern = .*"
- , "retentions = 60s:1d"
]
& graphiteCSRF
& cmdProperty "graphite-manage" ["syncdb", "--noinput"] `flagFile` "/etc/flagFiles/graphite-syncdb"
diff --git a/src/Propellor/Property/SiteSpecific/JoeySites.hs b/src/Propellor/Property/SiteSpecific/JoeySites.hs
index 36808919..b6524f69 100644
--- a/src/Propellor/Property/SiteSpecific/JoeySites.hs
+++ b/src/Propellor/Property/SiteSpecific/JoeySites.hs
@@ -15,7 +15,6 @@ import qualified Propellor.Property.User as User
import qualified Propellor.Property.Obnam as Obnam
import qualified Propellor.Property.Apache as Apache
import qualified Propellor.Property.Postfix as Postfix
-import Utility.SafeCommand
import Utility.FileMode
import Data.List
@@ -30,7 +29,6 @@ scrollBox = propertyList "scroll server" $ props
"libghc-bytestring-dev", "libghc-mtl-dev", "libghc-ncurses-dev",
"libghc-random-dev", "libghc-monad-loops-dev", "libghc-text-dev",
"libghc-ifelse-dev", "libghc-case-insensitive-dev",
- "libghc-transformers-dev",
"libghc-data-default-dev", "libghc-optparse-applicative-dev"]
& userScriptProperty (User "scroll")
[ "cd " ++ d </> "scroll"
@@ -389,7 +387,7 @@ twitRss = combineProperties "twitter rss" $ props
-- Work around for expired ssl cert.
pumpRss :: Property NoInfo
pumpRss = Cron.job "pump rss" (Cron.Times "15 * * * *") (User "joey") "/srv/web/tmp.kitenet.net/"
- "wget https://pump2rss.com/feed/joeyh@identi.ca.atom -O pump.atom.new --no-check-certificate 2>/dev/null; sed 's/ & / /g' pump.atom.new > pump.atom"
+ "wget https://rss.io.jpope.org/feed/joeyh@identi.ca.atom -O pump.atom.new --no-check-certificate 2>/dev/null; sed 's/ & / /g' pump.atom.new > pump.atom"
ircBouncer :: Property HasInfo
ircBouncer = propertyList "IRC bouncer" $ props
@@ -407,7 +405,7 @@ ircBouncer = propertyList "IRC bouncer" $ props
kiteShellBox :: Property NoInfo
kiteShellBox = propertyList "kitenet.net shellinabox"
- [ Apt.installed ["openssl", "shellinabox"]
+ [ Apt.installed ["openssl", "shellinabox", "openssh-client"]
, File.hasContent "/etc/default/shellinabox"
[ "# Deployed by propellor"
, "SHELLINABOX_DAEMON_START=1"
@@ -861,6 +859,8 @@ legacyWebSites = propertyList "legacy web sites" $ props
, " AllowOverride None"
, Apache.allowAll
, "</Directory>"
+ , "RewriteEngine On"
+ , "RewriteRule .* http://www.sowsearpoetry.org/ [L]"
]
& alias "wortroot.kitenet.net"
& alias "www.wortroot.kitenet.net"
diff --git a/src/Propellor/Property/Ssh.hs b/src/Propellor/Property/Ssh.hs
index 37e65728..fca7d037 100644
--- a/src/Propellor/Property/Ssh.hs
+++ b/src/Propellor/Property/Ssh.hs
@@ -1,7 +1,10 @@
module Propellor.Property.Ssh (
PubKeyText,
sshdConfig,
+ ConfigKeyword,
+ setSshdConfigBool,
setSshdConfig,
+ RootLogin(..),
permitRootLogin,
passwordAuthentication,
noPasswords,
@@ -24,11 +27,11 @@ import Propellor
import qualified Propellor.Property.File as File
import qualified Propellor.Property.Service as Service
import Propellor.Property.User
-import Utility.SafeCommand
import Utility.FileMode
import System.PosixCompat
import qualified Data.Map as M
+import Data.List
type PubKeyText = String
@@ -39,21 +42,37 @@ sshBool False = "no"
sshdConfig :: FilePath
sshdConfig = "/etc/ssh/sshd_config"
-setSshdConfig :: String -> Bool -> Property NoInfo
-setSshdConfig setting allowed = combineProperties "sshd config"
- [ sshdConfig `File.lacksLine` (sshline $ not allowed)
- , sshdConfig `File.containsLine` (sshline allowed)
- ]
+type ConfigKeyword = String
+
+setSshdConfigBool :: ConfigKeyword -> Bool -> Property NoInfo
+setSshdConfigBool setting allowed = setSshdConfig setting (sshBool allowed)
+
+setSshdConfig :: ConfigKeyword -> String -> Property NoInfo
+setSshdConfig setting val = File.fileProperty desc f sshdConfig
`onChange` restarted
- `describe` unwords [ "ssh config:", setting, sshBool allowed ]
where
- sshline v = setting ++ " " ++ sshBool v
+ desc = unwords [ "ssh config:", setting, val ]
+ cfgline = setting ++ " " ++ val
+ wantedline s
+ | s == cfgline = True
+ | (setting ++ " ") `isPrefixOf` s = False
+ | otherwise = True
+ f ls
+ | cfgline `elem` ls = filter wantedline ls
+ | otherwise = filter wantedline ls ++ [cfgline]
+
+data RootLogin
+ = RootLogin Bool -- ^ allow or prevent root login
+ | WithoutPassword -- ^ disable password authentication for root, while allowing other authentication methods
+ | ForcedCommandsOnly -- ^ allow root login with public-key authentication, but only if a forced command has been specified for the public key
-permitRootLogin :: Bool -> Property NoInfo
-permitRootLogin = setSshdConfig "PermitRootLogin"
+permitRootLogin :: RootLogin -> Property NoInfo
+permitRootLogin (RootLogin b) = setSshdConfigBool "PermitRootLogin" b
+permitRootLogin WithoutPassword = setSshdConfig "PermitRootLogin" "without-password"
+permitRootLogin ForcedCommandsOnly = setSshdConfig "PermitRootLogin" "forced-commands-only"
passwordAuthentication :: Bool -> Property NoInfo
-passwordAuthentication = setSshdConfig "PasswordAuthentication"
+passwordAuthentication = setSshdConfigBool "PasswordAuthentication"
-- | Configure ssh to not allow password logins.
--
diff --git a/src/Propellor/Property/Systemd.hs b/src/Propellor/Property/Systemd.hs
index 07cf81ee..5c8a35e3 100644
--- a/src/Propellor/Property/Systemd.hs
+++ b/src/Propellor/Property/Systemd.hs
@@ -1,31 +1,51 @@
+{-# LANGUAGE FlexibleInstances #-}
+
module Propellor.Property.Systemd (
- module Propellor.Property.Systemd.Core,
+ -- * Services
ServiceName,
- MachineName,
started,
stopped,
enabled,
disabled,
+ masked,
+ running,
restarted,
- persistentJournal,
+ networkd,
+ journald,
+ -- * Configuration
+ installed,
Option,
configured,
- journaldConfigured,
daemonReloaded,
+ -- * Journal
+ persistentJournal,
+ journaldConfigured,
+ -- * Containers
+ MachineName,
Container,
container,
nspawned,
+ -- * Container configuration
containerCfg,
resolvConfed,
+ linkJournal,
+ privateNetwork,
+ module Propellor.Types.Container,
+ Proto(..),
+ Publishable,
+ publish,
+ Bindable,
+ bind,
+ bindRo,
) where
import Propellor
import Propellor.Types.Chroot
+import Propellor.Types.Container
import qualified Propellor.Property.Chroot as Chroot
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.File as File
import Propellor.Property.Systemd.Core
-import Utility.SafeCommand
import Utility.FileMode
import Data.List
@@ -45,6 +65,9 @@ instance PropAccum Container where
getProperties (Container _ _ h) = hostProperties h
-- | Starts a systemd service.
+--
+-- Note that this does not configure systemd to start the service on boot,
+-- it only ensures that the service is currently running.
started :: ServiceName -> Property NoInfo
started n = trivial $ cmdProperty "systemctl" ["start", n]
`describe` ("service " ++ n ++ " started")
@@ -55,6 +78,9 @@ stopped n = trivial $ cmdProperty "systemctl" ["stop", n]
`describe` ("service " ++ n ++ " stopped")
-- | Enables a systemd service.
+--
+-- This does not ensure the service is started, it only configures systemd
+-- to start it on boot.
enabled :: ServiceName -> Property NoInfo
enabled n = trivial $ cmdProperty "systemctl" ["enable", n]
`describe` ("service " ++ n ++ " enabled")
@@ -64,11 +90,32 @@ disabled :: ServiceName -> Property NoInfo
disabled n = trivial $ cmdProperty "systemctl" ["disable", n]
`describe` ("service " ++ n ++ " disabled")
+-- | Masks a systemd service.
+masked :: ServiceName -> RevertableProperty
+masked n = systemdMask <!> systemdUnmask
+ where
+ systemdMask = trivial $ cmdProperty "systemctl" ["mask", n]
+ `describe` ("service " ++ n ++ " masked")
+ systemdUnmask = trivial $ cmdProperty "systemctl" ["unmask", n]
+ `describe` ("service " ++ n ++ " unmasked")
+
+-- | Ensures that a service is both enabled and started
+running :: ServiceName -> Property NoInfo
+running n = trivial $ started n `requires` enabled n
+
-- | Restarts a systemd service.
restarted :: ServiceName -> Property NoInfo
restarted n = trivial $ cmdProperty "systemctl" ["restart", n]
`describe` ("service " ++ n ++ " restarted")
+-- | The systemd-networkd service.
+networkd :: ServiceName
+networkd = "systemd-networkd"
+
+-- | The systemd-journald service.
+journald :: ServiceName
+journald = "systemd-journald"
+
-- | Enables persistent storage of the journal.
persistentJournal :: Property NoInfo
persistentJournal = check (not <$> doesDirectoryExist dir) $
@@ -87,7 +134,8 @@ type Option = String
-- Does not ensure that the relevant daemon notices the change immediately.
--
-- This assumes that there is only one [Header] per file, which is
--- currently the case. And it assumes the file already exists with
+-- currently the case for files like journald.conf and system.conf.
+-- And it assumes the file already exists with
-- the right [Header], so new lines can just be appended to the end.
configured :: FilePath -> Option -> String -> Property NoInfo
configured cfgfile option value = combineProperties desc
@@ -102,15 +150,15 @@ configured cfgfile option value = combineProperties desc
| setting `isPrefixOf` l = Nothing
| otherwise = Just l
+-- | Causes systemd to reload its configuration files.
+daemonReloaded :: Property NoInfo
+daemonReloaded = trivial $ cmdProperty "systemctl" ["daemon-reload"]
+
-- | Configures journald, restarting it so the changes take effect.
journaldConfigured :: Option -> String -> Property NoInfo
journaldConfigured option value =
configured "/etc/systemd/journald.conf" option value
- `onChange` restarted "systemd-journald"
-
--- | Causes systemd to reload its configuration files.
-daemonReloaded :: Property NoInfo
-daemonReloaded = trivial $ cmdProperty "systemctl" ["daemon-reload"]
+ `onChange` restarted journald
-- | Defines a container with a given machine name.
--
@@ -123,6 +171,7 @@ container :: MachineName -> (FilePath -> Chroot.Chroot) -> Container
container name mkchroot = Container name c h
& os system
& resolvConfed
+ & linkJournal
where
c@(Chroot.Chroot _ system _ _) = mkchroot (containerDir name)
h = Host name [] mempty
@@ -153,8 +202,7 @@ nspawned c@(Container name (Chroot.Chroot loc system builderconf _) h) =
-- Chroot provisioning is run in systemd-only mode,
-- which sets up the chroot and ensures systemd and dbus are
-- installed, but does not handle the other provisions.
- chrootprovisioned = Chroot.provisioned'
- (Chroot.propigateChrootInfo chroot) chroot True
+ chrootprovisioned = Chroot.provisioned' (Chroot.propigateChrootInfo chroot) chroot True
-- Use nsenter to enter container and and run propellor to
-- finish provisioning.
@@ -178,8 +226,14 @@ nspawnService (Container name _ _) cfg = setup <!> teardown
return $ unlines $
"# deployed by propellor" : map addparams ls
addparams l
- | "ExecStart=" `isPrefixOf` l =
- l ++ " " ++ unwords (nspawnServiceParams cfg)
+ | "ExecStart=" `isPrefixOf` l = unwords $
+ [ "ExecStart = /usr/bin/systemd-nspawn"
+ , "--quiet"
+ , "--keep-unit"
+ , "--boot"
+ , "--directory=" ++ containerDir name
+ , "--machine=%i"
+ ] ++ nspawnServiceParams cfg
| otherwise = l
goodservicefile = (==)
@@ -216,15 +270,19 @@ enterScript c@(Container name _ _) = setup <!> teardown
where
setup = combineProperties ("generated " ++ enterScriptFile c)
[ scriptfile `File.hasContent`
- [ "#!/bin/sh"
+ [ "#!/usr/bin/perl"
, "# Generated by propellor"
- , "pid=\"$(machinectl show " ++ shellEscape name ++ " -p Leader | cut -d= -f2)\" || true"
- , "if [ -n \"$pid\" ]; then"
- , "\tnsenter -p -u -n -i -m -t \"$pid\" \"$@\""
- , "else"
- , "\techo container not running >&2"
- , "\texit 1"
- , "fi"
+ , "my $pid=`machinectl show " ++ shellEscape name ++ " -p Leader | cut -d= -f2`;"
+ , "chomp $pid;"
+ , "if (length $pid) {"
+ , "\tforeach my $var (keys %ENV) {"
+ , "\t\tdelete $ENV{$var} unless $var eq 'PATH' || $var eq 'TERM';"
+ , "\t}"
+ , "\texec('nsenter', '-p', '-u', '-n', '-i', '-m', '-t', $pid, @ARGV);"
+ , "} else {"
+ , "\tdie 'container not running';"
+ , "}"
+ , "exit(1);"
]
, scriptfile `File.mode` combineModes (readModes ++ executeModes)
]
@@ -234,8 +292,8 @@ enterScript c@(Container name _ _) = setup <!> teardown
enterScriptFile :: Container -> FilePath
enterScriptFile (Container name _ _ ) = "/usr/local/bin/enter-" ++ mungename name
-enterContainerProcess :: Container -> [String] -> CreateProcess
-enterContainerProcess = proc . enterScriptFile
+enterContainerProcess :: Container -> [String] -> IO (CreateProcess, IO ())
+enterContainerProcess c ps = pure (proc (enterScriptFile c) ps, noop)
nspawnServiceName :: MachineName -> ServiceName
nspawnServiceName name = "systemd-nspawn@" ++ name ++ ".service"
@@ -267,3 +325,68 @@ containerCfg p = RevertableProperty (mk True) (mk False)
-- This property is enabled by default. Revert it to disable it.
resolvConfed :: RevertableProperty
resolvConfed = containerCfg "bind=/etc/resolv.conf"
+
+-- | Link the container's journal to the host's if possible.
+-- (Only works if the host has persistent journal enabled.)
+--
+-- This property is enabled by default. Revert it to disable it.
+linkJournal :: RevertableProperty
+linkJournal = containerCfg "link-journal=try-guest"
+
+-- | Disconnect networking of the container from the host.
+privateNetwork :: RevertableProperty
+privateNetwork = containerCfg "private-network"
+
+class Publishable a where
+ toPublish :: a -> String
+
+instance Publishable Port where
+ toPublish (Port n) = show n
+
+instance Publishable (Bound Port) where
+ toPublish v = toPublish (hostSide v) ++ ":" ++ toPublish (containerSide v)
+
+data Proto = TCP | UDP
+
+instance Publishable (Proto, Bound Port) where
+ toPublish (TCP, fp) = "tcp:" ++ toPublish fp
+ toPublish (UDP, fp) = "udp:" ++ toPublish fp
+
+-- | Publish a port from the container to the host.
+--
+-- This feature was first added in systemd version 220.
+--
+-- This property is only needed (and will only work) if the container
+-- is configured to use private networking. Also, networkd should be enabled
+-- both inside the container, and on the host. For example:
+--
+-- > foo :: Host
+-- > foo = host "foo.example.com"
+-- > & Systemd.running Systemd.networkd
+-- > & Systemd.nspawned webserver
+-- >
+-- > webserver :: Systemd.container
+-- > webserver = Systemd.container "webserver" (Chroot.debootstrapped (System (Debian Testing) "amd64") mempty)
+-- > & Systemd.privateNetwork
+-- > & Systemd.running Systemd.networkd
+-- > & Systemd.publish (Port 80 ->- Port 8080)
+-- > & Apt.installedRunning "apache2"
+publish :: Publishable p => p -> RevertableProperty
+publish p = containerCfg $ "--port=" ++ toPublish p
+
+class Bindable a where
+ toBind :: a -> String
+
+instance Bindable FilePath where
+ toBind f = f
+
+instance Bindable (Bound FilePath) where
+ toBind v = hostSide v ++ ":" ++ containerSide v
+
+-- | Bind mount a file or directory from the host into the container.
+bind :: Bindable p => p -> RevertableProperty
+bind p = containerCfg $ "--bind=" ++ toBind p
+
+-- | Read-only mind mount.
+bindRo :: Bindable p => p -> RevertableProperty
+bindRo p = containerCfg $ "--bind-ro=" ++ toBind p
diff --git a/src/Propellor/Property/Tor.hs b/src/Propellor/Property/Tor.hs
index 3af4a70c..f1aaeeb1 100644
--- a/src/Propellor/Property/Tor.hs
+++ b/src/Propellor/Property/Tor.hs
@@ -103,13 +103,8 @@ bandwidthRate' s divby = case readSize dataUnits s of
Nothing -> property ("unable to parse " ++ s) noChange
hiddenServiceAvailable :: HiddenServiceName -> Int -> Property NoInfo
-hiddenServiceAvailable hn port = hiddenServiceHostName prop
+hiddenServiceAvailable hn port = hiddenServiceHostName $ hiddenService hn port
where
- prop = configured
- [ ("HiddenServiceDir", varLib </> hn)
- , ("HiddenServicePort", unwords [show port, "127.0.0.1:" ++ show port])
- ]
- `describe` "hidden service available"
hiddenServiceHostName p = adjustPropertySatisfy p $ \satisfy -> do
r <- satisfy
h <- liftIO $ readFile (varLib </> hn </> "hostname")
@@ -164,7 +159,7 @@ type NickName = String
-- | Convert String to a valid tor NickName.
saneNickname :: String -> NickName
-saneNickname s
+saneNickname s
| null n = "unnamed"
| otherwise = n
where
diff --git a/src/Propellor/Shim.hs b/src/Propellor/Shim.hs
index 5fc1ea05..7cdecefd 100644
--- a/src/Propellor/Shim.hs
+++ b/src/Propellor/Shim.hs
@@ -8,7 +8,6 @@ module Propellor.Shim (setup, cleanEnv, file) where
import Propellor
import Utility.LinuxMkLibs
-import Utility.SafeCommand
import Utility.FileMode
import Utility.FileSystemEncoding
@@ -21,7 +20,7 @@ import System.Posix.Files
-- Propellor may be running from an existing shim, in which case it's
-- simply reused.
setup :: FilePath -> Maybe FilePath -> FilePath -> IO FilePath
-setup propellorbin propellorbinpath dest = checkAlreadyShimmed propellorbin $ do
+setup propellorbin propellorbinpath dest = checkAlreadyShimmed shim $ do
createDirectoryIfMissing True dest
libs <- parseLdd <$> readProcess "ldd" [propellorbin]
@@ -40,7 +39,6 @@ setup propellorbin propellorbinpath dest = checkAlreadyShimmed propellorbin $ do
fromMaybe (error "cannot find gconv directory") $
headMaybe $ filter ("/gconv/" `isInfixOf`) glibclibs
let linkerparams = ["--library-path", intercalate ":" libdirs ]
- let shim = file propellorbin dest
writeFile shim $ unlines
[ shebang
, "GCONV_PATH=" ++ shellEscape gconvdir
@@ -50,6 +48,8 @@ setup propellorbin propellorbinpath dest = checkAlreadyShimmed propellorbin $ do
]
modifyFileMode shim (addModes executeModes)
return shim
+ where
+ shim = file propellorbin dest
shebang :: String
shebang = "#!/bin/sh"
diff --git a/src/Propellor/Spin.hs b/src/Propellor/Spin.hs
index 986305d7..61d519c3 100644
--- a/src/Propellor/Spin.hs
+++ b/src/Propellor/Spin.hs
@@ -14,8 +14,7 @@ import System.Posix.Directory
import Control.Concurrent.Async
import qualified Data.ByteString as B
import qualified Data.Set as S
-import qualified Network.BSD as BSD
-import Network.Socket (inet_ntoa)
+import Network.Socket (getAddrInfo, defaultHints, AddrInfo(..), AddrInfoFlag(..), SockAddr)
import Propellor
import Propellor.Protocol
@@ -98,17 +97,21 @@ spin target relay hst = do
getSshTarget :: HostName -> Host -> IO String
getSshTarget target hst
| null configips = return target
- | otherwise = go =<< tryIO (BSD.getHostByName target)
+ | otherwise = go =<< tryIO (dnslookup target)
where
go (Left e) = useip (show e)
- go (Right hostentry) = ifM (anyM matchingconfig (BSD.hostAddresses hostentry))
- ( return target
- , do
- ips <- mapM inet_ntoa (BSD.hostAddresses hostentry)
- useip ("DNS " ++ show ips ++ " vs configured " ++ show configips)
- )
+ go (Right addrinfos) = do
+ configaddrinfos <- catMaybes <$> mapM iptoaddr configips
+ if any (`elem` configaddrinfos) (map addrAddress addrinfos)
+ then return target
+ else useip ("DNS lookup did not return any of the expected addresses " ++ show configips)
- matchingconfig a = flip elem configips <$> inet_ntoa a
+ dnslookup h = getAddrInfo (Just $ defaultHints { addrFlags = [AI_CANONNAME] }) (Just h) Nothing
+
+ -- Convert a string containing an IP address into a SockAddr.
+ iptoaddr :: String -> IO (Maybe SockAddr)
+ iptoaddr ip = catchDefaultIO Nothing $ headMaybe . map addrAddress
+ <$> getAddrInfo (Just $ defaultHints { addrFlags = [AI_NUMERICHOST] }) (Just ip) Nothing
useip why = case headMaybe configips of
Nothing -> return target
@@ -144,11 +147,15 @@ update forhost = do
hout <- dup stdOutput
hClose stdin
hClose stdout
+ -- Not using git pull because git 2.5.0 badly
+ -- broke its option parser.
unlessM (boolSystem "git" (pullparams hin hout)) $
- errorMessage "git pull from client failed"
+ errorMessage "git fetch from client failed"
+ unlessM (boolSystem "git" [Param "merge", Param "FETCH_HEAD"]) $
+ errorMessage "git merge from client failed"
where
pullparams hin hout =
- [ Param "pull"
+ [ Param "fetch"
, Param "--progress"
, Param "--upload-pack"
, Param $ "./propellor --gitpush " ++ show hin ++ " " ++ show hout
diff --git a/src/Propellor/Ssh.hs b/src/Propellor/Ssh.hs
index 97c3eb6d..3fe78f7a 100644
--- a/src/Propellor/Ssh.hs
+++ b/src/Propellor/Ssh.hs
@@ -1,7 +1,6 @@
module Propellor.Ssh where
import Propellor
-import Utility.SafeCommand
import Utility.UserInfo
import System.PosixCompat
@@ -23,7 +22,8 @@ sshCachingParams hn = do
let ps =
[ Param "-o"
, Param ("ControlPath=" ++ socketfile)
- , Params "-o ControlMaster=auto -o ControlPersist=yes"
+ , Param "-o", Param "ControlMaster=auto"
+ , Param "-o", Param "ControlPersist=yes"
]
maybe noop (expireold ps socketfile)
@@ -38,7 +38,7 @@ sshCachingParams hn = do
then touchFile f
else do
void $ boolSystem "ssh" $
- [ Params "-O stop" ] ++ ps ++
+ [ Param "-O", Param "stop" ] ++ ps ++
[ Param "localhost" ]
nukeFile f
tenminutes = 600
diff --git a/src/Propellor/Types/CmdLine.hs b/src/Propellor/Types/CmdLine.hs
index bd0cbdfd..96949957 100644
--- a/src/Propellor/Types/CmdLine.hs
+++ b/src/Propellor/Types/CmdLine.hs
@@ -10,6 +10,7 @@ data CmdLine
| Spin [HostName] (Maybe HostName)
| SimpleRun HostName
| Set PrivDataField Context
+ | Unset PrivDataField Context
| Dump PrivDataField Context
| Edit PrivDataField Context
| ListFields
diff --git a/src/Propellor/Types/Container.hs b/src/Propellor/Types/Container.hs
new file mode 100644
index 00000000..d21bada7
--- /dev/null
+++ b/src/Propellor/Types/Container.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE TypeFamilies #-}
+
+module Propellor.Types.Container where
+
+-- | A value that can be bound between the host and a container.
+--
+-- For example, a Bound Port is a Port on the container that is bound to
+-- a Port on the host.
+data Bound v = Bound
+ { hostSide :: v
+ , containerSide :: v
+ }
+
+-- | Create a Bound value, from two different values for the host and
+-- container.
+--
+-- For example, @Port 8080 -<- Port 80@ means that port 8080 on the host
+-- is bound to port 80 from the container.
+(-<-) :: (hostv ~ v, containerv ~ v) => hostv -> containerv -> Bound v
+(-<-) hostv containerv = Bound hostv containerv
+
+-- | Flipped version of -<- with the container value first and host value
+-- second.
+(->-) :: (containerv ~ v, hostv ~ v) => hostv -> containerv -> Bound v
+(->-) containerv hostv = Bound hostv containerv
+
+-- | Create a Bound value, that is the same on both the host and container.
+same :: v -> Bound v
+same v = Bound v v
+
diff --git a/src/Propellor/Types/OS.hs b/src/Propellor/Types/OS.hs
index 58bd809a..c46d9a28 100644
--- a/src/Propellor/Types/OS.hs
+++ b/src/Propellor/Types/OS.hs
@@ -10,6 +10,7 @@ module Propellor.Types.OS (
User(..),
Group(..),
userGroup,
+ Port(..),
) where
import Network.BSD (HostName)
@@ -42,3 +43,6 @@ newtype Group = Group String
-- | Makes a Group with the same name as the User.
userGroup :: User -> Group
userGroup (User u) = Group u
+
+newtype Port = Port Int
+ deriving (Eq, Show)
diff --git a/src/Utility/Data.hs b/src/Utility/Data.hs
index 5ecd218f..27c0a824 100644
--- a/src/Utility/Data.hs
+++ b/src/Utility/Data.hs
@@ -5,6 +5,8 @@
- License: BSD-2-clause
-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
module Utility.Data where
{- First item in the list that is not Nothing. -}
diff --git a/src/Utility/Directory.hs b/src/Utility/Directory.hs
index 2e037fdd..7322cd85 100644
--- a/src/Utility/Directory.hs
+++ b/src/Utility/Directory.hs
@@ -6,6 +6,7 @@
-}
{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Directory where
@@ -18,6 +19,7 @@ import Control.Applicative
import Control.Concurrent
import System.IO.Unsafe (unsafeInterleaveIO)
import Data.Maybe
+import Prelude
#ifdef mingw32_HOST_OS
import qualified System.Win32 as Win32
diff --git a/src/Utility/Env.hs b/src/Utility/Env.hs
index fdf06d80..c56f4ec2 100644
--- a/src/Utility/Env.hs
+++ b/src/Utility/Env.hs
@@ -6,6 +6,7 @@
-}
{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Env where
@@ -13,6 +14,7 @@ module Utility.Env where
import Utility.Exception
import Control.Applicative
import Data.Maybe
+import Prelude
import qualified System.Environment as E
import qualified System.SetEnv
#else
diff --git a/src/Utility/Exception.hs b/src/Utility/Exception.hs
index ab47ae95..9d4236c4 100644
--- a/src/Utility/Exception.hs
+++ b/src/Utility/Exception.hs
@@ -6,6 +6,7 @@
-}
{-# LANGUAGE ScopedTypeVariables #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Exception (
module X,
diff --git a/src/Utility/FileMode.hs b/src/Utility/FileMode.hs
index 201b8451..fdf1b56b 100644
--- a/src/Utility/FileMode.hs
+++ b/src/Utility/FileMode.hs
@@ -22,15 +22,12 @@ import Utility.Exception
{- Applies a conversion function to a file's mode. -}
modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO ()
-modifyFileMode f convert = void $ modifyFileMode' f convert
-modifyFileMode' :: FilePath -> (FileMode -> FileMode) -> IO FileMode
-modifyFileMode' f convert = do
+modifyFileMode f convert = do
s <- getFileStatus f
let old = fileMode s
let new = convert old
when (new /= old) $
setFileMode f new
- return old
{- Adds the specified FileModes to the input mode, leaving the rest
- unchanged. -}
@@ -41,14 +38,6 @@ addModes ms m = combineModes (m:ms)
removeModes :: [FileMode] -> FileMode -> FileMode
removeModes ms m = m `intersectFileModes` complement (combineModes ms)
-{- Runs an action after changing a file's mode, then restores the old mode. -}
-withModifiedFileMode :: FilePath -> (FileMode -> FileMode) -> IO a -> IO a
-withModifiedFileMode file convert a = bracket setup cleanup go
- where
- setup = modifyFileMode' file convert
- cleanup oldmode = modifyFileMode file (const oldmode)
- go _ = a
-
writeModes :: [FileMode]
writeModes = [ownerWriteMode, groupWriteMode, otherWriteMode]
diff --git a/src/Utility/FileSystemEncoding.hs b/src/Utility/FileSystemEncoding.hs
index 139b74fe..41c5972a 100644
--- a/src/Utility/FileSystemEncoding.hs
+++ b/src/Utility/FileSystemEncoding.hs
@@ -6,6 +6,7 @@
-}
{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.FileSystemEncoding (
fileEncoding,
diff --git a/src/Utility/LinuxMkLibs.hs b/src/Utility/LinuxMkLibs.hs
index db64d123..fdeb7795 100644
--- a/src/Utility/LinuxMkLibs.hs
+++ b/src/Utility/LinuxMkLibs.hs
@@ -7,7 +7,12 @@
module Utility.LinuxMkLibs where
-import Control.Applicative
+import Utility.PartialPrelude
+import Utility.Directory
+import Utility.Process
+import Utility.Monad
+import Utility.Path
+
import Data.Maybe
import System.Directory
import System.FilePath
@@ -15,12 +20,8 @@ import Data.List.Utils
import System.Posix.Files
import Data.Char
import Control.Monad.IfElse
-
-import Utility.PartialPrelude
-import Utility.Directory
-import Utility.Process
-import Utility.Monad
-import Utility.Path
+import Control.Applicative
+import Prelude
{- Installs a library. If the library is a symlink to another file,
- install the file it links to, and update the symlink to be relative. -}
diff --git a/src/Utility/Misc.hs b/src/Utility/Misc.hs
index e4eccac4..45d5a063 100644
--- a/src/Utility/Misc.hs
+++ b/src/Utility/Misc.hs
@@ -6,23 +6,25 @@
-}
{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Misc where
+import Utility.FileSystemEncoding
+import Utility.Monad
+
import System.IO
import Control.Monad
import Foreign
import Data.Char
import Data.List
-import Control.Applicative
import System.Exit
#ifndef mingw32_HOST_OS
import System.Posix.Process (getAnyProcessStatus)
import Utility.Exception
#endif
-
-import Utility.FileSystemEncoding
-import Utility.Monad
+import Control.Applicative
+import Prelude
{- A version of hgetContents that is not lazy. Ensures file is
- all read before it gets closed. -}
diff --git a/src/Utility/Monad.hs b/src/Utility/Monad.hs
index 878e0da6..ac751043 100644
--- a/src/Utility/Monad.hs
+++ b/src/Utility/Monad.hs
@@ -5,6 +5,8 @@
- License: BSD-2-clause
-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
module Utility.Monad where
import Data.Maybe
diff --git a/src/Utility/PartialPrelude.hs b/src/Utility/PartialPrelude.hs
index 6efa093f..55795563 100644
--- a/src/Utility/PartialPrelude.hs
+++ b/src/Utility/PartialPrelude.hs
@@ -5,6 +5,8 @@
- them being accidentially used.
-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
module Utility.PartialPrelude where
import qualified Data.Maybe
diff --git a/src/Utility/Path.hs b/src/Utility/Path.hs
index 9f0737fe..8e3c2bdd 100644
--- a/src/Utility/Path.hs
+++ b/src/Utility/Path.hs
@@ -6,6 +6,7 @@
-}
{-# LANGUAGE PackageImports, CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Path where
@@ -16,6 +17,7 @@ import Data.List
import Data.Maybe
import Data.Char
import Control.Applicative
+import Prelude
#ifdef mingw32_HOST_OS
import qualified System.FilePath.Posix as Posix
diff --git a/src/Utility/PosixFiles.hs b/src/Utility/PosixFiles.hs
index 5a94ead0..4550bebd 100644
--- a/src/Utility/PosixFiles.hs
+++ b/src/Utility/PosixFiles.hs
@@ -8,6 +8,7 @@
-}
{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.PosixFiles (
module X,
diff --git a/src/Utility/Process.hs b/src/Utility/Process.hs
index cbbe8a81..469f7659 100644
--- a/src/Utility/Process.hs
+++ b/src/Utility/Process.hs
@@ -1,12 +1,13 @@
{- System.Process enhancements, including additional ways of running
- processes, and logging.
-
- - Copyright 2012 Joey Hess <id@joeyh.name>
+ - Copyright 2012-2015 Joey Hess <id@joeyh.name>
-
- License: BSD-2-clause
-}
{-# LANGUAGE CPP, Rank2Types #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Process (
module X,
@@ -54,6 +55,7 @@ import qualified System.Posix.IO
import Control.Applicative
#endif
import Data.Maybe
+import Prelude
import Utility.Misc
import Utility.Exception
@@ -63,8 +65,8 @@ type CreateProcessRunner = forall a. CreateProcess -> ((Maybe Handle, Maybe Hand
data StdHandle = StdinHandle | StdoutHandle | StderrHandle
deriving (Eq)
-{- Normally, when reading from a process, it does not need to be fed any
- - standard input. -}
+-- | Normally, when reading from a process, it does not need to be fed any
+-- standard input.
readProcess :: FilePath -> [String] -> IO String
readProcess cmd args = readProcessEnv cmd args Nothing
@@ -82,9 +84,8 @@ readProcess' p = withHandle StdoutHandle createProcessSuccess p $ \h -> do
hClose h
return output
-{- Runs an action to write to a process on its stdin,
- - returns its output, and also allows specifying the environment.
- -}
+-- | Runs an action to write to a process on its stdin,
+-- returns its output, and also allows specifying the environment.
writeReadProcessEnv
:: FilePath
-> [String]
@@ -124,8 +125,8 @@ writeReadProcessEnv cmd args environ writestdin adjusthandle = do
, env = environ
}
-{- Waits for a ProcessHandle, and throws an IOError if the process
- - did not exit successfully. -}
+-- | Waits for a ProcessHandle, and throws an IOError if the process
+-- did not exit successfully.
forceSuccessProcess :: CreateProcess -> ProcessHandle -> IO ()
forceSuccessProcess p pid = do
code <- waitForProcess pid
@@ -133,10 +134,10 @@ forceSuccessProcess p pid = do
ExitSuccess -> return ()
ExitFailure n -> fail $ showCmd p ++ " exited " ++ show n
-{- Waits for a ProcessHandle and returns True if it exited successfully.
- - Note that using this with createProcessChecked will throw away
- - the Bool, and is only useful to ignore the exit code of a process,
- - while still waiting for it. -}
+-- | Waits for a ProcessHandle and returns True if it exited successfully.
+-- Note that using this with createProcessChecked will throw away
+-- the Bool, and is only useful to ignore the exit code of a process,
+-- while still waiting for it. -}
checkSuccessProcess :: ProcessHandle -> IO Bool
checkSuccessProcess pid = do
code <- waitForProcess pid
@@ -147,13 +148,13 @@ ignoreFailureProcess pid = do
void $ waitForProcess pid
return True
-{- Runs createProcess, then an action on its handles, and then
- - forceSuccessProcess. -}
+-- | Runs createProcess, then an action on its handles, and then
+-- forceSuccessProcess.
createProcessSuccess :: CreateProcessRunner
createProcessSuccess p a = createProcessChecked (forceSuccessProcess p) p a
-{- Runs createProcess, then an action on its handles, and then
- - a checker action on its exit code, which must wait for the process. -}
+-- | Runs createProcess, then an action on its handles, and then
+-- a checker action on its exit code, which must wait for the process.
createProcessChecked :: (ProcessHandle -> IO b) -> CreateProcessRunner
createProcessChecked checker p a = do
t@(_, _, _, pid) <- createProcess p
@@ -161,14 +162,14 @@ createProcessChecked checker p a = do
_ <- checker pid
either E.throw return r
-{- Leaves the process running, suitable for lazy streaming.
- - Note: Zombies will result, and must be waited on. -}
+-- | Leaves the process running, suitable for lazy streaming.
+-- Note: Zombies will result, and must be waited on.
createBackgroundProcess :: CreateProcessRunner
createBackgroundProcess p a = a =<< createProcess p
-{- Runs a process, optionally feeding it some input, and
- - returns a transcript combining its stdout and stderr, and
- - whether it succeeded or failed. -}
+-- | Runs a process, optionally feeding it some input, and
+-- returns a transcript combining its stdout and stderr, and
+-- whether it succeeded or failed.
processTranscript :: String -> [String] -> (Maybe String) -> IO (String, Bool)
processTranscript cmd opts input = processTranscript' cmd opts Nothing input
@@ -232,9 +233,9 @@ processTranscript' cmd opts environ input = do
hClose inh
writeinput Nothing _ = return ()
-{- Runs a CreateProcessRunner, on a CreateProcess structure, that
- - is adjusted to pipe only from/to a single StdHandle, and passes
- - the resulting Handle to an action. -}
+-- | Runs a CreateProcessRunner, on a CreateProcess structure, that
+-- is adjusted to pipe only from/to a single StdHandle, and passes
+-- the resulting Handle to an action.
withHandle
:: StdHandle
-> CreateProcessRunner
@@ -256,7 +257,7 @@ withHandle h creator p a = creator p' $ a . select
| h == StderrHandle =
(stderrHandle, base { std_err = CreatePipe })
-{- Like withHandle, but passes (stdin, stdout) handles to the action. -}
+-- | Like withHandle, but passes (stdin, stdout) handles to the action.
withIOHandles
:: CreateProcessRunner
-> CreateProcess
@@ -270,7 +271,7 @@ withIOHandles creator p a = creator p' $ a . ioHandles
, std_err = Inherit
}
-{- Like withHandle, but passes (stdout, stderr) handles to the action. -}
+-- | Like withHandle, but passes (stdout, stderr) handles to the action.
withOEHandles
:: CreateProcessRunner
-> CreateProcess
@@ -284,8 +285,8 @@ withOEHandles creator p a = creator p' $ a . oeHandles
, std_err = CreatePipe
}
-{- Forces the CreateProcessRunner to run quietly;
- - both stdout and stderr are discarded. -}
+-- | Forces the CreateProcessRunner to run quietly;
+-- both stdout and stderr are discarded.
withQuietOutput
:: CreateProcessRunner
-> CreateProcess
@@ -297,8 +298,8 @@ withQuietOutput creator p = withFile devNull WriteMode $ \nullh -> do
}
creator p' $ const $ return ()
-{- Stdout and stderr are discarded, while the process is fed stdin
- - from the handle. -}
+-- | Stdout and stderr are discarded, while the process is fed stdin
+-- from the handle.
feedWithQuietOutput
:: CreateProcessRunner
-> CreateProcess
@@ -319,11 +320,11 @@ devNull = "/dev/null"
devNull = "NUL"
#endif
-{- Extract a desired handle from createProcess's tuple.
- - These partial functions are safe as long as createProcess is run
- - with appropriate parameters to set up the desired handle.
- - Get it wrong and the runtime crash will always happen, so should be
- - easily noticed. -}
+-- | Extract a desired handle from createProcess's tuple.
+-- These partial functions are safe as long as createProcess is run
+-- with appropriate parameters to set up the desired handle.
+-- Get it wrong and the runtime crash will always happen, so should be
+-- easily noticed.
type HandleExtractor = (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> Handle
stdinHandle :: HandleExtractor
stdinHandle (Just h, _, _, _) = h
@@ -344,7 +345,7 @@ oeHandles _ = error "expected oeHandles"
processHandle :: (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> ProcessHandle
processHandle (_, _, _, pid) = pid
-{- Debugging trace for a CreateProcess. -}
+-- | Debugging trace for a CreateProcess.
debugProcess :: CreateProcess -> IO ()
debugProcess p = do
debugM "Utility.Process" $ unwords
@@ -360,15 +361,15 @@ debugProcess p = do
piped Inherit = False
piped _ = True
-{- Shows the command that a CreateProcess will run. -}
+-- | Shows the command that a CreateProcess will run.
showCmd :: CreateProcess -> String
showCmd = go . cmdspec
where
go (ShellCommand s) = s
go (RawCommand c ps) = c ++ " " ++ show ps
-{- Starts an interactive process. Unlike runInteractiveProcess in
- - System.Process, stderr is inherited. -}
+-- | Starts an interactive process. Unlike runInteractiveProcess in
+-- System.Process, stderr is inherited.
startInteractiveProcess
:: FilePath
-> [String]
@@ -384,7 +385,8 @@ startInteractiveProcess cmd args environ = do
(Just from, Just to, _, pid) <- createProcess p
return (pid, to, from)
-{- Wrapper around System.Process function that does debug logging. -}
+-- | Wrapper around 'System.Process.createProcess' from System.Process,
+-- that does debug logging.
createProcess :: CreateProcess -> IO (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle)
createProcess p = do
debugProcess p
diff --git a/src/Utility/QuickCheck.hs b/src/Utility/QuickCheck.hs
index 54200d3f..cd408ddc 100644
--- a/src/Utility/QuickCheck.hs
+++ b/src/Utility/QuickCheck.hs
@@ -19,6 +19,7 @@ import System.Posix.Types
import qualified Data.Map as M
import qualified Data.Set as S
import Control.Applicative
+import Prelude
instance (Arbitrary k, Arbitrary v, Eq k, Ord k) => Arbitrary (M.Map k v) where
arbitrary = M.fromList <$> arbitrary
diff --git a/src/Utility/SafeCommand.hs b/src/Utility/SafeCommand.hs
index 9eaa5308..9102b726 100644
--- a/src/Utility/SafeCommand.hs
+++ b/src/Utility/SafeCommand.hs
@@ -5,44 +5,45 @@
- License: BSD-2-clause
-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
module Utility.SafeCommand where
import System.Exit
import Utility.Process
import Data.String.Utils
-import Control.Applicative
import System.FilePath
import Data.Char
+import Control.Applicative
+import Prelude
-{- A type for parameters passed to a shell command. A command can
- - be passed either some Params (multiple parameters can be included,
- - whitespace-separated, or a single Param (for when parameters contain
- - whitespace), or a File.
- -}
-data CommandParam = Params String | Param String | File FilePath
+-- | Parameters that can be passed to a shell command.
+data CommandParam
+ = Param String -- ^ A parameter
+ | File FilePath -- ^ The name of a file
deriving (Eq, Show, Ord)
-{- Used to pass a list of CommandParams to a function that runs
- - a command and expects Strings. -}
+-- | Used to pass a list of CommandParams to a function that runs
+-- a command and expects Strings. -}
toCommand :: [CommandParam] -> [String]
-toCommand = concatMap unwrap
+toCommand = map unwrap
where
- unwrap (Param s) = [s]
- unwrap (Params s) = filter (not . null) (split " " s)
+ unwrap (Param s) = s
-- Files that start with a non-alphanumeric that is not a path
-- separator are modified to avoid the command interpreting them as
-- options or other special constructs.
unwrap (File s@(h:_))
- | isAlphaNum h || h `elem` pathseps = [s]
- | otherwise = ["./" ++ s]
- unwrap (File s) = [s]
+ | isAlphaNum h || h `elem` pathseps = s
+ | otherwise = "./" ++ s
+ unwrap (File s) = s
-- '/' is explicitly included because it's an alternative
-- path separator on Windows.
pathseps = pathSeparator:"./"
-{- Run a system command, and returns True or False
- - if it succeeded or failed.
- -}
+-- | Run a system command, and returns True or False if it succeeded or failed.
+--
+-- This and other command running functions in this module log the commands
+-- run at debug level, using System.Log.Logger.
boolSystem :: FilePath -> [CommandParam] -> IO Bool
boolSystem command params = boolSystem' command params id
@@ -56,7 +57,7 @@ boolSystemEnv :: FilePath -> [CommandParam] -> Maybe [(String, String)] -> IO Bo
boolSystemEnv command params environ = boolSystem' command params $
\p -> p { env = environ }
-{- Runs a system command, returning the exit status. -}
+-- | Runs a system command, returning the exit status.
safeSystem :: FilePath -> [CommandParam] -> IO ExitCode
safeSystem command params = safeSystem' command params id
@@ -71,23 +72,22 @@ safeSystemEnv :: FilePath -> [CommandParam] -> Maybe [(String, String)] -> IO Ex
safeSystemEnv command params environ = safeSystem' command params $
\p -> p { env = environ }
-{- Wraps a shell command line inside sh -c, allowing it to be run in a
- - login shell that may not support POSIX shell, eg csh. -}
+-- | Wraps a shell command line inside sh -c, allowing it to be run in a
+-- login shell that may not support POSIX shell, eg csh.
shellWrap :: String -> String
shellWrap cmdline = "sh -c " ++ shellEscape cmdline
-{- Escapes a filename or other parameter to be safely able to be exposed to
- - the shell.
- -
- - This method works for POSIX shells, as well as other shells like csh.
- -}
+-- | Escapes a filename or other parameter to be safely able to be exposed to
+-- the shell.
+--
+-- This method works for POSIX shells, as well as other shells like csh.
shellEscape :: String -> String
shellEscape f = "'" ++ escaped ++ "'"
where
-- replace ' with '"'"'
escaped = join "'\"'\"'" $ split "'" f
-{- Unescapes a set of shellEscaped words or filenames. -}
+-- | Unescapes a set of shellEscaped words or filenames.
shellUnEscape :: String -> [String]
shellUnEscape [] = []
shellUnEscape s = word : shellUnEscape rest
@@ -104,19 +104,19 @@ shellUnEscape s = word : shellUnEscape rest
| c == q = findword w cs
| otherwise = inquote q (w++[c]) cs
-{- For quickcheck. -}
+-- | For quickcheck.
prop_idempotent_shellEscape :: String -> Bool
prop_idempotent_shellEscape s = [s] == (shellUnEscape . shellEscape) s
prop_idempotent_shellEscape_multiword :: [String] -> Bool
prop_idempotent_shellEscape_multiword s = s == (shellUnEscape . unwords . map shellEscape) s
-{- Segments a list of filenames into groups that are all below the maximum
- - command-line length limit. -}
+-- | Segments a list of filenames into groups that are all below the maximum
+-- command-line length limit.
segmentXargsOrdered :: [FilePath] -> [[FilePath]]
segmentXargsOrdered = reverse . map reverse . segmentXargsUnordered
-{- Not preserving data is a little faster, and streams better when
- - there are a great many filesnames. -}
+-- | Not preserving order is a little faster, and streams better when
+-- there are a great many filenames.
segmentXargsUnordered :: [FilePath] -> [[FilePath]]
segmentXargsUnordered l = go l [] 0 []
where
diff --git a/src/Utility/Scheduled.hs b/src/Utility/Scheduled.hs
index e077a1fe..b3813323 100644
--- a/src/Utility/Scheduled.hs
+++ b/src/Utility/Scheduled.hs
@@ -32,7 +32,6 @@ import Utility.QuickCheck
import Utility.PartialPrelude
import Utility.Misc
-import Control.Applicative
import Data.List
import Data.Time.Clock
import Data.Time.LocalTime
@@ -41,6 +40,8 @@ import Data.Time.Calendar.WeekDate
import Data.Time.Calendar.OrdinalDate
import Data.Tuple.Utils
import Data.Char
+import Control.Applicative
+import Prelude
{- Some sort of scheduled event. -}
data Schedule = Schedule Recurrance ScheduledTime
diff --git a/src/Utility/Tmp.hs b/src/Utility/Tmp.hs
index dc559813..de970fe5 100644
--- a/src/Utility/Tmp.hs
+++ b/src/Utility/Tmp.hs
@@ -6,6 +6,7 @@
-}
{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.Tmp where
diff --git a/src/Utility/UserInfo.hs b/src/Utility/UserInfo.hs
index 5bf8d5c0..7e94cafa 100644
--- a/src/Utility/UserInfo.hs
+++ b/src/Utility/UserInfo.hs
@@ -6,6 +6,7 @@
-}
{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
module Utility.UserInfo (
myHomeDir,
@@ -13,12 +14,13 @@ module Utility.UserInfo (
myUserGecos,
) where
+import Utility.Env
+
import System.PosixCompat
#ifndef mingw32_HOST_OS
import Control.Applicative
#endif
-
-import Utility.Env
+import Prelude
{- Current user's home directory.
-