From ff3e83c737ee2be160d7df1b7f6af40ad7b9b6bc Mon Sep 17 00:00:00 2001 From: Justin Hiemstra Date: Fri, 20 Dec 2024 22:56:24 +0000 Subject: [PATCH] Backup of docs overhaul --- docs/pages/_meta.json | 2 +- docs/pages/core-concepts.mdx | 169 ++++++-- docs/pages/federating-your-data.mdx | 383 ++---------------- docs/pages/federating-your-data/_meta.json | 2 + .../choosing-namespaces.mdx | 132 ++++++ docs/pages/federating-your-data/origin.mdx | 349 ++++++++++++++++ docs/pages/getting-data-with-pelican.mdx | 31 ++ .../getting-data-with-pelican/_meta.json | 3 +- .../getting-data-with-pelican/client.mdx | 2 +- .../getting-data-with-pelican/fsspec.mdx | 25 ++ docs/pages/getting-started.mdx | 39 ++ docs/pages/getting-started/accessing-data.mdx | 2 +- docs/public/aggregated-objects.png | Bin 0 -> 149680 bytes 13 files changed, 749 insertions(+), 390 deletions(-) create mode 100644 docs/pages/federating-your-data/choosing-namespaces.mdx create mode 100644 docs/pages/federating-your-data/origin.mdx create mode 100644 docs/pages/getting-data-with-pelican.mdx create mode 100644 docs/pages/getting-data-with-pelican/fsspec.mdx create mode 100644 docs/pages/getting-started.mdx create mode 100644 docs/public/aggregated-objects.png diff --git a/docs/pages/_meta.json b/docs/pages/_meta.json index 98b35a7a7..1f281050b 100644 --- a/docs/pages/_meta.json +++ b/docs/pages/_meta.json @@ -1,6 +1,6 @@ { "index": "About Pelican", - "core-concepts": "Core Concepts", + "core-concepts": "Core Concepts & Terminology", "install": "Installing Pelican", "parameters": "Configuration", "getting-started": "Getting Started", diff --git a/docs/pages/core-concepts.mdx b/docs/pages/core-concepts.mdx index 374be5295..534c500b2 100644 --- a/docs/pages/core-concepts.mdx +++ b/docs/pages/core-concepts.mdx @@ -2,46 +2,99 @@ import ImageRow from "@/components/ImageRow"; # Core Concepts and Terminology -Pelican is a tool for building ***data federations***, a model in which decentralized, autonomous data repositories work together to make their data broadly available to other members of the federation under a minimally-centralized structure. In this model, data is accessed through a unified namespace regardless of where the data comes from or what type of storage is used to host it -- to a user, everything feels like it's coming from the same source. +Pelican is a tool for building ***data federations***, a model in which decentralized, autonomous data repositories work together to make their data broadly available to +other members of the federation under a minimally-centralized structure. In this model, data is accessed through a unified namespace regardless of where the data comes +from or what type of storage is used to host it -- to a user, everything feels like it's coming from the same source. ## Terminology ### Objects -Pelican should be thought of as a tool that works with federated *objects* as opposed to *files*. The reason for this is that calling something a file carries with it the connotation of a filesystem. File systems have extra features such as owners, permissions, etc., which Pelican does not implement. In addition, a *file* gives the connotation that the file is mutable, i.e., its contents can change without requiring a new name. Objects in a Pelican federation, however, should be treated as **immutable**, especially in any case where objects are pulled through a cache (which will be the case for almost all files in the [Open Science Data Federation](https://osg-htc.org/services/osdf), or OSDF). This is because the underlying cache mechanism, powered by [XRootD](https://xrootd.slac.stanford.edu/), will deliver whatever object it already has access to; if an object's contents change at the origin, the cache will remain unaware and continue to deliver the old object. In the worst case, when the cache only has a partial object, it may attempt to combine its stale version with whatever exists at the origin. Use object names wisely! +Pelican should be thought of as a tool that works with federated *objects* as opposed to *files*. The reason for this is that calling something a file carries with it the +connotation of a filesystem. File systems have extra features such as owners, permissions, etc., which Pelican does not implement. In addition, a *file* gives the connotation +that the file is mutable, i.e., its contents can change without requiring a new name. Objects in a Pelican federation, however, should be treated as **immutable**, especially +in any case where objects are pulled through a cache (which will be the case for almost all files in the [Open Science Data Federation](https://osg-htc.org/services/osdf), +or OSDF). This is because the underlying cache mechanism, powered by [XRootD](https://xrootd.slac.stanford.edu/), will deliver whatever object it already has access to; if +an object's contents change at the origin, the cache will remain unaware and continue to deliver the old object. In the worst case, when the cache only has a partial object, +it may attempt to combine its stale version with whatever exists at the origin. Use object names wisely! -### Namespace Prefixes -Each origin supports one or more *namespace prefixes*, which are analogous to the folders or directories from your computer that you use to organize files. Below is an example object: +### Federations +Objects in Pelican belong to *federations*, which are aggregations of data that are exposed to other individuals in the federation. Each Pelican +federation constitutes its own global namespace of objects and each object within a federation has its own path, much like files on a computer. +Fetching any object from a federation requires at minimum two pieces of information: the federation's root (i.e. the discovery URL), and the path +to the object within that federation (there is the potential that some objects require access tokens as well, but more on that later). For example, +the OSDF’s federation hostname is `osg-htc.org`, an example path to an object in the federation is: -```bash -/demo/testfile.txt +```bash copy +/ospool/uc-shared/public/OSG-Staff/validation/test.txt ``` -This is a simple example where the namespace prefix would be `/demo` and the object is named `/testfile.txt`. - -However, things can get a little tricky when you add a longer namespace prefix and/or a longer filepath within that namespace where the object lives. For example: +Combining these two pieces of information, we say the the **object's URL** is: ```bash copy -/ospool/uc-shared/public/OSG-Staff/validation/test.txt +pelican://osg-htc.org/ospool/uc-shared/public/OSG-Staff/validation/test.txt ``` -In this example, the namespace prefix is `/ospool/uc-shared/public/`, and the actual object is named `/OSG-Staff/validation/test.txt`. - -#### Differentiating Namespace Prefixes and Object Names -To discover where the namespace prefix ends and the object name begins, there are a few options. One way is to access your federation's registry (i.e. [https://osdf-registry.osg-htc.org/view/registry/](https://osdf-registry.osg-htc.org/view/registry/)) which should list the namespaces available in the federation. Another option is also asking your federation administrator for how to access the registry. However, you can always think to just combine these two terms into just the "object's path" or the "path to the object within the federation". +### Namespace or Federation Prefixes +Each origin supports one or more *namespace prefixes*, which are analogous to the folders or directories from your computer that you use to organize files. The terms +"namespace prefix" and "federation prefix" may be used interchangeably throughout this documentation. -### Federations -Objects in Pelican belong to *federations*, which are aggregations of data that are exposed to other individuals in the federation. Each Pelican federation constitutes its own global namespace of objects and each object within a federation has its own path, much like files on a computer. Fetching any object from a federation requires at minimum two pieces of information: the federation's root (i.e. the discovery URL), and the path to the object within that federation (there is the potential that some objects require access tokens as well, but more on that later). For example, the OSDF’s federation hostname is `osg-htc.org`, an example path to an object in the federation is: +Below is an example of a full Pelican object name: -```bash copy -/ospool/uc-shared/public/OSG-Staff/validation/test.txt +```bash +pelican://osg-htc.org/demo/testfile.txt ``` -Combining these two pieces of information, we say the the **object's URL** is: +In this example, the full object name encodes the federation (osg-htc.org), and some path within that federation -- `/demo/testfile.txt`. When new Pelican object +servers are added to a federation (called Origins), they act on behalf of some subpath within the federation, called a namespace or federation prefix. In the above +example, the origin providing access to the object likely acts on behalf of `/demo` namespace. +These namespace prefixes are a way for data owners to carve out sections of a federation in a way that ties namespace ownership/management to a public-private keypair. +In this way, the group that owns the `/demo` namespace can make decisions on its behalf, including the creation of further sub namespaces and the ability to make decisions +about the read/write permissions of the namespace's underlying objects. Using the "directory permissions" analogy, the owner of the `/demo` directory gets complete control +over what happens in the directory, including the ability to delegate the creation of further subdirectories to other users who have access to `/demo`. + +Starting with a full Pelican URL object name can make it tricky to determine where the actual namespace prefix ends and the underlying object name (as understood by the +Origin's configured data repository) begins. For example, this test object has a deeply-nested path: ```bash copy pelican://osg-htc.org/ospool/uc-shared/public/OSG-Staff/validation/test.txt ``` +In this example, the namespace prefix happens to be `/ospool/uc-shared/public/`, and this is hosted by a posix origin that exports a directory tree containing +`/OSG-Staff/validation/test.txt`. + +In most cases, users don't need to know the namespace/object name split for the objects they'd like to interact with -- knowing the full pelican URL is generally sufficient. +However, understanding this becomes more important for those who want to federate their own data by hosting an Origin, or for some types of troubleshooting. Pelican provides +several tools for determining which portion of the path constitutes the namespace prefix. + +#### Differentiating Namespace Prefixes and Object Names +One way to determine the namespace prefix associated with an object is to access your federation's registry (e.g. [https://osdf-registry.osg-htc.org/view/registry/](https://osdf-registry.osg-htc.org/view/registry/)) +which should list all prefixes registered in the federation. Using the search bar, you can start typing the path component of your object's name, and matching prefixes will +be filtered for you. + +Another way to get this information is by interacting with the federation Directly using an HTTP client like curl. The following command is an example of a valid request to and +response from the OSDF Director for the `pelican://osg-htc.org/ospool/uc-shared/public/OSG-Staff/validation/test.txt` object: +```bash +$ curl -v https://osdf-director.osg-htc.org/ospool/uc-shared/public/OSG-Staff/validation/test.txt +> GET /ospool/uc-shared/public/OSG-Staff/validation/test.txt HTTP/2 +> Host: osdf-director.osg-htc.org +> user-agent: curl/7.76.1 +> accept: */* +> +< HTTP/2 307 +< content-type: text/html; charset=utf-8 +< date: Thu, 19 Dec 2024 21:12:35 GMT +< link: ; rel="duplicate"; pri=1; depth=3 +< location: https://osdf-uw-cache.svc.osg-htc.org:8443/ospool/uc-shared/public/OSG-Staff/validation/test.txt +< x-pelican-authorization: issuer=https://osg-htc.org/ospool +< x-pelican-namespace: namespace=/ospool/uc-shared/public, require-token=false, collections-url=https://pelican-osdf-public.tempest.uchicago.edu:8443 +< x-pelican-token-generation: issuer=https://osg-htc.org/ospool, max-scope-depth=3, strategy=OAuth2, base-path=/ospool/uc-shared/public +< content-length: 132 +< +Temporary Redirect. +``` + +Note that the `X-Pelican-Namespace` header has a "namespace" attribute explaining which portion of the path is the registered namespace. + ## Core Entities Pelican federations consist of 6 core entities: @@ -53,36 +106,52 @@ Pelican federations consist of 6 core entities: - [Cache Servers](#caches) - Central Services (the [Director](#director-service) and [Registry](#registry-service)) -where each of these federation stakeholders represents a unique set of interests. One of Pelican's core functionalities is balancing the sometimes-competing needs of each of its constituents. +where each of these federation stakeholders represents a unique set of interests. One of Pelican's core functionalities is balancing the sometimes-competing +needs of each of its constituents. A description for each of these entities is provided below. ### Clients -Pelican views itself as serving two types of users; data providers and data consumers. *Pelican Clients* are the tools built around Pelican that support consumers, enabling them to download data via a federation. Pelican currently has three Clients, and more are under development. Existing Clients include the [Pelican CLI tool](install.mdx), the [Pelican FSSpec](https://github.com/pelicanplatform/pelicanfs) for Python, and a file transfer plugin for [HTCondor](https://htcondor.readthedocs.io/en/latest/users-manual/file-transfer.html#file-transfer-using-a-url). +Pelican views itself as serving two types of users; data providers and data consumers. *Pelican Clients* are the tools built around Pelican that support consumers, +enabling them to download data via a federation. Pelican currently has three Clients, and more are under development. Existing Clients include the +[Pelican CLI tool](install.mdx), the [Pelican FSSpec](https://github.com/pelicanplatform/pelicanfs) for Python, and a file transfer plugin for +[HTCondor](https://htcondor.readthedocs.io/en/latest/users-manual/file-transfer.html#file-transfer-using-a-url). -Pelican Clients are designed to work with `pelican://`-style URLs, which defines a metadata lookup protocol on top of HTTP. For more information on this URL specification, see Pelican's [client usage documentation](./getting-data-with-pelican/client.mdx). +Pelican Clients are designed to work with `pelican://`-style URLs, which defines a metadata lookup protocol on top of HTTP. For more information on this URL +specification, see Pelican's [client usage documentation](./getting-data-with-pelican/client.mdx). Lastly, because Pelican builds on top of HTTP, most HTTP clients (e.g. curl) can be modified to interact with Pelican federations. ### Data Repository -Data can live in any number of places, from a hard drive with an associated POSIX filesystem, to buckets in S3. Pelican defines a *Data Repository* as any instance of a storage backend. +Data can live in any number of places, from a hard drive with an associated POSIX filesystem, to buckets in S3. Pelican defines a *Data Repository* as any instance +of a storage backend. Data Repositories often have their own policies that are unique from federation policies, including things like authentication/access control and rate limiting. -Pelican's primary goal with respect to Data Repositories is to make the data they hold accessible to clients within a federation, without requiring that users know what type of repository the data comes from or how it works. +Pelican's primary goal with respect to Data Repositories is to make the data they hold accessible to clients within a federation, without requiring that users know +what type of repository the data comes from or how it works. ### Origins To make data from a Repository available through a Pelican federation, the data provider must serve an *Origin* in front of the Repository. -Origins are a crucial component of Pelican's architecture for two reasons: they act as an adapter between various storage backends and Pelican federations, and they provide fine-grained access controls for that data. That is, they figure out how to take data from wherever it lives and transform it into a format that the clients from the federation can utilize while respecting the Repository's data access requirements. This implies an inherent trust relationship between Origins and Data Repositories, as the Origin is responsible for enforcing the Repository's needs and wishes within the rest of the federation. However, while the Origin is responsible for translating the Repository's data access policies into something the federation can understand, Pelican is designed so that Origins never need to share secrets with their federation. +Origins are a crucial component of Pelican's architecture for two reasons: they act as an adapter between various storage backends and Pelican federations, and they +provide fine-grained access controls for that data. That is, they figure out how to take data from wherever it lives and transform it into a format that the clients +from the federation can utilize while respecting the Repository's data access requirements. This implies an inherent trust relationship between Origins and Data +Repositories, as the Origin is responsible for enforcing the Repository's needs and wishes within the rest of the federation. However, while the Origin is responsible +for translating the Repository's data access policies into something the federation can understand, Pelican is designed so that Origins never need to share secrets with +their federation. -Pelican Origins work by making their underlying Repository accessible under some namespace path via HTTPs, which is accomplished by building on top of [XRootD](https://xrootd.slac.stanford.edu/). The namespace path, also called the *federation prefix*, is the path at which data from the Origin can be accessed in the federation. For example, an Origin that exports the namespace path `/foo` might provide access to an object `bar` in the underlying Data Repository. The full path for this object in the federation would be `/foo/bar`. +Pelican Origins work by making their underlying Repository accessible under some namespace path via HTTPs, which is accomplished by building on top of +[XRootD](https://xrootd.slac.stanford.edu/). The namespace path, also called the *federation prefix*, is the path at which data from the Origin can be accessed in the +federation. For example, an Origin that exports the namespace path `/foo` might provide access to an object `bar` in the underlying Data Repository. The full path for this +object in the federation would be `/foo/bar`. -> **NOTE**: An important distinction between Origins and Data Repositories is that, generally speaking, Origins do **NOT** store any data themselves; their primary function is to facilitate data access *from* the Repository, which may not coincide on the same machine. +> **NOTE**: An important distinction between Origins and Data Repositories is that, generally speaking, Origins do **NOT** store any data themselves; their primary function +is to facilitate data access *from* the Repository, which may not coincide on the same machine. Pelican Origins serve as a transport bus, connecting a variety of backend storage types to their federation @@ -90,28 +159,54 @@ Pelican Origins work by making their underlying Repository accessible under some ### Caches -Pelican *Caches* are responsible for storing copies of data inside the federation with the goal of providing more efficient access to reusable data. By default, requests to a Pelican federation for an object are proxied through a Cache, resulting in the federation storing a temporary copy of the object. Currently, objects are cleared from Caches based on a "least recently used" algorithm whenever the server begins running out of storage space, but more robust forms of cache management are in active development. Like Origins, Caches build on top of [XRootD's "Proxy Storage Services."](https://xrootd.slac.stanford.edu/doc/dev56/pss_config.pdf) +Pelican *Caches* are responsible for storing copies of data inside the federation with the goal of providing more efficient access to reusable data. By default, requests to +a Pelican federation for an object are proxied through a Cache, resulting in the federation storing a temporary copy of the object. Currently, objects are cleared from Caches +based on a "least recently used" algorithm whenever the server begins running out of storage space, but more robust forms of cache management are in active development. Like +Origins, Caches build on top of [XRootD's "Proxy Storage Services."](https://xrootd.slac.stanford.edu/doc/dev56/pss_config.pdf) -Because Caches store copies of data for re-distribution in the federation, they must also respect the Origin's data access policies. That is, the Origin should trust Caches to protect any data that isn't marked as publicly accessible. Caches in a Pelican federation accomplish this by aggregating access policies from the Origins they support and following the same approval/denial rules the Origins themselves would follow. +Because Caches store copies of data for re-distribution in the federation, they must also respect the Origin's data access policies. That is, the Origin should trust Caches +to protect any data that isn't marked as publicly accessible. Caches in a Pelican federation accomplish this by aggregating access policies from the Origins they support and +following the same approval/denial rules the Origins themselves would follow. -Generally, Caches are operated by the federation and placed close to computing clusters where data may be quickly re-used as part of High-Throughput Computing workflows, but this is not a requirement. +Generally, Caches are operated by the federation and placed close to computing clusters where data may be quickly re-used as part of High-Throughput Computing workflows, but +this is not a requirement. ### Central Services -It was mentioned that data federations operate under a minimally-centralized structure. In Pelican, this structure is made up of the *Central Services*, namely the *Director* and the *Registry*. +It was mentioned that data federations operate under a minimally-centralized structure. In Pelican, this structure is made up of the *Central Services*, namely the *Director* +and the *Registry*. -> **NOTE**: Pelican's Central Services are responsible for connecting Data Repositories and data consumers, but a core part of Pelican's architecture is that objects never pass through the Central Services. In fact, the federation’s Central Services are unable to access any authorization-protected objects via Origins unless the Origin mints a token granting that permission. In this way, Origins that don’t allow their data to be staged/cached in the federation need not trust the federation operators, because each Origin acts as its own token issuer and is solely responsible for deciding which requests to respect. This architecture also prevents the creation of centralized bottlenecks as a federation grows. +> **NOTE**: Pelican's Central Services are responsible for connecting Data Repositories and data consumers, but a core part of Pelican's architecture is that objects never pass +through the Central Services. In fact, the federation’s Central Services are unable to access any authorization-protected objects via Origins unless the Origin mints a token +granting that permission. In this way, Origins that don’t allow their data to be staged/cached in the federation need not trust the federation operators, because each Origin +acts as its own token issuer and is solely responsible for deciding which requests to respect. This architecture also prevents the creation of centralized bottlenecks as a +federation grows. #### Director Service -Data access in a Pelican federation requires two fundamental pieces of information -- the federation's hostname (also called the *root* of the federation), and the name of the object within the federation. Notably, the hostnames of any Origins that facilitate access to objects are absent from that list. Instead, the Pelican model uses the federation root to discover and route all Client requests for objects through its *Director*, an HTTP server whose job is determining the best location(s) at which to access a given object. In some cases, this is accomplished by redirecting clients to a nearby Cache that might already have a copy of the object, and in other cases the Director might send the client to an Origin that can provide direct access. +Data access in a Pelican federation requires two fundamental pieces of information -- the federation's hostname (also called the *root* of the federation), and the name of the +object within the federation. Notably, the hostnames of any Origins that facilitate access to objects are absent from that list. Instead, the Pelican model uses the federation +root to discover and route all Client requests for objects through its *Director*, an HTTP server whose job is determining the best location(s) at which to access a given object. +In some cases, this is accomplished by redirecting clients to a nearby Cache that might already have a copy of the object, and in other cases the Director might send the client +to an Origin that can provide direct access. -Generally, the Director's hostname is used as the federation's hostname because it auto-populates and makes available the federation's metadata. This information is hosted at the *discovery endpoint*, a URL obtained by appending `/.well-known/pelican-configuration` to the federation's root. However, some federations may wish to set up the Director/Registry as subdomains of the federation's hostname. For example, the OSDF breaks these two endpoints apart by providing federation metadata at osg-htc.org, which then points to `osdf-director.osg-htc.org` and `osdf-registry.osg-htc.org`, respectively. +Generally, the Director's hostname is used as the federation's hostname because it auto-populates and makes available the federation's metadata. This information is hosted at +the *discovery endpoint*, a URL obtained by appending `/.well-known/pelican-configuration` to the federation's root. However, some federations may wish to set up the +Director/Registry as subdomains of the federation's hostname. For example, the OSDF breaks these two endpoints apart by providing federation metadata at osg-htc.org, which +then points to `osdf-director.osg-htc.org` and `osdf-registry.osg-htc.org`, respectively. -All Origins and Caches in a federation send periodic advertisements to the discovered Director at a default interval of 1 minute to let it know where they can be accessed, which namespace(s) they provide, and any information pertaining to data access policies (such as authorization schemes). In this way, the Director is the only service that has a nearly real-time view of all the Origins and Caches in the federation -- if an Origin or Cache fails to re-advertise after the required period (15 minutes by default), it is assumed to be offline until another advertisement is received, and the Director will stop sending clients to that location. +All Origins and Caches in a federation send periodic advertisements to the discovered Director at a default interval of 1 minute to let it know where they can be accessed, +which namespace(s) they provide, and any information pertaining to data access policies (such as authorization schemes). In this way, the Director is the only service that has +a nearly real-time view of all the Origins and Caches in the federation -- if an Origin or Cache fails to re-advertise after the required period (15 minutes by default), it is +assumed to be offline until another advertisement is received, and the Director will stop sending clients to that location. #### Registry Service -Whenever a new Origin or Cache is created and added to a federation, its first step is to register itself with the *Registry*, which acts as the federation's locus of trust. In the case of Origins, the process of registration entails sending the Registry the namespace prefix the Origin exports, along with the Origin's public key and a variety of other bookkeeping information. After the Registry and the Origin have performed a handshake that proves the Origin owns the corresponding private key, the Registry stores the information in a persistent database. +Whenever a new Origin or Cache is created and added to a federation, its first step is to register itself with the *Registry*, which acts as the federation's locus of trust. +In the case of Origins, the process of registration entails sending the Registry the namespace prefix the Origin exports, along with the Origin's public key and a variety of +other bookkeeping information. After the Registry and the Origin have performed a handshake that proves the Origin owns the corresponding private key, the Registry stores the +information in a persistent database. -This process serves two purposes -- first, whenever the Origin re-advertises with the federation's Director, the Director can verify the authenticity of those advertisements through public/private key asymmetric cryptography by looking at the Registry's stored public key for that Origin and namespace. Second, the Registry's persistent database prevents other Origins from registering namespaces under an already-registered namespace without first proving they're allowed to do so by the namespace owner (i.e. the entity that possesses the appropriate private key). +This process serves two purposes -- first, whenever the Origin re-advertises with the federation's Director, the Director can verify the authenticity of those advertisements +through public/private key asymmetric cryptography by looking at the Registry's stored public key for that Origin and namespace. Second, the Registry's persistent database +prevents other Origins from registering namespaces under an already-registered namespace without first proving they're allowed to do so by the namespace owner (i.e. the entitythat possesses the appropriate private key). diff --git a/docs/pages/federating-your-data.mdx b/docs/pages/federating-your-data.mdx index 09a794d37..d1d41596e 100644 --- a/docs/pages/federating-your-data.mdx +++ b/docs/pages/federating-your-data.mdx @@ -1,352 +1,37 @@ import ExportedImage from "next-image-export-optimizer"; import { Key } from '@mui/icons-material'; -# Federating Your Data via a Pelican Origin - -Pelican users who want to share data within a Pelican federation do so via an [*Origin*](./core-concepts.mdx#origins). Origins are a crucial component of Pelican's architecture for two reasons: they act as an adapter between various storage backends and Pelican federations, and they provide fine-grained access controls for that data. That is, they figure out how to take data from wherever it lives (such as a POSIX filesystem, S3 buckets, HTTPS servers, etc.) and transform it into a format that the federation can utilize while respecting your data access requirements. - -> **NOTE:** An important distinction between origins and data backends is that, generally speaking, origins do **NOT** store any data themselves; their primary function is to facilitate data accessibility. - -This document contains instructions on how to serve a Pelican origin on top of a variety of storage backend types. - -## Before Starting - -### Install Pelican - -If you haven't installed Pelican, follow the instructions to [install pelican](./install.mdx). - -For _Linux_ users, it is recommended to install Pelican using one of the package managers (RPM, APK, Deb, etc.) so that Pelican dependencies are automatically handled. You may also run a [Pelican Docker image](./install/docker.mdx) to serve a Pelican origin. -If you prefer to install Pelican as a standalone binary, you need to follow [additional instructions](https://osg-htc.org/docs/data/xrootd/install-standalone/#install-xrootd-standalone) to install dependencies for the Pelican origin server. - -> **NOTE:** Serving origins with a standalone Pelican binary is possible, but not recommended. - -_MacOS_ and _Windows_ users who want to serve a Pelican origin should use the [Pelican Docker image](./install/docker.mdx). - -### Open Firewall Port for Pelican Origin - -At their core, Pelican origins are web servers that listen to two TCP ports for file transfers and Web UI. By default, the Web UI and API interface for your origin will be at port `8444`, and the port for object transfers will be at `8443`. You may change these port numbers through the [configuration file](./parameters.mdx) with parameters [`Server.WebPort`](./parameters.mdx#Server-WebPort) and [`Origin.Port`](./parameters.mdx#Origin-Port), respectively. - -In order for Pelican origins to work properly, these ports need to be accessible by the federation, which in most cases means they need to be open to the internet. If your server host has a firewall policy in place, please open these two ports for both incoming the outgoing TCP requests. - -> **NOTE:** If it is not possible for you to expose any ports through the firewall (e.g. you're on a local network or behind a NAT), Pelican has a special feature called a _Connection Broker_ that allows you to serve origins without publicly-accessible ports and TLS credentials. However, this is an experimental feature and requires the Pelican federation you are joining to be compatible. If you are interested in learning more about the Connection Broker, please contact help@pelicanplatform.org for further instructions. - -### Prepare TLS Credentials - -Data transfers in Pelican rely on HTTPS, the encryption scheme used by everyone from banks to instagram that's responsible for securely transmitting data between internet-connected computers. To configure the origin with HTTPS, you'll first need to acquire three things: - -- A valid Transport Layer Security (TLS) certificate -- The private key associated with the certificate -- The Intermediate Certificate or the chain file, that establishes the trust chain to a root certificate - -> **NOTE:** For local development and testing, you may skip setting up TLS credentials by setting configuration parameter `TLSSkipVerify` to `true`. You should **NOT** set this for production, as it makes all data, including your passwords, available to anyone who can monitor your network. - -You need to contact a Certificate Authority (CA) who owns the root certificate for getting these credentials. One popular CA that provides free TLS certificates is [Let's Encrypt](https://letsencrypt.org/). You may follow [their guide](https://letsencrypt.org/getting-started/) to obtain the credentials listed above. **Note that you need to have a valid domain before proceeding.** - -Once you go through the process, locate your credential files and set the following parameters to the file locations or copy the credential files to the default locations of the parameters: - -- `Server.TLSCertificateChain` - - The certificate chain file from Let's Encrypt (or another CA), usually named example.com.crt or example.com.pem, containing the host certificate followed by any required intermediate certificates. - - Default location: `~/.config/pelican/certificates/tls.crt` for non-root users or `/etc/pelican/certificates/tls.crt` for root users. - -- `Server.TLSKey` - - The private key corresponding to the TLS certificate, usually named as `example.com.key`. - - Default location: `~/.config/pelican/certificates/tls.key` for non-root users or `/etc/pelican/certificates/tls.key` for root users. - -- `Server.TLSCACertificateFile` - - The intermediate certificate from Let's Encrypt to establish the trust chain to a root certificate, usually named as `letsencrypt-intermediate.pem` or `chain.pem` - - Default location: `~/.config/pelican/certificates/tlsca.pem` for non-root users or `/etc/pelican/certificates/tlsca.pem` for root users. - -Since your TLS certificate is associated with your domain name, you will need to change the default hostname of Pelican server to be consistent. Set `Server.Hostname` to your domain name (e.g. `example.com`). - -## Launch the Origin with POSIX backend - -When you've completed the aforementioned steps, you're ready to start configuring the origin that will add your data to a federation. Serving an origin is the process of taking some underlying storage repository and making its data accessible via a namespace prefix in your federation. For example, you might make files in the directory `/my/directory` available at the federation path `/my/namespace` so that anyone with access to the federation can get objects from the directory - -By default, Pelican origins serve files from a POSIX backend, the filesystem used by Linux computers. However, Pelican aims to support a variety of backends and we currently also support serving objects from S3. Configuration for S3 is mostly similar to configuration for POSIX file systems, but with a few important differences. For information about S3 backends, refer to the [S3 Backend](./federating-your-data/s3-backend.mdx) page. - -> If you are running Pelican docker image to serve an origin, please refer to [Pelican Docker image documentation](./install/docker.mdx#run-pelican-origin-server). - -### Find a Federation to join - -Before serving an origin, you need to decide which [**federation**](./core-concepts.mdx#federations) your data will be accessed through. For example, the Open Science Data Federation (OSDF) is Pelican's flagship federation, and if you are interested in serving an OSDF origin, you can refer to the [OSDF website](https://osg-htc.org/services/osdf.html) for details about how to join. - -Federations are identified their URL, which is used to host information that origins need for discovering other federation services. For example, the OSDF's federation URL is `https://osg-htc.org`, and an origin that joins the OSDF will visit `https://osg-htc.org/.well-known/pelican-configuration` to get important metadata about the federation's central services (the Director and Registry). - -To point your origin at a specific federation, you can either pass the `-f ` flag if running from the command line, or configure `Federation.DiscoveryUrl: ` in your config yaml. - -### Starting the Origin - -Origins can be configured via the command line, a config file named `pelican.yaml`, environment variables, or through a combinations of the three. While simple origins can be run entirely from command line arguments, more complex origins will require configuration your your `pelican.yaml`. - -To start a simple pelican origin from the command line that serves POSIX data, run: - -```bash -pelican origin serve -f -v : -``` - -Where: - -* `` is the federation URL discussed above -* `` is the absolute path to the directory containing files you want to export as Pelican objects in your federation -* `` is the federation prefix at which files in `/path/to/data` will be accessed from in the federation. Note that federation prefixes follow POSIX path conventions, and they must begin with `/` to denote an absolute path. - -> **NOTE:** By default, origins require authorization tokens for object access. Pelican currently does not support serving a public origin using only the command line, but various access controls can be configured through your configuration file. For more information, see [origin capabilities](#origin-and-namespace-capabilities) below. - -To run the same origin using a `pelican.yaml` configuration file, save your configuration to `/etc/pelican/pelican.yaml` if you're running Pelican as root, or at `~/.config/pelican/pelican.yaml` if you're running as a non-root user. The command line origin from above could be configured accordingly: - -```yaml filename="pelican.yaml" copy -# Tell Pelican which federation you're joining -Federation: - DiscoveryUrl: - -# Configure your Origin -Origin: - # POSIX is the default storage type for Pelican origins - # and can be omitted - StorageType: "posix" - - Exports: - - StoragePrefix: "/path/to/data" - FederationPrefix: "/your/federation/prefix" - # Explicitly state what capabilities you want this prefix to have - Capabilities: ["Reads", "Writes"] - -``` - -and then simply run - -```bash copy -pelican origin serve -``` - -Pelican will read the config file and apply it to your origin. - - -Finally, origins can be configured to a limited extent with environment variables. In Pelican's environment variable model, configuration options are taken from `pelican.yaml`, flattened, and prepended with `PELICAN` prefix. - -For example, you might configure the origin's storage type by setting the environment variable `PELICAN_ORIGIN_STORAGETYPE=posix`. - -> **NOTE:** Environment variable configuration does not support complex structures that can be built with yaml configuration, such as `object`-type parameters. - -The first time the origin is started, you will see something that looks like the following: - -```console -$ pelican origin serve -f https://osg-htc.org -v $PWD:/demo - -Pelican admin interface is not initialized -To initialize, login at https://localhost:8444/view/initialization/code/ with the following code: -551220 -``` -See the [admin website configuration](#login-to-admin-website) documentation section for more information about initializing your origin's admin website. - -### Origin and Namespace Capabilities - -Origins and namespaces can be configured with a set of _capabilities_, which are the configuration options used to define data access controls. In the previous yaml configuration, we configured the origin capabilities using the `Capabilities` list of the `Origin.Exports` block by specifying that the federation prefix `/your/federation/prefix` supports "Reads" and "Writes". This list of capabilities can be used for further control of what types of operations the namespace is willing to support. Available capabilities include: - -- `Reads`: When included, objects from the namespace can be read with a valid authorization token. -- `PublicReads`: When set, objects from the namespace become public and require no authorization to read. -- `Writes`: When included, objects can be written back to the storage backend by Pelican. Write operations _always_ require a valid authorization token. -- `DirectReads`: When included, a namespace indicates that it is willing to serve clients directly and does not require data to be pulled through a cache. Disabling this feature may be useful in cases where the origin isn't very performant or has to pay egress costs when data moves through it. Note that this is respected by federation central services, but may not be respected by all clients. -- `Listings`: When included, the namespace indicates it will allow object discovery. Be careful when setting this for authorized namespaces, as this will allow anyone to discover the names of objects exported by this namespace. - -> **NOTE:** Most origins should have either `Reads` or `PublicReads` enabled. If neither is set, the origin won't export any data. - -There is an important distinction between _origin_ capabilities and _namespace_ capabilities. While it's sometimes easy to treat origins and namespaces as the same thing, Pelican must distinguish between them because two separate origins may export portions of the same namespace, and a single origin may export two disparate prefixes. The only exception to this rule is when a single origin serves a single namespace, or the origin exports multiple prefixes that should all have the same capabilities. - -To configure _origin_ capabilities, you can set top-level options for the origin: - -- `Origin.EnableReads`: When true, the origin supports reads that are accompanied by a valid authorization token. -- `Origin.EnablePublicReads`: When true, the origin supports reads by anyone without an authorization token. -- `Origin.EnableWrites`: When true, objects can be written back to the storage backend through the origin. Writes always require a valid authorization token. -- `Origin.EnableDirectReads`: When true, the origin indicates it's willing to serve clients directly, potentially without caching data. Note that this is respected by federation central services, but may not be respected by all clients. -- `Origin.EnableListings`: When true, the origin will allow object discovery. - -If no `Origin.Exports` block is provided to Pelican, these values will also be applied to your federation prefix. - -> **NOTE:** Pelican tries to resolve differences between origin and namespace configurations by respecting the more restrictive of the two. If you serve an origin that enables public reads, but the underlying prefix it exports disables all reads, you won't be able to read from that namespace. - -### Multi-Export Origins -The previous examples have shown how one might export a single namespace, but Pelican origins can export multiple paths from the same storage backend under different namespaces. For example, assume you have have two POSIX directories called `/my/data/public` and `/my/data/private`. If you want to make your public data available under the namespace `/my/prefix/public` and your private data available under `/my/prefix/private`, you'll need to configure a multi-export origin, which is accomplished through the origin's `Exports` block. Below is an example of what that looks like, along with how you could configure access control for the two namespaces: - -```yaml filename="pelican.yaml" copy -Federation: - DiscoveryUrl: https://my-federation.com - -Origin: - StorageType: posix - - # The actual namespaces we export - Exports: - - StoragePrefix: /my/data/public - FederationPrefix: /my/prefix/public - # Don't set Reads -- it should be toggled true by setting PublicReads - Capabilities: ["PublicReads", "Listings", "DirectReads"] - - StoragePrefix: /my/data/private - FederationPrefix: /my/prefix/private - # We set "Reads" but not "PublicReads" indicating we want authorization - Capabilities: ["Reads", "DirectReads"] -``` - -> **NOTE:** While multiple namespaces can be exported by the same origin, they must all have the same underlying storage type. That is, if the origin serves files from POSIX, it must only serve files from POSIX and not S3. - -### Additional Command Line Arguments for Origins - -This section documents additional arguments you can pass via the command line when serving origins. - -* **-h or --help**: Output documentation on the `serve` command and its arguments. -* **-m or --mode**: Set the mode for the origin service ('posix'|'s3, default to 'posix'). -* **-p or --port**: Set the port at which the Pelican admin website should be accessible. -* **--writeable**: A boolean value to allow or disable writing to the origin (default is true). - -* **--config**: Set the location of the configuration file. -* **-d or --debug**: Enable debugging mode, which greatly increases the Pelican's logging verbosity -* **-l or --log**: Set the location of a file that will capture Pelican logs. Setting this will prevent logging output from printing to your terminal. - -For more information about available yaml configuration options, refer to the [Parameters page](./parameters.mdx). - -## Login to Admin Website - -After your origin is running, the next step is to initialize its admin website, which can be used by administrators for monitoring and further configuration. To initialize this interface, go to the URL specified in the terminal. By default, it should point to https://localhost:8444/view/initialization/code/ - -You will be directed to the page to activate the website with a one-time passcode. Copy the passcode from the terminal where you launch Pelican origin and paste to the website to finish activation. - - - -In our case, it's `551220` from the example terminal above. - -> **NOTE:** that your one-time passcode will be different from the example. - -> **NOTE:** These one-time passcodes will be refreshed every minute. Find the latest passcode in the terminal before proceeding. - -### Set up password for the admin - -After activating the website, you will be redirected to set up the password for the admin account. Type your password and re-type again to confirm. Then store this password in a safe location. - - - -### Visit the Origin's Dashboard Page - -Once the password is confirmed, you will be redirected to the origin's dashboard page. - - - -The origin dashboard page consists of the following panels: -- Status -- Data Exports -- Federation Overview -- Transfer Rate - -The **Status** panel shows information about the health status of the origin, delineated by the following components: - -* **CMSD** indicates whether the [Cluster Management Service Distributed (CMSD)](https://xrootd.slac.stanford.edu/doc/dev410/cms_config.htm) daemon is running. -* **Director** indicates whether the origin can advertise itself to its federation director, which is required for other members in the federation to discover your origin's existence and how to access objects from it. -* **Federation** indicates whether the origin can fetch from the federation discovery URL, which contains locations of central services (Director and Registry). -* **Registry** indicates whether the origin successfully registered the federation prefixes it exports at the Registry. -* **Web UI** indicates whether the admin website is configured and running. -* **XRootD** indicates whether Pelican's underlying file transfer software is functioning as expected. - - - -The **Data Exports** panel lists information about the federation prefixes that are currently being exported by the origin. It also shows each prefix's advertised capabilities, like "reads", "writes", or "listings". - -If any of the namespace prefix registrations is missing required information, there will be a warning message and a button to "Complete Registration". Note that each namespace prefix is registered separately, and the Origin server itself also registers at the registry. **It is advised that the Origin admin completes the registration as soon as they can**. - - - -The **Federation Overview** panel lists links to various federation services (director, registry, etc.). Note that the link to the **Discovery** item is the federation discovery URL where the metadata of a federation is located. - - - - -The **Transfer Rate** graph visualizes object transfer metrics like transfer **speed** for both receiving (rx) and transmitting (tx) data. You may change the time range of the graph by changing the **Reporting Period** and **Graph Settings**. - - - - -> **NOTE:** This graph may be empty when the origin first starts, as it takes several minutes to collect enough data for the display. Try refreshing the page after the origin has been running for ~5 minutes and you you should see data being aggregated. - -### For local deployment - -When you hit the URL at https://localhost:8444/view/initialization/code/, You may see a warning that looks like the following (with some differences depending on the browser you use): - - - -The warning is due to the fact that Pelican servers by default use `https` for network requests, which requires a set of TLS certificates to secure the connection between the server and the browser. If you don't have TLS certificates properly configured and you turned on the `TLSSkipVerify` configuration parameter, then the origin will generate a set of self-signed certificates that are not trusted by the browser. - -For local testing, it's OK to proceed with the warning for local deployment. - -## Test Origin Functionality - -Once you have your origin set up, follow the steps below to test if your origin can serve a file through a Pelican federation. It's best to test your origin while it's serving public data to minimize the risk that any test tokens you generate may be malformed and the reason objects can't be pulled through the origin. - -1. Create a test file under the directory on your host machine that binds to a Pelican namespace. This the `` in `-v :` argument when you run the Pelican origin. Assuming your directory is `/tmp/demo`, run the following command to create a test file named `testfile.txt` under `/tmp/demo` - - ```bash - echo "This is a test file.\n" > /tmp/demo/testfile.txt - ``` - -2. In a **separate terminal**, run the following command to get the data from your origin through the Pelican federation - - ```bash - $ cd ~ - $ pelican object get -f /testfile.txt . - ``` - - Where: - * `cd ~` switches the working directory to your `home` directory - * `` is the same URL you pass to `-f` argument when running the origin - * `` is the `-v :` argument when running the origin. - - You should see the output like the following: - - ```console - $ pelican object get -f /demo/testfile.txt . - testfile.txt 36.00 b / 36.00 b [=============================================================================================] Done! - ``` - -3. Confirm the file content by running: - - ```bash - $ cat testfile.txt - This is a test file. - ``` - -Congratulations! Your have finished setting up and running your origin. - -## Next Steps - -### Obtain the Public Key of the Origin - -Pelican origins follow [OpenID Connect (OIDC)](https://openid.net/developers/how-connect-works/) protocol for authenticating users for object access. In the OIDC setup, a user's identity is encoded in a _token_ that is _signed_ by the origin, using its _private key_. The private key only lives on the origin server and is never exposed to the public. To verify the integrity the token and make sure it's not tampered by malicious attackers, a _public key_ generated from the _private key_ is available for others to use to check the signature of the token. - -The _public keys_ are used in a Pelican federation to facilitate user authentication and server identity verification. They are also used to register a namespace at the Pelican registry. The public key used to register a namespace at the Pelican registry should be the public key of the Pelican origin that exports and hosts the namespace. This is because the Pelican origin manages user identity verification and authorization for the namespaces it exports. - -#### Obtain the Public Key via the Admin Website - -To get the public key of via the admin website, follow the steps below. - -- [Setup and login to Pelican Origin admin website](#login-to-admin-website) -- On the home page, navigate to the **Data Exports** panel on the top right -- Click the icon to download the public key - -#### Obtain the Public Key via Direct Download - -To get the public key of via direct download, go to `https://:/.well-known/issuer.jwks`. The public key will be automatically downloaded as a `JSON` file. An example file is as following: - -```json filename="issuer.jwks" copy -{ - "keys":[ - { - "kty":"EC", - "use":"sig", - "crv":"P-256", - "kid":"sig-1712605941", - "x":"c3BhLEMGqmO98-43pD3R5DJtUGIQf4McsNBWuVTorVI", - "y":"eWssaV6WrG4kVla1Ygdr_qUZeqgN7I2fDeb3K1qL0qI", - "alg":"ES384" - } - ] -} -``` - -> Note that you need to run your Pelican origin before downloading the public key +# Federating Your Data + +## The Role of Origins in Pelican Federations +Data is made accessible via Pelican through Origins -- the service that acts like a universal adapter plug allowing Pelican clients to interact with a wide variety of +underlying storage technologies. From posix filesystems to S3 cloud storage, Origins translate Pelican client commands into requests that work natively with whatever +holds the actual objects/files. It's important to note that Origins often do not store the objects themselves, which is why we say data is access _via_ Pelican and not +_from_ Pelican. + +Not only do Origins translate requests to/from the data repository, but they're also the component responsible for telling the federation they have data from some +namespace in the federation. That is, you may have one Origin that ties the S3 bucket `foo` to the namespace `/my-origin/foo` while also tying the bucket `bar` to the +federation prefix `/my-origin/bar`. When this Origin talks to the Director, it tells the Director which namespaces it supports so that requests for `/my-origin/foo` are +forwarded by the Director to the correct Origin. + +For those who want to make their data accessible via Pelican, the Origin is the service they'll get to know most intimately. It's the place where data owners can define +what data is federated, craft fine-grained access policies to describe who/how the objects are accessed, and monitor how users are interacting with the data. + +Generally speaking, an Origin's configuration has a few key elements (not including stuff like TLS configuration, which is needed by all Pelican servers). +These include: +- **Storage Type**: The underlying storage technology the Origin will be translating on behalf of. Valid options include (but may not be limited to) POSIX, S3, HTTP, Globus +and XRootD. +- **Exports**: The actual sections of the storage instance that are going to be made available through the Origin. For each export, some namespace prefix is tied to some portion +of the underlying storage. For example, in posix, each export generally points to some distinct directory tree, allowing the origin admin to map unique namespaces to certain +pieces of the filesystem. For S3, exports usually point to individual buckets. +- **Capabilities (per export)**: The access policy imposed on users when accessing objects from this part of the namespace. + +Understanding how these pieces fit together and what each one enables allow Origin administrators to realize a vast array of conceivable configurations. Documents in this +section should help guide Origin administrators, both new and experienced, through the steps needed to add their data to their Pelican federation of choice. + +## Namespaces and their Relationship with Origins +In general, the origin-namespace relationship should be thought of as many-to-many. One Origin may export multiple prefixes, as in the previous example, but one prefix +may also be striped across multiple Origins. + +> **Note**: Pelican developers are still working on full support for situations where one prefix is spread across multiple Origins. At this time, certain client commands, +like those that involve object listing, may not behave entirely as expected in multi-origin, single-namespace setups. \ No newline at end of file diff --git a/docs/pages/federating-your-data/_meta.json b/docs/pages/federating-your-data/_meta.json index af602a6ac..372aad116 100644 --- a/docs/pages/federating-your-data/_meta.json +++ b/docs/pages/federating-your-data/_meta.json @@ -1,4 +1,6 @@ { + "choosing-namespaces": "Choosing a Namespace Prefix", + "origin": "Setting Up an Origin", "s3-backend": "S3 Backend", "generating-tokens": "Generating Tokens" } diff --git a/docs/pages/federating-your-data/choosing-namespaces.mdx b/docs/pages/federating-your-data/choosing-namespaces.mdx new file mode 100644 index 000000000..ec179dcca --- /dev/null +++ b/docs/pages/federating-your-data/choosing-namespaces.mdx @@ -0,0 +1,132 @@ +import ExportedImage from "next-image-export-optimizer"; + +# Namespace Prefixes and How To Choose One + +In "Romeo & Juliet", William Shakespeare writes: + +> What's in a name? That which we call a rose
+> By any other name would smell as sweet. + +Unfortunately for us, Shakespeare's wisdom doesn't hold true in environments where names carry relational information or otherwise convey information about the named entity. +That's why picking a good federation prefix for Pelican is so important -- it's the data owner's opportunity to _say_ something about the data and to frame the way data +consumers will think about the data when they access it. + +The process of organizing and naming data can be difficult. Even the Dewey Decimal System has gone through 23 major revisions over ~150 years and now comprises two entire +volumes[1]. Luckily, there are some best practices that can lead to reasonable choices in +picking a namespace. + +The following sections contain advice about our best practicies for organizing your data in Pelican, and understanding each section will help you pick namespaces that maximize +the FAIR principles of your data. + +## Data Provenance and Taxonomy + +One of the the best ways to start picking namespaces is to think about how your objects might be taxonomically structured. Taxonomy is the practice of organizing things +into hierarchical categories based on their characteristics, relationships, and differences. Consider the following example: +``` +CoolScienceOrg/ +└── WhaleTrackingProject/ + ├── Atlantic/ + │ ├── 2023/ + │ │ ├── Jan/ + │ │ │ ├── image1.jpg + │ │ │ └── ... + │ │ ├── Feb + │ │ └── ... + │ └── 2024 + ├── Pacific + └── ... +``` +If a user understands how to find one object under this namespace, they'll likely understand how to find _any_ object that fits the same naming scheme under this namespace +by changing predictable keywords like ocean names, years and months. + +Choosing these keywords is often unique to each project and highly dependent on the underlying data. However, one common technique to discover reasonable choices for keywords +is to think about the terms you'd use to Google for certain objects or collections of your objects. In the previous example, one might imagine the user Googling for something +similar to: +> whale sightings over time in the atlantic and pacific + +This expresses some of the relationships inherent between individual objects in this data repository -- data relates to whale sitings and is split over time and by ocean. + +It's also important to note that this example includes information highlighting the data's _provenance_ or where it came from and who's responsible for it. More often then not, +it's a good idea that your namespace starts with something signifying your organization, group, or project. This is especially useful because Pelican namespaces are hierarchical +and can be further subdivided (see the section on [Namespace Subdivision](#namespace-subdivision) below for more information). + +In the previous example, a namespace beginning with `/CoolScienceOrg/WhaleProject` lets users quickly attribute any data coming from this section of the federation to your +organization and project. If data consumers have questions about some object, this namespace prefix is likely enough for them to figure out who to ask for more information. + +Lastly, this type of naming scheme makes the objects very interoperable for machine/workflow access because a simple nested `for` loop could be written to fetch every individual +image. The ability to create predictable naming conventions that integrate with large-scale computing workflows is crucial for data re-use. + +### Namespaces versus Object Names +The full "name" of any Pelican object comes from its Pelican URL, e.g. +> `pelican://osg-htc.com/this/is/an/object` + +which tells Pelican clients what federation to work with and how to find the actual object. + +Because Origins map namespace/federation prefixes to sections of the underlying data repository, it can be confusing to understand where the namespace ends and the object begins +in a path like `/this/is/an/object`. Information about how to determine this split given a Pelican URL can be found in +[Core Concepts](./core-concepts.mdx#differentiating-namespace-prefixes-and-object-names). However, this presents a unique challenge to Origin administrators, because they have to +decide which parts of a Pelican object's name should come from the federation prefix, and which should come from the underlying object name as understood by the storage resource. +Consider a posix filesystem with the following directory tree: +``` +physics/ +├── detector1/ +│ ├── 2023/ +│ │ ├── raw/ +│ │ │ └── event.csv +│ │ └── processed/ +│ │ └── event.csv +│ └── 2024/ +│ └── ... +└── detector2/ + └── ... +``` + +The administrator who wishes to federate this data has several choices to make. For example, they could create federation prefixes with the following prefix-to-directory +mapping: +> /my-namespace/detector1 --> /physics/detector1
+> /my-namespace/detector2 --> /physics/detector2 + +which would expose detector1's `2023/` and `2024/` directories under the prefix `/my-namespace/detector1` and detector2's directories under `/my-namespace/detector2`. +This is completely valid. However, they may also choose to scope things differently, creating the simple mapping: +> /my-namespace --> /physics + +where the entire contents of the `/physics` directory are exposed through the Pelican namespace prefix of `/my-namespace`. Choosing the right scoping level depends in part on +the administrators broader goals and needs. + +#### Prefixes as a Means of Reorganization +Because namespace prefixes essentially map some path in a Pelican federation to underlying storage, they can be used for minor re-organizational tasks. For example, this +filesystem has a series of poorly-named and poorly-organized directories: +``` +/my-data/ +├── grad-school-stuff/ +│ ├── first-detector/ +│ └── detector2/ +└── jan2021/ + └── detector-three/ +``` +In this case, namespacing through Pelican may allow the Origin administrator to correct these issues without touching the underlying filesystem through the creation of a mapping +like: +> /particle-physics/detector1 --> /my-data/grad-school-stuff/first-detector
+> /particle-physics/detector2 --> /my-data/grad-school-stuff/detector2
+> /particle-physics/detector3 --> /my-data/jan2021/detector-three + +To users, each event from these detectors will now follow a predictable access pattern when accessed via Pelican. + +#### Prefixes as a Means of Delegated Management +Because prefixes are hierarchical entities in Pelican, they can be further subdivided by anyone who has the appropriate cryptographic keys. This means the "owner" of a namespace +can delegate sub-namespaces to other people in their group, even if the namespace itself isn't exported through any origin. Because prefix registration can be done through the +Pelican independent of any origin, the head of "ProjectXYZ" may choose to create the top-level `/project-xyz` namespace with one set of keys. From here, they may use their +ownership of the top-level namespace to create a nested namespace like `/project-xyz/johnson-lab` tied to a separate set of keys that they give to the leader of the Johnson lab. +Johnson may then use his/her ownership of the sub-namespace to create further sub-namespaces for lab students. In this setup, each prefix owner has control over their section of +the namespace without having control over the parent namespaces. + +> **Warning**: One caveat here is that matching a namespace prefix will take precedence over any potential object names. That is, if the prefix `/project-xyz/johnson-lab/foo` is +registered, then the origin exporting `/project-xyz/jhonson-lab` will not be able to export objects that begin with `foo/`. + +### Prefixes as a Means of Aggregating Disparate Repositories +One additional benefit of namespaces and the fact that they can be exported by multiple Origins is that they may allow data owners to aggregate data from multiple sources under +a common name. For example, consider a case where you have two telescopes taking snapshots of the night sky. Due to each telescope's technology, one saves its images in S3 and the +other stores its images in posix. Namespacing allows the data owner to elide this fact from data consumers by exporting both the S3 bucket and the posix filesystm under the same +namespace: + + diff --git a/docs/pages/federating-your-data/origin.mdx b/docs/pages/federating-your-data/origin.mdx new file mode 100644 index 000000000..937e3ef05 --- /dev/null +++ b/docs/pages/federating-your-data/origin.mdx @@ -0,0 +1,349 @@ +# Federating Your Data via a Pelican Origin + +Pelican users who want to share data within a Pelican federation do so via an [*Origin*](./core-concepts.mdx#origins). Origins are a crucial component of Pelican's architecture for two reasons: they act as an adapter between various storage backends and Pelican federations, and they provide fine-grained access controls for that data. That is, they figure out how to take data from wherever it lives (such as a POSIX filesystem, S3 buckets, HTTPS servers, etc.) and transform it into a format that the federation can utilize while respecting your data access requirements. + +> **NOTE:** An important distinction between origins and data backends is that, generally speaking, origins do **NOT** store any data themselves; their primary function is to facilitate data accessibility. + +This document contains instructions on how to serve a Pelican origin on top of a variety of storage backend types. + +## Before Starting + +### Install Pelican + +If you haven't installed Pelican, follow the instructions to [install pelican](./install.mdx). + +For _Linux_ users, it is recommended to install Pelican using one of the package managers (RPM, APK, Deb, etc.) so that Pelican dependencies are automatically handled. You may also run a [Pelican Docker image](./install/docker.mdx) to serve a Pelican origin. +If you prefer to install Pelican as a standalone binary, you need to follow [additional instructions](https://osg-htc.org/docs/data/xrootd/install-standalone/#install-xrootd-standalone) to install dependencies for the Pelican origin server. + +> **NOTE:** Serving origins with a standalone Pelican binary is possible, but not recommended. + +_MacOS_ and _Windows_ users who want to serve a Pelican origin should use the [Pelican Docker image](./install/docker.mdx). + +### Open Firewall Port for Pelican Origin + +At their core, Pelican origins are web servers that listen to two TCP ports for file transfers and Web UI. By default, the Web UI and API interface for your origin will be at port `8444`, and the port for object transfers will be at `8443`. You may change these port numbers through the [configuration file](./parameters.mdx) with parameters [`Server.WebPort`](./parameters.mdx#Server-WebPort) and [`Origin.Port`](./parameters.mdx#Origin-Port), respectively. + +In order for Pelican origins to work properly, these ports need to be accessible by the federation, which in most cases means they need to be open to the internet. If your server host has a firewall policy in place, please open these two ports for both incoming the outgoing TCP requests. + +> **NOTE:** If it is not possible for you to expose any ports through the firewall (e.g. you're on a local network or behind a NAT), Pelican has a special feature called a _Connection Broker_ that allows you to serve origins without publicly-accessible ports and TLS credentials. However, this is an experimental feature and requires the Pelican federation you are joining to be compatible. If you are interested in learning more about the Connection Broker, please contact help@pelicanplatform.org for further instructions. + +### Prepare TLS Credentials + +Data transfers in Pelican rely on HTTPS, the encryption scheme used by everyone from banks to instagram that's responsible for securely transmitting data between internet-connected computers. To configure the origin with HTTPS, you'll first need to acquire three things: + +- A valid Transport Layer Security (TLS) certificate +- The private key associated with the certificate +- The Intermediate Certificate or the chain file, that establishes the trust chain to a root certificate + +> **NOTE:** For local development and testing, you may skip setting up TLS credentials by setting configuration parameter `TLSSkipVerify` to `true`. You should **NOT** set this for production, as it makes all data, including your passwords, available to anyone who can monitor your network. + +You need to contact a Certificate Authority (CA) who owns the root certificate for getting these credentials. One popular CA that provides free TLS certificates is [Let's Encrypt](https://letsencrypt.org/). You may follow [their guide](https://letsencrypt.org/getting-started/) to obtain the credentials listed above. **Note that you need to have a valid domain before proceeding.** + +Once you go through the process, locate your credential files and set the following parameters to the file locations or copy the credential files to the default locations of the parameters: + +- `Server.TLSCertificateChain` + - The certificate chain file from Let's Encrypt (or another CA), usually named example.com.crt or example.com.pem, containing the host certificate followed by any required intermediate certificates. + - Default location: `~/.config/pelican/certificates/tls.crt` for non-root users or `/etc/pelican/certificates/tls.crt` for root users. + +- `Server.TLSKey` + - The private key corresponding to the TLS certificate, usually named as `example.com.key`. + - Default location: `~/.config/pelican/certificates/tls.key` for non-root users or `/etc/pelican/certificates/tls.key` for root users. + +- `Server.TLSCACertificateFile` + - The intermediate certificate from Let's Encrypt to establish the trust chain to a root certificate, usually named as `letsencrypt-intermediate.pem` or `chain.pem` + - Default location: `~/.config/pelican/certificates/tlsca.pem` for non-root users or `/etc/pelican/certificates/tlsca.pem` for root users. + +Since your TLS certificate is associated with your domain name, you will need to change the default hostname of Pelican server to be consistent. Set `Server.Hostname` to your domain name (e.g. `example.com`). + +## Launch the Origin with POSIX backend + +When you've completed the aforementioned steps, you're ready to start configuring the origin that will add your data to a federation. Serving an origin is the process of taking some underlying storage repository and making its data accessible via a namespace prefix in your federation. For example, you might make files in the directory `/my/directory` available at the federation path `/my/namespace` so that anyone with access to the federation can get objects from the directory + +By default, Pelican origins serve files from a POSIX backend, the filesystem used by Linux computers. However, Pelican aims to support a variety of backends and we currently also support serving objects from S3. Configuration for S3 is mostly similar to configuration for POSIX file systems, but with a few important differences. For information about S3 backends, refer to the [S3 Backend](./federating-your-data/s3-backend.mdx) page. + +> If you are running Pelican docker image to serve an origin, please refer to [Pelican Docker image documentation](./install/docker.mdx#run-pelican-origin-server). + +### Find a Federation to join + +Before serving an origin, you need to decide which [**federation**](./core-concepts.mdx#federations) your data will be accessed through. For example, the Open Science Data Federation (OSDF) is Pelican's flagship federation, and if you are interested in serving an OSDF origin, you can refer to the [OSDF website](https://osg-htc.org/services/osdf.html) for details about how to join. + +Federations are identified their URL, which is used to host information that origins need for discovering other federation services. For example, the OSDF's federation URL is `https://osg-htc.org`, and an origin that joins the OSDF will visit `https://osg-htc.org/.well-known/pelican-configuration` to get important metadata about the federation's central services (the Director and Registry). + +To point your origin at a specific federation, you can either pass the `-f ` flag if running from the command line, or configure `Federation.DiscoveryUrl: ` in your config yaml. + +### Starting the Origin + +Origins can be configured via the command line, a config file named `pelican.yaml`, environment variables, or through a combinations of the three. While simple origins can be run entirely from command line arguments, more complex origins will require configuration your your `pelican.yaml`. + +To start a simple pelican origin from the command line that serves POSIX data, run: + +```bash +pelican origin serve -f -v : +``` + +Where: + +* `` is the federation URL discussed above +* `` is the absolute path to the directory containing files you want to export as Pelican objects in your federation +* `` is the federation prefix at which files in `/path/to/data` will be accessed from in the federation. Note that federation prefixes follow POSIX path conventions, and they must begin with `/` to denote an absolute path. + +> **NOTE:** By default, origins require authorization tokens for object access. Pelican currently does not support serving a public origin using only the command line, but various access controls can be configured through your configuration file. For more information, see [origin capabilities](#origin-and-namespace-capabilities) below. + +To run the same origin using a `pelican.yaml` configuration file, save your configuration to `/etc/pelican/pelican.yaml` if you're running Pelican as root, or at `~/.config/pelican/pelican.yaml` if you're running as a non-root user. The command line origin from above could be configured accordingly: + +```yaml filename="pelican.yaml" copy +# Tell Pelican which federation you're joining +Federation: + DiscoveryUrl: + +# Configure your Origin +Origin: + # POSIX is the default storage type for Pelican origins + # and can be omitted + StorageType: "posix" + + Exports: + - StoragePrefix: "/path/to/data" + FederationPrefix: "/your/federation/prefix" + # Explicitly state what capabilities you want this prefix to have + Capabilities: ["Reads", "Writes"] + +``` + +and then simply run + +```bash copy +pelican origin serve +``` + +Pelican will read the config file and apply it to your origin. + + +Finally, origins can be configured to a limited extent with environment variables. In Pelican's environment variable model, configuration options are taken from `pelican.yaml`, flattened, and prepended with `PELICAN` prefix. + +For example, you might configure the origin's storage type by setting the environment variable `PELICAN_ORIGIN_STORAGETYPE=posix`. + +> **NOTE:** Environment variable configuration does not support complex structures that can be built with yaml configuration, such as `object`-type parameters. + +The first time the origin is started, you will see something that looks like the following: + +```console +$ pelican origin serve -f https://osg-htc.org -v $PWD:/demo + +Pelican admin interface is not initialized +To initialize, login at https://localhost:8444/view/initialization/code/ with the following code: +551220 +``` +See the [admin website configuration](#login-to-admin-website) documentation section for more information about initializing your origin's admin website. + +### Origin and Namespace Capabilities + +Origins and namespaces can be configured with a set of _capabilities_, which are the configuration options used to define data access controls. In the previous yaml configuration, we configured the origin capabilities using the `Capabilities` list of the `Origin.Exports` block by specifying that the federation prefix `/your/federation/prefix` supports "Reads" and "Writes". This list of capabilities can be used for further control of what types of operations the namespace is willing to support. Available capabilities include: + +- `Reads`: When included, objects from the namespace can be read with a valid authorization token. +- `PublicReads`: When set, objects from the namespace become public and require no authorization to read. +- `Writes`: When included, objects can be written back to the storage backend by Pelican. Write operations _always_ require a valid authorization token. +- `DirectReads`: When included, a namespace indicates that it is willing to serve clients directly and does not require data to be pulled through a cache. Disabling this feature may be useful in cases where the origin isn't very performant or has to pay egress costs when data moves through it. Note that this is respected by federation central services, but may not be respected by all clients. +- `Listings`: When included, the namespace indicates it will allow object discovery. Be careful when setting this for authorized namespaces, as this will allow anyone to discover the names of objects exported by this namespace. + +> **NOTE:** Most origins should have either `Reads` or `PublicReads` enabled. If neither is set, the origin won't export any data. + +There is an important distinction between _origin_ capabilities and _namespace_ capabilities. While it's sometimes easy to treat origins and namespaces as the same thing, Pelican must distinguish between them because two separate origins may export portions of the same namespace, and a single origin may export two disparate prefixes. The only exception to this rule is when a single origin serves a single namespace, or the origin exports multiple prefixes that should all have the same capabilities. + +To configure _origin_ capabilities, you can set top-level options for the origin: + +- `Origin.EnableReads`: When true, the origin supports reads that are accompanied by a valid authorization token. +- `Origin.EnablePublicReads`: When true, the origin supports reads by anyone without an authorization token. +- `Origin.EnableWrites`: When true, objects can be written back to the storage backend through the origin. Writes always require a valid authorization token. +- `Origin.EnableDirectReads`: When true, the origin indicates it's willing to serve clients directly, potentially without caching data. Note that this is respected by federation central services, but may not be respected by all clients. +- `Origin.EnableListings`: When true, the origin will allow object discovery. + +If no `Origin.Exports` block is provided to Pelican, these values will also be applied to your federation prefix. + +> **NOTE:** Pelican tries to resolve differences between origin and namespace configurations by respecting the more restrictive of the two. If you serve an origin that enables public reads, but the underlying prefix it exports disables all reads, you won't be able to read from that namespace. + +### Multi-Export Origins +The previous examples have shown how one might export a single namespace, but Pelican origins can export multiple paths from the same storage backend under different namespaces. For example, assume you have have two POSIX directories called `/my/data/public` and `/my/data/private`. If you want to make your public data available under the namespace `/my/prefix/public` and your private data available under `/my/prefix/private`, you'll need to configure a multi-export origin, which is accomplished through the origin's `Exports` block. Below is an example of what that looks like, along with how you could configure access control for the two namespaces: + +```yaml filename="pelican.yaml" copy +Federation: + DiscoveryUrl: https://my-federation.com + +Origin: + StorageType: posix + + # The actual namespaces we export + Exports: + - StoragePrefix: /my/data/public + FederationPrefix: /my/prefix/public + # Don't set Reads -- it should be toggled true by setting PublicReads + Capabilities: ["PublicReads", "Listings", "DirectReads"] + - StoragePrefix: /my/data/private + FederationPrefix: /my/prefix/private + # We set "Reads" but not "PublicReads" indicating we want authorization + Capabilities: ["Reads", "DirectReads"] +``` + +> **NOTE:** While multiple namespaces can be exported by the same origin, they must all have the same underlying storage type. That is, if the origin serves files from POSIX, it must only serve files from POSIX and not S3. + +### Additional Command Line Arguments for Origins + +This section documents additional arguments you can pass via the command line when serving origins. + +* **-h or --help**: Output documentation on the `serve` command and its arguments. +* **-m or --mode**: Set the mode for the origin service ('posix'|'s3, default to 'posix'). +* **-p or --port**: Set the port at which the Pelican admin website should be accessible. +* **--writeable**: A boolean value to allow or disable writing to the origin (default is true). + +* **--config**: Set the location of the configuration file. +* **-d or --debug**: Enable debugging mode, which greatly increases the Pelican's logging verbosity +* **-l or --log**: Set the location of a file that will capture Pelican logs. Setting this will prevent logging output from printing to your terminal. + +For more information about available yaml configuration options, refer to the [Parameters page](./parameters.mdx). + +## Login to Admin Website + +After your origin is running, the next step is to initialize its admin website, which can be used by administrators for monitoring and further configuration. To initialize this interface, go to the URL specified in the terminal. By default, it should point to https://localhost:8444/view/initialization/code/ + +You will be directed to the page to activate the website with a one-time passcode. Copy the passcode from the terminal where you launch Pelican origin and paste to the website to finish activation. + + + +In our case, it's `551220` from the example terminal above. + +> **NOTE:** that your one-time passcode will be different from the example. + +> **NOTE:** These one-time passcodes will be refreshed every minute. Find the latest passcode in the terminal before proceeding. + +### Set up password for the admin + +After activating the website, you will be redirected to set up the password for the admin account. Type your password and re-type again to confirm. Then store this password in a safe location. + + + +### Visit the Origin's Dashboard Page + +Once the password is confirmed, you will be redirected to the origin's dashboard page. + + + +The origin dashboard page consists of the following panels: +- Status +- Data Exports +- Federation Overview +- Transfer Rate + +The **Status** panel shows information about the health status of the origin, delineated by the following components: + +* **CMSD** indicates whether the [Cluster Management Service Distributed (CMSD)](https://xrootd.slac.stanford.edu/doc/dev410/cms_config.htm) daemon is running. +* **Director** indicates whether the origin can advertise itself to its federation director, which is required for other members in the federation to discover your origin's existence and how to access objects from it. +* **Federation** indicates whether the origin can fetch from the federation discovery URL, which contains locations of central services (Director and Registry). +* **Registry** indicates whether the origin successfully registered the federation prefixes it exports at the Registry. +* **Web UI** indicates whether the admin website is configured and running. +* **XRootD** indicates whether Pelican's underlying file transfer software is functioning as expected. + + + +The **Data Exports** panel lists information about the federation prefixes that are currently being exported by the origin. It also shows each prefix's advertised capabilities, like "reads", "writes", or "listings". + +If any of the namespace prefix registrations is missing required information, there will be a warning message and a button to "Complete Registration". Note that each namespace prefix is registered separately, and the Origin server itself also registers at the registry. **It is advised that the Origin admin completes the registration as soon as they can**. + + + +The **Federation Overview** panel lists links to various federation services (director, registry, etc.). Note that the link to the **Discovery** item is the federation discovery URL where the metadata of a federation is located. + + + + +The **Transfer Rate** graph visualizes object transfer metrics like transfer **speed** for both receiving (rx) and transmitting (tx) data. You may change the time range of the graph by changing the **Reporting Period** and **Graph Settings**. + + + + +> **NOTE:** This graph may be empty when the origin first starts, as it takes several minutes to collect enough data for the display. Try refreshing the page after the origin has been running for ~5 minutes and you you should see data being aggregated. + +### For local deployment + +When you hit the URL at https://localhost:8444/view/initialization/code/, You may see a warning that looks like the following (with some differences depending on the browser you use): + + + +The warning is due to the fact that Pelican servers by default use `https` for network requests, which requires a set of TLS certificates to secure the connection between the server and the browser. If you don't have TLS certificates properly configured and you turned on the `TLSSkipVerify` configuration parameter, then the origin will generate a set of self-signed certificates that are not trusted by the browser. + +For local testing, it's OK to proceed with the warning for local deployment. + +## Test Origin Functionality + +Once you have your origin set up, follow the steps below to test if your origin can serve a file through a Pelican federation. It's best to test your origin while it's serving public data to minimize the risk that any test tokens you generate may be malformed and the reason objects can't be pulled through the origin. + +1. Create a test file under the directory on your host machine that binds to a Pelican namespace. This the `` in `-v :` argument when you run the Pelican origin. Assuming your directory is `/tmp/demo`, run the following command to create a test file named `testfile.txt` under `/tmp/demo` + + ```bash + echo "This is a test file.\n" > /tmp/demo/testfile.txt + ``` + +2. In a **separate terminal**, run the following command to get the data from your origin through the Pelican federation + + ```bash + $ cd ~ + $ pelican object get -f /testfile.txt . + ``` + + Where: + * `cd ~` switches the working directory to your `home` directory + * `` is the same URL you pass to `-f` argument when running the origin + * `` is the `-v :` argument when running the origin. + + You should see the output like the following: + + ```console + $ pelican object get -f /demo/testfile.txt . + testfile.txt 36.00 b / 36.00 b [=============================================================================================] Done! + ``` + +3. Confirm the file content by running: + + ```bash + $ cat testfile.txt + This is a test file. + ``` + +Congratulations! Your have finished setting up and running your origin. + +## Next Steps + +### Obtain the Public Key of the Origin + +Pelican origins follow [OpenID Connect (OIDC)](https://openid.net/developers/how-connect-works/) protocol for authenticating users for object access. In the OIDC setup, a user's identity is encoded in a _token_ that is _signed_ by the origin, using its _private key_. The private key only lives on the origin server and is never exposed to the public. To verify the integrity the token and make sure it's not tampered by malicious attackers, a _public key_ generated from the _private key_ is available for others to use to check the signature of the token. + +The _public keys_ are used in a Pelican federation to facilitate user authentication and server identity verification. They are also used to register a namespace at the Pelican registry. The public key used to register a namespace at the Pelican registry should be the public key of the Pelican origin that exports and hosts the namespace. This is because the Pelican origin manages user identity verification and authorization for the namespaces it exports. + +#### Obtain the Public Key via the Admin Website + +To get the public key of via the admin website, follow the steps below. + +- [Setup and login to Pelican Origin admin website](#login-to-admin-website) +- On the home page, navigate to the **Data Exports** panel on the top right +- Click the icon to download the public key + +#### Obtain the Public Key via Direct Download + +To get the public key of via direct download, go to `https://:/.well-known/issuer.jwks`. The public key will be automatically downloaded as a `JSON` file. An example file is as following: + +```json filename="issuer.jwks" copy +{ + "keys":[ + { + "kty":"EC", + "use":"sig", + "crv":"P-256", + "kid":"sig-1712605941", + "x":"c3BhLEMGqmO98-43pD3R5DJtUGIQf4McsNBWuVTorVI", + "y":"eWssaV6WrG4kVla1Ygdr_qUZeqgN7I2fDeb3K1qL0qI", + "alg":"ES384" + } + ] +} +``` + +> Note that you need to run your Pelican origin before downloading the public key diff --git a/docs/pages/getting-data-with-pelican.mdx b/docs/pages/getting-data-with-pelican.mdx new file mode 100644 index 000000000..55c305656 --- /dev/null +++ b/docs/pages/getting-data-with-pelican.mdx @@ -0,0 +1,31 @@ +# Getting Data With Pelican + +Pelican is built on top of HTTP and uses the most common [HTTP verbs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) to interact with data: +downloading objects happen with an HTTP "GET", uploading an object is an HTTP "PUT", discovering data uses HTTP's "HEAD" and WebDav's "PROPFIND". Because +of this architecture, any tool that speaks HTTP _can_ integrate with Pelican. +However, Pelican's official clients -- any of our tools +designed for interacting with remote objects -- make intelligent use of special information provided by federation services like the Director to +deliver the best experience. They also have built-in optimizations that help interact with data more efficiently, like multi-worker object streaming, +automatic retry policies, and tools for packing/unpacking objects while they're in flight. + +One of the Pelican Platform's core goals is enabling data access wherever it needs to happen -- whether that's from the the command line, from a browser, +in an HTC workflow, a PyTorch training loop, or a Jupyter Notebook. To that end, we've been working hard to develop and maintain a wide range of clients +that meet our users' diverse needs. Information about each of our clients can be found in this section and are laid out by client type. + +## Which Client Is Right For You + +Picking a client starts with understanding what you want to accomplish and where you want to accomplish it + +### Pelican's Command Line Client +Pelican's command line client (also referred to as the Pelican CLI) excels at broad object manipulation and management tasks, including writing/reading large +collections of objects, syncing data between local and remote resources, and discovering data that's accessible through a given namespace/federation prefix. +For extra detail about Pelican's CLI, see the section titled "[Command Line Client](./getting-data-with-pelican/client.mdx)". + +### Pelican's Python Filesystem Specification +If your goal is to integrate Pelican with Python code, you're looking for our [Pelican Filesystem Specification](https://github.com/PelicanPlatform/pelicanfs), or "FSSpec" for short. +This client lets you interact with Pelican objects at any level of your code, including by plugging Pelican directly into popular Python libraries like [xarray](https://github.com/PelicanPlatform/pelicanfs/tree/main/examples/xarray) +and [PyTorch data loaders](https://github.com/PelicanPlatform/pelicanfs/tree/main/examples/pytorch). + + +### Pelican's HTCondor Plugin + diff --git a/docs/pages/getting-data-with-pelican/_meta.json b/docs/pages/getting-data-with-pelican/_meta.json index d6d78259f..34abdea6f 100644 --- a/docs/pages/getting-data-with-pelican/_meta.json +++ b/docs/pages/getting-data-with-pelican/_meta.json @@ -1,3 +1,4 @@ { - "client": "Pelican Client" + "client": "Command Line Client", + "fsspec": "Python FSSpec" } diff --git a/docs/pages/getting-data-with-pelican/client.mdx b/docs/pages/getting-data-with-pelican/client.mdx index f989afd61..8f67ded8b 100644 --- a/docs/pages/getting-data-with-pelican/client.mdx +++ b/docs/pages/getting-data-with-pelican/client.mdx @@ -1,6 +1,6 @@ import ExportedImage from "next-image-export-optimizer"; -# Getting Data Using Pelican Client +# Pelican's Command Line Client It is recommended that you start with our [Quick Start Guide](../getting-started/accessing-data.mdx) where you can learn the basics of Pelican Client commands and learn some useful terminology. diff --git a/docs/pages/getting-data-with-pelican/fsspec.mdx b/docs/pages/getting-data-with-pelican/fsspec.mdx new file mode 100644 index 000000000..0c89d9d25 --- /dev/null +++ b/docs/pages/getting-data-with-pelican/fsspec.mdx @@ -0,0 +1,25 @@ +# Pelican's Python FSSpec + +## What is FSSpec? + +[FSSpec](https://filesystem-spec.readthedocs.io/en/latest/), short for Filesystem Specification, is a Python library that provides a +unified interface for interacting with various filesystems. It abstracts the complexities of different storage backends, allowing users +to work with local files, cloud storage, and other remote filesystems using a consistent API. + +Pelican chose to develop an FSSpec because it delivers maximum reward with less development effort by providing: +- **Unified Interface**: A consistent API for different filesystems, meaning many users already interact with FSSpec in their projects. +- **Extensibility**: Robust support for custom filesystem implementations Because Pelican is built on top of HTTP, our FSSpec is built on top of the +core HTTP FSSpec. +- **Compatibility**: FSSpec is used widely in the Python ecosystem, and already integrates seamlessly with tools like +[xarray](https://github.com/PelicanPlatform/pelicanfs/tree/main/examples/xarray) +and [PyTorch data loaders](https://github.com/PelicanPlatform/pelicanfs/tree/main/examples/pytorch). + +While we're careful to say Pelican is a platform of tools for working with _objects_, because many of Pelican's storage backends don't have +a true filesystem interface[^1], FSSpec lets users interact with Pelican objects in a more familiar manner by translating common file operations +such as reading, writing, listing directories, and more, without worrying about the underlying storage technology. + +## How to Get it +Instructions for downloading and working with Pelican's FSSpec library can be found on our [FSSpec Github repository](https://github.com/pelicanplatform/pelicanfs). +If you have further questions or feature requests, we welcome new issues, contributions and discussions there! + +[^1]: For more information about the fundamental differences between **_objects_** and **_files/filesystems_**, checkout [this publication from RedHat](https://www.redhat.com/en/topics/data-storage/file-block-object-storage). \ No newline at end of file diff --git a/docs/pages/getting-started.mdx b/docs/pages/getting-started.mdx new file mode 100644 index 000000000..d14d54376 --- /dev/null +++ b/docs/pages/getting-started.mdx @@ -0,0 +1,39 @@ +# Getting Started + +This page is intended to help users and administrators find the right documentation to accomplish what they need to. Each section header describes the +type of actions that section is intended to help with. + +## Getting Existing Data From An Existing Federation + +Objects are referenced in Pelican using `pelican://`-schemed URLs, which help Pelican clients identify the correct federation and routing information +they need to find the source of any object. Whether you know the `pelican://`-url name of your object or not, you can find a quick tutorial for interacting +with data using the Pelican command line client at [Accessing Data](./getting-started/accessing-data.mdx). + +For more complete walkthrough of Pelican's clients, see [Getting Data with Pelican](./getting-data-with-pelican.mdx), which discusses each of Pelican's +clients and explains how to find detailed documentation for each. + +## Adding Your Data To an Existing Federation + +Integrating your data with a Pelican federation starts by serving an Origin in front of whatever service already holds the data. Origins are a critical +component in Pelican federations because they act as the adapter plug that lets a broad variety of storage technologies (posix, S3, HTTP, Globus, etc) +interact with Pelican's clients and caching infrastructure. + +For a more complete discussion of Origins and how you can run your own, see [Federating Your Data](./federating-your-data.mdx). + +## Sharing Your Storage Resources + +Pelican federations are built from the ground up with distributed object caching in mind. This lets well-established federations like the [OSDF](https://osdf.osg-htc.org/), +where there are many highly-performant cache machines plugged directly into network backbones like ESNet and Internet2, operate much more efficiently. + +If you or your campus have a storage allocation through something like the NSF's [CC*](https://new.nsf.gov/funding/opportunities/cc-campus-cyberinfrastructure) program, or +you're otherwise interested in establish a cache for your institution or the broader OSDF, see our documentation titled [Cache](./operating-a-federation/cache.mdx) for more +information. + +## Starting Your Own Federation + +The process of running/managing a Pelican data federation involves setting up two primary services: a Registry and a Director. +These services are called the federation's "Central Services", and together they handle the registration/verification of Caches and Origins (Registry), +and maintaining an understanding of where clients should be sent to interact with data (Director). + +For information on serving a Director, see the section titled [Director](./operating-a-federation/director.mdx). For information on serving a Registry, see +the section titled [Registry](./operating-a-federation/registry.mdx). \ No newline at end of file diff --git a/docs/pages/getting-started/accessing-data.mdx b/docs/pages/getting-started/accessing-data.mdx index 82f1c690d..3733f7cb6 100644 --- a/docs/pages/getting-started/accessing-data.mdx +++ b/docs/pages/getting-started/accessing-data.mdx @@ -1,4 +1,4 @@ -# Getting Started: Accessing Data +# Accessing Data The developers of the Pelican Platform believe data is the lifeblood of science. That's why Pelican provides a suite of tools that make it easy for researchers to federate their data, giving them the ability to share objects from a broad range of data repositories and allowing them to connect their data with distributed computational capacity, such as the OSPool. For more information on Pelican, visit the [About Pelican](../index.mdx) page. ## Before Starting diff --git a/docs/public/aggregated-objects.png b/docs/public/aggregated-objects.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee5d0e2ee6b67e1119c3980d2958cde3bd0b7f8 GIT binary patch literal 149680 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

RVzyi0*MVr zzJ#^Bm#29cKiIn%<6orxYFX??{5E}PUh1q( z@)x`@?n0Z8n!~tlz0Ec{_wf`nB-f+`;dBI>jG5ld=$3i>Mz{NlROiiuR0>*ebBX4o zdI9JMKjz0s&B?snW;S%*F@n$?ku3KV2*oL-+TLxmEHrOJug%ul_ zn~^1+obliss>Zf49nZ{uf=_p}LUl6xHkGd!(@OqG+%{<^g>sleiz%i~&&Iitx0*5- zCc%(`hh>I#`C7PJwC>wpkNhu11*}bh8^e#aP-3=Dn|OnfU$0+KfZ(cW3kG6LO=w4=0?k-5WaLD2Le{=o^kW< zr@z6s2|{SAM)DMw(zgo2P@3T91)@IDj$ni_OkXk z^hdIUMxv#`c9{8;`5=SZV4$^DOfuunkHLXdoeous@uCxU$1!8@6r|Ht0zQ9Zvcw$7 zG|m_^Pcw4zQe~j&W<0J3NPl3=@|6?MK=UA#SD>kGD{O?{{N^|AKmYlU*%X|9#u+)q zD0T6?Hp*t(7;wM&=37YRFg5QhR!1d*v9?_-lxi^TmG>h9y_s|#trRQ7UHX%>4+O{v zs`7&I&fC7}7i)2?^3iu-rWY>UNvhHZtPgB11A1@&Q;T9XScdIWm>AXpX zpBMeJ>^Qs_(0o;!&NNt>m#^dal>uU2BwhrpC0qg)tnV+#l5=Xv~X=mk_`26QT@4oT%ue(3}=}+n6mc0J*m%r@x+H+60r+%OP>=`+< zEqvMNqRI&I-?T}N90YIGz^w!zxaXX6j_p=Z$$RCewV);CC(o18_aoE<{ya~zy17Le zVf2wQZoBQa<_!!ZkvmJ(O>vv2AR5?9p4N6ta?UAdmx@|c{7;u%W@DT2{mys1qZUP| z>Nns1wznnqp>8<zQKGHsuPPPAMR(+lhOLYRO)ZMonB#clSZJC!;Qn?{$6c3 zwn5YqW{1tbH)=KDe=tb4qksZ3vR|ip18Sg*ChETiw~vc6kk8Ud@seQ!cqDZYfV`}W z1}FDh3F52oA_4ODf}WZ5-ybVcvllmG)0Q_spEz~I5dDe8i|y|I2ON-kTE?aD=K;JS zJxG@?dX9>y%i_AtoHfG;q<^oR;~)R{NB7c~zSMp0v!AU#)0QAC+B3GC@{~%0dLY`n zQ+=inMWtS=&2#lF82{1QCm1K59LZ0;m%TO^8{AhlW*Dby)~t39KlD&E;j0bmt)Gmz zrdJanVP@Pen7_cy-Eyv5wrp8WTN}L=J!bKVnF|YdBu2~$G+{Xaqju;ahqw>?&;M9B zm~!6nX)xc2zE$SO{ENeQgoeP#jvqf(u?okU`g0gRpM9!A474&~Hxl=ZM0d4>f#)rus#igVUOR&L17j7e1ac!&5kKtB9( z4|{_3+MU4os4~a&)mL2=f7H2y4mv0~AIOQ>-qHT~Ue-q#;fu-M{0H&tBjQ$ zcG$r!x^IzNwCG;9^Ugb)clAg`N!`>trvDo@Zg87V-`swvKcTOT1%?KU2-luIz{suF zg4Mu?T=Ci*d(1J~3;5pRiPBH~oFMwz9>ir!C##2RY}7`_&Rpg(E#kram2cjvhw_f} zGKjYcD1HsF5lVT&^Fl=-{6-J)dg5|JOfee9772!pF^HrKNmex&wxk>ye9@{6kD55P z93K-<6!x;@o9yAriq11^QHuP3S=~e;`?A92SteIsb4`-jt6uf0~ZRGStyT) zQ7!beHupijZ+G8sd|&q06_reF2!oo#1y+!V~1UJBuo1>+7o z>}V2nCUNtq2FDqmYu>nweQdJ2Sg`0Ea|bje=J^=U6=5M69{lpJSi_V9KW~-5fHFYi z2Sk$w{^^R}q_C6YL5@)hi#buwvT1zzikDo!#`+z%yCbu zW`faM@NSi}-pgHws2uVll`rDSQ>fM&1%T^4}&A> zPHcI=ErEG4fcNnc8mmqjBHj) zGr?iLs0cQw9~s0r4WHNbdEBO~lIJgoqWQBG({|f$ACE1SK4|y4u1h@^PJ@T2{EYMM zci7%0Hd`#{y552DyGl&vPCM;nbhB3F#pZ0WY;wWjym=+YcZG#S3&R}XJs6sVEb(5IkC#IlJ{$omatgFVZ-az z%zRpiYEX-kWZx_Y1364vB%P4zFSiFL`Pg$kURDXb55&q#J0FTacmj26lHa64 z!-!Iba>|;oES|746P>sI!wXZcC^_X{Ti{VYD4hMkq&OO)t z```agK8J_Z9((NRzVxLp3ORj^J89A+^FHjQ-2$=&^Ynx7eb4>=_rEvBj}Rdtkl#N0 z?Bl+C)>-C?@1H&M?6dAQ2ON;B()|6G?zNX2E6M1b*|Xi1flVII9}si#7hZV5 zefPWHbwB_4&l4vq{}TJXGQR&uM*b`wD*+aq@BM%OPd0{&lGncY#V=ajxB*=T_{N!{ zF;@r=ga-*>x7~Jk$H->weMgJF=s{N;(go)0FgYK|vU>P}kCwYah4#~7jMl$!IjQ%`f}pZ~Rf^+q*t?X}mqgAcyd%@*V2p}l>Knj^qCO?U#2U075~%zJ#QS-%U5&*%r z2jO_fn?DVd<47@xk4l1`51B z4S_lydE}9{_zds+^V@H~&3*X8x4A2?yuy9|``!E$3H4`Os5+PwO!$FQ(h+c z>Oo{LCnN|^n-bonrM<;H_SjFp2M(FUYI`^Qi%V3_uXe{{0leSaD)5(C6~Cj zmx@0Xq0Z{UyBLpmiNHs(i2A~-u!^+6#v)E3L}5R|I}LVD{WXqgua5ci%|68&7dKc< z8m73=tS%N<>Pu!{i>RV7F&wsfdC4^@(S7#a*RiO&=Gto$M(biNgpkbs?7|C&q)aPT ztZ=W>nD$H#A9>M>UgTc(@|U~KL@TaUSzsOkn7Sk0{cd-eVow%YWLZM}fj<1#fBjbu z!*=q?Cz~|QGhC!a0{6;SzS6&D$Nl%;-&Dj%>HhK0e=4?H6n72DBISk7czEL*-)K9J zfF}<~DWOpSd(<-AS|nK;&Uwc^KFB{YnKZi19E#dM;o_7x3qRDnAwCEB$?WwiVL&?~ z&|nggYI1|n+qIZ7__A)N)wv*QU_4-SGimLh1o6Foj9HRI@0A0}hdf%v2ze&4oY%rM z{=GCa7pAG#bEKKrmW6>B@kC`s3xV_CC0qWQZCuX$(wF?D8A|`(MHjh_dGka}h%MJ* zYE#qzAp!NcvZE0HPZ2RsM9J)Y1@JxUz3;VHZp+26u`1qn+wI&*C!J`kQqnLn+$3AO zSIU!h%9JTK0bm0+PaAG~_?}j6BzVjXb*of%mV)9_zLcl}skb@6S%KX!x{|>d|VVTftE2p1s0D-`<5hg=rnllSrl}+(&oqQDgt1!UFmYjCoGIxQL%yqU_J$ zFd*7FT59!`Qbj(c2>wXGiRs9eWA(te9e3Pu?hM6B^i0LtHEZ0_M<1Omi2fky^<8(} za7Y_~(dEP$dlv9$i%VWy%F-grmZ9Y|!_Ag1D`IWDH#ok6LhKd!&st}-kAe_*( zfvLzDXPn_qm$VM>d2`OUJj~F7@drQnfjdYGNc2I>WuxV|bLN>}a=Z`x{qKKwzn10z z2_Eo`Z+yd!Fq(JYeYc&H=bPX17CYw;!wD_V?z`{q-u&h_+kNkZU>9}%2U}q10c(tq zP8f;MO_=&ds!yGxyDG(N!3c4U?Hr)c89GOWg%l#5%IqUFrd?Z0R^__|Gx49GECT@s zZ8&fTlE+ZLVC%4n_*{~G}nK5k9cGl#9bPH)6(zL@5Kish! zLOzJ_)$2k=3h&gTq$XuVBYnaq4XGb$pf7wuws8SGp~Y0cYkXbAG0m`%9})uW zT|D?Ldi-^%qwmA?U-}a&0Dh5_EmHSeU$_2VD!0ab9ui_|K#*92^n>Vb_P0_D*u>Up zixT=U4j|G`M6+O}c~v<*Qt!`c_Y}{tk^O{;6WxWP7v2_&dtdy*7dTWER*O0OwRRBj z0Hb*P@yF-TX6VkRKK*Hv=KFLoO@#oV0;*PQ$vi;QJj3Siab&lcFdeiFjR3e{5esc( z|7+gGPR#=nI|LZz0`nES#k@ore@b|r^fqePxI=!hU8gZjci zOP4%Gn3Ne1fVG$BoN7>3EnKB;?Qt6`7&tX3X30;&nDL|2`*Y8%6=Ev6pYIt*Cp z;uWvx$Kd?=&wozJ^EPe$LJ&~$35hic-X~-JkXUoi7;%evw@{wLc^?Nj=34{bUm+9%+y*VGKy;b?trHBiqPwm)z?hs#1%{%O zeM7yKo$|1y7V+aE=}r{zmw}8|5kH6qBK30NAOHAAB1wa|r6Keb4W)2MQL)%E&q@&% z2qf=caKQyh7TBl3SkB#YOZSqOyu`gkHXAvhV#4U)0rs3!q}R*l<3_0w!U*A&uEtQK zzTpjT$oY)FfH*%c`<4f^T^Ezd6#zc(|A;2!y15$cSAMmoQ z7T|#30rleCxpVzxzvElPQ1L4UY#|i_OjyWxhR--hn(qPAj9YHG#b1^@q6%HOaAEOu zp21NnPEjL5+p(by&0C6RQv0X2xL5z|kpwbw42&2!geTaR+g6aZFJ@MP00aGXalyly zoW{HiQXN!RjmWeSCkO@uNf)x6cBwaE+HfaV%x+_zDjC>+`O9CDra;6W0^bQ$qjTqO zDX-H`;f_t-dyF~6h692EdBHIu1k?memMn3zmDbPSFisf#|Lt#oGv&fY_Cb3V6i#2szdPUk&`77w{EvU z4j}7f=+1br6-T^fYMiIrfJIsesCBE!w0VzlzLA#hhu*I$NbC{do+8% zDJpb~^7jiJ|0<8vz4zYR$_)(b&o|i|DdTnXJHKE2H3VxqWO&g#+V^s=#*_+ z049moHPW^W>I(yP$F%wB9~Pq3+uzg|&PtYsfsWW22&GWmg2Abj$+;?yZH8JAZ_W@f z`VV2^#0fUgOx?|L3F2W4aJSjFr3ok=pM-{h@U)B??JoV}A51m+^wUp=*;f6W7*BYr zVh57JFkwL5fr(|i?Y4CfKKOvUUmm&(7HnH9zG9dvJ&d0b@qz(n{4=i1@x>FgVJrrp znks2_F<`NV4W3_&Eh`e*qfkB}Gm}me(k1BDP{2{|J<7a2QTK)b%}vK+3!j%dXN)}d z*kf+`^yy~%1{w8$7kZBvoVBv=B~%jYRd(nZ%hrW*Y~Wq+GNHnlb3Xs!KH{updpPr9 z>Y4Oc7W|q!g1QfP*|P8D$3T5CZE>f;ZJwBG5WhwQ2CZkz23rSKthe5JtD)flh4AqC zdc33!_}57_E2?2CSnLsyRHBac5=)q+5MVC(L2OWa=G*AKqoc!AEfzXppMBlluh`oi zbl`!`t3Zko@9@x|CCXg7Id;YCK=xO`>u?_|dcFaSZ;7(+U{ z-FDks0N&@HUtytG2#9SnPzBj#N%LSpIEIY%W7wGanc;^CN|_R1hw2$NinLAO?Hv{| zTy%!_IrlbP{(eXYLaANI!1=TTIeuT>pUXrK3H}SP%fVL_)b`^ie%$5@pC>doWJu9Y z?6=>3{&CSGb-)G=+u=UiO^ZgbV)Yt#=hAgI;ktDXrX(NOB!a)5nZBZ|=fikAOaTzw6H_cduO&&6I z;r&AAq2X;ldo~!ZkU+7*QRgTQ(|p-IVLuAPKAa3i z6>C$!Sp^dyg=C99f|bI%*$g?vB@fk;`978Q#Af@md|(p$d=GSQrR-co2x(22-&0RL z6(;L<&O#Dz&sno(xvj-KhT(#IV!UAA`ObHm=7P9s-j4S(pZT<$7Y?(KC4AqPfyJM< zV}q_7|M8ETN)y#(DF|tF$cXaZGj5{WFmifJPsh>`~%&kf>~?_0!T3jxA1efs7WSn{F34&g>4%w?I1d9@qOK*NCQcCf%Io7Jk)_|JtVH(N<5C!iDY7x!o;v$?Al?~N z2Lr;TWEB?Z`Qe8jvPs-_P8bFpGtLRSQ3(Ee?X}4xq+*j43dBR`U72Rgd>W2-$qqGy zkiqHb=tv$t^2j5OEwu^(p7HNL_E`6Z*T3HFDyM~fjN;sQyC@c!-~86Ma{i6AyvC_%*5lWnx{Vm^90O-aJ{$)jEXX)KNg>A<>_4<-(;QZH?+*E-Y- zE{C%mb;BLeN!Ujd2@!)Rgpe47_nZBkdS4yKXM-_gv*Ud5mLS;U|NY8FOkd7v^7*dAaoAlGCaIW`v`}? zp2QyT;7*TUp0SM-`-v6;7GWMx!+u+#gbD#$)OmQl7`J?}D*bbgm}!KeJ}@6SN6Z%G zq;4BGZ8Y-=|IUpH{{8#k{odvkBumUM#GFKh361^P&wggX!oR64y$C^+mJEjT&&DN> zC{TC2pSIeOmV}{U{u#SekQn`NB_Q)rXnJJs-zy83CQ+ittfJu9geaIkg;C@>q%q zV=vJUX!GYZ;9&}}>j+lHq`6d)(sLog{x`Hs0z@u^HK`T-xRentwkIJh2vjjh1lS%c z4Ub99`$mNY3DrChe@}4I>9gy>V*uO|$IYZcgU>F@0V$?_-3q>nx(-I?i6<7jc9|~> zM?c2)>kl$T2mwhGQmxR@=rrw25W>zo@0?uXIsTQi&PuL1f$1R+uYSyV7+>I}9&Skg zZAr&Mt$}~%7mC*yIwQSN0fEZ_;=Y9;O{l}&ci&@i#fX`QlLBE+JRE=g#~jQXz# zwPa|Ha7qOI^+2c(w%r3@#E{6fjUDeFyZdBg+x5^LuD45)z0ovq#Df3x>dV}BPCMRx z@6?aEZ=H9xTfR=)5027KL-OPY{2XQ%HU2|cXhZs-9mDdd&ZeaiZpMxsS6Af@i#d|d z>&K>zR)BGnw2dR4If%*e%t1s;M~j9?UvtsvYCRZ+vJ7FUkM!16eOPejs?Sz1i1-0i zimY_st1YN7FeZ$~h1y>*G(0991c`WZxUY98T}MYp5_01#5o**5hscO`8|}4s%PqI+ z`g#k^!Mh=_jaCS(ltVi^qL{Nf#@6mSg%R2J)vtEH{N*q06_~P@%cc!`Jsd4yQX#H{ z8%dX!7m)OAzWL_i=d$xEVE}J2qzvP<2jc=wct|a3J-(_`wc2JQIz=cD7&oNMs2^v} zoMnuI5Im%1`+suyVQlU7(wCZP1KU=yfb;NSsRZXML`ewm(Eh%siwW}M@2j#mWpB>? zH9nWftNgm_u1lVU@1@T_t=$g(PrCz<55IRRU*fT`e^lP9MrqHyNQ6>P z#iB%_Wf;9<8-Vo9g3^i^pd*#)Ox0$j()pQ4xgQJ3%B;Ff+uri#ByFJ+_9=w${rJZ}wj^7L zsl$^rY!`xI5`QfX_h`~0&?Y-Kgw6=*bpHA@Z8LNJ*S?la5)kSmk37;p&W_c>fW{mW zHWp3y-g}RmtUkwNzDa7NJYBt7UmY>|KpWUq1gSKP@qz_nl&Z|Iv3(K}FaRmk(xpq2 zagz_x@6lrFY}u~jh?Iu!YTKt!1(|-%H9M@ZK=cx~`@{^+o;^D!DIV#^rX+hg3F3xz(T{%Q-j;`^fuQ1Ne)nhYE2kV6-nR3TK6jRT?Xf4S9b4RYPdzS&X}jft#ctuuNv@?`+hxg^ zKW#G7FS8-OLI2|ipcZCM)vDciHoIw$6iiok zTUyPtgC-L|~f-MxN-o4D(N?%dy8 z?iTKv+7%(n!oi%KfByMq|8exueZ&o?1VVF!z-II8eVB%a6cY|SpB zXo2`O(E=ng9-;u={wg}Y@>Q>L|CD(ICL5tsQ<#d4<^Q1tW5}@aJfwN~@+J*xQOe`t zbJ~>N%q`Sq!SMV4`@e0G>Q$aTU3kQf4!gLJVT+iYNa}R(+u!Zp_sP$?iCV~n@brq6 zx|9}3-)fcQF9gXN^!-R;XC9j2!y25^|Ik=5Z*pXA%^B6!9p&+=yU>9Q>K6m`DQQdN zivh@_LNC*iRSPOTE^YOo2a-_RJ?`_oka2rD>vFDP47r@*P$qmU0FHMR~28~Hr=*kXA)O>*7irbvn@ z8;8aBxt7hhaig@asH*3dJo12Becvsvb;C+GZ^3qMr-eJpVPT3%Ki4W&5p`{siovV1 z3zZEIHoQ`4k1Z92Jx#cA_lG%PX9NIy8o~uYSTd*q23UM({IHSqy<)_f5T{L@HY}>V z8q{_~d=hC9Qgjx!d+fQVn^|G7Ti(aMcC{9gFBL6GOVi3lBDDH3+1etV4FSeODMH?Mb@>zFykbt(_EMTMB-eBT}HJ-k*i zbwCvw0zwYFXc^m}s2`}pCTVMr_GhJyz*`3Og@MLk+EO?}_YRvzcVb`}#CGuq~(Z?%GL7!O%pMGPFacyXcPBG${{@u!x$`!CKVme)7QAg zVi^f%HH99-QSXuTjfNCwL~^xgpjhV%JD~a_j26HioC5{F!oVTIGi>C=;N+W>!OpoB zu!@a-UB=L?UAxX=2Zd_eC}r+nn8V=$zJyBm(N)^qc#;@4;VP<+DkR&B-kxahJnpf* z$r!D;R*aeDo_k@n6Q34=lA@~48{;cZk{ucx1N3j%w&{>bJcqg|W?;W z{w$`Eu#J@#z%y)vrLhaPp5t1ce@cTvq#uS2noYaKZN~w58{VXylCsTdS>raFJV8>r zNX;lVNw36-hZyxRmF8#=n-4JuVoublYm=}QVA!aOFQQjP4_BFo7$r@YeM2&B#ah86 za2i*1P;5v-pc9tU5q%mME_+AElE4fnpyR_dQV!m?K_e9We2EN+achy0^0OPHK7|n$L1b`S zMx~1y79%@vGz>5|smx(BBjL6kF~XaTR+DHx)QY7M<0j?|-VH?xKgeQ_?rmJR-c4KgwA*UNRM**q0gXU^ zY=2Klt%0F#-!7?c(F|cn2cyO{@lV;N&bpix%8HWvhx?RO#q_uvEZ%ZIkX=;^15L-Y zffza`3=%HQh>JbY2`lM{=3t=Q>>W>JeP)G@!JvR~>=ffjEHq*@5w&~G8cE=^@_~sX z|L7Z0X62MEl+34#kneqe&)!oRRw#Z@?`Wwy4T8c-z1zESUBr;_OpmBC0=BiS6AX_K zCl9P*nZz>~85p3abc?C)(nNrIe5fa%rpGD>)c|80ZLS>&9(w3O3&Vg~PsnZh>Q}vj zLK#>?s#R^(9({fK)G2Pa8Dre!=NG%4H7}SzV51~yoAm1xJ#TyAS+{l1b8e?OQ{5&S>6%(Jd9bA!DvPU(-Kx>V@ zJM^E`ATjS#F>TgqHSkzLAo^wC_+P$)_<==Qm_DPS^y&)1lU`I!refuW@{wPIsT+xv z14GAFB8+LiXUq^6_FsQuh(zqr0^;q&9;>8_Kf`tGe8mfH_4;LQ)q0teNZmMje5;#0rOl0>5J}iX?2W7%Vf3WdCJ`mq zaVW~i;vd04qyklw`tQ=Z;dz19hK4i7Lyz48NweEE#y~?lB2bF_g3Q^d+i;LBhuD?P-j z&SYKjyJU*E-e>RA!(=h2Tf}nR^W+M*Y~t36!vi7G8>EkqWY!xm%E-fK)Vpq_+ilWD zH)i}q5rr-r*laO1O+<`+OHB=(lz|sBXgUn2lc2s^rg(vD$3$2V77486trIm}g@>_1 z!fl&ydEcT%W;{Qyqr=o$8D7h81E?pSkI>cedE(BMpHtzKA;Z-x28rDcOk1M%>xRZ^ zp6Evgp{<&KCTf?MYBOtLN!Lj=%U+?H6hyY8`67H?^xV^bO#l-nj5FazSl6QOW)FuQ z1I@4B(jaE#%8x;XeSxVg6{Z8%Xrx_fFs4X1Iogi|P=#tike4|$SlM)@^0D$}BJ^rg zjxbOhVUFyX>R^myQZL@+$M!7xNjhlxXb{^q?}^A@d@*^fR9gyP5){D*jjEb3Z1zD0 zGQ(d9$8@eUM$J5@R2G=Pi4!I`!gbgx6ueN#44M}MnvJm4+(O|Z<|=f{A_Yk%e1I)_ zvbG;|yJLey_zScF;Mpel46kM575at!7Bq@;z|-;QYVd!J*2Qx|r)Y1dX!0ht8|TC} z>&LL^lZ+2SepJG+Ra$Ohukmdb_oCPpSJcX_GKSF(Dk*QpAIx4D6b71~X#+iUXp>7t zM{eQvY>bUM`r25U#(ltd*ob(>2BkwuKy%7x1rU=aW;15sA|@`nPcdv@>K*FUSGS0{ zvtnu#+A$u#cCJ4?y`$W;aqX^s<4V`9mM4`baO7hHU+I+0zCs+jZV`kn+BS)4Lz5nP z6jB1DE_ldV8AxvLaFRi@Vt{eM1TkyoOl>75JFJHvj;4sL?FZN7j8{$kFl<|Iy^YZy z8?zZ+%g3v51-hVFn>r)gE>FkH&!oJR8^?CmlQ{^kDoIF$~R`U}iA)CGWIrq54>0^i;Bne$_ z#HIC(dDR>BEG`^lRzKrr%@{B7KL*mmg^+>zc8qM`z!RQH5echm^|Q?C6a$PAJfdgM zo#Up+I6I5gSEYsu=utHDS1I2Sl#R%e=(QHFVsd;y-D+2#{tuwJ;hebxTIp#Z7QY@~ z!lS*j`|kN?#f~szXn{=PMy29B?b~ry9B@29_~6ZFf=?IAzTY#OCp5iStkHf?vm5n> zfsxC!1ubEY0%BPZWg}t-7zhj=<4l6IjeN>L@6_PjYV#>>!_!Z?XL{$l)(PWXOPU|l z>acT@R{krWaSNwQGBKX&@ap=|#|z@VwwdU1%` z0UT?5Opu)p4mKH75d(c4+A_t_#~c$<_pA8D=E=&&zGy&;9LU7DtVm25Mv;2 zgCYLPh|Qh}n^;?Yi=t@q9K6kU(^kK2Gjt_mvK8Y-w6=BY z*2;Z-qkCb4_&9kTOla?MQ^&VSilV{W)-K+zKf~q=)+SXlQNMH4u>Rpt9%E(!DMYyC z3U(i?upva)0g^0(;l)5E8LA?_)sOGL|9&?|jvrGMY9et^sNyG@F)MhT(UNu%^UjAs z8tQt&bcGCJ`nuTn*A;_qu&vYkWT2K69#?SMADyGF*WPv_z z+*s3;kQ7D@m9jB&`SQ!|)eQzRrmb$8VwejO4{BCeivD4tLQpJX--g1gTefay!&Yo1 z2?Z$je2A)4iYOCX58_vf01i>{Mqak+2QbfU1`g5RTAR$H<_RaUk%yE))>t^jzV`W* zFSx~zKkjzgX(x?Qf*Nad`WbkTpJ;~HQBn4j@_3t7zJY ztRn4-oXhMRp47rzsbBP%EgMk;@+?l37RC->AqzSfmo^@C0mJ8|kn3dL0t45sEekV- z%}`eNe=?@6?we@f1vD{wtnMwEiw)$y6gDT6IWa6>zTBO6-g)-&!3Q7g_St8jzKjNW zMl3i88)}Gcx7#kt4GJWHSDZL;VnN1W{rU~|uD4N)-s=DN$tRz5k3RaS1Vg$V`O>$r!f*;4*lHzK_EX{d2>H^=_dUw@pO7FLP`LSvB-&Av%D^ zCSL9A4{g$ZXhVP-f|VDOw!ttF(0Ij)6>jd_xo%7K+u;Z<>!onS0ELla+bQGJRCvk^ zQw2~J&b%`mOw~Bq5+fDcumM#ncGm&Z7S|tXH~B`nM44c(M&8&*!q8Dq$^m4HD?>xW z{K*^<8m6fRP|#?xR{BLzhk(|VP9LPW;_}PgH@^OLyR-Xly9G}Mce-@xQn%+GdnB1G zRzTOyHrp(^R$(DG5UoP1LyVBwwZRBqOw5wZ;uCC0-t@*d8sXkeWxwuke@iFHuFJsy z?I9JLjw7qaQyMcu;u+ucC#`Js4cL$ z!lQKCZMSs~D~8*um8(qB5lIm$%PvdpF(B4N!_7?d!8`Z32G<6isP*Y;!B$nM!^pLO5-<~QA|U;S!3k3W$dd|B}BgqfzlR|1}1 zVZ+8g)R>{LxIu+Ge(X4tqQS7y-ckMpe~-LLb<^tOrPtURC;cF1*jlwGFrKR+!$$f1 zckMhMG2}r84TFJ9($+9dRbfG6qD2r~m^W5*1~$O^@*>$l0WZyKuDQlu-($}`Wh^~) zpjlP)9=zJF_N{nzV)pN6ur5-XgQqb__pw7m z-B<}gr(nhs8#W3rMhix~O?d(^gzIExfQr*VY1qvMX`J_189ahhum(8G4~gkIG5r6QB4*QnLf36}b4~i`^70Fg&0( zMG6Nz^2j6Z%rnn)-}=_K{NtP>o|ff+r$Zdqiy7l+G&d%drXCfIhD9@GQ1lozsRap^ zvjOT-^B5J=Moc(8GQhTt{9xwTCM#pu%4v<}NE5U3%~6@G7X2{*ZScUr988%pGi>VWW*)#)pWE%5y7~jD9Oz+zcgZD} zB(Gx|`^#VcGKXQ~Aq&q>e)5w^x{EHlC^;YKiKjyru0^dzI3k0%Ejb|hCv;MDAB8SX z1Y+1Eg==pgn{46^!{!|&$QK$uR?nf~!xh>jDrEMzmKeyGwpwC;n7+-R##VxX4daIQ z5l414KoZracx(d!R;Iw@$&=k)Vup$VJ15+A*IlND;CwLf+;h*loB#0-w?dw)5IpQY zJaNpIFDipq@4K)2(igv&^LQ(TrpRE3Fu-gSPfUCPCc`G2jL8@@!kN6gx)s(&KMR!Y z8G%9PJoFh5g1@+}5sLn_Lg( zgpeNQKEOi8L(W);E*LUM*V;vsk><6vMf7@XOus`q2My=BXXJdg*|E7Xkf}$TyM1l4 zL><}#rOyLMqIyRYAXlnWT+hpdl`p*D{`IeaS?ZU+{N*-3+ZUic@u%3&_3QF1{n^ic z=AKx*I45U})ekxJQ1|Iif7*?gA#N#vIs3BI6+i#QFLLto`S6T=RSN+&D;~DkVhi_! zAO6ri{q)oBLm&L0znvY22m`2aHf`ACmOi_}&5>Q!fK~ECRKAAFR^y9k|C_Y%!JCvY zAfqgPn(>&AC^vk~TaK%T(xom?k@K9t>oXw&rQe zyfuM9pr(T9;RmEuiAdmB!C8Etyt(wh`PaYxHMx16_p9h7nNGmV);jafI2Jq?tdT4~D}JD6U&EfC!&_@+s~%85)}n9@IR8 zA;$oVhPL)ri-+~3Lbo76NcX`ZFGRC^K;sMJdO}hl;ePayN2MN%jM(e3io;0usFsJtyPjS3-OVZ z4-bFEP}7+35J}ad>rk>5p8K>M3*8UXWarI;flSiYJZ)L9CM>|c>pS}x<{RV?igoMO zYcf?fG2>M*Lp`|q>Z_B-Z$132QB?ByJ=B*+zUMuTqlXv0=tZVNg*e?J2^}6<0D(gf zQBdC7ZoADbko2t({Qd8Lw?}j4%yAeIs{|k>{!foKHTWJRHcQNK0!u$wOpvw*?q$RxRc6fryX}R^?17i#?GEI+d?tq z>x&uIN?{<{?r2^|hv9R{(j|^@L1>G5!e_1M!0Qe>OmyKc*FL7t?88h#WG3RhG}9Pf zEKR`2KmPF?y7rd0yd|A%P}hX|!0~`Zj3+mcTXwl9RIWjNFnhTvF_1BBP1&rum4Yy! z`oyr+i_-nkr-azsid~FXIUBBDd+oLMD%1grdCt#Cv5$xnXb zj{E3GlUpZKQJ`^S6DLKgXP(y>YE1_&`0)kqgCF{kh#820Ns@6tgEo+y zv2Z;5?6cit@+`gSrkipwM!Yrx?N$@`KH3b6wFi+=J257Fc#kwquI9J1yqX6CnR>K& z+OlX(ytIutK|r`7hgbk!O)9II{G5xWa_-)H?==RA%hw!upb^CQkvSV&7pP88QRMM7 z!$#VpjylQ+rhkuj{`}`Z`^$buBniL$?Qau?jRe%;UY(=fFa|Ckcjq(AjyV{htynlr(AHzyZo5FiOP}duFgzaV zhyI+mIgk5hPG;GKjX9(?#b@hFdee*(l6ZhIAIaw9l7QNeKi_AbF~J3T3gzl2KW&O85O_dT&pr_Xl{1BdhtX(Q*5R#w2H zg$sx(k^arwR_a~bY+27x`4vG^zR!&4d-N}2xJ{HTRo6+Ap~|yAf!mOApACYvOx4wwrYJN%cuDXFN)L}`dybbY+BI%Mz-C&_G^GUA}k z(+1cc9xUShStzcOe>dE2=Anlk%-I(Zui0WusLvyPOcUAgIgDI)ta@P;pFsr}umyzD z8^fk8hBj?*i=J5K{$*0qSD%y`N$+Hk z!T<(6B*B<}RnPtUm? z%mv>^dQTU|zF1_|r2FJK5c)KjvSjZzE(WsMrg7V@@{-$RDHn4Q4)(E2gC`u=wlO=V zw5XQ+26=3HI1qa_K-6dT>eY4{y2wwNI@RtK`@{Z!9#*Va;ZJjp5Y}Q06p7RM_z2^8 z)OBjVMi^CJznsh~xCry0JZv9h;VU9*=WyPvAlDI^G-lYkHmq}to?Yjj88gH6OxeP< zjU8`NxAr#e)}iyBNt?T8C(LnoJ+sbjShr46IfY=z*D*&Z8uL|~kRSmMmoLeX->U~Y z@I3THGaSLS`IVv}AcZhR#~*)uf*(|+m2M25yqxC*yui4zFb=)k%PCu)?6O-U5Ca+0 zHo_VmVh;1NDc=4mtiC54*mUu;)nJ%F=b>s8rj5L?1tWcDS7(l+z?ztmOJ$LB83wbQ ztT<}gnLl+~$}k(12s6a zWn{aoP|5+W!|O6X*Zj#0k?LcL=>N#FHSYO|bKU6WkGtMwPuV2f(=A0lX>j_}`IxZ^ zM>Ba#cmFf1^^P2A6ihagxaH|4!WsKhE?)e&Tdv(g=#zt8sO0%dS+~MHJ)r}on8=}^ z12|~l>AguoZ8vO)w!15*@CO`lKu$8kfm92SwqbG+GHlh#JIiNeU?5}KMn*d)wY0eq z*LQ&rwwpZEi6`>JZPP{g$j+~hx322w=&-nIJw4r8#g1{rf7>J`X~BX8$vcY+82Tm& zbP}f7eERh8QF6{UHJv4PYX}MJ{Q2|cbRou6Oe9`oqZE$~8?=D}(mL`1U&LDS00W0q za@_cFwvxxAlpl;5_IhToq7h~jmT;LcaiG=zd}iew{X70x&O3FPrq>)iR;*g(mbFb4 z?!>@tv5o6`cCqVO^}HL^4yIH|9eRahm^jj`nlQsXyK;?UTFEZ1F6&hvg_<>MwtMo) zC&j3&kNSO{aXi!|Wej>KWbp5wa~u*n04-8Sfi9hU?zt9Sp;8%lY35$`PHz)=&rmaC6Zm`8>(nD>S1}{nC2-6Wp>VD*rM=TgF@7NxF$^^ng zIv5&4ZG>KdH_DT=n3Rln{&wAUNf8JZS_r%yUB2gpAPEEc!Z_k|p+bo`MsN6f<$J%- zJzpn|Fl~UvdP=>(Cs2Ff#4v7Lw81m>SA5fAFd>b@o<;ZY%rzAWY7+fWRmVl_%az9A z7XXYP#`yNG>|yL(J@5B!@J{`nYSQZMcFVK{ZSR=LGPG1Z#*TBXTkqt$mptTp*KaUJ zn+3!u!-HyxHotAWTdrs>z3jP3#Zx${-}(+y$%K5X}Vf#Zj?jvwbr zVKy+yNJVuR*GA7#$r@Bz!D5vk%4d{QM&b0owJoTZg<1XYl{Bqo;%092^f|6;@!hUh zeG_IQsg~+Ix^>cyH0{_i+V)9fCWL{|0n9vJ`N~%&*}%N5lYL}9SS9K2`RAXXJlb!+ z{rWjDBoDKb3_JYlQ(ONqrlYVX^QZOaS9xHlzZC@P+Z&UafE*2Fj~j zD$*^snBgW&n&|d@^}g-^?f>WDi(mYr`{N(~=r5Dw_19nTPC4b2u+urI#kRPe0>~h{;UuL{1lM)?6-N3y0LuBy6f10H1^ugP&(~{V|vHF6M4Lj9&1YIEggTFG}C{9@kzStEP$?HC>o`yQZ9?I<}P$ zy)Y@a7_=@iZqsGoHnRga=RTfHY3Q#c?HSb?F>)E@D$=s3l)K%$d6)?(HluA+9wV{H zTh)BDpXkE@2LyCLdk~jR2M#&Z+L*D1YCMF2(t$U=@r_9~Xbe82-4fCc2G{|<``zz$ zFqt0GJE{2l*)hXFtuQcZ<*HS=qoP(N$-XVi&a1L?(SotIQLKO;gmh-LTqq!&LrptY+{44D2Y!?U>*VMx0zdHOW z4Udu#_IA2Ep4;Tsj-R1;cPcmcV~`-uxU`&my49omEz6&Dd(N3CH8UZ2(V1qD7XxvB zMUC!N`+3t1;myI)0i>x*mOSP1sV6I;116PKJ>UKA|8kdI*0+G%WtUytkw+eBVLu4O z`;(vi#NxJjl)U%7@3njWIy+_A%wPO`OE2c3W_bK0Z zhwI)(sl=F^i%Cw0t1P9y12fhp_3uMVm%FFO%#~!6J#i!Ens+_3=9z1*(V}ir+sxkd zwA+4*$xc>n#@HoHb*Ybz)aSxoEpb#YbO2A_10TU_J+5={q05{iUkKR znMsx)!@v+=fHiFfBNPKLF#Nn{W-+PJ6<1u5VCf)*`hW>421w2Rr9hR3zwK=frYj#D ze)!?;Chh;1X4ps@GDN6O|Dx|7a>yb5vLWw}9(SC(LSC(5fZcRL<}Or5*s2l7YK?4K zLNzAL7K@*s==j8d3K`kTXfjoKA%$J&L;)-g~#JQ{63O)uKWQwa72U9@PC zrdH>UIN}InfYS6I;)s1)8enW5ms7&M+AV=ioQb2hM65(Yi(^8Q#3MW zRxm&)52SBxV%*xKcCCnsta2anYEqLL)-&T~WmCWF?Q#zcwpPIWC4rkENunO&7e zXmvdsR=L@oD_qCSDQ*-2V`W^Qq^UCgnld}BNLq!r<;#~zMYz^&v&}q7iZ|7?pAI#i zBg!O(O^j+31e>^M<=LPPb=k7~GYkv{1DSesFxYE?cbPj;8FE~&_*kq!i$SYatx*b* z#fUQ6k?<5NUwAqb7NVgwA$c5F>$2**Zyt(q3u9Syen!JtJu+G;BQr zg;cCIalCH(In&*at*hMlmD&+u-3zW~-AdQ9cBP$<)4c_wUU1vZo+fu^7&g7*`&~WO zt1io=P37fOGft8C*(#2(78Xjw#LIPA;K3Ct?(=96#*AUNmZ-zjaxpcy3T1C+80f=5 zCTZ)##fU${(+nu3DqX#LZ6ry9INIdP+{^Yki`_(pp_ne)5euCgK0Yh^1Kso2}wMk_k~1o3L^(M}Y;zm=DB zmMXviQYLoqAgsmXQVYKLB`=A?t^|pi(E)KNzj{BqsAD>ByBZrfO`5ok|J!h zEPOgHn)o(&LDJSGT-H+JhN>I2tp!H5_Nr5)$9;%B zVtZTK+=R)~+%!3!@SC{VG`rWSX9huktJB)lZLt`W>`pRWTg6S9G|3V88js3ml!&7Z zKqXqsMH6(go*b3xwqs@ms~7_r(^fIcn)?L;TEdbMlrtX~b0#|xgP1du-=8sRJX07*naR4_6Q6Si}LSBKSOyI7}@ zikbalwY{4CFqlUfpLD39##nRb&w>mI_%`$Axm7a0U%6_fG4{>ExY11r=K~#TQ=hNp z*rN=LKaLq>7^o%&a`y z(K6TA$Z>C^g7HMy21@c6;iq<(VDf5})D5YhXRa+4T^KmHcE#)e<(x@wNP!G6kx-!H}PENhzg+|W32DyMVon=rQUDvg7cLEHqL4pqM z4uKoD;O-vWEx0?uA;H}xxDLVHHNo9Iz}q}uegCJrrn^q}IeYK5uC-612I@Y4npRlP`bibzD$VSGn)c3i) z4;_lk(kaPUt^hXV(MMwqs-i?uAke1N1Ex|KS?x}7`aes$k7dmaVb zH?LI>FVz&T#k6Xr41Y7!xZl_UsL-2DzkLBU(L(~eBQwca5Ak#6qSbwRQil!3*pw08 zOC2J)1S5k>sjb)B!w{k|CTClOeCyE!midfBm@iY#c+3q%|Gg7sW<*_6}NI5NNpIEE*j3wdmZe)*+G3m;|$y=)EC^zl}PrZm(5#BiUH^T>r; z>f~dV^`Gd;IL~I^-QSpwF5-fDh4QMdm>i2L3aan1K{Yym=${?jz{=^~n)d?Q4(Jg< zs&`5TFyS^PYpr!je;XNozIeB|-x8^5aITVkZ$U1jDJOgZJSA$2VN;EZyzrz_I5soN zp9-(C2Eeo#@U?uCd4EgSNYx5B}Tos&B~Y!OE+9`5;BaxzS;R}v70WDFl9?QNT3oJ`D&eBw2o~tn{`!lD zIA(9c@li6xx5g;!_9d`u8XVB&a}`NvwprXMt5Pt;TiTLDjLY1~^4VRO9wF;P9u{4; ze5f{>+;W3-pXlk%NNh+^qWTvVajT|5BV5WMSa#KnozE~wQw$X-R@p}r^!D)opY>M zX$+&n|Eg+VqlJ|iVU^7?>qA48oVm1qRAZkUOKEA*e3C;-sOzETZCIyR)^vBlSEdz+ zEYClo0LiLN+&3e1qpvDH_x4Ko)S(2K(2Z9I3uH~WjgyS+AE)Avk!M^3XJXSbH|0W5 zV+AHFFMT`bdT`AkDrmXBSF$d@jY#aeU+xBzEGF5}=Fr~1+#GX@_u=-!;%@bIY6D;t z{luC9KE z0Gj}C^DNijDLVekCyld;XAiiFU(Y><1fGN#U4wtcBAslsZgNP4&Mc1li40Fyo9ewb ze?&KV$bE3^O!4d4jd-S%=MKtG{6s`H$M@M3cMt==oKf|2I(Oh5nh?$O!tHDz!N+FOnAJ12FMS66C+=fwk`zq8)I!Yb6>O zfQ0BU8^Q1&l@^dB_4uL@Z~g+t+3U~oLJOU*ZZ$5GB5%IKN@`rI{D^zf6|d6Ye3SLs z{uP3SrR{Y4gIADz8fAVi9nmUeTO~=KJda_hB;nCoW!uQ~!%ec9Em4t3;O|&RFvYwh=u8jZv-NwJPZ9FEVnd&^U9{alBOfPEYN8m<`cDwLAbE zLnNn}zvD791gv96kPSrH9o);bA_Iq*_*aTV?Csq|}{1mU2evhMP z9^ds$%>QEIw8LWZ|8^V8+SeL3bQ;9lyB%pDc4+POyP+m`A^-*tdicrl0gTv&&{Zx&P{EFStE+z{Xwb@2XemnJQ*9 zgchEu`SQ$fI2uDxfXd@Kop|gyL7Y7ZVDG#+Gip{hvcK0Hvdf7^2@8TBxN7E|o!gJA z+i|i4P+B)%pWDe_FTx#Am+QT>IxS)a6k}Ef2@LI8SUPW1Jt8MIy&wJv%T6R}2;UB| zRCaUH(pmQ#^fdNX-dpWe=8iQW94J33^cBAnv)iT6_~|PiF0qtpwkE>VW$&Qpg@Nso zTK<$H=P>Ur^fd7ZUF4OF3kCxiiyQl2Vy@viItPva5!pKy;l2s_hF@nnv<>$*nkN|N ztFQsXVdA198$Cr34-z@IP%e~#|KqM~8HUi!)K2!ko#KR9q=q^(rTS)H>AT-*!gz_E z_^AHe_r85X4(XSN6qDEvNyL8Q(za^dAtcsTCv5y^G-eSl&}QtZU@k8h8U!CmF}OpZ zk4`(p@2{Ck{SOsws=xmBKS7J|pED!LxfY$wUrbwu-LWhZ;Z;_unaKP1z{?C4M2=Rv zGzja9FbIr^juLr5&}-8fKx4c4{@zfKc<+i5{meKjNLcbur*zjNnTvutf_(2hF~3|t z5dCU^%FtU_raRy$apX2c>apad_!ousLhA*X5+=$#Ms>b=@R550Z~f+Bu|n1!t4o~c zPtte5<^5UP^~6s06-N+TBBc|_YBjIL@a&$Tas5E>%--RT^vZB(dnTf%@Y#cZ}2n}RM_ZRh9J8+ z+h$ZrCN6oU6)`SG{vu3CdTZ4y!WJIC0D~dH`;&&rw%DY$pvj;Jkk@^M;bYXQ`MxlJ zEvu{10#nQL8LLxCwsU=7ncd99CqPS@)0~4&jJV%%^f7{W7w%}2$Dj1$3r(RCA}xe<+ur!-nO-LXoe z+i%dxxz=3&!bSe|cB&;YZoPL(1)dHHlBwz+Z<-bjj^hN*c<&#!{8z;`SP83*Uq|*H>iQzdJnO-Xn@}Y`Msk_r|r)}En z1Pt_zipQMHUHE?LLxR}qY6paW(FCjue{HH(4Yuo|6X?LWdbKf5WTgy_U5^&`n?#yB zDrlgVcOa~Nwhu{iu4fd005QM%G`0cs6!Y{-l*IX=s>DYuP^%~?8$;oPPxrfH#60hQM_IjYzVU z#%h?Wj%E@SZe5X{ue;Op_4%}gZj$#G(8*Z)X5XT4R+Pd0W;Bt_mv(QVR@~Y>I(t1K z8av#uTI9}v_i=q6kBr>^fU@ezL&+h>cZA_=ZZg{jd=wQ*AY)+Fhb!K>6}wo*hINYp zQLadkpONv4mbER{Ajq~)fTDh}Mt}+z&-Gf7X8fSPs<8haH8GySv8a$KC`-0m?&vF0 zvT^whQg~)^k~SO@1ditmMx0Av1xO{aiQ=jO$5ky)pWQp&UY}jkOE_oua5)wL*oG00 zlB_J!66Yc>*A$;0k@t;p2#@9Wc9t+4{tN<2Q^S5*V3s~~Godxp>52RN>jfCrw zJ>$juXPcboFsFOMW8gY@o;QSOOZNowb?qTl6WnP=_1ZQ*~*N?bLS(r z4xk21?ytoTd4_|p#rX5in0h{cdp+M-c(XY%aGTc{cI(3ZEB1QV(#_RGKgn>tFMQAE z5jIy0eps}N+ghJ1e{=;X$ zVh+JJYC48)qQq%@7YMwjVb8=zE1N2>QAwEAX!HHo>o5s$8fn(u0$wVfuk+rrfd#B3 zBvC5V4{_=80OmvOEgieevd$4~29ATGE|@UzS%sXNt(d^$=KJ)Wb;#Y5S_)kUNpp!6 zfCGD)u%x*PZ(JEwG{ow%(#gO-$KwQlx|HzQ8SKklmlHG5(#JBHd+A@&_D2lw?_@fcu zgJmD~c)EwnpmEsbSy7-}1NF6PO|N@+Kfd(`V+jEjQQY!y@03^T^I7})pH9d zB`Tw%Gqu1l+Z5Eh$PB@%(EAfr$kWx5ZHhB6HE6{+Rbaa?Z$gz!W?;M&rt(fX+2ZHt zKj90ATCOxUi-}bg<~_vClW{1B5*t)S>oA4J9j8k@cQg^;-Vn>#9wkX@(()gFiW$Zl z#v^eMV*dy?9&5*h+$+Ad_QwI)i?$rCppiO^umkgcAMsI0g20}s7&n}hCcM$B%YV|3 zLtyJy7b>ZhqoW({2bS;)p4@3_(u87II_qpa7#e$-PQj39;ebhUfDDox`pI5b}m zk9mF5SM>E#zU|%@I+x82*yG3pbJ_pDd!+c^JzAG~GteeAS5%*<83J2?FrO4EVU1?@ z)4W4p2=X0C8Qe~GB>p$d-J#cmrl7*JUPQ9r!;BrCInCcc!3msqxG0`9g@4d3$D-g9 z{S^EmvdUJx1{{<8-owvy4Z0WVWldR>X;sSVUAwDWxmB?>@v0Mm{v&vSRRw=@Cyn+W zj%p!(DCmG^dk}X!sH$TOgL$Gtx!baxJGTzX77!WW$52y@AB4JY1;S#;9Ekpl%!Yjo z-G1(RJ{$ESGw3)}a71BsnJ@$}Zdr7t-H)Q8N*8SRcQwF7vILb-Fi#k0%3Hy`_e-c7 zRY_A515*|a-*_0Y5jvS=OkjGDdnM?lw#jfME5yM)4}^#%KG)655IP>ytsN>ib~Q?g zD6s?MyZmgFE9f!Ar695xS77%KbJa30*_brdp@+**LaoSef&DaX@ev- z%qEPlB-f0P-%~9!)6YUHM`tnu-=x@(*vVI+IY5alZOwF>lr1viZ@zj}NlB zd{NHE^syz372X|#f>?@h$huan`+2c*)X898OL0qLYFm!@DI&_jbkx+cswVwphq+A~ z^^~0kGNn>PWD??IjO6`WPpS`@ehfC!>Eo(f$1?mYPy$0kWIki^$S9q}GeJ|YmC8?F z>ppnrgdY-a7afT5lMDLv>tnjF+ViX$@)nx# zv7K>@=fI=0LU1tL`dC9IBDS7D>>HQ#n66BI#>{&Nn^&t#&?+J97IFNB=zF_oAyLZL0iRwSq zfv9OF3*v<{sVPxK^kXnW4*&7B6MND(dQzc%WE;V_3b{cg znZeuBV*7G~<@4xCx^aFnh`w{I-1@RUevufVI&S?EutooDwaJ91h_RdL@L%_C5pBow zltElDH!+2=@Cc$0EOCj>^X#MZ$g*YsjR@Dx$Bjx=hn@A zvF7WgQ^eAUzOe0#DLC}QYj#D+9$9^6-*{o+2hK+pQm1GB_78iOjNxW$J~loi4@r*1 z1A6ka(0R0iVb%$i`>+MDaQDnG#=^#gQ5{J_BWzR3@BL%+dA%lPrstcwHiSFPu|}-6 z55cj>71S3n{lRDqgfrNf@?8ZK|AcaA6CYOH79T%5z??BP}#q{S@N%^aOvRsF! zO)P%x9fy$i;|r5Vv?6C1Fb)}mVyaxsU*}mtj{&%2I-@H3N+q6-HyJ& zCn)xFN~ilC2Nvmyx#E+mY_YH)?_SZzf)<1SvQrBzK&`ZKREp3TNx0%7SeNS(x!Pn} zw|{exp>LqDPfv6lRkNa5pG3lSyTW-2L5u-;+n9JE9L6g~O9KhL@{KVzE|$5EgES0I z+3&^}g)8iSggRkqG2xdqE}D*=Bspi3_K&QVbY5Vn>$%yAp5I=1Umj__rJ5LD;BpZo zl`|=dh&c2b%Wy6>k;)v;BC|x)%-8lL$(}J4MGscY*Ny+Y=NKm z*J(D20q2!WhU;SriXtw#1?I0lZUNu_)Zjl?7Yi+2^MH`R|9N$j1;EZ#jKjJ@6~}T@ zLU}OsK)B3Sx_)-5_77T=-8bwLB7~vBPLFZx8IE?%PJxi9Q*kG#(Z|rAtsQ$pe$8-& z+<0_9>nEikgNBFE1G+c3qwX-3BT1YOe!SLiCib+K&?m4Y^Wnmw5i|a&@jLCvHp;fN zQS+Mdd;tDLYQx|-LDvPmN1!-X&j8-@pO0B$A<(AcVaSB|J_>iXRRyc^q$~7jy5!zk zGCk{a$o#vFg(}t@|~7BtFwc zce$eXV9WloM7*6KB46a+MgPi>OG|drAE+&!P|Lh&wtQyffZJok_I?ZjChyN)Oxl_4 z#vPL<=Bz#$0y0^@sDmCW+*L&N{{}tCz0GtL`?L3`Vxh)^C7=S zs`=gudcdsZ7~@@ZdX`xzj5@G4k^9J}JWx+zMZ09cZC*;Gh3#|i7Xj|}{rbAt4RCqE zWg#={cK_{-XIb`wfp%R0zrVE+UGTfe-x4P%=-OPdWU`vEU$kOQ9`5zv@UXfoQ+*8X zl+-KyCq`AJ-EGoJx-Xc2$)9ki46!9F>5@4L)lV=gap^C=T66K^hJ?v)7UWV9A0H>l zNI3fw#*r6QfCVkEls=?8yPAnt0K1eChNjE^mVhA||4;;P2_e=8X(e0!pd(yN6}9lqj%Ggpkl@q8uPGCNG)J^tqd_;Rv-2(7 zWrwh;rUb;@KDWfS?QXZ>YQWf&5m=u_E$gt@x-)e4vC3qQ&7MBo_}VQPx&8BVLKh&o z{`4Q>QdOXz%q$km2Eu=cGhTb`7~TEXCO8AW=a%>EXlMk$Z5(_xZtLxK0aWf;C7@)C zRS`TI8+qx=kkFB!92DBo(U=61duAOoN*JT+ulRvrlfM*tGM1Vp%P?YssC!kFk@F#N z=uOB$?1@Ksa+_OLHC~t2NY5l<*aFVkVpaPq3A zzJ=d?L~s9y^@*ksHr1cM05;WxNp6$r{h(=KJxp1OSm?_J6Et7(h2aJQm;94L;nIf$ z!FL@ig@3d@6Lb;tA?9|a={Sb)QvT7XOJa=e5*<>B9WWkX$>z0irSJGQc!rHel+9B+ z+TdMg1lK5KvP-zd5;|@4LsgC~oGjJp1XQ?!?P5?WI0sALENW7tG={CLVv%4Bh!m!b zDAeLH&<%)rG-*jv{pEdVUfA5?X_ta}K2){onm5{kb0u#gAK}z3^+ghJ%+J-MphaX& z9l3R8sL~xl)x9vy8l`%NhT~960Zq~1VC=s`WbJJBr>b;7{9OW6`&f6)e!C_j4EN7Yz#<0VnWLsmC?!`Ad-C z*&ZpBGM1Imez%I%_i92OK@P`PxMH75YqV(XQ34gw5~)2i;NwB&PwnjzQ|eMeSCA~s z=1OH!_30I~?++33GrI8aBUMk;zjSdahA0@cr{{~ify;>b)p`%Uz@w)1e}iYL*7!A# zQQB@DH%+vkXr?^Q-a{$cxf}|0?sNym91{McoF#@$)UFw*3pp7P>NnOanFW@-BVU)v zqJoF%XkMufRK`kr&9q+IYJBTXuV|@Lez)ObJGTN&S+^rR>bd3m2fdx>CGx8RA9r>0gguHIsz6ws~Fr#3F#)~ zr=X4abosuiE%bKTRr^6ziP%SUVs4ugxm4B(5V92lAwniRa2j1;V%Cnoo%%!oYj5YF z_1K(dl#ieW-~Cg1-IOejYC&Fl3D;bi6palUr$#{_;SRM`=aS%n*d{Nre1u)kMo_Zu zJi$=9yff-jtBBwNjf`2kqlrs38G}~0<1?yP0tW5oO?xioK-@%p06s3$lHH%;?(OX< zvD{v{{X~6BkQFDI+0nGLZJjiI4eib}`+&4Yo!M~G(iT6?M1J2z0+vnywJ?6$q-kz1 z68oR+yUF+q=;IH+a`Hlpra11TNjm81S(M#n*aFSa_I#A(!(Bt~8RFqRkvmszb1Oih%+i%j9-JgC>NLH#v(|UHm8kbW=itki~dXV4%`m`+W)w4HH z!Kua2A83!04B_kkO{>5dfNcts;Jm(Gl}G!b(3+BMF~gf-u&`I_U%=f2tY}g}+jD2j zpCp0$YG*bhHbPv7F2-kqhVl>MI*RPt-bbMzW!w;Klcg{&&5q%v$IW3^hhnYd)H`lcJ_bSXkQJ z(fnKO(Vw$zD(yd>IWqj1z{Me!zj+ZsU`Wqjd45Q2ga$bnEy6&eK4YyeQ5$R4oRqm} z`!0rP`?QHIzD>=U4_h;$2JFga{bZaq4kyk%s^erreF}HEfROE3Y8v8>CU46~+Z8cB zI_|iVTRuwaN7iQmRpBOHJ*NS{Hs0C<7q;{ZomDwF5SMMJho@n^%jJfnb~Nyu9$?+ zka1OX|4%EWLVQ*ODW=B;olXT>0`_ANVT)Iii2IDL6Pu4OxmvQSq|3MSs+3*X*bq?r zNE_4*_SCOw8Hu?$4TsI$Qfrqao9*9fp9PFF9lU3=Xn`J+1MTfmyMvfCjTO_0{HMG( z67eIV&PD&A5RuYWx@~_jU#m-#&b5omfVcLhgZ=>fI zDAC+C+q_`d-72Ea61$tTBzDWGin*C?%$QByGhr}Yan*!_-M=uD>~yPmI<0-5a$jP( zS>MB*loLr?Rpxgyar2ab8^YRPZ=@skLWWEEyEWJ@ z8pkI2$#aSk;;Lq)`XkVV9*+V!4CMu#JZ;mlNvNzHQ+?NHI%K9Rkf!a4%l;-1_tOI8 z_W1Zk(aob!%V0n>4`h`|RAfU>Gb}W z*6KVwFd^`8KGxmTIjv)`yfBGXv0YF?oCQT{_di~o5Y#|^DKttR3 zCRJ>on319SkNcw0U~K5=_E>%$F)52_WQ&!VQH&KRr0rIZLj3NQ=`zZC3y8Ce%5T3W zsmAcF*A)EYUnLoh0+kZO5*F3s67XE7ef)vt#zU9Zq66MS#kAA@3ETJ8C#WJD8KWIS z^>lwHd=*RVnRQ%!|FcenSSRwN-V^`Y_)e=WXaH##J4sgSgRb&-^>6=z#Ybd5ogk8} zafx^Gn$&X?|j(I71_NJ}rx8Vie~g1Wyr$ZjU4xTP$w1v>#RICCjM4BTTT!SoTv&H_## zy9mKgj6*~!Gelg7vs~I%+$PlIp=(LMHv}B%4*L|yLF3g`pu4f_uejbItY>Q;!b=G& zZT;Wnd7r*`-y(&RshGI332G`1Rc)k?19$@g2Ji2t^M7Q0{olk08RzmnTQYa*B2k-1 z`wg5yW4E;zSfjC^13cJh`7CFAu$?p}=(lQcE#7pdEPC?RkdWzGCTz(f%D@dH9_*1q zX5__R$tKfWD`8@^AH!@|9JZEW%FaynNU*}-Vs3kDsGXm#{*$MTYoZ-6@%!4EcPbHV zta_x&q51M|Xf9}`;s3S8I#r;`l_M5rOJT`97(@B(1BJMT^Sp-Ut%l&^;b*2PB!$0b z@M~BPUV0yY`B73^=(vHbj92Ox`U|;O$H34Qv57z4u<%ZpAL>RdZX>5pW_)y(F{N`O{qUD<~B`k18T~m1duXjZQN~9c(zl5>p--z3Y`smMmv0P<{ZU#bq z42JpkvrWg3TYT}%&AnRs5#pII-K`1INLN;QPfTCB`agl*B++895Kt`n9yq>PQh8f! zIV4b?K+uVk(4+iJD~PcPkifYL#I6C-Xe0(cZmXg(Sh*$|-h)snhPXIKxy#Gz_%-82 zOr7}i44q}tnSi@^CT8FlZgZGRp5qZ}8x`%hPOd`~(5yf{ktxS{PQ3^bqLwRuX-l)+ zm;=rM?V<{;IqGJN4c6f;TVL@-6%C|*F#})9G6y6hH@8jBdJI&T91W49tlb^^SDi5# z8FN2Eg(1G?w+lOiEXXpfkG&nxxg|qKkR5DT>Tqb{9B$<-jbH`|=b#(Ac%gv=YopfI z3}o;dH8G@yjCg1^PEXD>Gz}j%Ga@}YeTv6UYf}4YI2Si7C;SyZpjsO%mIn*T^;UF)@n_%Z6#kZE&^>@VRch z^5M_9C=zO*gla}a@2>yr;=0{vv{rKlvQzKWLUwpZeUJy5Fj<1;9gwobftFs#v4C#W9e%@sdM zX$^v`6eW+?hQ$y`ljJAq&4SQE=fO76Q9)X!9^1I`UEK>;Kec2u(OL)Sh_9b`n;()N z;TmcFu~-CF3q$wE>fmYMV-+7h_2DHMeZirO=2@WY=8p+wm#0aRvP20FvUyuTBy~+l zFAD`aTr72qHzTc%-#?7sk!b|Dlo9KY?{Qecenaf+c}kOW(`HNO4*;P@n@giHK_k$V z_MjWuD7#%89!lX!cb^xN7y)+dn3n~*Jzak^HZkJ4f!YitOhgbgYADiZbdc*bPwH4r zuTQ+yQyI-*hIO^y&oGrg&(nBg&q_%%+On%hNE&q=S_dzup8QnSoIYD*4FZZ_R8e@V z%Vo~7`nm;EFPhKezr(f5!BXA7#_b)F=jWbf+zVDCpAzArzVLC(azLPFYm~{`<#1w1 zx6mk6|Kx6(ejE_NhAjvRD!V;iD5>bQ@XH3>=n8$Y!rF_A{*2`AaD}g+ROZ>u8vFQ# z0AVhm_D2Y>M4;)t_Uoi0C5SU2$3Fzu)YD<6$igjgjM6$Iwb5P&=hr;kmh~4@-NH$k z5F;aTLAUI@*eZ$OQV8X3F!D`(`}~i%{UynJ^fBr_Vq;~Zddv^2 zWz^TBf8m1nB4{UgRJnW~D$nmBG1#!95zy07gBXfJ2&Z#9pPdn}_l}Y-(DC^tD@eZx zTA-RT=KXG9HYEqOYnD{(s>7T3xu59NvNPJ5c85HQmWTMx!FrW^n(>ORGB;-ZLaU>r zvx`HXK0g*D!GQ3iU4}sgk)6dG0o#)1=V)*3t=^&@LW8C49nX+qPmQ+C*Ln&_`hI&> zx#t_gufKoI2YR%OjOfEGk9Raik}UsoI9zJq(uf)dXxCvsNwD_|GP%MO_xE1<*%|sq z`k)vMyMFoS4A#tN+Pw@tp^53}L#r}7$~U=!4mcU2lw_ZS(4PjMdf3Ls(Lo>F>sk|q zUG_{S#J8BJe&SA)b0ZL&p}I2R?VFVC{`&E&`RhVDyU&i`kXo+aa9*FQaq?cE5tK#h zYj7dX@9o5W{C0)OI`e*nh3=s5xbfJq+aW>1X%_2Qh|@hX_`wUm_9%24EJkQ`$n}gF zim6oi>%4UEtanL;WA*`3tX}}=jya1b>vY1v=X|}J119IE^-#0J`b_y($UQ8R(zt*^ zl>OZowi_z^m;eFo+#{Az-MT>(iAb#u?%3~&tre=W-{ed;Eo?VoCSr93IRNZd31{xw zK>mM^{fZJI`7h?YNEz&VIO!UQxtFNd{X3W2xlI~O%$KXb1>`MJYt#g#(dJ@A*z7@1r` zCtqr9j_VJxvL<%o-z5-A@;nw2hxUVK6$P02&O5FvWx5H{FlPsAaHsGOVqwjVB!>I2 zZv|9&K-?hBzuTd`9zsgMpN`>2!1sAbuo>w=Mx@x!L4t?Hxoi@VUm0w zosnW2le1{(Ljw9yey!N+3&m}giL(hy) z4&!PkHIc4Z_Xl&kkbg$~KIOD7;$AUFQyd8bu^@y^G~Vj?sTaBs`Eu8n$1WNeV$ZS? zA|zB<7u6t}tv1__x7qrt!@F$fdfx~QFW@yuxM;`3hOCv*!G zA8u+#1;MWlx;lqisVWS%>POlc?6$n8OzgJS)%+VOcdrI{j~^}PK6r}`ib~oeg_pvql{ZTad)dyR8yHjPT=Qr3MivU#uhp<`YTwwl) z4rYX>DRN}7wKqinON19m1-X$AuJJ#xsGZPwHe{f`4$Ci3NM^iUDF%(rW^911cEVG% zKy+1Y0=?0Sd`5fFzJix~u!)g6m@P@3nD}3tLSHEr%R&VY8kW^B<{gPH zq-ix8Xf*}m=2Dz-YAbU+jvp}F5c#=SKS3golQl|RCVTTDf6Uo12Ix4L3c{uMg>(f< zO0%|+uj1b71xzqZ-Cv_`oV~rP)Tgg$y>_}nzpIE%qjsWYT`tp`8ik~_GEgcF{y9ve zE{JK>0{ZMzsm5wf@_IA-OTyn0jgQg0w^R7lwPV#fkE6a2x6f1s~OD6{qD`CD%S$y>}v z1nCHC-MJv~-zT4Tw;?!nbu)Zuu8(QHE`MdJl9@5eqvv^zciHe+HK7qM>|C!gO=$*P zJ^$6t4`{J%IFY4eQKPyHF6ec_B*}dpYSuV`NMvkb4GZlr{Ti2JCZ{wp0@q6w4Mpe?9-2)CptyfeblF~KQCp`cs9fl{^ILV52 z8VDpDt5_@`GUoxU;)#yI8zff@ZrHS}MAY?$yjsR7@sDc*aoDu%h+yOSpjo1H{3JPS1=!wc>A6(soY?)%I(xy;ecn zp|o#+m+jN~$KGieH47plQfB!CtEf|1n|mi-trR6t95#w%1PCO77K1j6a0aUMOr?yK z9bN{RaDL$n51NZUu9pLx6m3@{#VfEH@JCawx5q)OE`-~_{=8&NVa8kjg-rIkBW5o) z+!jaJu3@dK!iH}<9mB#lr+E&gC~9pR5ep`ys%osi*{eoPK!vNoU=SMmGi;!2HSv&$Ag6&I6D0%4ia>B!#G1*zBzTqGKi1pubQ7P)H>UDeuDWlzdRsG~^y&hq z;e%@%K}%J&A4)l(ExF6*dS+J=s{m+dOryefA>WtUYn@@yRcm)Ti+eybQoD{e0Z6MQ zBuZQb3z_EfLQtI6p8Q5DMW)D4HayQZ$MObE2YPsojA+ui_ouN^am6-khM17!hW#*Y_I7uE&&O&zpoXe{(5|} zc4n5v&9eC;&x_rLQU`AdOhrxtN#ERx*fv6NI&6 zkl7(ob}Bo=MKDOy-wq$MTI*puwp~uZQC>kohaTIU+q!gLHrS6q?ml$9RbG_~L&kKK}ytIeet(2fAvqs7D&R#E;87t#&E3xvj&q^Fde zhB5!|BT9(PG~U$6Qb+`JKa}c@SD6IeE;jl#6duQaVTG~Dk+R7>#$;2-MkW_Fl2K+} z{UIh>^7fzFmGA!2Y-ky*e4r%{zve%}%)O}9mjL~Mmq@ZwY+HrKQA+3X+~oEp`bPWp zJ_2o(*ELOR2p`S0n2LEg?cm$6aG#bb6cyhOSrkVVS^|$!7@&v}H{#SEh@dPgQH#2KJ=t!F9{~QT|k554%EIm7l3X>pzm0+sK z5U@1f_<#j3YL^t@2140q?O&JL1ET97Eq7Vs;6Y@9ex|+$lb$YvWGfuH$jIN_=YM&~ zHtz;AKcl(!LA_+bkDO$G`)fl1s>v5Y&%ymcZmqnik72}(MfBqcwRfb~AP#=os;Z&i zCM_qc071S4#7q>~Nf^y<_n0l6vU`4mM!6cp9Xc5}_~RmihZO_)+GRX`OD&p()F}Sf zj!L0YT&gFD8yb@U{BMM41RZzbBdzFLTc90{yO{p6g0OtvQwx2W)%@erhSm>IdPWAf z3)Ed3rxiPjjIU}IPnlvCj-^Ogsi-(ye^6r;eCDoJ?w;4^HFmdXd6S{B2 z9yt1)Cj95OZr7(l9?gM3Y~iYOIy^5DWL<1*i@xRJs>&$Zil~~%VPHuU!QR-Ptb#C? zT=+d}^>{M({duK*<>d>GIAG`#br6Yo9pn-0x%cER_h=->ehZui8edP5#KEqgq3~kr zxlT*`47`2aPE1tG z^0hYE3)r7|hdUGb*L=`--~+LT)E|Pr8b?~jSv4&~%GvR)vESX#s@R3(;ktgCGMvOj z%(=yGd5tgQLguSUzb3AA2(a2 zy``&W?cbEw&Y{zJ?rm z0lH9Clb;NJjEkahF)5vKx+XW@&iEkVqZQa7VJSu#83aWdU#Jdi?rXW1O4PLejjBX) z=jH{NT*<3zd)&*N7a{D%Gx9#OzD+~DS-B8bYOYPB>w)Y4eW-sASi6|jp}2Y2cN4@@ zM+EIj!fgY!+t2S-+6n=;6^0*qI{u(11Hr0-kNp5#FX;wIc-Fj{eET=aeBXzf-YIDM z0MJai9s!*eA#LLYsLOr!i*r=C_a(x86JNUJtRxX(+%39qN$VEP@>=eW*Kb2~T;m0-09F(>g0!^I z5w9tH#5y!~4|NPZf@JKaN$^s2RZp#$4D`(ENK3wUjn}wsQZ#E<>y~T>9=P_3?PC4h ze-Q$cH69Mdahsg1gyA^v9amV55jH-=`I)=PvIPM|gRhxN$bBHw;Kt^SUKZyQ1PD0f zUFn%A1I#eQ+C)B<5nWy<>=?ToZ?qV^8Eg>D0y_c>f^?iUECZx9vQ-`)(oqmtsfB3V z18N><4mT!O@z;QElHbT3x~58`Pj2*T^Nay$A%h+O3Syd`-!0eGr}=cOe%KzF9$#M| z9iI4+mOnX!57p*#Iu{9gplhT>NzNN5ZWXq~U>w8J_a9_u@NBWI3rzq~3pIu)PKD$6 zCOH}L&W>gH`pILAgdBJ_^a$R>ALW*i5SHQMkcpXHV2Uk)WONY`^7{-`rwBX_szC_;T_j??XME`=xgkOahu zQ}-S>;cig^InXSVWMm@mWH2hBN3&BGC=M7&->AC)%NQCeIrw0~O{sDX62CL^a z!aZm*YyHHcDA|76=jb18>1yvZ2H`p2p6o@QSu-f&_62NpkCPC#^{ccNP7QsP&Wa7{ zIe66rhYP>C{GU!pF)@#ce7{?|Z>t=Z>zVWUKkhv1xi6b9oVPfvXP&g5cP*UXZw3U+ z>bZ_Ao(l8+FC_ZqUWDz}#%)d3nZp#b+Uu{C=n(YcV}LFyTitOrvg7!==h(Kg44xQ) z=)7`CE#9OW0xD4MSEqmsjYrd%hu<|zsIj$9+tSo`o|PMiiXJ0< zAJ;D9JmiIMeqiF2d;IDK(6c9>b+!g@mE_NSHlK;6-!=VtYd6I_3K+awfjgJ+0lqN7 zyQ2PAJ#*_oFmlUHOY0zW5}AKg}qMbR|6K* zb2ia%FA|X*%bTxDXQFpNAgUOTe1J!t@Sj{=DFRv32?ei0?B5pQhuvX}8>4 z+V#b=?h?Om2b0}Un0lk2+HR2CWQCZUzC}o;-S_jpo^HO{I|Gk}i%-Uw(+Ht-TPfga zmQC)@e&y>GK8^eyn0W;zb3zEXeg|sq&4RT~Q z+r;QBbMyY~&@B)g5}cX*e-=P5^k$Cme|bOb*@&35USH4OHpI<8bZ$Gv`{<2&1iW77 zISvC}4iCEfxd&*T`_>^L&Rh&R2j^{Kx=G*(B-xvwL_=kD>aHJsVeY=35Mt%Kj^RkQ zB)c8kDF*U~<8PSpgGd0)d<{OH`Mtr-PlBeoSpUNp0@~Y3Am7iyXLYr?&cm=# zJTDg=l0Ebwa_=NeUkP{fzCLUdvsbc=Px{0I*43~tFS%8_zZ-nl`Ssty)Q-PRTRw^q zu=*^I>Wt*Spj6E`vl`OgzIFp)Tg~;YDnmS%-?{;2Ezdw;%EI9B-4np2YG@)Un=~c6 zPOmn<$bDD!GJB1(3nX;sF$DW+DuQ~OhU=Kzj0e)Zy|=IyBl-AYo+|25lx^^jOj zXW8>Wf?Ovv4@@&}ubcVPX+G@2liDO76OF;VHvf8-JZ?It8eY}X~{Hxe4}4B*ZMfEdvX7LV+KOC z;KyWGch}DS?`;{k0X@8-lKF+OEbq$5Fo%8TT=XyprkgMBND5rt{+;a6vMTA5Q7+%% zLKhW6NzoJrffvHR*Zb~(Z9vedFGn2b`xloZY=5#OZ{sS)yAxQC4()Ud)}zD$HwENP zMTZNtWr(^XTR$~B9t4aASXvK$R+3JQP!*5QdI$h)C`Y>rUBX#u6Imu=6y7xsvQkvk zYAPeK#j5I@+|R{TNClS$q#%&jZ7G73g%4X1dImJtTHNJi0@%n(v9tQ(Dl;8);=d#3l@YR=E+&VwH^~d1lAe7< zWc>QxpmeuSI7R{QC{NJHBbX?GqR&fIBTKW$Zwr>(N|v^m z(rdoLz}(^fb$m>JOlGJ&4ShAfDv}es?Fj10CYw=l$>QUb$U z`em9~l#7Tt8Vj)-7a+F)uf`Imb9zTdd?AEa?x64}^o~A=!U6>|1f5rUV+h-1+<0(B z*e1=FbhQC`Vu2i*PUfJ37<1yih8ZQ{GgTI9hStWCP{!PwgP4o1jmaypO&L9GDJoUF zd&jkeeYFU)xF2;nr?Pk{^?fddGetr*^lND7l8gCg{4O9}SYxL`C0_LYLv(B>m{)d6 zMmziaMu<$iRC7eqBJ?tm8}jC0yXd@I!o(<$L>+!`QVcVj`WC78zEGsrU}Eha^5NI0 zkYM`}iThJX%|dDH;S0GN;tMJcZs3weOd96mcm3x+?%vz%tF4rf$8OoTbq*9wndaB? z!q`u8p+$3x&IwK1`>3wg!tg{xOL#t5>yz%7d@0f!Sv`l>^4smSFKbmyBRV8{MYn=K z5#xm&gitUyTH^kGVn*}1FN|W~621)#Mz!kUpm(c4zTIQl(YGCL#U^i#j+eEqG|8FC5 z(LJ0;MumJDb?+yprh^T1X7-p`KM2B7kRrK>3vEi$c5*Pn&!MbFE<6=_8dv0$))({! zn^o1=1z>$48R|-758E9Td&H@A3)Z2S?l&hfa_1L?ehvo1@jVJj>Dd?A_l4#9h`pl= z0*f;w)jOLVHG;})*NT@k$nD@GcYa;J7YW^{fUyG;2BqP}^TukAsWxCv+fF(F6f?hn zFU+v?z9LDNE_6#>>n7ieX=jx3AJLBky4AaL;1@dy2VeQs5Y=zW6}=buy#!bksG_d< zUw?-RP3@k!UECGZK_4K5H^VN}7m)2-E(!A%rHR{&$4V3F-7MJn{+sZCkYOo_Zwkxi z(NV}ypa)dSvdeIeA|E}5`$XAzSc~UAs?sMi1?Wl;RVK}}u$4iYZs_D@d?Lzf75FZi zQcfVcPl(mjBKFX?0cMm!P&61^Z~s2e@bl^fJFf#mTsX?H0MZoiK9 zF=E}myr;OQ9ou30^pRiDM_NWUAl9S9fXql{1RlR<3U9-*2(3f>J4ef@xWbDB!lNpu z|6|kBSm)U78`VuiO)f6d->>GJ-R12;%-6pmGYfdF{<0u!B$}>ttE2|E(R-cr+|f<}3VZPluM{CCPG|SMkw(lQigb zDXw2>2tXbwF0x!V67okSqQ==rHt9hRC_36V+2n}~6hmzn+4SzAw4AJa1I#rPv^#uk z^B!izlz+w9^J7xbqD7?_2#Wvh@1pEY{UPWJ6x3zNutuXz^Y&pC6e^ZRPwgE5--5_W zmQz9g((GP+vl?jCp9dl|A+tcXacIMXnTI-GeH`JziGsU{{-=4uQQ|G$m`$TM)4=~76^{FGCgZ7#iJ9tLz(4& z;P|^$i#V(TPu5)G8!AVbplFSKYv0TVcInZ+U>2S^_yN|I1uHyHHkhfJ8&@(Oo}2N~!?d2D>C!D1Iez2Qx3uoW>?Mhrd! z`{q`5zjiEQlzaq2a$cpt9jw+#s=*eMm6>B^k?;yIWGSj75oySZ>}6lbjcJS{lZhOs zSaqFFF-p?8i64#@Lsuc#kk~*N zOZjIvguD5FzI*%3kvuJ{%|qvS=sY8a+$8ZdlmHxtVqbKQnq}yPmFsKgq694DMiBNq0 zhczQ)0p8B$dUF^ATH@K=@b>GICrS}Pc<2DnkUj;>GJnK^ZzgO80g@XlC^uKvcMvvr zFW{Qy?3G9%(MuS(caIz!_>+LIPsD%xF9}acG~4Y?LW%@P8^3YS+5Oyz)QU69hnVDO z&ag9*Ono|VasKt~cLp(X#9jnhT9c5ZfHqvzzWaSD4{Lfv#r{+VC0?6zu zNe)hPp|yc(k;2783{XJl>4AzmYJD78!~{vtr8cd9vxpIEyfWG}#CbH)e@)W}6ocVA ze_)peEXnOSPeoX+7*z5H%E-NuTKy+vIU=Y`ySrTDn#9jYt&M#EQvr2`mS3Iv=QFVv zNp&Azb6RA7Y8kH%$sXdb-|Jldj#C87JimT5|D!X?B_b-D9#n2Gd=t#P0RVz;8ZJQw zCO?5m$ae~N@ea(DNi0&=EeGj%n=B!;Sn)R0Tup)Al%=B}xu+u*-*r}5nrKF?WEHep zU~iojj=Ni!4Wpj7al{DUQgxELuWm?52&x zWUwYB>B|tHh&<~4%lPl{Y2Upblfr>$qy;o8>C>}8tc34vaA9h^P)OUD5T)<>t(Qmd z@wR(kNy0_N4OC5~IrPobPv;@wUND%iWSTHzom|AJ1D#|RD^@^X*fBVNxvljfyf8H3 zS!Ut`QlSzK+1%53ayZ#+RM$;%tu|Q0<4SxD9T6_r?a~L||Ida4srltOQ z2e#2v1yrCv14vu&;XBnAxSZ_$qTmh$^>1Z8ch9b>)a2_PD~&lO3w*PIfe0^b$NlLS zyuH#pJi)F7NT}3g5P*2t`4^g9p@luAzM0sZBqA#Mt^v8Xj?V z|09D6OQyhQEIeQM8LG3PR4WJp0A(NZTN zzpQR)l(ZdeBvyd=$^NICiLA`bR&+tgd^T>3u7Y5%Ugri65&V1AA_i7yf!_)fjMkkJ z>BR61F1-&h+$sjfgyoWAhjMc0vU0AtaiCL0;G5dJ4IurGvHgd1Su^%84ssGrF2A{B zb@M}!`;WIUupj!TD-)ztjTHyqieX$Z{7#XeXEg^9`7bOK*(Lq|zU}_CG2*OWqzr=3 z6OfF~N1pV{=lK~%$utCirgHwHNzx=TmE@GZkZ@6gmrA=#EB-s{HE#Kq(o1_s{fynf zP)xk{SlVDw{q2V-aN_eLvI}7=6E=ZT=j-#;nHpJH%#>| zzxg&#)dY>C;xG|rnNfjQ5j;Uj>gmTrzWwBg!+I$KC+8UwHYQ4b+NM#5+&AkVj6BtJ zX%3i|Kle^^N?A3Gk&kEJq;jb^3G0#LxhcjE`HuICS=`He=p%=dYVcTfwhl&HS-!a` z3tDO}4ew<&5%ID584%Y&f3PF>6ZqxZ!DY)wk-iRnEcL!a!MBIo*edR&36jN1mN%oXu`1@e@ zH^uzmH097uCnfkdnNz52mNIEWH)@Li9_$_;LhAHeTna2K z0mcCc<<|Z)%!;7tXuAQW@}rYsSu2Aaop|N3f?fYySE7!*AR1;ng=dmiM?ttk=Hf{r z^Xa{n-pfYLQoqzxoi>vHuk$sS2bi+F$fb}cHiSo<$;3o)IuOt!iEF{u8lp)|GDGaF4E>&`e)0iLE&!UE~oa$!G8rsMB!4 zKHx=L;X3_=5Wh1=T|SB=e@=N8PwR?@S@ZM0AQ#xB=Km%0 zqGL@;t=7;7nw)Dh(}@^j${5l$5&91zoPP{%ce^jQ+{RVt`pEa`(!*uNg_114oZ zTo^y^J!C$)I`mq06xfrC+eoNLw4thHWYcibC{vLP8BfAu5l#`IBCoY3Lv!-2ym$U01x|QoEf_0m?0$YU(hP0YonO(SWo8MHc<(ne&da zhZs}axiR>#7fBi>I=8IKSZiuw!~+ zun=Y=ar57XFq#Gq00qk@aGFwRrJcm(O+yE%s`JpUUvt4vq>4+AsHFS!V(RXtjI~Tt$dok@tVV; za+L(4qBfZCt0qF|4~fO^YXaZh@Z&gkU>kTIUv#;I3{Cg0SIZcuSZH9%tAoW0d^`eO|WWv0-Jnb-koyW#)1>J<_s*_`6}_tgQ19xB=|{*`gn>Y9mdg!uMvPQ!jZ# zgq|?NGfvW@-2O5>)>B~MjihV0aNzV>i6Wy&X3mxECy36Seb6*<;I-pon!kmZ`1@X# zPY$N!!FH=nWO^p-yEcxpKks5lQih|CRAnrB<2cMA(7WPTcHDV!E>Hj4GBHZXNC0az z-E?h&AefG#U-mV~1ESw%EUHx)ebC(BD8u~iqo#MdFQu9z1_c}ioC*l?X(~r1p{1Qc zF0-NE5^O|8PYm}W-q#kqemc}tFPqX#5Q#DGWD!HNs6h*J9O(?ZK z6i{)xF~%kBGFBhpqHOnjKxirbvzD4J0Zw@Ut?_78SN4YbgRWY^90V-ncLNy4s6_C8 z2f{XgDST~sSwoiqfF)eGw8&9{Eh}@S4E7Z%u*y+$4M#wF%@6X4?C|f)48qngbq_{UNx*jEPb=9SX10TP-1J!-|-VBUlR8S#Z658M(57>*0F zJehiY{v%P^8|MP^Uie$%%w;h}^C+KNbJ?M&dRUl~wd`pb@5yHAp`kix$BtF`2s1=S zU%HpO#lMD_J@m`H^)e-+O3jtIUI%}Mv{sjo`nm6@>+;b4*?{KPj!Iv;f3&IEd@oZGOO1 zTG@9R?Y5)K=I@;8QdFMi0(qmt%Gs|Ze5`At5bM&4PROp*6{8S{DYDaoM|4`Q7RQLk z=41wYL)PODY$3ek6e?(C<&%5=l`sAAzOp3oGPTKbnmxmZv6;;-^$8*@anPNgfBgeV zaW?1^3=_p!=y;eC3tW`B6-hegJmW@I=T7VJf&?_ITh{aOjxH%DK4iV360_CwKl+FFO96yw=L`TqOtalBW*c{m;JB)_h;1 zK>o7@@l>w#Z#CSUNjIX{27c z-u;w|gWD`7&Bqhivu2=zIh+$iYu?3>BvQ7}jIX$g0^T{VfqpQ=W|JC`ftDc~9sNpk z5b6u+;E`^aPIH1$MVNmW^eEK6PM(RQ>8~SK?bzQuR#f2wX*~*l4w;$SK)X+6ULm>^+A=EwuhvBlFz5`##<-OLRcV3T&e@luM|uyxS%L^%@*}1-xccto6csa= zi7LKW|K!d5<5n73E-Zahbbk*dtf{ zEqJs_PdNL#V)!MIc?#%O%<*=47_iYNdUy&OH8v-16Vp&~D}GswXV7CPDF>QGvrYIE zOGsF|tHH@y3Vd)Cz-Y#+oey0kpb=PtVPLwEKA@O|DOa!}2+3#FO!y6gy_rhTYozQa zaQqf$lfHwJ7_0`ez_KVAmP!$+K#adrh!je#h|l>Ur$S9|IfFj7uiwxiVp&QvqN2i? zwyn0IkripytVneO*ZkcLgQ6Q ztJZr&r-h3bgY7d^o6fIbCDCUJm@S^^7)-;#TJc~%`oSDzJGoTh_1{>q5b8m%nb6{d z$x85`6_wq8EBn}FqaVBEsSU(Tq;&ZF7f+)E#T4%j2+RWMr60m(Lz+HiM`0TxTq&n@ zlHljm)jU1>v7AlB=Pf=pL6Y-_Km_8Qrsj;g-Ne60JzEFDaG`C=2E1^Oq96bF0dh|^ zE7%bZcz;;|2_G>3Sv0Um*6om&yOC#z_&nPC69C|R4;gfFJYRcRB=sfefs!ONLTnX6s7d=qTGm5TPOBkjV-CMyz+%AC;B4eg&zY4J zXJEtn2Tj`S2%{N|k7BK=kIDaQuT}sVayHC!3s*WJ4AH{9_VKgt zL%VjaY&5TC%D$|Vfg@`X4~jLT-)E#%%O?on|K9<`YXqfk47LqLxx_cKHc4jVD);_c z%DUcu=#iu5&Egc8o8Cy~Y{kYm69<5b96H`ckDOm+%pxpvcxCBpig2&j+K{m)rYZ2WI~!ySk(Dl40z*_GQKEjX4NK6bRcMTQP?0~i@iYiYD&mPPDBB3Ho|ig zycawpSSb=FFA_v~uQL7VjS8NDwPn2pkKj0r`q{(E@C;NRofab!`w zJnP=_5pb8EM}#>wRX7I9xGB}XPuy(Xcig&YrMTliC`Qbur${mgd)nK^S@^QI)wHas zY(joZihswk|6wSk!7t?Pe|ksP%xrbJlqbU!R-oWl&1+ z^+wX3s1%OiV}TX=YP0iyk~sCBn=X^weiBdn=vc(Bj?YD9wudlI)s~*4m9=BN=)P1p zbc-E_8ybo{+;-8vN^%@DH=ZBRchT4wv1|&xmF}qjt}^;@C%IJF=K}Oug?9(75guQh zmn+``{T(5h3wa&*-_=>`)+#HHwMLvc!JqZf9T#8Z<+`KpzcSa()P5BAwC?9Qf0&(_ zh_v?6U|eV>)@&TC5n~bpIC)6lklhr@t#6~s$lfmx0}76WP)-H8DQYWf{E67jBlA#p zNJ&SK1IBDnhC>Ct3G#m*uq2`M{xDGKcbd6=6~2PVuk%D{5d;LeHnr@4*^0iQvp`23 zI6w5p7`Eu7S#NeM8_tuji#;DXKe%4(FrSvB$=FY`TbE5!Ne(-ZO0XJt(Gfma+q%pg zGt{gjK|T~kYv2fEYVvcRzh#9__XFTj?^en7ckx{syB*ilX)? z$H6Lepf~#tp5w?R19@K^S@RFOg>{~CjN-E(MA(Xz)JL9}ftz+a?t`@|ECmt(fm8gE z-cpVfi2ni@Qd_9-sI^YlktHPIBXpmRJV5j#+d@P>j(*|vLu}@@gLv6j$=5AapnKNM z(4%0AQ^l7B-(EfPUxQhp;6@@WjP!+_rl1WRqJ~&_zlj)Q94^ARW*&A?nsr05$}Xou|oxJq?D|7NSBX}WJ= zW)xAGtO#Yh83&2^XXMVfL-tHebU%9i>ai|KBa#tM^*_j8Y$OSP{h9F>VtVaYjA|k* zU@t?qUNq7j>nxOVba9VwVyM@->+_PlfHP-kAkfzeWw$E5j$Q)8Rb*#)Ohx^r!E~yG zgiMvut{f-%-GAzIs&~C=sUj(uc^8ttk_UI~6a|5B5{|I1IXIi;71?eY1s$>0GB`p* zQ)P#NCb-|uG<#(pc76XI?ggTKqDqna;1>E(VWo4`{65-@NKPAQ*oFCvgU~e$d+4PH z9Whx{P)Jyz>QKrK*>n}mO(Af8Tg&LD(%0hv(TwYDM*9GO;DKbgL4P{b z3KAUN7FoL-F$jAro3?^|iWq9LEe`0<~!(%g2(8H)6$rs8+IZO_GxkX^K^*;XaPp%!d!k&{?NqK z!X5Z9pQ9jTY&z^5W%J_@k=~Oz?W193XkO&o7M-(|4%}*UNZ8e?P3@XbCFv~+DJTQHlBq4%Y{)$ zFcz#;4HouJjh)Js2|S!C6mBu4T_&2{FTe}OmBVD{#ecxbewZU1>@QmM+fV9oDi-a{ zGjhwkT;j1sR!Ac5~E--r;oLEEa)>gxl8tB>TQ9j))7 z{rg=F?cehc<*${)pecWew#%*$n7!pR%1mEHKw%t`JP_?an(T^`*}^Zfv>5d)hd}G0 zv(9i@ujSQ8+Gw4HhhHR%B!;l{e2pb9rfeFn$?lY2I5w%`+)}rxWfu%FT0g7qzg0&? zD*vWhyu>Ye?G3@{X9S1B?;@62>I^!~In;W(3FXA1{qJ>_eZEhlf^gz$d3@2r1o_!n zPn_v*q#=-jlakSzEHEZ7I%V_@c2iRwYxIb(^e}^lQ@?#d{8ZT~RU zQDPlz;L0}mij^a&>gNSx`s=MS3`yyFv`)zrp8aRR-lkpZqWKZbFiA;7iRj21!h;64 z7FXw=FO6nUMQ=B~MQ{Yuv;;0HnDuBkOrUO@qlC+< zC(DdADJxg}W3^i1={=#y&zN4n6K4dwFCKMj^=Yf&Lx1?8oGIJ~;X7KGd?oHD?GK3W19NXWaSGHgN>oXKG`7B9X^Dqd}y(pE* z8BL?Y&?`ta+TCY#^xc_^9}g%Q$YTBNN?!!8-SQhXM{dkbGt#}S!9|I}+Q!XyzGyLr zd?y^Jeaa&I3s{G>0@sCq1P+Cz*_=LnEl&?(ZulH-x8ATUs*D~31GrMZ4{2`AZ{d^a zh1$E}b#vwVl-G7E00HLrz){sXmB!YKw-S6&P7{<`;U_~NiGB_r%HiBE#S*4_kca-W z-IBPon4P~&zsD}<2x$I8Z1TcUSv(S4UJdT1ir;Ys1DYYzQ|fO!Dy!6wf(Va?NddeO zZendOItB)5$c1p^p?Pw3qdUiy36(WnZ0&auR!&_E>6<+~>FJoNaO6|InmU^)oE5ud z3q9X&0l~HKkT5A&|EA@lG0FAYR2D*Dxgt-7Yio>YBE$1OXJyxjxnCMzKq33}ZIxce z&t)24;v+YAAF5wmN4oR`$?%Ca;S#gqCHD<+I%+zob{)YEnW@Jx&8HAQB}z!%u|8`Q z-Vht3kv^5pM$S!ADHRZhshI%JzXv`3k2^FqI&48*rCHvXOJVwGKG?I5!{Xa6(7s%4 zn@n^+WoBCbKR(ke+r32Ef9HC}l^`%tpvohNYiS^&CTJS_bTmwT$lM$ zmlV7e2+sYG3_IQ7Ok@h5HG@!U&F>E4Hyx|pK+gnOcdk0(;q{*b`v59R-#_eNvxU<| z`GB-*L8<$TmLSOM&mgIS?(;%wM)d*!Jhyq_%xC7)|Kt3sQCk7KfCRvxyZx(o&!1ry z8a?1FzR39eFa5gFY|Ca5-hUY)?fjBK%E)?-L&5a~Zr9oPjm;u*Eg=L^!|Ft z;_JN*;GMt!3wWQ(>!B7Ij_mR)H*EQqfd8iSQGW$}KT~Gu%kwa_{iN>MmuS1OGf#ya zi-OhhBhByWua^@~hYQZ|G@Z50y%Jp$J6>NC&YN9<5e#f%4TF~sI zzrk&?_qwP113+-{^88oTShc$aV9;kN{GRWCfQ0!8U^!V{=1f) zce(80k%s5KzSQ1Vlm7^rx>5*#E8Ph`{$mk~d1-UKemtCKInG$PbIRbYS@d_=tda3S zn59-GtuQUP<*;W^diDYh$bIln_qFm+h776vI6=ExU1}cFj=vN!(w-G9ME8ix&m4Z! zPo1J1{RN<>&l&IavEEEPe_wA0H8%>jT5qh}mG)tzskre+6wutt*x-pPckw>c0_$I? zIVWKbu0;yj=2?MzKj^T8tJ~tHG54*iw88M_I|TA0fm5(cF$c|S50-t#TZN%1yOU!s zd$8QSd4cqKgj>^b*epmz%48Y2AHd@F-IG&1JV4I)YpN>sw%ZLnPm8$aT915?bc6iy ziSHu(iNu-I21)Xnm+NqA?4eY?T|Wa3Ijve~*a;8Yhh@I?-cw)-H+B$LUf}vc8b;FC2sVIqJ1vbdxrb4FkH&4fNdFXV z;d5c7m-&y7G5LDXn86D9A(yGxvxfWn4-Q}XuECHfWsV(SDAJ-l(#6bv@bIhmrSpHZ zJyVLZdcDs|o{1niTL*^PKDLn&Y22H}WIDqG$`MhsomkDKnNBlf`tE<|Mr%s3c{CU} zwk7q9-iq#}r!SW~|81aSeI%X-_ML9)DOS13yl3@~v)UX2r)j-mk)`Z!--<){ zYq9eBNhXS8e#FNZUWyW`s3tq1mRLVFRUZh{M_GcwJS7)Ei=kwhKdHf8HEwHf$J)DR zlj$-&#LWvJ*@cD{LY15n8%1@Xo5k+IsFxxdX74c@mNROH5L>G7b9zm zO)BMAk(8-87~rghzOXn&;yDH)yxMBlY12#ffO56e)@oI-XuASsdc(4gmk-HDUK~FJ zn7AJ_?(6FprEyyO`2ZZemaG^@2%0`g+8ZpfYR$hRlz!Y~Vld*)lx^)^OLSW)*x-*v zX?9AM?~eO;wA~M^7xihv6ylXi>yP0MucyB6jyJ#`aqs{}@(F}8HZFct;oE*U;R|nO zN81dZwcR*LxPwPPs%k5Q5jLJ*SSy$PpMnJ#lE|ZW1ClQ7-LsYP!;K~O&w5fqjAM16 zFgl5P-mz(YiuDFrPDU&%tTDrhEDlxKj!+$Kx5Sf$0;z!(&h>gv?S{~q%9Rs9j4@S# z@sN35qVP-G_w|4@QI@6qb2}i+u=A$z+PNU=$|-#p?OiXh6Y<;I+<9mj|EGm(sVbuO zNr2rQK7VzheEsyEMaj^`KEplO!(p+`0h6ilQ$idJ0<0s*gPrLJ7$F36q@sdbN=8R1 zt-x9fhW&hm=KDwN$7TBo4Oi#-^wdb{S;63cL-l34`;J1R>HhCiFAp15EULr*)X9}g z<*7d3HAu}D{!#gd5^P?h3J`0?1Ke=X=Z%ripAif8B0227gchc2nuEZfl4gxn8DPWt z8C_cKj^7ES4?{n?#Tjabt(=?){cY!otJ8*A&4zkav9m{)fxfR)rzw?~r zY`U!tlBDQ(J_A;}9?_3ISKiT9oOYLgUarS!xjq}T9u-H8@;}r^JI?aeGGFBaVO30T z-hgB#<%FPby-`+u_qEgaPa!GC&=+Hit{S3PU}jAy#C=-S!k={gM*5oP07yC-A*AkC zfR5y|&-J8U%h4MUPIAH&o3=i3oAdWI#Ja1&^WCRhk08UC?RCYOBDNuh^s^8dtGXP5W0dEyA?`iI&xMIX$? zhLZZYi6xrJ3S!*HoYJ#=c<$o=z*hn&Y;t$n&MGPgn6A6vK~mm{`zco!=nL4)B?Pe^ zON9+i?>48Dq)%g#{IdJkz&%BtvIsUO^#I5}UY{GOdZq;*ISX7w}}!A$GQQ> zyxwBd>9cug-=Y1Vvp8j=-tvNnB5mz0=x^@xQYpb>@87pZtG_LVzX*R=(=%n+?VS$w zm0ffaXsiFVw{_dx+({{Z+6xt2x`}eqwCw7A-hHnY`Fq>&iXh;7@t^K0!bxVYu7^cR z%+m$IyxzomhqIN~^)10a*jl@1{h!P!niSB(AT1{7(ja{8a8nV2+e?y!^ZHSI8w8dATcJqZ+U4?b;D8q3v0Frh;Zfmb z(ggX<;=Hb2cJ0RXMw)^_WU#bEX-kw$or~`8-gZ8>nT$t;UHk`diN{y;hSqQRk~A3% zAmu;A9oecorWiz`br!L4la0}hoh-R z=r-E>r=WR2F)>QRL0?E>D@nh?VDtP6&8s|?TXkM=H6mahQS{lMMFM}Zq>k!q`i-^i zxFqRq&(5j$*57|h))cR|2O}iJ>!s>mR2fx$do4MFw>4DN`s#eJ9kUJogZNle@_w2b zQuVw>cHB;175-p}4?OHdEDuG|^_Az}7wzNd$WJ|OPW_k89)K>Tdia_nr8U~Zst5jC zls?(_wn4vf!Ra&}Ft5Fivn}Z5`kzFpD%T_XHBB$9iJX21i~uW@CJD0?Q6v=|UrY4U z&@b(qS+2LjjbwS{yEv;QQ60OO4f=qc?~8Wi{NbZL*`H&;K|ZU(Y1I4DaUHH7tPb=8 z&C<-*7ats{P}R(@LI^GzM~Tf0=yw2K+`^KB<#AlmL*+qGjl|AD4I zlBrPYMhK_g3GeE74q#?~H8FEb8zc{{OSJ{y<-2l%fYy-q+mqS260A3%WSpt_k6VN( z29H4j6{TG0F)N87P)mVf%SA{Svv#-L_f_oX39W~Hz2}I)b3}lI+(NIhj_+$NN>wGy z8#E3^oMyD)oIDsEDtV+HX*=NCiT3luWBaW4xlgH(7cze#5gl@tj@R{YiRH@BS^>@e zCO5j36>E>a;qJ>niQoX*C=QgJ#MUkGKiSl`-s0DPip+2tSzlwDKf3@!cg~xmHtNS$ zroR_UP>-PG4(p|=R#?`rw-Yrz_GT7FlgEa%54gQbQ?1X~TCjcYlzFCbSh@U>+PTJV zJ^@6ZANq^JD5G1_PF(jW_|h8{U|HZtmq*l&h|Kjbn z6(&$Um5vU}UN15a3&l81Nj(Wtb|2;2iEr+d$*Hi&xy?FROEY`L8W`P=w(~Ngpij|j zA$G7Arsm~IuE5i&-b{hCi9|_1Ivqbu>Rm^CA;>)3WP^5JY0S+orkWa&6uOB&@A!4N zdR7?g_GgftmIzTC^A`duH=<5J;@FkX-_Dfw>#NUPK$Zb5O=)<|P4_=!Tzme>=XGsV zaOGK8$}wCUDf%V$@1NL$vmsAs1K~guDq)8fwi%u5mSTl{OT`OYbCo8XsM_yZ-Cge} zc4Ie@(w1Ml%MMItm4t#YS!a}~C;S9tZ-Lu8z3gIa(Z#wXX?AijLDJ2jYe5K#rjX&U z^LCndrrmfZtmRnWOKFlX97R-;@vgrm@uK^?PpXZL8q%N8ufLt zI;a?-YKb_`+?}tVL!}ix?)wondiT;<>gCJGA;br5^>j(AjN4!*Cw2jzXw~0m59RWIdhj1aup07fEZW2g{w#L1i ziWn)hEEcd=LUHXfQj)`SW^N-+6hTT05+vs2lBpC04NC+3lcX{mkhklr(Q8J%H%p0K zo0>#5Cbirb{#6loh7FtbHrV9R_m;ME{JY9bfH9t7;1gm~g}>p6)H?q!(vV~p z4YfP|y@dA_VU?S3MK6lnqEagjZd5=_{onM_b}i2(z&DP|s-bN}V53sH>q}IU@{ihc z>NkJ?;F>(tC-R|BaWkeW?TgYzl*ZR;zCExq*Is%=DaJ^P>Y`O5VO1)|drDm zAybE){Xr%zn&8dpxJB=~_)P;XKiRs+^3iyghv7knY+|5^t5CB`_c~MMi)(exV`eBI z?qzlxv0vL?|CS$-_fkyEnkCV(j0h=`@aTV>|Dcs7=MuX9)?gP;jifMSPaBjg3^Rn( zhG49ixP96D%5=aWn2+YRmfWC3I+sLIYc!I#h+UMcpc>bJ@d1y_@V!#^zJilU45%h} z#yDpbUwChP;3@78$`atI^LSEuK8Xn%_04<8RNKXhBtSUlxZn?|&2nOs8~d|zUn!F3xlm(o zQfczHSz?4fc448FpDQz`qkFN!sd|^B;6aaj3UjE2GB@?1>r(YJQj_%1q3$% zN#(9eEP)yh#M%jb8^H=kUhfZWkg_ze6Sd)o_{dV4o3nh_ax=17@EcvcZZ*d<;|${- zf#GvCMMI2sQqQ6QLR_VNIOfG!otMW_X+Bc&iK6Gm;(4m#WOLNK{N3NdM1=_wE9dm= z6U9rXQa(bTGDYsT-@-rU7$y|0_(ajxeulWtFu*M|KW_4^->otxI@Yc{s({fbKT?R! zx-Dxb=4Ss{K3vj!`|RFNd7096rb8-!>6k$KFAqgcdkUEm5*v%jIKz zTAIcutCh`uYg3&&6ER0J>e}RfY;ody2k>j}8$dY8+n-4^f^yFqx$3i@`+l0sWVI$} z+vg@Nll$lAyVEo)L>Vw?FvfWOl=oH9Z2&9kD?4V{-5x^ovBy2FizONM#Q9~C^hUjr zrv{PsP5tl3;fSK{@t2*)o^yA%pSReLXTL^+j0_Y4<|85epr{XvA=|^!@}^Wv@pv4Y z@aP~yj9W2os<@J|%E`1A_9m{fL5GdeBt4wIPZz*!t0tj|dU}1jI;qXw9u1a<$vBeA zJU9LV8dD5B=6L9W%D#>wihB~m#lMtrf=H3iKy>qA=L(OwTnxtot)Icn%+)F&0D7KO z9f^X&Vfl1Cn9pRt#a8k4ZhtI+mj8-+96rWf`p0{^uXN7+@4@Mq|2Rg8j4(&}8^5a2 zmNPeOx=T-71*lu;PNbMDAY#`3Q`kx|8(={vpwj4CAEpKU2lJZ&Z6WCW886rrk@lox zr~ccdLkP*s@GCchL%@d~EbEOXde0zZn31rn!{0)GZ-o$h8TyR1SMVk${BXIkgVV3g zvSXa@4$$%TJ)eu|=bAc--_|z!n}Ccc`p{D!pe|X&Qa!RstXKs0B=ST!K&be#UCS(A zO89B`=7b`?AUS*w~A%CdJ~)4Uc8-+&9@QT&%tZq*<|N@kTs|nq&MMSxy+^4kF5Xi1t6+#{FX;r zQd{HmolD+-W*oVmR83=MaHnRjnmusXb9o9#&(s?&BDbN<(e8!H9uzUqMc!%*;Jxhq z+w82j(A-S80p|3@b5}OIRQfvxyNlE@41;wWH#@%n3C;QOz=`q8g-hb%<>4-2E&O1g z6vRgG$uJV5Mn57WBsEU4X>sxFoGm0HTQ zw(@v&J4OmxOi>GN=c2iRc8nI9?}|pdmr$nLJ&ejP8ys$X_3M$RLYpR=O}}m+s_v&H z?6#q}`Ba*K9UbHbhgmnJETO))4C#~fc%{U6>~`Kk*`iFM(_JZr@bmrFi6EEfP-|b} z84#`H{3B9(Yv5d7AA9i8IGizSZYItkP(q9;HxfIZ5Vig?4y2g&Qd=#-kjQ{hvh-bu-pj0>U_rRG51#aQyN` zbP%zmmGHQl*hD3<92|Y|#}rk<*-rO9XQf?1TIoiZcumOvS^gf{8upNT2$N zNhJEPJNvWW-BU1&mw_xoe#eW$SMN%G!jTl6IgC(R`YcQXx~%nw7xh>sm3mp1z7X7H znyBzl%%5M&bkWkQ6fjHYx&m(OHOQDdZ~uIE+i^dk1!B0i-?=9mFaM{_#gkLxHP&gD}_I-pIkY_da%CxntOjDtM`A4-nW1TSIYT zo0^zwn&2oC;OdbkBHa}w`siZ@)dJ08T)fKE{)?e#SG@H^B8MRiezsqS?W2HL7S`ii z%;nwwBjgLqGp>olWtW|b#7=nM1(&-7e=S8ww3)%v6Pp`JK06$dt2oG8P*X~Ez${8S zR(`~rMu0493=aA{FPQG#g*Z_9*#CfMhz0XoThxsI zsn^>#26UF^fxZTI8-tTx&BS>ID@0gUC*NFMKBMv7-yvMam~>!H%~%SGhnPt+6*+1` zswdYj8QU#%0Uz{rg%{7`TO1uBWk&u`BOt<($*pErtl%+)t9P9R>wNeIeZ%;PJqt4j zuk8E=vz6xW;dtudSY9x=p;cGi0zHa7fk{npl=N?K(A5s|pu}L;ZeJGp#aLjA<+v?t zxWN|^m>^8gW(IVRukIdT>&H(Ay6@V1J6GrgaE`P1Ix}DE@!WF^w=T(vq%@O4UNAOT z{jeew)6{VT+%tYs_W(u}Gd+wmpijlZ@-se}P*)-yI6kVgwaj_n%w>8pNhicm{_9&C zf27X|&XkK@>2{5Js!KV1C{>*#-vgQ~=g`}GF zhjcQ=1&UGySM4tdNM`ESCt?4Orf-hR>;3=Fwr#s*x9nxRW!o)V%eIzzXDr*c+cH)y z|IXf@-}iCL?7_(jhl%E0-Fzo#K0XBME0OIVB`d_I9JtDUf%DFTMsX2 z+b*Hkuau#L852Zv@?Tz02z!@>!;Id?wFpe=jo4Gxgk2&Sv};#_m>Y$GnibEqN}uEd zg~p$Yv`;{YVqA5NiIahB5yFiQ&T12zczSkpos}=NgC^S++p2Tq$Lmvh%MQ&2jn|>( zg>QMPQ+jK&Fim1vWcFS(vkCuCz=x<7DStP{_KM@FuR}0>kcUxjkZoe(L6E`&xu)J8 zb>yGq7-w*yH;B}_7t;OD3z6g|VU{}cDC-q`euH!=l{m7j2NPMN;I3|7a++usdZme| zD$W3@e<<)uTUK&-uXwLbBUW%bs1S^I`t#c`W=fNO;xSOgmU}$QDAYO+jqKW>IBd@O z2`txHV@HKdI8M$e9=M+K8LL)2PT!q^H{LEH;s`%6;#J>_z)|nnqQ*jK zb3G&DY$lM8X%*8v*wb#uZc^XquC{JGh`Ef)-`1Phcj?)4SLRwr)|L>6C$*#8DfeRO zTuytPePR>w*FjV|)7pE`D)}C|dfRxPe)1jJ4fIIohMR>ojo4^r8`(a-%_k#LhQ@5y z=((`cjCR>!#QMZ(FYyZ#vRWbyIitF}34N^xGc29rWwD7CY|>aAxGyc6=3}4ba;ZO z_ggPa%DH_77)Y_(35$L#)h;b1gkhsPU=(g{%qS6gq)YkGMX z{1z(1uJZTom1f>#(eKMZD9Rx%>^Bk;6R7@YYHkWe8fDoK#-eJfY%F%ertn~>?du1>xD*iZZ=thc&E=qK>sxeDN^psIn6aLgtrJ_t<~ap zb?v*4{x@^RuZ*o0$Gk9FOj2$QrSJ{&aWuaUZ~|x$67x^0!+rXNxvFE5E{Wv>`_LS# z91pI3l|-UlHX$)Ats!YVPq8b!!_-?W#mjwX#&#Z3s3LHL zS&YFY;+uzaPiRHna+KlMJJb zFUQ9xNifI6{NdL?^|2@*h?3}L#>s7Tz$a|CFNkiFx_^PKw(yF4YV@0#-TtaPPIA2R z(y6&q!aIS_Xt-PQJEf8OWH@z9)5rRNd-ptRxMq+NyB7bSjfAlo!ILr;LlPQD-qNY* zX}~cuX&3@>qJ&258(u~r={f7!ZadpKRXu%(@KrofTKq|oucj%ll5`MnlMwc{4pR8p zn4XhikO6WQ|66_Rbq;teB-De1SK9ZT3ypp^_gu4q;c28ngnmfmx?BnYrf;ObXVTNp zb#C>|L`{=VOq2u_*Utu17^L;=SnlR^Xtn?u9?75V)j-b9yeeVV{J9(|w{JkE zv?;7C-yhsA#Tz)t{6co`@<*q9ZjAgG$C1`Pn9#=uh@|R_n@|48of(OvHmP>QQ(p9@ z(osM8xl_@f2f#qzRxiP3qm(?pZdoC`nJttlYAU6Q%wj#`zJ)p>g)B|kw#c>T&WnP6 zr>|Rbn4CcON4eQBnlH{J2rQYWT!!G18Z~<>x%TJaHT~d9MvyFlrkM;@^ez%@_YRh) z5jQJI8MdbLA2)k9p_~$UNF30~+Z#U!dYm8{I42py_3;k39^j97mV{b%H4PpS;`$0FcW zX-h(tp-OS5^Jki*pdk0fokjtowR~KV5~ul(GxQxT5tt0r$!r4&_;6%;0#^vPa)jJQ zHwH7+&yHhIW*ntq*UeU%TVR-Db+ypk_7OTIlYFvxCedvpTo}9%5B)-B zs=|qupW0_OgJNV#KDy1kRJ4|Tx6Nnva)XMW%e1-QD>ztur_y>M(DF;^CZjy>=zU_t7u-=#(n2P-xm{2_}}HI102ii1)rUiO8}B>iF-_;vs&`HwyPw_XLX22_^YgIeI0(+)#CXVfI?iN|(k}EqEFL>i zcG3JZq?>jq*&x~jy36+R7f(hEY4ue#ih$|*&utVE0JBa4DGEIKI3tp9wQ|U87_u~F+bG*CaW}PDqemm*uWlh zuc<&noM=tAO|}b<+V>`h85Wxl*TVXY6r_~hwy~;vnWr7OPu)dN)z>W6nnO=;yg@E3 zG&gGTc6^MJ#71|(c7`_*k4M)pik+pJ!n#d}0+Z3KvV(s>%^##itLj~R_RPWfd$xI! zzCKL1)xlnmI;W7M^B7eAwv&;O2;Ms>x_ZJtQ@v*#dWXhssuAQN#$%#sSU+YT(7McdTo+1mj@axur2N9xl=%aOp!vQ3c`8Y2@3!j!qMQrofVKiA4g|bn`IVohY_fXnSO4?qr#(`AK zRnI`P6ER*56wIYW!hBia$Fz)Mc)jUhtZbY6BET8-*QPLP6{ZM=mI`jy6@pxsBE`)3 zJQGyy9hvj{4GbyU^^=F0`TGqGhHwb>FPF&Ps8+MtFj<-0-$YQbg8tac<}k9~>0vhW`EC_F19yZ6*CFrSui}3S zIiw9cT*D9H0mn#?B@xCe){N^8ZhE9_UXOJFd(yT{$m!jxbVZE~W&NWhF!vPwN*d@X zCJ`8>>q;@#He|gc0xoK2HkI>XF{V!m1Dfrza`0Rckve9dCyC7NCy&euyJm!6sBjIv z3Wa|3J7s!Stp{EZi)3;9cp5)x*ksf^r*_3wgYk%t=b_4y7mA3Z3?9kryg{8tUpWTM zjIk$cVqSvixhxdXOCMM3=lGvhc}Wfh+VGE~3#`XdfOrP@VB289PcrGnd7ruVtpNsQ z-zT#^JZ^UVPD|`O$X|`S@|Z{O45$oCCTw=YGK!@nm+Ht-%6XYiG>F*NbYT-qjYmm> z70^=;we8C-;&;rB8O-<9FmS9&UbCf|qim&oD~;>ul{PVHtD z2JFy%WeM|VOYMiz+B&Aw*ci_tZGk`{*z`vgstf7;$|~bV<)wcI3Wla`PDhk zuI02fH*gqqq^Oe}i)Jmb_SxF#97~`VnDLqOzFgGaulX`WV^^NdOgAdosR??Un zZxiF6%Rwcj7Pc+vDtB=P?S5z?bVDl!EXr4ok$`P-k-UBOF1Pu`;YxC z0)uzJM%>9<0{x=TqQrV;tx=2lh2Adoyy7>8`Zi9XI=&s#aZ5I3dvX!R$Eha3A!Q-z>}RId_w{KFD*8; zT8snhXRwCO3VM~ejs*SUw3?&ZqW$5xn&+$C9yb}n|ISi+w!kd{^h=@fH`Ojzx+|;O zbY4}Bdl&N$6(Sav-dC5Zqy_5-2}uJYIpQXMSiket114K_L40l)O{|6EDngL!?GnlS zk5n+Upx5vr#zKPz@SRyA; zmo@Wrb6J%bvDT>f9SZkJRi->9^-XkBc4_J6H4mpal%~Ee zoib`Y61WHRDP2Um$Nd{_d!)WlEOrXXmhjsCYGCuGY%y`QPAYL=M6pWps^q))8@!bX zL=7|lV*BYLzPtSovsX)P%og@>4{$bqU1K6NP2L=3wRUpt?LVrnewd;zt&OCFd;wq~6)v0Uc)JLh> zqSRM*ebKp<3P5I7r{V)GV47Rh&u2pSrsaPVPpvbdNC zHm~r8Y{ySHzg^$LOb&`NBNmpR=(h=e_e_AJ^leq+fl~A^rGhPqZ!mWoVz3vk-1ayKpor!%pep*v8`q{(*RYVeHr8v2&4ZuLE2YPp6^J9V)Y2*t-hAcCW* zW&Fj+5w74BS!ROFmL(oMvlvPkm?5xAs)yhPHfblw*MH@be#e+a)fG0}P^e5*Cr|FA z{G5K__E6j8N`BRaO9Y!ugtl5r{rM#@R` z)Idhxl|qOe=SJ&WifR87viyn#FSi!(EJM*!p_s$hlD`SPViyuJ%gU{)>*(05Rcy}x z>j@IE#)<*?lc-P8jB2+6Oh|h^t;;x#f##p3O}}!KX|M6DS^_i?a91mvXPwnc0H`frcKsNu6FE6uY}exs zJ>KOoraltwh-a#9)B-DEQMz*z1GY`wY`7mZSnpYK)m4 zS2$52RkQRUpfEw!H$8fLIuy;OeGe|F;Y`2_Y78|u7$EM3chV!Ioz%&$HaF@Lw*Jt~ zLq*#mV6TT@18WKwBAkY$EE3cP*RE-RpO#Jc&#?fEr;9km2yack7Q0SS=xSmwSlq0S z!^}_^hPy8N@gNbRz+TexBPbj?5fI7$x1ZC%tp3Wiy0JLv$!WIFh$A{_yjQH(XsRcr z-hu5wJ{FjUz999LbES5rK_lkU9E*qBMm`VOs2olgdH)I@|Iyoh2UcHF@ept^X-5Hz zP8AXui9q*^^?CRE5Lm)130WkbFjaK444N{0a1j+aJPaBYU1ZW{7c4Y1bgFXd0hVk} zix+|34p*P5GtC{go9#?jk1IFN(pvs4gSV^X=m;$(0Zr3KG*63uD7_*ZxHgA!Hk4Q^ zl)vUbzCuG4;~avy_E@Po1^T|-uP}1kmZr-c(n72|C8-&kg4Mbx(kkU7hJZRIf?Ia& z*=7w0G?KXe;l{h_V6)myd~=eye#5m@D8c?2fq)6uZ}dM1bS_Xq@mi{wBsb(jz{3l7 zoRfOt&zeAwxJZ>vCQ_YauV%~zbMSgiiiJG$`sJK z=u%%fQ3iJNxhu7{FbP+}Qo!xahTyS$?G;!bEzroql*u?vO=qa)M(Qy-8;7nVbv z`*_)+`TF$5G7>(+;|NDT@h6I(_=miG`ngc9kf#qnmBb&^mCzP1Y!{=iMtLBL4=aUj zCEhqh;JDppm)N6Vot7Vd_v@7COx&kJU9r_1cW^!qav1zTl#&Rr8;V{G{>|NAvqwMB zSs<;+ukF?_^wmA|hw!QcEa+3iY#^0NF~o{4^WT?ir|D_k;UE?0bz=zBNxZI_SBz$J zyQq2ZzJ4PB!aKK*fyL@<8AtuSJ{Zi;S#9wGJOb!uRwB`UO?J(?)z2E>fjyiy?l2LM zw>`hnv48vBvS>T~gx(@@mP7l}Jf80FCl#0-=mced9E-*=5}yiLY=h4TBjo!)G(zCG zb(?zn9nVMzZ8xT3|F&i!nL@)5S1ZB`vB5B_m21p)EgtAL zVtf+JwZz3NxtgT&%0niHcJ<-!jbmJvnLwq`>Kei#-z0k)`|^? z*np@)BAZy!jD*LbI$NM=1hR_H)gnel7lsuTJunWnAReVbAo*KhM{PqA3?AZNNSP{L z4&}<**9M^A6Q7QaVl_AlJeUmy2?Mr1;q>w{4y`VEmMnK7i&zvTC5THX?C@oRextqH zME_J{u9DKb%5dJy*Q_P(uz~v%NCkG?7-2#RT>zGg<_o+WOaTtNF#z5&jfCD{GL!*( zplxWj=J5aip8__q(H+j}Ks@mJ?OJwDVI@|APZ-zil(>IU6X!o&+N$VgUqa_f>`tBy z#t%hytW-fsMwe5zm`X z;%a1u5kNFYZ!hbP*8%b)NYGQBxh3UgHbUflS=%hGzgwr+JO6$^hPC7OLix$itQ=GC z>+O>>hrl4U?@_82f`+E9x490sg?g`t-(S@8%85u@;FIsj$CJRA-fW>lk<>jN?k06P zfdtZ)-SXM<6~Nzrz5!mW^qem9vb61xD7<}d02w-=^YwND(VI5Ut4QEiL5Lp#>npaV zc44B?)hV*Q2kQxs9J`TR`wFT&GE&sp~wsY zMsrKFZk`jEsNb`7d3y`AUB1ihm;*?L8#WXwaZe(6&^=tHSU_hULB(3;JuK8lovCIl zx^bWgB*M?fcKUhaSJyeE@8S+Xdfo)0$T=Eet&0g;i2ecyvq!c=W0d&OIubeb>#3n{ zy8$2>5oEJ2yR@SB-LP+Mzh5?3AqI$t8mbHLw_vHXbI>@3Ug(beVqSC!V-&{6A?MNf zFeLq{c+lZn&l4}-)ptZUWID3A({dnz3H(@P7kR6&!H&{Q4@=_zM}?hzwb$ZG<$$H@ zy1&$%O;0rGtNIi;m2Jb6jr)(DQZfn3*~?%=mfg=BHkT#g(g?u^+U2@h(#mnlJJXx* zEy|398oX>B%wiWTc$_H4W;hGLT)s?J_24Qb|E8Z{X17V=cl|j(Y=sDB$FcVf^a9L; zUl&TIdK8PL-vAlv=4Izqo{fX@f+mjH8KGlWgH!w}No68mKMH8eL$4K(ec(uOWq5># zVIm)ZKYIF+o(j#}p`9#so*WeJ1}b}qd;?N5oN05Mf?p~sM3+zyHfH}RRxb~YUMU>L ziOD^5HynGr^(->YD{o;K_T+ERhaPNgQH#2Ni{AUruA`fA9oIhLYWGcL@lDi8c4TaF zY#F{0^nLnCyV`8>Q{Up*%2rgX#DJ(=(XPYp#1wcXUM0Zv&Oa-@{B!r;`u6eoty2g}bg1CQ7nbxq!1Mjd*_A8d zNm&fz9@^%tM`x=3-Br>HR@>joZ+}-bajCO1P7KzPhQsm>+ z`8zltOzh3(p8weigR`8D?ljMi-yQb4^wwBY(=XE)&E=m;@QFUu_A*C@QE6woNQxR( zvnW!euoCB1Uy1OXP&U0!auuY*c4F~4UcLXZn8o;ys1zi&BTn*sYZ;6J#q#pkpZ0Nk zwKXgwh&^Pmr@op_c>r7?1w* zFy2Kl?}r3WU*q1eJD3;|EdKIx+36^iZBE4+t56cX_Iy@nw8UeN`tA=nW>1wV>miuf_HlW|zL5YWaztEMrr4fHe3ae%Cz3G<~vjNcm~4dLSL z?}!LX$`cT|mU<_wVf8MqjxF%y*yqbx{eR1^HQgeWOkBTQc8Oh6zU4^ z{+;q2O)PGkf>|rR=Ps7}773((qSq`w*#GGh3KB0Yn91HDb}&nyo(>7|Z$v9d-Z1+{ zRJIt|#UC21$897d{}wT#sOp9_R5O=q_yd?;(R}5pXQfEVmeT<8dYs=x37i*Q6=u0B zF_n^`p^@i4?&f39W4B%FmPgeZi@QV5lZ8FSj@;kmN*|0{%9$_S83zGn@mC#ZwOz;_ z5|wFDoYklL&IY38q33jq$f!VBaA&cb_AglEM%?EOt`&VXy1UdmKWdRF_Z0)J(U`Mi zXn7BbXtjzue{^e)=TcG#ur=5cu)gLz2cU3&F7}2620m%?w1^|>IuOT$vko2^$^K14 z2>wY$g7UO z3IpdAqi_C{Loe!5R2)iFPRJ`;4xJa9JMRyzVnqC=j=7%O-pH*%&q`oAsi*u7yFgG} zOmbzsO6x`M$9uf?S8>G(R(Nmps#n!Fv>$aZ|HSN%p%t4@RyfgcXiP1bh=|dDxC9k0 zV@eh_v~9{{KHOFwv0vm%d6)Cc((UoZ6=Kcx+Gz>M7lQ|tVij@3QtfpFRt$aZb<)0k z`)qdtN|LG{~=xp0_$6rP1o}A&M2DCmt!#_2Tu`4@X4^k-HaS?dKj!VfQ868N8gb)lRYct*ooD;43G!!we0 zDq=L)5>hs-uYY#|Fp|$RIm`z{2UA>dD8$KH__)DKL)7QIhk-$$L_&~A0nw_<1hf1` zGV8{CmlQ`m<?FYbY6bRmRr@MgJyLmZoB5&bTfT&=Ppw$q6~^JP#zvp3}GcR zK(3ere#2bnW1g=|IT>?b_YHE*eZ%c(*aAxep^rs4tj$9s(?--X zjxt&@^_N)2m}7;g;ZuD3zPKA*u16u#lc+8yarIM+!UZ7(oq_d<67J^`ji)b@O^g^; zo@$4&gCk3yVf{ClsmMh-I)>Z$nk>hpN7UD*tG!}8;#?6&g*XHHC03Y^?LyxJeFlfW zFmSrp4D=wM2*-5Ip!W^?N7w9od2@?nNCvI$O_S8`4w-CFdi3hd<)reUAaTR0o~n3* zah#|9E!>Z}m>W&_24QnsYnqLHGJ${qO~?vPreX6*-IkoI=-IABL2fHNH>2zIcA*d@ z_GOa&K`YU#Li1?E!;d1YngG+j00alGVd=**pXYP>qYKYQ13XpZ=qq$+7m~pJV)0ei zozg>a#b7R0_$-iO3MyRDY}kasyc~dkujc zdCjv~ih%46Pr8-r=%!h#WY~RWKjkNa`*_Y=Fxtg8uPn(Bg)^HHjI=E_l4(dFUm-W8xKczEz? zmdtN3N4#4rH?(q0Q%x@NSbDGTR#ty=7O(_%*04`08-90FcP@=N+Mt7Y0Si>YzsB6| zw*qUJUqq6({{D(tYnf3Ps||3_^_X&9XtK@EO*8mdEjcfw&6_Igy3^#AR4;B0dDDB* zZ866`W&=1V={M>dCngl1{C$R&+sC9$7jf#+G{(1pgWXCJWfyrI72D`_iRckmL;aUx z`TURiO&!ZzjcXb`*D0>IPueET=SaR(xQQnl@h9d zgmtDZ$Eef)d70w%i#;(QOauuami<<@=~`1 znOM_*fkMZFJ(Y=m020!nY@;_yR0LU4$v(AGLVHN@{gLZp$Tnp7WY_De`_ZG2ALGYZ zVFdAUBFhk#{LudE^EAF1C}cR^@;KK!G-7M9+Y}V z=Viyn+v&OM7K2NIF!yib#}d8Cd!~liiS4XIe&}`gD7PBdS3ed#H~PohQ0lD#)~-E^ zFZriJDw0Y^gM@{rITuNRJVFe!DD5y?bG(WAN;y{Y?p&_SibCs1t<`pVPGDTx)nyn_ zDuq}3HNS9|G_wV!6uNU%x^FS?=){(w1L5FBVIrg8cim2Zl&6Ki8_$c!jeLQ>M*`^v zVw@wG-P0ZIJKJtKF_P5m74D$U6lcLrXWo-$;)!g4OG$&frKl54VMZxyO@Lh)1TPC7!fs6X9jc4jwE+yR9cPGYYFw z{71d$oObYmttXxsVlz@4xAF&kP2r!fVndzDe&=+?3ocCR3F{ad?%(<&OT=()1e;3m zMBwg1r;aj*|A>i@bn+i}SkiPK8RnCn#Xmq`7id3BS4~f~CapGV>^Hi{=kJy=0b=-v z8r;p(YHxlIL6ndl1JF&IpA_N;xEG{g!^~M)V80oriQBrf{=kq6r2W81PYap&5 z>&HC>rTOx6jQuumycu1pJDuO>lvHaP;xSPLbM{VEqkCrqiYh>T`|aUp=+pd2Ko!YS z_FwRp=SKJqxf=x|I+J#bhwqU?eX-9NI0JRGgoLay&+U~@v%h*7IAq}Js4+G&B1O`Q z8vm%T{gjc9y80+f94W8qK9-t1)!_6gnEW zN9>ul7d+3S`*)1sF^Mbc#L1A>n*)I@TUQ*rn=D26Q0wKIWAF4lA5{JTuJ!0VK6(}m6DT<>QmxV?l ze!ol8pEX2ki6CWe;o&xL#cU#^4diOHtAui}Y*Y~HRSb(SRw_3Xwt;Glin70rfheWT zY>EWckVuV|BcWWj>MpnXmk9g&l>t7xsx^O6=kX1!D2BWRda_)8>G9uWhV2v@b?0GO z`|v+22}@5XQZ0(_=|*BJpv?3wGGI9Z_utLML}JLSajJ%j>4wruX|OI4XmaW1 zR~uxR_4;fD@7HMXUhZVa2`YW>AY;q#qe{%9Hdc>Yo;&v-hgFH;#g!LIhw^hgjVdUE z2f?>)nN0^PGR|2pt&gP|=ec%=Duahg&X`IyO#wVgIQz>*fbF?2A5}$1!2|A=v_hWL zmZ?*oEhH@(@0AAPASWYYwb@zQr;n!nhP2)lQB7*RBRH{<$usq^C92m%)O2e<60}${ zeXE5k^6DgRMxV^dsm`YY=Ps*YJ})}&P2V($D`MxH$Z(56?Iw-13g+CH6{N*{%BKp_ zyBEz~Caz{az;ImqdMC4^nncYU>ndSa4jZVr=5I~B6~2OzYDx4FtL*@M6V>9(wB9`3 z#*(k^`4qCm518dJR33FdtXEyG>P$08GA(H&C`*^8WyZvPSX&OIYF4i3=jAgnR>8Kh zO2w0ThgnJ2nad5m_)$QiEm8BRrhS;9%c3$rN-&WA)K|tXXpKB;U(*`gZA}*N21`8vIZ* zop+zQz@j%(;Trc^_tqEp7piRMSrn?j!-owIgltfp1(JflM7YI7iM+D^kmrRYt;dl? zJ1q~QAwn^A~PWOAn6Z@V%gN&;2WDfayUbXLP|}!zs(r+h3p}ChUFrPm(|Or%*uw zoE2%eH65%IgN1qxyX5PLjDFL^p>VWyg3yB#WBTfKm^rn&j9120xz|$ch0!<-isQsz ze$!;146mxj2Zo@4gN8EoF5KupF>S`|Z@Q+Xb5{c>LW{8XZw1x%KCWnq>8>MCsN(zL z@Um>A(l3`y2^%VT@>Gr+GO@xr1z)Y%9!q$I(dF67a6d2w4_s;$vM#laRaV$P`VFZo z1LJ(KGXabA0q<;3rfFyNn~ebGE>l`#%bizv>6Iy~32+mkM~R%mxYO8^wgbH<%2Xj- z%=J{WDQjbXF+3g1uwcq9UX(!sNsWiH=eSi5hGLQxmyfGDAJA3VIz_A3*eGDAbJxwp zS4dWk&%&_JiD97W(2d+G)5{Ho3!GLIBS_i~SyOtDoOPaN4Ag|)k4hw^G;rIW(z42b zBdL|vPVm1(ZMb6mL+MU(30bsIL>R&gg7|wv_YG;P{gV) zvdn`mn_$EeMV%E%OJf*2)}toel4i-EM0gQ{tVNE3Z~Hxo?zkJ@my$M znr5=0b!kA{>Ojrry7aWHeUiL}oZNW+oX*j^^!BPf@BVR$dt&h@d?UuKxZk0e_i2e0 z8hbd8X|u%Mtw3JCMI~LYvZ{*U1mzZeW8k}Kaxeo@6y!W<&-8&Zk>3zv zA3_!KsIbvt1;4o1`tVb|q<9uuU8JZEyzrUwg;<5hWm?^HVx)C=1l2rUi9@58Z$|DF z$F@|z&>=RARfGoZwUZ)x5@LXPC_nawU_V{`DP$Ek9r>H+(#T)uQ_-O;{+W+tZ3DT% zc1jvNMx)SXpv2PVI?Xq7hi`3LErvXSaukrT%18Wd^XAeg>IQeGoJgK+ExgmUxk5g> z;eJy(&Hnif8n=xrY~&*a8=?Q2&_{LgZ(K!1i=cTgeNyFu1O~yp6ovH>e=Us#RO^mM z_BWORzlUCu)mGDQ-iIpE8s52i%<^+vbSpSZmyoD}%Gj9k9@h}a7x$_SSBYO)XsbBT z#9*&hx6FIsu7uY4Bri8`k21F;E@}Jsjm0BR`O7}moj9(jqc3!6DrYkMlJqSbRy`e_ zI~}5KREy;IbG)&CXP_5KDadk|39mXMqcmfMHc#WhhC+srTZc3hX;weqrb-uE=n@h4 zqSNbAn*TygD)l)@xEqjMfKKExFxn_~kZC9}t*5dtvN(6m*I^fvUHq!pO8L{b#iu9L zT`k)|+M72eiCbk(_UluoVV3J}^K@$5Zz};y8wkqdS_sNN5*;R}?C;klOoxj8tfOrB zByo?|2aDNggzBD%&)VG70BV^R94cD}8rFApRJ833GZd7?r z@_u-n_^)ZqOpiMFX;9g-&fJSo**;UobyXSu0#4F%d>#C~i|7=^lIjI>b8yOoz_sSF zWD8DyUNRfOkxIxojQKQP{(xe4LV9VqWPgeISvqnq#E_5iMqUR!9or_7QmU}(r`74f zjKsiH?~Gxy4c8f=tti?&JX+u1n@=bCMyVvU#%iS))4Yy!@eNhuk&xugYZlqvT$U7|*rDpe$Ql-Q)MK(3$lTYl2xEgjQ?%$&%l&t42QzJq>^jiLd?@;)IwL>F4B^6gPW~%l!iC6)bblE<93?TZm7e54*(E}d zk$x7N@OmNOlmKkAHYru$;d|JI+BEs%!DfY99S&?DfE|UFFo6iu zv{*`Cr?!qJTV|xmEDY|iTo3nAm&`^gf_oB~!qc`K_5lbnNU+N@TEM+AI?Pf_ahw_B zyho-Ur{!yXPrvH01;mH;XB>2tcb^R_1}rgi-Dy1TmEySN9?-P4LoAQLksYm{wYS)B z#4Dl1eqQC}k8mjFM&a#MgDPXqvq&BjAuF03clBxw(*=0}NHL_aE?(oq3!{K(4&msOSWtJq9kQSpQY}m6M-ZXiQ z`KXbE%8nu|`C8ZyF0-U2vr5Eeg20NfePvn70>F)9!BEhS!O0R4Oy(*F4j{jBu#YF? zT3>cw^<*Xe&?KG_eVlk9fWyPIr~6es-xb(SawBm)&!sww2~n?zm1+n6s?m6UMRzFb zn$J?4_?i1F0Kx+Vf*c}IE`|U&L$0ib2Ngt2l5D6^YA=`bJ-OBh`RFYhCh_1jc(ljw zhdw`bsFkygxlj)oGLY#BzXsMU)$U&3kBDwu-)v9Y0qw(swQ(^{tCrRAj)|cZn@Xzr zE=!lF-BBhazLcp;p>QX?rTH@pMNl~H5Bu$xrFQL4_+DxjaoaU~6tUa3j+8vWALu4R z+E~OgXQwxgiLKWltvbbnIbL^uyuZlv`BZrA5^#-zo6xLuNehNA?G1tHg>(__4JpiX z_p{a`&j8rB6)VcM3rw2{u4a(!KpjSnSIvAvyxcEzaBN{k;TM6DUbA7h_SPMr2_e9G zQ`X{NZCYu6o%)W6eILw9@ox<0vn==jc>#n@2})6JuNHDhLv_N({zr>IbPn`{-?tIBWay0aKv3mWCChF zFiR)VUuYzdesQsoRcWJW&#d6SN&(!HNSx?DHh5{Cx!~T(AseI+~(*BGZ--ezrjer#MXJRIYsh z$l24u&Hazealt#wp;ffIaJHU7$5*S44W%~*3jTva%2qvr3t2G5%9v6$ct$0qaU$>;bK4hR7i}a0eG#;L1V(1FJei3t4b`VfhJM$*Y_bpZ8`VR#uLlt4BE9I30{zaI|%6qPP_ zQ;E-Ws4wc1oI{^vJMJguEGW$f5V6fJ2dqr`{975ZPAFvNX6VjnTCElGLg1jo(s(9h z>~;OcirciS)AJ;4!xm}|naRK4@#_3MM4~mH632~(Wv+J-oRT>&w6(3UE;wGNw{3qk ztVzvX+gBjF^eq-6e;SX*hXp2PP~kq9%{V;7XvgMEv%!HL$K~X9NN(mDre!q$ZzZqi zL9%BM)`DA$fZ1@AeR(ARENF^fi-LUTtuZbYiQ3n4Ynjn$UheoAr9@;wx4w9p`oG=8 zn5e=jFx|(fLZiff9knl7>n7SDx4Z|rinZG62R|=~u~Ehy^!M!V&SXEqA?@MIw3GfL z<5-!a{F>-aeOa~IaS9dXIW-xl8(`oiEjYD!Js9#`8Rb<@08Zpn=h55$=5e62@hoqk z0SRJpf)qI+NskP{8DA0-!ClQB=m3~Mpw6$$CjZ;qTzCT)(X26dsiQW1=5l68`34>+ zf8OElQB1@7Yj`KHrL8)hI`xU_5yR+!{%Z-q&iMp8D3t)#ORvV#rJzFDSiKxcUWZ~~ zu%eJwMQ|0tm88B+dCcFkD=IasHXFRz!t&oB0JGHqWfGDpRV#_d9@BVWy_}fXjB2&o zO9R2G3XIpfHrM^f9|M@tQ*2Ca7CWk-xel#$gg@z!IOR3HM9t6tt@u9P*)J$y3!)sU zM+AP?#(bA4Wc^GzN@Ux14&08`tO=*j-s5|fEdHb$)MxeM(O7_a_JJtJzj+2!6085O z`Mj{om}0Mz9m5^ScZzuV5q-wrpYkpp>S%_%dUMA%8lwK7)#=2HEKh5>cs)B5*n9nT zu;c=^-hW%%QDCbz=28V*9-KeAT!FT8?Ce7G)FRymHQ)ao*?ayBp= zHg_W~|2G_HyalQ>I8D<1%k)3ZX=8I~4GvOVwZCap=;5R}dft*WQZVN5nuv9x4n2#+ z64jemhkt+au=(E@t@F)N79eACagA!R!5U{X_kOQup$B=#CYV=}5f_WpiwpQ6a3fAgT6i&F!&S*Ze1z!$V2=1)%qz(dxk*irD90m<3elX)CyR;ZVYZnJMn?X z?>;z?_LTSI>uvwr!?T^h$chKw0lZsqmfVA|3c8-V+!HTXOChH94^E#{FD=;W*9em= zVm*1I#dkZWpzj+HJmEGMG zPd-?ST)z7T31z(@hyr#Jy%4)D`hM&`T2`zo%HObskf8-<^GI9sft>Lj&g_ zY~kE4K)YU@$b*66vE{Dyjo4$;c_aYUa=BXP@*k*ivN99!&=k;$%iZU`>T_1J_0KMa zZS4Uz5OQ-xFyRE_rIsHEsM$b+K+PhczbY#C2M1KK}#Ei5R=;=7SbNjuV>K+kNG=85Ee2@p&lkcAlk6g85jm@nMj z#{plNt(eO#^bg`+=w)u*oKLVnP~^7ma5(k*=WOZ{(9PlP(l7;p?DX>^*7M(rTd}neO-ll!))^S9`5RP8+i_<#j17M{j zWD9z`$Qwlf*zcBo;~33l%Zj0`o^Y$rNL~9e!OqZ(-!X@&ga~MIahje!f z3J8cG&46@wNOyM#lG4)B-QC^bUh{tM_x<)h_TS9GtXb<>Pu%BqU3WP1v(z9jyXtY! zuJ_Hn_44~P`yC38y&U0tKp-!fSP@f+P;&7oo{1Wny zRUc0b0w^(Uyb2KoqINx9&@v1^6eQ~ZtQv7W0c3nPT2f)#Gk`qneHo^QduIK~oId^`&$Y~_3azrcUpCXJMC`_~ zsh=PVz-xi%U^7v~xk2YQ2|uI(!!-mgdXDYxEAcH)J)eB-aE1!>z@xIa07E?$D^xuM zsCc7tJ)@P9-oxu1U`EGwJg;iI(H9GYD(KFpXTl`Aqrz6@=-M#kgs!coP&T~)wRqd| zFc9pysJ%BDa?(A*x0)VZHT`z+!2HlhR|w@F^fGY|xB2&}Q`qRt(?(L?bd_Ia5-eu_LsclNxKs^?qO=bx0p(R6E*zGQ3MKW`p@E%own16Chll zAa?rBXHjI_6J5=PYc*d^YiEmE4M-(RTIJt61jbSR??xUBJOL`OS|0BXNM`%9^z$ho zOZqMQPqeqnUqB%lM-IFq&9SXX{i+WJs}I`0&iEX%zslNW*OI%=Q9CFe);>ekK))?1 zbk6&&qL6@W+1raocsuRsZ7--crtAS|L|_#gXo1GkakmjZ4-C?za#^ETiT7vJg)u6* zGlNnj+e1N{mcDtByn|Z>_&Q_Jy^>%`LW_{l8lSsv%F&^K;~~0Cu_kJmLou^A$75bmsC{llU_etBJ+ zD#EeR;kyE^%vjk+roW;4k+w z5uM|LiJ#X{0puBhLi|iNLKo|V@8{c{sCLEwG=NnaGhEj@0rh3P*xq{h;~+~FV7~-= zWRT546a5mySzm; z3r?IAEZ;hT_m0G-%zP3;7sAcdF}jY}HC3W<`K7YXxNa)xkr5#PcimsOZ4vdoe8PGul1f#M;lXt3X1d1bCgI3?C05 zF>pJN7v6r|tK?bE-uJaBPdVW?-pmqBk%<8oxbZ+3L`2Z%8t0)!;p-`lZ-$FJ7{kz= zt9z@>kVv9G=kGu~f9woHx*eUHt#}m=jx%VeKL^vx!)ymenf1GD>bb`~S+VcbiLmt{ zr8KyC3ts*?-V5kV=}p~NT;qK@e7ocA7oVYu;Ab5c3+PC_5FQkU>gDQkwFfQ%(HsyPg?I2O@*TkHS|^DiKt z1D9A4d(R`6%m-g6H~b&p(tp`o){Spb_M){D^IFw{9l-~|%e7;$% z8fS>BL!@w{!fo(is3AmkFUoM$_xTA#h%=8#J}~y(q!wSc!N)oUZDv=2j0*6wnpVd| zPFvAR)_^EBjiyzx^H3E{7?#fIzac$wjX?gk3coFx43m$)m}rpZiKU3CE*vc+z(UD~m&D+TktYI?LUOH+ll6SZyS&@^>w`(z!pV z&!w*-#(YSHu27c;voNws+H@ZNHN&%RtcxAGYLqpY;#G7hlaW;0G-G8 zqfMy~OT0DKmlWyl?@uv;hM@WB7nXPI8frddCmcQ3E+JA5-~a3;N0U4x?F zmZD)(o{^=^H72UGKXH+t-G074nB|;~fbVtj1{W0RTD1 zq9*#}pRv(O7ma|S3Ts#IF`fR+B3RV9M@oYRZ>XYeHn`p*N@T{<>!YXvnN$j6vTp9i z9u;N4rFp6Q*f;lrUfw@!;89d+Cnaf;6vpYx83HB?W9_dY>kM%(rA{B(?IVFR-NGG( zstS*|9+JWab&aM%s*Xm}Qd}{nmzFT2%Z7z|Umi+T|DEh>WVH`FMcph7Rd}z`r;=5c zlDz(SihsMM#}%YAIabz;p`Z$t%27o)DW99@-fBih)^Hs*174KD}(GuA0$9G_ojF&- zQ&c*_wkYH4XkEf>z?Ev130JQkGZ^>e>`&oy_mDw;w3(|JB?O6|ag;&ac$X-){O9$I z!5B;cP;lc!WZjY-j(saiP{mY)lQ&hOTjvajmXxiu3eFuRy^w=(6%17i%$x-K*JpE; zXVwE$bYY(_-c4gp7WZ3D5>7a4`~a_`g3O^k7+UKkyT4O8*#v#5RhrfV{12DOpHslh znb+l$a`)8{KCQ8h>E+Awgs?p?fLLZ!5{+k( z@=iC0^HU`&!Kt4C*hZ4M1kV@pp%_ywkYGn@oAFxvU>d`Q^xPHL=nMlHQO+ck<~nyI`NUi-upZ!M`wR*;Twunm`;Y_#qxu zGas#2o-=vz<)-mT$Az`ci%9?_`2-73^yD@FlZ}_gFt{^pvp;&$j#39KCU+EY&AAE) zfm#M+TLR23wC=D>Io+Z57ogll%@<^v^&1c<^%ohM`XOxOZ`CNw50oPi49Jpb$`nf^ z;&le%@-Pc9#K{yNh1VJzO;riTCc{+K@*?GilPe(&s*2?()46dx7Dwp?!nCybF(g)V z+~^7tC@3E&t)S@doAB@3`r4K#xHTW%*~)*eXIs?fhdf(USl3W=s*A#EYQ|}t>d~p% z5o3SRKZVOgJd*474Ds0D*U)Z@$^03Ng7A?nU`(uZR$qOknpm`56}_w{MK}|62P;$h z9jLlZ==o|ggC8eQYv{Ijv^;Mzv|j1mLZ<^&G0x8tzHIjSoMp29)BOew3zKyGxde4H zWjs$^f26X6NCn8VKHdys2#@5MER)q`p?f2F8?cu0_RLbitt8ZV)-9`6gZPmd=QV{I zAgcVF#Tkfd4~Zbuh9r%*BG@wSvmPU#QkSlJ`@?gO3gAvbuOaaO>>cj_;Z>ihi__h*ytIVs5dj9^Q3`)lpoMTs7gus`qyp1EpJe;oInC@Hpm`WCMqyy2&`P8k zTW4e+c+bBPW*D0@)d^-YgUZr4f}tiLUO8_Vx(mUK*tC=ART4eODe-@gfR=66a6)8z}B&4ES` zhf9KKP0h+G8cUb($jOyq&p&boKl&*24kq(vs$g{%53{g46!&4QBq~6v&TI`QF@=se zmam!BFuK4lhF2C6`E?UsyRsn)b&wIXLOn~!!cV0$g1HXTQU5dc#P1$nQ3d?rGS+!n>U*6q{( zA*`}gv^43FRsA6Q&TL$J5T{s=ZtcaGW}N%BeP%Zkvt)kl=M*}e^(4D<6eu#HU7W#uOu&)*w!*XcmZTGJoGCz1i!Nf7YcqZ3eqTU*b+P zpUaXdA<6@{&~roQpt8~V!TEOue8!H^8R>O+C?cN0~Evd zXfX|x=h~W0?FQ*8Oz`#%nX<8!)-*hmAMdq?g-E`yf|koS%q_{}oB+~wQQwH0qpYzQ zDbu@4bc*}SfZ=~5l{A?yi$DsxsdXJ{X~%n}%sG@C4!jxkj``fRK2N2}UB-}~i9Ra(?0M2$G|0)+y0Y%$cG~Z~ z>ywO0;viPqceS1(*L|a@RlDT`Ue6h6`%dHSJV@ zoQCJu8%+ik2{Z9IlMsdO#XoDBopiqyL0_L7H*NwIUrej~gK0q_s>u8pYX$Q*&vEY+ zJ)h(1@psP$_DGVP0%J?t5U^d6n|WgXZIoTm}BOu-x1{{ zwndgmi-Fz#PXyB!>C9`+mDGL7N$?qoI*u$T&d#fdh}=!sB;{KRjYp@0uCUF zi%4yl>e==I7}G&kWHuiFUw>oL$rseGQJ8`V5$mExeZMSjjs!L=RrS(Rxbr`e;|K;| z@|zf|KlK+{#>kQc8=gmieRm^BM%UrY09< z+nT$HEXMRT5j@8Cy4kgxc5eed*?^li*BR&kP_D*T#5r+4_?M#| z`(d_OR(^bDkhIp~b%EzJqRB?}QuQ{D+nTmv7qR2=e45 zb4D)9HC37}q+SNX&+G``3HEt=w|=sW>2n6h2iTfBBbG5|ZzsyVu`%=+{k8|~HOeN&g!kgT62U|D*fQsJi>f{FH2bEM8ggcaiUjbCxqu_i9*mm=;5sQyo!C=dYvU9TezS=}j~Gw%boQA2iw~`O^Oa-9oo7U(H%v zZ2d-`C6Drt@E)8hncrg4sQoZmWc}v-Fj>^6hy~~G9-5hPu8i%%4lT#LVi9bObGggG zla0?Ez-~JIT@#xNInbnRRnYxI3$UwX+dY&8>ihlym+g-y&QK?Re6p-@pXRWT9o#nxyIXJ;NuQi3}1Z@d>YG;#N7K1omrk{#EO-|kiI1x%-fymLT1?*V|2_V(nkjZw{8K*_N)B6~M7lkk zrJ`P)2l2Tn)z`YxU$12p%Z?-tn%MT&w#ew)dXmQO_q&b zecu6O=%1{3o?g4(6giNka9RYl0ASH;Tichw{pCt;tJzK(7RfYv=NK3x?)g;4;UHel zpe!cJa-wce94eTafN1~-&l5P)Fwa6u2DdHKfA<;&JS??Pn%T*_c1Ni`WzM5xjNo&R z^KyGpOw}2B9yhc}bA(`Zm-*2ARv60OJnuT5;Ovp!5tpB<3@Aos3v;5@z+w{FGqfvSSsLbA==Xxs9dpvO)`QPp_Nl1mZb)PDl_ z>VtO?qu{NW`FTW(B7uw(s_6uS&%f#aVb2`e!O+MFID2_zo}}W587&>72FI~|5gA8a z?|UbQaJC!+%UJ2BwrapG!{ds>gwO;8hXgOf>)m3@2Hygi@aVJXsD%&sJ9R3lvXtIa zS^s5-LUlb>o11_Md3KC+O!zY5Fpf}ojQZAYzAozk(|+mmVFgaRMWcZy8}T7dn+1Le zsW>_w-+Q!!pJ6@r<;91CJ3ZCDlSL}Gm+;I9JAg*be|}shBE%Tejj9FJeQ2-)FL~ zM9k*|Q|NQJ7GMNTY{cqL>ONf0nvA&uec@Z#L%L^3}Fcka~ zyI(y|>zGu0G{JQR1S72@;p{)<;_Vj^F&v{m+uzPxXSFuAW;?(506y2>FF+CkL)9j5 z6=`i}U8wGDZiq!e-I!v+?$OS^CO-GuPWZltJ0YFV`M1<#R`2*{o&ffwaFf_9sd+p< zoH{MDmrFAm1<)l+kx|)YXj4(*<6yjt(0c_@s@m~8lSk%GFmB6R2c&4ur!AB_Y1a>tVmvp{evS~RjOS}L{7QdK84>7F0=L62a!UDf z7K|oKEAmNN7Cs%5s*#_%(-yfrjpTa)Iu|0A0BHj!;u+dIk)zz3K`2qI=)M7%+50%S z+=G&Rmty@gs>4Y}MqeE{?>J42!%_`KecCq(iqmTpbWjxkpb}ceXbgG;V*B zG}%j!$4ok#2banIBw7nz#;Y24_rf7|=Suw9&$Gd@PyK?klfI?bd!_s&lpn z#SRC?vpt)e>nNNfXU6#e!EDySWS`|$cz2cL>D)f-4?$f{?Yzf70MU_8j;I$Lnqn*W zDqm<~((dG|Ss5mT1ve*JD^oilo!RW|_nQ5}w2#w4KcE;4b=RRO7r%U?6YP6Gl%6aX znE?EtTfVWfIqv&p%G+-Wdjq=^q5I(`Pv$GUx5%9Vo=6|?COGVq*~VPuykYEdD60Xs z_=Zl^d@U|g?m++`b_V(8Hq2V!Pq^~1?A6VNJhe>&NZ(%I;cYu75Misc$46eHVWEWhV8;qd1rdw!zB@IMzyN(BpAX(O7N~W$Czm+W9(GDR z`te3CZ}4NzS_AODVOP?E+hSIH9*<$E*5Txl#dBsuZAZez7)0~y(M%!E%si+IDTwuK zjllAf$D8O74RoDuMe9T{k3u??7FQ4J+U18&;misVkSF8tK^gsoTjDXt2VuDmS$ySI z%)=N&`PB=)&za;J2=n^e>MgEc+=c#@bTgvh#BdVI6C;@tb}XWDrr5J1?-O<1<#p0>zKZ1$MJcBp)k+<5xhun=X5T>3Ksjo`0m<=LxQNHq`v6 z$F*Hw*v1;)O%V9^WIZ2QnadH{wYrLz(qC((7HEFIncvJOSXgwg3M4M>~7u<4Z zr6ACrk~nro&j7n0r((?i`wf$=$kDt6vdLUfl;Y4qvMt)ehHbfhz}i2_Tnw{IIPdsc z`<4)8ymtY4`8{#jj5!C+t0wd@H^9`rbF28e2Ay7Mqv@Q+T`v(}J_S#Fk>g9->@bbc`m)FFJBZA~B&0 zp26$VOw19jA&?^A?`Ete+ZJcliG;P7Svg+Fhx;ybmhnoTtC%mOA7Tk{IkXP$2b=i$ zGSgz_z*_E(gQ(q}Mce4Fgjh4^gBC>*Fjqb3z*daR`NCvK_CGxKf;}uqPM%~o{gK_i zUiifxv5)1>i9HCn5%MEdl@!Ap&DVtxmK4)^duR5xtGj(VslY2p8iEE@rF-!ggbBf} zbE$MPMq0?ey&sTI+I6=`<=I%d{<4YBY$n1rAJ+fcIc}6tMBTS5;CzKPx%q8YubVR3 zCMM2HA!|AMrup#2`rcz;5ub3hJQ?x^o$v64)s>2P4rLX@U94zrq;fXN2^(Cq98wc; z{@25k-Ao6m)|R^-dZes>a=pMmky6t3(B8N?0yKsN_hv!GN>4dn^E*Jh9iDM+%>)vVVpYQjbSTc^Fse|mkrGv9T3Hi&8dbl>F9JKDvE%05Om_-MWb*4x zQhPdHMP*@L#o!Udh#(0jwyCrn)3^C57^d1X4Vk@X0z+>@muAcH%cN3L{so9=lnx3* zY(LUZcpDJXpP>XXtM~mQ9Hn&a=3AqeR0asTn7c&&Yith*$>M6ZG~8}Zo(tBGkJP3! z+#vc6F76*Vd^YJNFOAz zMh53QTRm$t>FIeZF;W=T;VGbhGzvbGju%9XgDIGLRy(Bs6|UHyQd)K#78!{v=_GQc zu2n;C2NVO z0%v2Uzf=}Jk`p6fx@qkg23vr7A>B%(&QO;N;XS^w9=XVlr0SCs@{VDe$K;_rVu4VE ziAK&i0}ICn%a|ozd-moeZhj5+1Xy8k1{QUT7M+>ae}I_@g39<&^J}EcvCPpbAx(CH z@|IO+S-H^^hRIzQA&NT3l!{yoQqphHQVVUf7!EY6kt+csde#V$q^Q7nvG}iS>f;Kj zjuW$j8^lE|S_Z}^%n0w~KM%-e(B7!J8zogqBx(_)@PYaLzcMJN>t5=WBUUHyfbbI| zracLe@eE|-lCDJ8+}9QYZn3U=Ue%R*P>Z-=;-gIQBW3xDE3z>;%%M@5l*8uWSX{WV zr%1XHaKf01%uK3?Er-&o>GCv3tJiC23-1AKGj3XhT~K;Jyj|(CzPOy>$t8377Z7%V334?AU5+>>2`#TR zIk7BxbgK|7YK&(ECU-*=he;;`iYYG$*^t0wSY~2!S+~)%@aEwt2G-TRb_Lyy>DR>_ z3m?n2M*>VH+|8?Tjf2k+@}#SsS@M9M^t@vd__#RYkWdq}$xF+8`;F&h%IFz#&3o@e z%Ru2tPYAbma{1;r3-sO^Lbv5xJ%&9sDhI3)! z*>ne~m~@r6Fwnz?x{k;jR(Rc43fFuMZf7!;?ux55kXY7y#UZhIdbTZf$^SY45=mGA z(|Ct+b*lT8RDBtm4fx(-1Li0>RuLbiDo->#0riyDgP+B$bYwi?5HVEPC0c&sD#ky)Zmk#wLy_n4!=H~PrcZ8Fgky+vX`lG z+(aLaEl3cR9FmL?pZVcUVR*M(0okqppEc+%eeK+JT>t&Z+YBOgQ)*F8lc;m^^#qvz zARh3d*7*H*V9~hB?Ic@DC=;P6vQ3?DVN=F~hGoZYmG^)bcrg~CO zPO*1yKgo^?bEh*C;chW8c&;sqMdw?p1_DSL7WQ)bdK>8(jByajzo=%uGZ|`MqfeK> zzbiCKH%OoxO*`=zn;%z*Zl82ag zV8+NE7#|W=!c=TaAm+9HdAp*fiUw{a(WSG=B~;4Ns?P!Og~96l*Sydm;|Je9+n+XaTcy`zV6Qn;@|kvDKZH|}@H zBOMfZev@N=()ZU_`LT}khB`~VjNE2bWAl%A>QzgGZtUB!A#L$^6Kp@HSVmqk_jWlr z6hDnke*3B2^sChDF6(qBnROB;Z%G^`n-yM{ed{)prYH5eq~jt1tXIYC;T;71l$-h? z{aFb zAUl;sTrm*-D((^hR3+9w!d+mI=5wLhfK=&T92LFaNZUw zC*HZ?)G61Kx*PIFjuAM7TKtZ_7>Q`6P+=7tff=s>9)vjKS#4)B8Y4XIx>Vu<;$1!k zZ*FZc_?xEDL?hr4mr&Ik&4Lxkp9SR7f%wW^R=aRVuS1{Z)&rAEyWxiw)i0%L3#L)M zKEA52v5aceAwbhr!I9CM6+9>K2@Q}cyR%1H=t}l5Otv^d&OKnMIgl(hY^!%O(y+2+)eWIeG&hSDh;O#@3JbVcxwP z69E=&@^5YJ_ffB$#{?aed%SPFY~8#(nKC<42e2H6B8pd$(-P(=Zw)GVrG940H)S<> zjBKvIvd=BNVNt;fNI3){0d^2$@lB%Q!2W~`c9BI= zbz5edljt;@j#bBf&kbOmn)oe^<1WURYRS2u6Qpx^N~)#3sp8nap7#>&9-y*8V0h@_ z(-`jU-7@D)Nm}?LQW3T^r}Ma&DUU?DUN~M&X>jf1kLDr5$4Unhc_`zIDKQ;M>gXgh z=-6+b7wf0`Umu}B{R*B!nYDLDwKnxX5Iq3>yAHp@0L#?(Gh(>Ym^En|rig;SCCg8-oMEiwJYVBq;Zc(PB+6Pl)m2<;T1}1@@NA z{rP9@7`NTFZ4p)+i*NXe_}sPJX|z zr=q9X+hdeQ`zy@TLn~9XUN%yuU#@eL{d}*W!^kM(cjp#Qsev}70LQE1+5Vr}_C)*; z^pHx^&Yt-1Yx@N8j5!=sM_{Rf^N!I6BB3`Mh!RES30ucEz6-8t9oDar{9rl>N8wTZw#@gs4Ei;2?XFe|RUZ#45K! zK;oL{hLxfmhIovRF86}Wo9$}OUcFcSFn#iFY5KS1W;`LcL9>@(8^oiRLb}hkUz8*I zQBOJUb_LgB!|NoT*70UTqt{W(*w%h^?0mOvWOMvQ+GxHxOD*_-L)y6VE1W59cC(H| zA{lh;bW!F4?h&rrd;wM^gTHsPwGA5C6;?vFdCHM#PL4(hU5QAdjiW{v%xBe*p8E>n} zqw5C@*+{DKSge;y!*zK1#HJcD=p!@Yi{oeWqvroZeMws&kX`v)(RIYWlQZ%v_KiBo zP$#)qg8oV&I3ZmAmqGfcegLBdWXSx>+@N0;A%U^={&?DL*g4Pq2U_tVS>V!#HtMwe zitEbXkSnB36QduMcEsOd1Y&uh-!!$=$semKXDCVO|jqmH) zWNo6;s3?BbXtE;OeV!1gvnpW*_nimXwv)PrCxO^9 zBjDD=p4k8W=ER?`GTans1A)Gp_>g_mw0a9`MQM--$-wQb_`{MAQa#83Fan^-jv6N3j z(7z<`SZ3QN7&($w{tGiB>@cvp;5vDAK%`Pf4XLmj90sJM{CHd2J2yWmHP;8Kdj2RqK?!Vhbaob7 zl#TWQ$JusBb0B9(-MQR)D_dGUjXjAeYV#b)IoO zibq!=9v3T*gMp0OH*yJ!(CVUK*VsI7s3-YlWg!P;2CW*uX^snVM`VF3xl8c>Mp2&t zsPp2ZvRZg4tskEuY8uvf5M3lbI>Wn^HRs}Bk+hHr6x(3fCz=7mM$1RG&QC}_AP@*% zUta31CU8gC9I?w$|MysIlHm9WP0RYK!aT5bd$mWJLwO{8G^ZN^lAzJB1~(JB{r|go z)pbZITOuWh*KTSMM5;d#R-qqED&~_uU&OSz;ANX#F#^tZS^f8J$xtAg#}wY!f*SO4 z7wE*0=K}D3{BD))W_IRFBZV;{N3n@*NHb=aW$gcbJJ^Q(#<3x)6wAxbTeF+=?^lGl zFR-R_zJxl%aGQ1AE#Ycj+AY37oeM9s<1+tw3nSoYBj8fJ3volKQ3}%s9=~ z$wvD^@+pIXL0{9aG(e=`Rf9%4*AwN@G%q(V`f zMm#3S*$+q|)MUfwSGqXEurj-?tT7UuSrEVez3{;vsHNH-A6m4%`H!pF4|~9GKKDfm zVemq|SZp_>Ug@0JjZJL4<`$OcmpetZ)?mbW8L^eB8LQmOBM_ST`P1cJ1hJ z#LyQ}(b;3c*6Y*#5|W~1{)^y7E{8n6)SX>V`&-%EW*ri#1> zgjKK{s1mryChMtW&6nZO?<~x*hjs*|*?3aM1M;mFAfugF+Nkc>IzlQftj?bpr zRRJT5RU_TT1tPg}48D$ndj~j=4K)^uL;8Jt&=lW4?#uR5|NW{EDCL!*VEwT^86t?c z#_RLM-!bReeO-DP0ob~&XhhrP*B8gs&{-i~$$F{JLM|q_`E7o>6=~3_EOv n5DeE4Jjn$(74!Me{=x{kvaXI