From 37fc5814725a0942140e19d8125a7664225ca9b6 Mon Sep 17 00:00:00 2001
From: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Mon, 31 Mar 2025 15:05:23 -0400
Subject: [PATCH] docs: v1.3 (#7160)
* lint-plaintext
* Squashed commit of the following:
commit 0820877007091550e196c1ec9189580a1adcfe80
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Wed Feb 19 17:34:54 2025 -0500
fix-links
commit b47fbfe04e3f3c2239147df59b14626839f6b07c
Merge: 22987155fa 02617ffad2
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Wed Feb 19 17:18:18 2025 -0500
Merge branch 'main' into docs-publish-v0
commit 22987155fa3bbf39ab2f2a31fe6db643cb98f43f
Merge: bf01a75e72 e8529eaecb
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Wed Feb 19 16:25:52 2025 -0500
Merge branch 'main' into docs-publish-v0
commit bf01a75e7252f61303c237c7f39c35b6e9831278
Merge: 85770ae167 b43bf8f783
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Wed Feb 19 14:42:10 2025 -0500
Merge branch 'main' into docs-publish-v0
commit 85770ae167914837a2e0eb5b8848d79726507f3e
Merge: fda54f8f43 e970cdbca3
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Wed Feb 19 11:19:11 2025 -0500
Merge branch 'main' into docs-publish-v0
commit fda54f8f4344ea629ef8028c388ce65ebc0cac51
Merge: 3027a9c3a4 25ac555e8f
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Tue Feb 18 11:43:21 2025 -0500
Merge branch 'main' into docs-publish-v0
commit 3027a9c3a44a0c270333d033394eda9b8cd521de
Merge: 0046d1884e 45e2f739d5
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Fri Feb 14 13:20:44 2025 -0500
Merge branch 'main' into docs-publish-v0
commit 0046d1884e30794f9e372ecba2c484a00675be9a
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Thu Feb 13 13:31:22 2025 -0500
delete-site-and-redirect
commit 1bf763b3b102b2a7cffb75705c5614a114f3a50a
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Thu Feb 13 13:17:49 2025 -0500
docs: Add information about sharing the Langflow application's Playground endpoint
commit 4eb34bd746fe16c1e81c92d74640d803d0473dcd
Author: Mendon Kissling <59585235+mendonk@users.noreply.github.com>
Date: Thu Feb 13 13:06:46 2025 -0500
docs: Update references from "API pane" to "Publish pane" in documentation
* s3-bucket-init
* add-bundles-page
* output-parser-component
* language-model-component
* legacy-components
* update-file-component
* parser-component
* publish-doc
* update-agent-starter-flows
* voice-mode
* webhook-component-update
* file-management
* update-env-vars
* make-env-var-table-more-readable
* file-management-link
* bump-version
* add-graph-rag-component
* docs-lambda-filter-component
* docs-add-watsonx-model-component
* add-langchain-links-for-watson-package
* remove-s3-bucket-data-component
* docs: publish-flows introduction
* docs: update voice mode instructions for clarity and detail
* Apply suggestions from code review
Co-authored-by: KimberlyFields <46325568+KimberlyFields@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: KimberlyFields <46325568+KimberlyFields@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: KimberlyFields <46325568+KimberlyFields@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: KimberlyFields <46325568+KimberlyFields@users.noreply.github.com>
* plurals
* docs-review
* Apply suggestions from code review
Co-authored-by: KimberlyFields <46325568+KimberlyFields@users.noreply.github.com>
* steps-for-file-component
* parse-data-and-dataframe-in-legacy
* remove-beta-from-parser-component
---------
Co-authored-by: KimberlyFields <46325568+KimberlyFields@users.noreply.github.com>
---
.../api-reference-api-examples.md | 4 +-
docs/docs/Components/components-agents.md | 2 +-
docs/docs/Components/components-bundles.md | 10 +
docs/docs/Components/components-data.md | 107 ++++++++--
docs/docs/Components/components-helpers.md | 46 +++++
docs/docs/Components/components-logic.md | 60 ++++--
docs/docs/Components/components-models.md | 66 +++++++
docs/docs/Components/components-processing.md | 69 ++++++-
docs/docs/Components/components-tools.md | 20 ++
.../Components/components-vector-stores.md | 51 +++--
.../docs/Concepts/concepts-file-management.md | 67 +++++++
docs/docs/Concepts/concepts-overview.md | 14 +-
.../{concepts-api.md => concepts-publish.md} | 136 ++++++-------
docs/docs/Concepts/concepts-voice-mode.md | 53 +++++
.../configuration-global-variables.md | 4 +-
.../Configuration/environment-variables.md | 182 +++++++++++++-----
.../Get-Started/get-started-quickstart.md | 2 +-
.../starter-projects-simple-agent.md | 8 +-
docs/docs/Support/luna-for-langflow.md | 2 +-
docs/docs/Tutorials/tutorials-document-qa.md | 25 +--
docs/docs/Tutorials/tutorials-math-agent.md | 6 +-
docs/docusaurus.config.js | 7 +-
docs/sidebars.js | 5 +-
docs/static/img/api-pane.png | Bin 300843 -> 276360 bytes
docs/static/img/component-lambda-filter.png | Bin 0 -> 311539 bytes
docs/static/img/component-watsonx-model.png | Bin 0 -> 400199 bytes
docs/static/img/starter-flow-document-qa.png | Bin 407449 -> 363475 bytes
27 files changed, 708 insertions(+), 238 deletions(-)
create mode 100644 docs/docs/Components/components-bundles.md
create mode 100644 docs/docs/Concepts/concepts-file-management.md
rename docs/docs/Concepts/{concepts-api.md => concepts-publish.md} (67%)
create mode 100644 docs/docs/Concepts/concepts-voice-mode.md
create mode 100644 docs/static/img/component-lambda-filter.png
create mode 100644 docs/static/img/component-watsonx-model.png
diff --git a/docs/docs/API-Reference/api-reference-api-examples.md b/docs/docs/API-Reference/api-reference-api-examples.md
index 0c7172c37..3001065e3 100644
--- a/docs/docs/API-Reference/api-reference-api-examples.md
+++ b/docs/docs/API-Reference/api-reference-api-examples.md
@@ -24,8 +24,8 @@ export LANGFLOW_URL="http://127.0.0.1:7860"
```
* Export the `flow-id` in your terminal.
-The `flow-id` is found in the [API pane](/concepts-api) or in the flow's URL.
-```bash
+The `flow-id` is found in the [Publish pane](/concepts-publish) or in the flow's URL.
+```plain
export FLOW_ID="359cd752-07ea-46f2-9d3b-a4407ef618da"
```
diff --git a/docs/docs/Components/components-agents.md b/docs/docs/Components/components-agents.md
index 70757420c..d3b660a42 100644
--- a/docs/docs/Components/components-agents.md
+++ b/docs/docs/Components/components-agents.md
@@ -253,7 +253,7 @@ For more information, see the [CrewAI documentation](https://docs.crewai.com/how
| Name | Display Name | Info |
|------|--------------|------|
-| task_output | Sequential Task | List of SequentialTask objects representing the created task(s) |
+| task_output | Sequential Task | List of SequentialTask objects representing the created tasks |
## Tool Calling Agent
diff --git a/docs/docs/Components/components-bundles.md b/docs/docs/Components/components-bundles.md
new file mode 100644
index 000000000..20086e509
--- /dev/null
+++ b/docs/docs/Components/components-bundles.md
@@ -0,0 +1,10 @@
+---
+title: Bundles
+slug: /components-bundle-components
+---
+
+**Bundles** are third-party components grouped by provider.
+
+For more information on bundled components, see the component provider's documentation.
+
+
diff --git a/docs/docs/Components/components-data.md b/docs/docs/Components/components-data.md
index d756fe31c..3f33bb628 100644
--- a/docs/docs/Components/components-data.md
+++ b/docs/docs/Components/components-data.md
@@ -75,25 +75,73 @@ This component recursively loads files from a directory, with options for file t
## File
-The FileComponent is a class that loads and parses text files of various supported formats, converting the content into a Data object. It supports multiple file types and provides an option for silent error handling.
+This component loads and parses files of various supported formats and converts the content into a [Data](/concepts-objects) object. It supports multiple file types and provides options for parallel processing and error handling.
-The maximum supported file size is 100 MB.
+To load a document, follow these steps:
+
+1. Click the **Select files** button.
+2. Select a local file or a file loaded with [File management](/concepts-file-management), and then click **Select file**.
+
+The loaded file name appears in the component.
+
+The default maximum supported file size is 100 MB.
+To modify this value, see [--max-file-size-upload](/environment-variables#LANGFLOW_MAX_FILE_SIZE_UPLOAD).
### Inputs
-| Name | Display Name | Info |
-| ------------- | ------------- | -------------------------------------------- |
-| path | Path | File path to load. |
+| Name | Display Name | Info |
+|------|--------------|------|
+| path | Files | Path to file(s) to load. Supports individual files or bundled archives. |
+| file_path | Server File Path | Data object with a `file_path` property pointing to the server file or a Message object with a path to the file. Supersedes 'Path' but supports the same file types. |
+| separator | Separator | Specify the separator to use between multiple outputs in Message format. |
| silent_errors | Silent Errors | If true, errors do not raise an exception. |
+| delete_server_file_after_processing | Delete Server File After Processing | If true, the Server File Path is deleted after processing. |
+| ignore_unsupported_extensions | Ignore Unsupported Extensions | If true, files with unsupported extensions are not processed. |
+| ignore_unspecified_files | Ignore Unspecified Files | If true, `Data` with no `file_path` property is ignored. |
+| use_multithreading | [Deprecated] Use Multithreading | Set 'Processing Concurrency' greater than `1` to enable multithreading. This option is deprecated. |
+| concurrency_multithreading | Processing Concurrency | When multiple files are being processed, the number of files to process concurrently. Default is 1. Values greater than 1 enable parallel processing for 2 or more files. |
### Outputs
-| Name | Display Name | Info |
-| ---- | ------------ | -------------------------------------------- |
-| data | Data | Parsed content of the file as a Data object. |
+| Name | Display Name | Info |
+|------|--------------|------|
+| data | Data | Parsed content of the file as a [Data](/concepts-objects) object. |
+| dataframe | DataFrame | File content as a [DataFrame](/concepts-objects#dataframe-object) object. |
+| message | Message | File content as a [Message](/concepts-objects#message-object) object. |
+
+
+### Supported File Types
+
+Text files:
+- `.txt` - Text files
+- `.md`, `.mdx` - Markdown files
+- `.csv` - CSV files
+- `.json` - JSON files
+- `.yaml`, `.yml` - YAML files
+- `.xml` - XML files
+- `.html`, `.htm` - HTML files
+- `.pdf` - PDF files
+- `.docx` - Word documents
+- `.py` - Python files
+- `.sh` - Shell scripts
+- `.sql` - SQL files
+- `.js` - JavaScript files
+- `.ts`, `.tsx` - TypeScript files
+
+Archive formats (for bundling multiple files):
+- `.zip` - ZIP archives
+- `.tar` - TAR archives
+- `.tgz` - Gzipped TAR archives
+- `.bz2` - Bzip2 compressed files
+- `.gz` - Gzip compressed files
## Gmail Loader
+:::info
+Google components are available in the **Components** menu under **Bundles**.
+For more information, see [Integrate Google OAuth with Langflow](/integrations-setup-google-oauth-langflow).
+:::
+
This component loads emails from Gmail using provided credentials and filters.
For more on creating a service account JSON, see [Service Account JSON](https://developers.google.com/identity/protocols/oauth2/service-account).
@@ -114,6 +162,11 @@ For more on creating a service account JSON, see [Service Account JSON](https://
## Google Drive Loader
+:::info
+Google components are available in the **Components** menu under **Bundles**.
+For more information, see [Integrate Google OAuth with Langflow](/integrations-setup-google-oauth-langflow).
+:::
+
This component loads documents from Google Drive using provided credentials and a single document ID.
For more on creating a service account JSON, see [Service Account JSON](https://developers.google.com/identity/protocols/oauth2/service-account).
@@ -133,6 +186,11 @@ For more on creating a service account JSON, see [Service Account JSON](https://
## Google Drive Search
+:::info
+Google components are available in the **Components** menu under **Bundles**.
+For more information, see [Integrate Google OAuth with Langflow](/integrations-setup-google-oauth-langflow).
+:::
+
This component searches Google Drive files using provided credentials and query parameters.
For more on creating a service account JSON, see [Service Account JSON](https://developers.google.com/identity/protocols/oauth2/service-account).
@@ -178,19 +236,24 @@ This component executes SQL queries on a specified database.
## URL
-This component fetches content from one or more URLs, processes the content, and returns it as a list of [Data](/concepts-objects) objects.
+This component fetches content from one or more URLs, processes the content, and returns it in various formats. It supports output in plain text, raw HTML, or JSON, with options for cleaning and separating multiple outputs.
### Inputs
-| Name | Display Name | Info |
-| ---- | ------------ | ---------------------- |
-| urls | URLs | Enter one or more URLs |
+| Name | Display Name | Info |
+|------|--------------|------|
+| urls | URLs | Enter one or more URLs. URLs are automatically validated and cleaned. |
+| format | Output Format | Output Format. Use **Text** to extract text from the HTML, **Raw HTML** for the raw HTML content, or **JSON** to extract JSON from the HTML. |
+| separator | Separator | Specify the separator to use between multiple outputs. Default for **Text** is `\n\n`. Default for **Raw HTML** is `\n\n`. |
+| clean_extra_whitespace | Clean Extra Whitespace | Whether to clean excessive blank lines in the text output. Only applies to `Text` format. |
### Outputs
-| Name | Display Name | Info |
-| ---- | ------------ | ------------------------------------------------------------ |
-| data | Data | List of Data objects containing fetched content and metadata |
+| Name | Display Name | Info |
+|------|--------------|------|
+| data | Data | List of [Data](/concepts-objects) objects containing fetched content and metadata. |
+| text | Text | Fetched content as formatted text, with applied separators and cleaning. |
+| dataframe | DataFrame | Content formatted as a [Data](/concepts-objects#dataframe-object) object. |
## Webhook
@@ -219,12 +282,14 @@ Your JSON data is posted to the **Chat Output** component, which indicates that
### Inputs
-| Name | Type | Description |
-| ---- | ------ | ---------------------------------------------- |
-| data | String | JSON payload for testing the webhook component |
+| Name | Display Name | Description |
+|------|--------------|-------------|
+| data | Payload | Receives a payload from external systems through HTTP POST requests. |
+| curl | cURL | The cURL command template for making requests to this webhook. |
+| endpoint | Endpoint | The endpoint URL where this webhook receives requests. |
### Outputs
-| Name | Type | Description |
-| ----------- | ---- | ------------------------------------- |
-| output_data | Data | Processed data from the webhook input |
+| Name | Display Name | Description |
+|------|--------------|-------------|
+| output_data | Data | Outputs processed data from the webhook input, and returns an empty [Data](/concepts-objects) object if no input is provided. If the input is not valid JSON, the component wraps it in a `payload` object. |
diff --git a/docs/docs/Components/components-helpers.md b/docs/docs/Components/components-helpers.md
index 7a5a1b8c8..c2de8d86b 100644
--- a/docs/docs/Components/components-helpers.md
+++ b/docs/docs/Components/components-helpers.md
@@ -38,6 +38,10 @@ The Batch Run component runs a language model over each row of a [DataFrame](/co
## Create List
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+:::
+
This component dynamically creates a record with a specified number of fields.
### Inputs
@@ -135,6 +139,48 @@ It provides flexibility in managing message storage and retrieval within a chat
|------|--------------|------|
| stored_messages | Stored Messages | The list of stored messages after the current message has been added. |
+## Output Parser
+
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+:::
+
+This component transforms the output of a language model into a specified format. It supports CSV format parsing, which converts LLM responses into comma-separated lists using Langchain's `CommaSeparatedListOutputParser`.
+
+:::note
+This component only provides formatting instructions and parsing functionality. It does not include a prompt. You'll need to connect it to a separate Prompt component to create the actual prompt template for the LLM to use.
+:::
+
+Both the **Output Parser** and **Structured Output** components format LLM responses, but they have different use cases.
+The **Output Parser** is simpler and focused on converting responses into comma-separated lists. Use this when you just need a list of items, for example `["item1", "item2", "item3"]`.
+The **Structured Output** is more complex and flexible, and allows you to define custom schemas with multiple fields of different types. Use this when you need to extract structured data with specific fields and types.
+
+To use this component:
+
+1. Create a Prompt component and connect the Output Parser's `format_instructions` output to it. This ensures the LLM knows how to format its response.
+2. Write your actual prompt text in the Prompt component, including the `{format_instructions}` variable.
+For example, in your Prompt component, the template might look like:
+```
+{format_instructions}
+Please list three fruits.
+```
+3. Connect the `output_parser` output to your LLM model.
+
+4. The output parser converts this into a Python list: `["apple", "banana", "orange"]`.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| parser_type | Parser | Select the parser type. Currently supports "CSV". |
+
+### Outputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| format_instructions | Format Instructions | Pass to a prompt template to include formatting instructions for LLM responses. |
+| output_parser | Output Parser | The constructed output parser that can be used to parse LLM responses. |
+
## Structured output
This component transforms LLM responses into structured data formats.
diff --git a/docs/docs/Components/components-logic.md b/docs/docs/Components/components-logic.md
index 04ac64ddf..b87324bbb 100644
--- a/docs/docs/Components/components-logic.md
+++ b/docs/docs/Components/components-logic.md
@@ -36,9 +36,7 @@ It includes code examples of REST and gRPC implementations to demonstrate integr
## Conditional router (If-Else component)
-This component routes an input message to a corresponding output based on text comparison.
-
-The ConditionalRouterComponent routes messages based on text comparison. It evaluates a condition by comparing two text inputs using a specified operator and routes the message accordingly.
+This component routes messages by comparing two strings. It evaluates a condition by comparing two text inputs using the specified operator and routes the message to `true_result` or `false_result`.
### Inputs
@@ -46,11 +44,11 @@ The ConditionalRouterComponent routes messages based on text comparison. It eval
|----------------|----------|-------------------------------------------------------------------|
| input_text | String | The primary text input for the operation. |
| match_text | String | The text input to compare against. |
-| operator | Dropdown | The operator to apply for comparing the texts. |
-| case_sensitive | Boolean | If true, the comparison will be case sensitive. |
+| operator | Dropdown | The operator to compare texts. Options: "equals", "not equals", "contains", "starts with", "ends with", "regex". Default: "equals". |
+| case_sensitive | Boolean | If true, the comparison is case sensitive. This setting is ignored for regex comparison. Default: false. |
| message | Message | The message to pass through either route. |
-| max_iterations | Integer | The maximum number of iterations for the conditional router. |
-| default_route | Dropdown | The default route to take when max iterations are reached. |
+| max_iterations | Integer | (Advanced) The maximum number of iterations for the conditional router. Default: 10. |
+| default_route | Dropdown | (Advanced) The default route to take when max iterations are reached. Options: "true_result" or "false_result". Default: "false_result". |
### Outputs
@@ -59,9 +57,26 @@ The ConditionalRouterComponent routes messages based on text comparison. It eval
| true_result | Message | The output when the condition is true. |
| false_result | Message | The output when the condition is false. |
-## Data conditional router
+### Operator Behavior
-This component routes `Data` objects based on a condition applied to a specified key, including boolean validation.
+The **If-else** component includes a comparison operator to compare the values in `input_text` and `match_text`.
+
+All options respect the `case_sensitive` setting except **regex**.
+
+- **equals**: Exact match comparison
+- **not equals**: Inverse of exact match
+- **contains**: Checks if match_text is found within input_text
+- **starts with**: Checks if input_text begins with match_text
+- **ends with**: Checks if input_text ends with match_text
+- **regex**: Performs regular expression matching. It is always case sensitive and ignores the case_sensitive setting.
+
+## Data Conditional Router
+
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+:::
+
+This component routes `Data` objects based on a condition applied to a specified key, including boolean validation. It can process either a single Data object or a list of Data objects.
This component is particularly useful in workflows that require conditional routing of complex data structures, enabling dynamic decision-making based on data content.
@@ -69,10 +84,10 @@ This component is particularly useful in workflows that require conditional rout
| Name | Type | Description |
|---------------|----------|-----------------------------------------------------------------------------------|
-| data_input | Data | The data object or list of data objects to process. |
-| key_name | String | The name of the key in the data object to check. |
-| operator | Dropdown | The operator to apply for comparing the values. |
-| compare_value | String | The value to compare against (not used for boolean validator). |
+| data_input | Data | The Data object or list of Data objects to process. Can handle both single items and lists. |
+| key_name | String | The name of the key in the Data object to check. |
+| operator | Dropdown | The operator to apply. Options: "equals", "not equals", "contains", "starts with", "ends with", "boolean validator". Default: "equals". |
+| compare_value | String | The value to compare against. Not shown/used when operator is "boolean validator". |
### Outputs
@@ -81,6 +96,25 @@ This component is particularly useful in workflows that require conditional rout
| true_output | Data/List | Output when the condition is met. |
| false_output | Data/List | Output when the condition is not met. |
+### Operator Behavior
+
+- **equals**: Exact match comparison between the key's value and compare_value
+- **not equals**: Inverse of exact match
+- **contains**: Checks if compare_value is found within the key's value
+- **starts with**: Checks if the key's value begins with compare_value
+- **ends with**: Checks if the key's value ends with compare_value
+- **boolean validator**: Treats the key's value as a boolean. The following values are considered true:
+ - Boolean `true`
+ - Strings: "true", "1", "yes", "y", "on" (case-insensitive)
+ - Any other value is converted using Python's `bool()` function
+
+### List Processing
+
+The following actions occur when processing a list of Data objects:
+- Each object in the list is evaluated individually
+- Objects meeting the condition go to true_output
+- Objects not meeting the condition go to false_output
+- If all objects go to one output, the other output is empty
## Flow as tool {#flow-as-tool}
diff --git a/docs/docs/Components/components-models.md b/docs/docs/Components/components-models.md
index f2f30e772..885ba09e7 100644
--- a/docs/docs/Components/components-models.md
+++ b/docs/docs/Components/components-models.md
@@ -247,6 +247,72 @@ For more information, see the [Hugging Face documentation](https://huggingface.c
|-------|---------------|------------------------------------------------------------------|
| model | LanguageModel | An instance of HuggingFaceHub configured with the specified parameters. |
+## IBM watsonx.ai
+
+This component generates text using [IBM watsonx.ai](https://www.ibm.com/watsonx) foundation models.
+
+To use **IBM watsonx.ai** model components, replace a model component with the IBM watsonx.ai component in a flow.
+
+An example flow looks like the following:
+
+
+
+The values for **API endpoint**, **Project ID**, **API key**, and **Model Name** are found in your IBM watsonx.ai deployment.
+For more information, see the [Langchain documentation](https://python.langchain.com/docs/integrations/chat/ibm_watsonx/).
+
+### Inputs
+
+| Name | Type | Description |
+|---------------------|---------------|------------------------------------------------------------------|
+| url | String | The base URL of the watsonx API. |
+| project_id | String | Your watsonx Project ID. |
+| api_key | SecretString | Your IBM watsonx API Key. |
+| model_name | String | The name of the watsonx model to use. Options are dynamically fetched from the API. |
+| max_tokens | Integer | The maximum number of tokens to generate. Default: `1000`. |
+| stop_sequence | String | The sequence where generation should stop. |
+| temperature | Float | Controls randomness in the output. Default: `0.1`. |
+| top_p | Float | Controls nucleus sampling, which limits the model to tokens whose probability is below the `top_p` value. Range: Default: `0.9`. |
+| frequency_penalty | Float | Controls frequency penalty. A positive value decreases the probability of repeating tokens, and a negative value increases the probability. Range: Default: `0.5`. |
+| presence_penalty | Float | Controls presence penalty. A positive value increases the likelihood of new topics being introduced. Default: `0.3`. |
+| seed | Integer | A random seed for the model. Default: `8`. |
+| logprobs | Boolean | Whether to return log probabilities of output tokens or not. Default: `True`. |
+| top_logprobs | Integer | The number of most likely tokens to return at each position. Default: `3`. |
+| logit_bias | String | A JSON string of token IDs to bias or suppress. |
+
+### Outputs
+
+| Name | Type | Description |
+|-------|---------------|------------------------------------------------------------------|
+| model | LanguageModel | An instance of [ChatWatsonx](https://python.langchain.com/docs/integrations/chat/ibm_watsonx/) configured with the specified parameters. |
+
+## Language model
+
+This component generates text using either OpenAI or Anthropic language models.
+
+Use this component as a drop-in replacement for LLM models to switch between different model providers and models.
+
+Instead of swapping out model components when you want to try a different provider, like switching between OpenAI and Anthropic components, change the provider dropdown in this single component. This makes it easier to experiment with and compare different models while keeping the rest of your flow intact.
+
+For more information, see the [OpenAI documentation](https://platform.openai.com/docs) and [Anthropic documentation](https://docs.anthropic.com/).
+
+### Inputs
+
+| Name | Type | Description |
+|---------------------|--------------|-----------------------------------------------------------------------------------------------|
+| provider | String | The model provider to use. Options: "OpenAI", "Anthropic". Default: "OpenAI". |
+| model_name | String | The name of the model to use. Options depend on the selected provider. |
+| api_key | SecretString | The API Key for authentication with the selected provider. |
+| input_value | String | The input text to send to the model. |
+| system_message | String | A system message that helps set the behavior of the assistant (advanced). |
+| stream | Boolean | Whether to stream the response. Default: `False` (advanced). |
+| temperature | Float | Controls randomness in responses. Range: `[0.0, 1.0]`. Default: `0.1` (advanced). |
+
+### Outputs
+
+| Name | Type | Description |
+|-------|---------------|------------------------------------------------------------------|
+| model | LanguageModel | An instance of ChatOpenAI or ChatAnthropic configured with the specified parameters. |
+
## LMStudio
This component generates text using LM Studio's local language models.
diff --git a/docs/docs/Components/components-processing.md b/docs/docs/Components/components-processing.md
index 960c60318..20b685068 100644
--- a/docs/docs/Components/components-processing.md
+++ b/docs/docs/Components/components-processing.md
@@ -137,6 +137,11 @@ This component performs the following operations on Pandas [DataFrame](https://p
## Data to message
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+Instead, use the [Parser](#parser) component.
+:::
+
:::important
Prior to Langflow version 1.1.3, this component was named **Parse Data**.
:::
@@ -220,6 +225,35 @@ The JSON cleaner component cleans JSON strings to ensure they are fully complian
|------|--------------|------|
| output | Cleaned JSON String | The resulting cleaned, repaired, and validated JSON string that fully complies with the JSON specification. |
+## Lambda filter
+
+This component uses an LLM to generate a Lambda function for filtering or transforming structured data.
+
+To use the **Lambda filter** component, you must connect it to a [Language Model](/components-models#language-model) component, which the component uses to generate a function based on the natural language instructions in the **Instructions** field.
+
+This example gets JSON data from the `https://jsonplaceholder.typicode.com/users` API endpoint.
+The **Instructions** field in the **Lambda filter** component specifies the task `extract emails`.
+The connected LLM creates a filter based on the instructions, and successfully extracts a list of email addresses from the JSON data.
+
+
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| data | Data | The structured data to filter or transform using a Lambda function. |
+| llm | Language Model | The connection port for a [Model](/components-models) component. |
+| filter_instruction | Instructions | Natural language instructions for how to filter or transform the data using a Lambda function, such as `Filter the data to only include items where the 'status' is 'active'.` |
+| sample_size | Sample Size | For large datasets, the number of characters to sample from the dataset head and tail. |
+| max_size | Max Size | The number of characters for the data to be considered "large", which triggers sampling by the `sample_size` value. |
+
+### Outputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| filtered_data | Filtered Data | The filtered or transformed [Data object](/concepts-objects#data-object). |
+| dataframe | DataFrame | The filtered data as a [DataFrame](/concepts-objects#dataframe-object). |
+
## LLM router
This component routes requests to the most appropriate LLM based on OpenRouter model specifications.
@@ -258,23 +292,50 @@ This component converts [Message](/concepts-objects#message-object) objects to [
| data | Data | The converted [Data](/concepts-objects#data-object) object. |
+## Parser
+
+This component formats `DataFrame` or `Data` objects into text using templates, with an option to convert inputs directly to strings using `stringify`.
+
+To use this component, create variables for values in the `template` the same way you would in a [Prompt](/components-prompts) component. For `DataFrames`, use column names, for example `Name: {Name}`. For `Data` objects, use `{text}`.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| stringify | Stringify | Enable to convert input to a string instead of using a template. |
+| template | Template | Template for formatting using variables in curly brackets. For DataFrames, use column names (e.g. `Name: {Name}`). For Data objects, use `{text}`. |
+| input_data | Data or DataFrame | The input to parse - accepts either a DataFrame or Data object. |
+| sep | Separator | String used to separate rows/items. Default: newline. |
+| clean_data | Clean Data | When stringify is enabled, cleans data by removing empty rows and lines. |
+
+### Outputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| parsed_text | Parsed Text | The resulting formatted text as a [Message](/concepts-objects#message-object) object. |
+
## Parse DataFrame
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+Instead, use the [Parser](#parser) component.
+:::
+
This component converts DataFrames into plain text using templates.
### Inputs
| Name | Display Name | Info |
|------|--------------|------|
-| df | DataFrame | The DataFrame to convert to text rows |
-| template | Template | Template for formatting (use `{column_name}` placeholders) |
-| sep | Separator | String to join rows in output |
+| df | DataFrame | The DataFrame to convert to text rows. |
+| template | Template | Template for formatting (use `{column_name}` placeholders). |
+| sep | Separator | String to join rows in output. |
### Outputs
| Name | Display Name | Info |
|------|--------------|------|
-| text | Text | All rows combined into single text |
+| text | Text | All rows combined into single text. |
## Parse JSON
diff --git a/docs/docs/Components/components-tools.md b/docs/docs/Components/components-tools.md
index 418f6fc62..f60482ea1 100644
--- a/docs/docs/Components/components-tools.md
+++ b/docs/docs/Components/components-tools.md
@@ -220,6 +220,10 @@ This component allows you to call the Glean Search API.
## Google Search API
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+:::
+
This component allows you to call the Google Search API.
### Inputs
@@ -337,6 +341,10 @@ The component dynamically updates its configuration based on the provided Python
## Python REPL Tool
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+:::
+
This component creates a Python REPL (Read-Eval-Print Loop) tool for executing Python code.
### Inputs
@@ -392,6 +400,10 @@ This component creates a tool for searching using SearXNG, a metasearch engine.
## Search API
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+:::
+
This component calls the `searchapi.io` API. It can be used to search the web for information.
For more information, see the [SearchAPI documentation](https://www.searchapi.io/docs/google).
@@ -456,6 +468,10 @@ This component performs searches using the Tavily AI search engine, which is opt
## Wikidata
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+:::
+
This component performs a search using the Wikidata API.
### Inputs
@@ -474,6 +490,10 @@ This component performs a search using the Wikidata API.
## Wikipedia API
+:::important
+This component is in **Legacy**, which means it is no longer in active development as of Langflow version 1.3.
+:::
+
This component creates a tool for searching and retrieving information from Wikipedia.
### Inputs
diff --git a/docs/docs/Components/components-vector-stores.md b/docs/docs/Components/components-vector-stores.md
index 8fa7ec449..fba582188 100644
--- a/docs/docs/Components/components-vector-stores.md
+++ b/docs/docs/Components/components-vector-stores.md
@@ -319,6 +319,30 @@ For more information, see the [FAISS documentation](https://faiss.ai/index.html)
|----------------|------------------------|--------------------------------|
| vector_store | FAISS | A FAISS vector store instance configured with the specified parameters. |
+## Graph RAG
+
+This component performs Graph RAG (Retrieval Augmented Generation) traversal in a vector store, enabling graph-based document retrieval.
+For more information, see the [Graph RAG documentation](https://datastax.github.io/graph-rag/).
+
+For an example flow, see the **Graph RAG** template.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| embedding_model | Embedding Model | Specify the embedding model. This is not required for collections embedded with [Astra vectorize](https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html). |
+| vector_store | Vector Store Connection | Connection to the vector store. |
+| edge_definition | Edge Definition | Edge definition for the graph traversal. For more information, see the [GraphRAG documentation](https://datastax.github.io/graph-rag/reference/graph_retriever/edges/). |
+| strategy | Traversal Strategies | The strategy to use for graph traversal. Strategy options are dynamically loaded from available strategies. |
+| search_query | Search Query | The query to search for in the vector store. |
+| graphrag_strategy_kwargs | Strategy Parameters | Optional dictionary of additional parameters for the retrieval strategy. For more information, see the [strategy documentation](https://datastax.github.io/graph-rag/reference/graph_retriever/strategies/). |
+
+### Outputs
+
+| Name | Type | Description |
+|------|------|-------------|
+| search_results | List[Data] | Results of the graph-based document retrieval as a list of [Data](/concepts-objects#data-object) objects. |
+
## Hyper-Converged Database (HCD) Vector Store
This component implements a Vector Store using HCD.
@@ -664,33 +688,6 @@ For more information, see the [Vectara documentation](https://docs.vectara.com/d
|----------------|------------|----------------------------|
| search_results | List[Data] | Results of similarity search |
-## Vectara RAG
-
-This component leverages Vectara's Retrieval Augmented Generation (RAG) capabilities to search and summarize documents based on the provided input. For more information, see the [Vectara documentation](https://docs.vectara.com/docs/).
-
-### Inputs
-
-| Name | Type | Description |
-|-----------------------|--------------|------------------------------------------------------------|
-| vectara_customer_id | String | Vectara customer ID |
-| vectara_corpus_id | String | Vectara corpus ID |
-| vectara_api_key | SecretString | Vectara API key |
-| search_query | String | The query to receive an answer on |
-| lexical_interpolation | Float | Hybrid search factor (0.005 to 0.1) |
-| filter | String | Metadata filters to narrow the search |
-| reranker | String | Reranker type (mmr, rerank_multilingual_v1, none) |
-| reranker_k | Integer | Number of results to rerank (1 to 100) |
-| diversity_bias | Float | Diversity bias for MMR reranker (0 to 1) |
-| max_results | Integer | Maximum number of search results to summarize (1 to 100) |
-| response_lang | String | Language code for the response (for example, "eng", "auto") |
-| prompt | String | Prompt name for summarization |
-
-### Outputs
-
-| Name | Type | Description |
-|--------|---------|-----------------------|
-| answer | Message | Generated RAG response|
-
## Weaviate
This component facilitates a Weaviate Vector Store setup, optimizing text and document indexing and retrieval.
diff --git a/docs/docs/Concepts/concepts-file-management.md b/docs/docs/Concepts/concepts-file-management.md
new file mode 100644
index 000000000..0ee65016b
--- /dev/null
+++ b/docs/docs/Concepts/concepts-file-management.md
@@ -0,0 +1,67 @@
+---
+title: Manage files
+slug: /concepts-file-management
+---
+
+Upload, store, and manage files in Langflow's **File management** system.
+
+Uploading files to the **File management** system keeps your files in a central location, and allows you to re-use files across flows without repeated manual uploads.
+
+## Upload a file
+
+The **File management** system is available at the `/files` URL. For example, if you're running Langflow at the default `http://127.0.0.1:7860` address, the **File management** system is located at `http://127.0.0.1:7860/files`.
+
+To upload a file from your local machine:
+
+1. From the **My Files** window at `http://127.0.0.1:7860/files`, click **Upload**.
+2. Select the file to upload.
+The file is uploaded to Langflow.
+
+Files stored in **My Files** can be renamed, downloaded, duplicated, or deleted.
+
+Files are available to flows stored in different folders.
+
+## Use uploaded files in a flow
+
+To use your uploaded files in flows:
+
+1. Include the [File](/components-data#file) component in a flow.
+2. To select a document to load, in the **File** component, click the **Select files** button.
+3. Select a file to upload, and then click **Select file**. The loaded file name appears in the component.
+
+For an example of using the **File** component in a flow, see the [Document QA tutorial project](/tutorials-document-qa).
+
+:::note
+If you prefer a one-time upload, the [File](/components-data#file) component still allows one-time uploads directly from your local machine.
+:::
+
+## Supported file types
+
+The maximum supported file size is 100 MB.
+
+Text files:
+- `.txt` - Text files
+- `.md`, `.mdx` - Markdown files
+- `.csv` - CSV files
+- `.json` - JSON files
+- `.yaml`, `.yml` - YAML files
+- `.xml` - XML files
+- `.html`, `.htm` - HTML files
+- `.pdf` - PDF files
+- `.docx` - Word documents
+- `.py` - Python files
+- `.sh` - Shell scripts
+- `.sql` - SQL files
+- `.js` - JavaScript files
+- `.ts`, `.tsx` - TypeScript files
+
+Archive formats (for bundling multiple files):
+- `.zip` - ZIP archives
+- `.tar` - TAR archives
+- `.tgz` - Gzipped TAR archives
+- `.bz2` - Bzip2 compressed files
+- `.gz` - Gzip compressed files
+
+
+
+
diff --git a/docs/docs/Concepts/concepts-overview.md b/docs/docs/Concepts/concepts-overview.md
index 0533b234d..2463ed6fc 100644
--- a/docs/docs/Concepts/concepts-overview.md
+++ b/docs/docs/Concepts/concepts-overview.md
@@ -36,7 +36,7 @@ The flow storage location can be customized with the [LANGFLOW_CONFIG_DIR](/envi
If you're new to Langflow, it's OK to feel a bit lost at first. We’ll take you on a tour, so you can orient yourself and start creating applications quickly.
-Langflow has four distinct regions: the [workspace](#workspace) is the main area where you build your flows. The components sidebar is on the left, and lists the available [components](#components). The [playground](#playground) and [API pane](#api-pane) are available in the upper right corner.
+Langflow has four distinct regions: the [workspace](#workspace) is the main area where you build your flows. The components sidebar is on the left, and lists the available [components](#components). The [playground](#playground) and [Publish pane](#publish-pane) are available in the upper right corner.

@@ -75,11 +75,11 @@ For more information, see the [Playground](/concepts-playground).

-## API pane {#api-pane}
+## Publish pane {#publish-pane}
-The **API** pane provides code templates to integrate your flows into external applications.
+The **Publish** pane provides code templates to integrate your flows into external applications.
-For more information, see the [API pane](/concepts-api).
+For more information, see the [Publish pane](/concepts-publish).

@@ -126,6 +126,12 @@ Projects, folders, and flows are exchanged as JSON objects.
* To move a flow or component, drag and drop it into the desired folder.
+## File management
+
+Upload, store, and manage files in Langflow's **File management** system.
+
+For more on managing your files, see [Manage files](/concepts-file-management).
+
## Options menu
The dropdown menu labeled with the project name offers several management and customization options for the current flow in the Langflow workspace.
diff --git a/docs/docs/Concepts/concepts-api.md b/docs/docs/Concepts/concepts-publish.md
similarity index 67%
rename from docs/docs/Concepts/concepts-api.md
rename to docs/docs/Concepts/concepts-publish.md
index ff66841a2..392b62029 100644
--- a/docs/docs/Concepts/concepts-api.md
+++ b/docs/docs/Concepts/concepts-publish.md
@@ -1,44 +1,41 @@
---
-title: API pane
-slug: /concepts-api
+title: Publish flows
+slug: /concepts-publish
---
-
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-The **API** pane presents code templates for integrating your flow into external applications.
+Langflow provides several ways to publish and integrate your flows into external applications. Whether you want to expose your flow via API endpoints, embed it as a chat widget in your website, or share it as a public playground, this guide covers the options available for making your flows accessible to users.
+
+## API access
+
+The **API** pane presents code templates for integrating your flow into external applications.

Om!l%NBKPUGhI!hZU@KW6vQn9!{@l=tE=opyd%xiEt5S}JDA&96 z-=|y`-{_(gfwt0&UV)hR*c8uW-peDMS@W3q(CFtgHNuop6Yzz*3-XTs)n0zg|2{uE24-0T!aLUf)J3_L=1Ap4ONs zh~kP_U8xs-CjmO50fp9$aMjPUEUaRuLX4cCnJc*$IJjm~&P3O)VWxF@5vW&pqhIQb zm!u%$nbe3MY#@-IlCMHf1!&VBbT~p%*7x2~PC;6|Hy>ZcFi6~6?BqU_CSq^zH<&o~ zv|v{^8GRSoIG0Qj^YV%b<3*A>KBDcW{gZT3jC*a0Y5dMvTa>BD%{xR_5rEjO)sNZd zmS{$FQ#!QM)kqCLC5-CcZ?MN&7iCJ#mDHCeMld^h&13#!CmBcnbcqj`>ET59ND8rd zw|}Wvxd=q#YMf%I* ?^OxdoX_S9x}Wrl0=1jP;GSC~9_3ujQptihN2ulBXieo35d8OfZLZ z9I9JaX~_!~b!PZrsWgWKqvtS)_GprEqpRPL+M%L%X{)Q`rQwxmRQ`XlOD%T46Jw?H z4tmrWdC#5gh|Xf?Z#f@lDvJyYCvwi07stmlFI}7d;nuh%OO+md7$)*(zZM><0?KkH z5cv5q+r(qKC9R8c#Qg6k QW|a!zzv_P=rh|zCW7Fw@^*5ulc|5f>o9-rpRE)Z>y_fU6nyg_ z5(`;=`GE&eY2Ee!W@qheM<{Pg-6XhiOSGb~6n=puCD`CJ@%;6^1E5#We}?8~wGvRd zK7Opu=m&J~!q*ZEp2LOg4&o7oMnO}j-)LLZ?|5&Px3Bj @}KSDlIV{XO7DSeA13zLCmIi0E%5lmO{H2^*(aOW5G96=}~=Fg{1D^_E> wLPaW~joqHTSu56cV};!>4BjhZtF-S=xd zA)WO-p6d`r7V%@mo& op~_Gfmch+SZefytb&GZ-Ni0n~x4sFPqTy zi*HFus?$@{{{^}89lqq*Pz22-dJQCFkT63od9t`9%L~=0M+bq>=}Ged19K%2-KR{= zk7#Zj@n@ef^>%cggG}gD(bOUg2B5lAiJrz_mwSUVc)hVa4-dumMp7|V*PGNMFeABY zYNG1^WxJ&gQBc_PM9mkW)tEDJ5#jTj#cD9v9i5l?k%Xzzr=)4WXGslyrX|wwHA6Nu z F9|8yG3`lh;?da-Hq9yVRv zmG3fZQ}|Z3NIu$>MDpJ5t6ARa@;QHgNoR05Fj9L{qhse@x<6ZSK~juO_1DZewKlta zVI0e+$O2*ZB02zm@T@9jwG}G8b^&%y9r9$N?_Utu{6+nlFHgEUOg!dvYU}G^`@g&U z(kP3Kn>?NC9f4NoR2AR*ZrxH4&n~f{pi?+wc#JBAH+wFe&&Qbr1&$3qJ_2Yu96dIQ z(3UK>KEa7-iB)E|L1_g6`i#}AC{?cBJo!t2@p&&F?fI(Zc-}j70CrSqH8PT;@=%^S zZ<-?BHaeh}x7BCTI@~4Ak)$N?iIrlnd$@j@d2DU-mSZ>*TP$sEDh%q3IbEy${qmlf zl=S^e%+BR}(OqHNEG?9P$GdnwY9K k-!ECq(f=rf@}oq>(_bigIm){B z%{y>ohzKeq(g=R|@qslOfM$$ge){D$p!2B?3fS&7BW~{p3Kz?@0MD0(KBp_PbD-&0 zAVZH74WtjUmh3T|v!5e{@(_L7G==l`j7*7pWx!gATF4!sm%yBV+zYDGA$osP%G`&5 z>Olq$A3=IwvRLgT5G8kd1a;=2N`1HNJK8Bg#x?G3xI|O{G5@SAmfCIqr;TJ~-6iHc z$Z-U~E_|!hOF021qy64kDXe<1>=jsa=>rQ1nO%;lRm*-%DOKv(Xf6ps{ikW#LC9-= zb|DpCOaWTA=0bx0g1)FLa>yy)+wjY%MB{Y4#8#IdWw&5}s_v75iKxln GXpuYASS5oUY`@pb#kB!=&ja{2;VfW zi1Dqu<&S+nKkp9i;E}u=eDfISUdJJqr>U2m 0a{*i@>yBdA zTUDVMhstLXjkAD#>)@#cXbi|!jD2Ms<%LN;;=LUf)B%jVk#6x_YBI~`h%i4qH8*l@ zPQM2L>xe>B!-R9Ccy8~@M=Ec1!Ji*nQ~A8mPbi)11xM}gZ@=u640n6WU$BX|4;u`I zish3s<%_C&d`UL(D4@_UXVUI5Rime#8XeaglSn{f&RZ`V2PY$AYv!Ry7x5-wkT(qq zv659EBrc$HCcV~@d5nxkP~%3WVUe@2a~)L#(`H;N+A4i-Su`2ku#r wC zd4J5)i{$&1>wrWkz; *;h8O=A53HFQi`a z>m!8p`%yYvQmS%OC5P8Yq~VZzZ=v`cm7AuAa^bi=eyqPvsJ{q7s@u6Aj|sEqFe&@J zH{sRI`CRK+$x@#hUb;KT7lTPf%kztCeJuG<-uzzUl_@$xg%tM3fybd{Xp1g9wb3@9 zTWJxBa=iIE>{vTzUC9`a!5p{pf*!;7Ld~?tg@MIsOS|n9yz>{^9u(*55K{Dp8k|d@ zB{h&(vn?nU3n|xRiXY)_uMJha)tyI`c<6l0&)qsJ(>u00Yoj1YOY&Nc?;rx5d|d)w zP`&)+h83^3fymF#Z#4=c-}Y;pc9~4{{sdeSJs-?LDsRAx0tA346NOAPZ$rM$zcJm9 zjEk0-)rO#Sb=d!YnbQ*fVPv-H?Xl2EgugK_KDfMtrdr0r*lQ)G -P@pdB_}Jy<)La5S$DLc}l7K_lWR;NQrvgvRqZHf^XlahcIq zyKBd#$d0mBms)BM_a=>xJU4;Co1qtjBEtuGTdk&CI*B9}E>SZdk;|*)Udh6>He`*a z4vjfm#&GKlsj^heVXl>503HJ%LEQb$$^PZz*2@c*r? enb>s^KdBe53kJ5-r+&@Wc%IWsdq&Yep~kix+st1$5` zKR3m&|3J+KpBq?Tq5yQ`3tgzl`h%tAwzc)Ml@bc^A-cOKS!be~&j*782kJL_s6WGB zv*zSdkv=I;qfDGWLo{!p4LyMQzGbK7JT`n2nB=X1b*g#JvxoPVBT&{eTDc9lgFzXR z4m?vtIXt!e5*LRfp&l&<$ua)-bxS4H$HISM{m&&}@-xstNtZI*3O~+gGC&LmP)O>p zUo)PI+>oo|T3pU#zOePuYINHeZg}03qV!Q@^~=7D@jNCx9jq>3JOr4qm1)r`={0TP zVY8EOv>|H}J6=3qR_GqRmWsOHkxGW+=cEn(Ln`Q8ptCLMltOiStx@3nl&A-kilT&G zK5JqNoU`+eWc`{|=2&=S{mCHqnYfttk0pLf@Z(&)S(WZ}vj;nk@7Q&RUF{Z66xk z_|^;9&eZ^iV!g$HmVq&k_OnL@3uN%)#)YvQYt1(SEpXjWeu+Q_w#~5l3(?#G|D{ba zKlU)-Egd2 dc7~9H0Z{91D(QxYOta3q?5j(W zPi7H~MRAEdoR7b&oi*zYTqu%+lpk!ZjZ~QW)gV<-Xa4MJ-qRyJNSQU+HAP%$k~b_6 zRjJlYMH)8?Eh96q13J@cCI`|yIHCX|Oq@I&b&G5q>^r!C-M?_12u`DH?H_zB1~Vmy zw|&8^L?SsP8Ll%-7MJ16!@2vcy_sVpN9|^JtXsgET;259Y<}REp`f%xG=r>%QBPAK zY%f67jU}663dkeXh|3)ZDh^E}PQR-)+|zwm3ztcM@y2)kk#SvF_6IyZDxE@0*C?<# z)?0lkOba+!?gj%uqG`jLH`+}20c=<$jM*(?{<)iR<9366FIh 8U*Zm{{Z&k6j9 z|L+#xg$4SxP)ZyQ%7i-kEHi`$eXRQDUI3XI7w_`4D9X&vhT~!>D!2R_8!gY6%y^j! zgc0hRI}f0zqj0)I_~kL26qQ#T$Ae0)1f&*4`Ifg3O&lX23Jb+ZF*lWqtd|QY-wNpM zQbiKc(>VBP+)HWpp2DC-Y`5&ep={QtS0p(qOQQrWbV(kSTkJF+ms}Usn8!v6=#Qq- z;_2EGfi3p6zgyAvNI{+54-#m-!FMGKU$PFkWe9GaO0#p7rbPk^_$xNYW)a@NJY+Um zN$l$c-^h-e&UvZjkqVJ8c=J5B1VoUs&T335N>_8OKSb1$U1_BVPmWw{vkWT__koT0 zG961zsVG(5639k_@$5ouC0eUz{$kFCW7_?A&Ld7*02}ip4!j@jZ5Ao8@kPBTy;~4{ z2zZ9&@g~jV=L%o7V}+((MLqk<2eB(Gu6YgCbb5rK>r@%{{y4sItUAG!e}G5AHB>36 zMDln@R0%)%%X23cZ?@g%xw2o`kF-1zfa#z)L6pvIzr0eHAT$g>8FoZczOrxk1so~0 zZ%z_@mc)k~th15Tj^t-KucL9o!-ePTSjJlS!krv8Hhu#^9ap1 LFe25I>*L&KU z=Le=fdmZhP`qX5b^G%2V-Ag+Sk9P=|`dmSN93_FNzGj>|II9ReOAXm%Lt)ZWq}*I{ zp;Z0|*e8x18_9$C{nf!9yVU9(px0*{ 9I|GkAS~A4eDCj; zX=Spe(XykG^Dp=3ZL5WuPz6Nfq=Z8OHog%>>F%Q}U(XjVF{_^*nOz|C0@|}uefGPp zO4-i91`@`|m$}dy_2G6$iL!~~7Ls@BZvvo?HFmDk)a^#V(V3gwnf+4I6eL_v&(<@0 zFUBw%=a#6qC0Rj72 #VK%Rz*{jhvl0BI_+k)ENfLq_<@_}kaCt?mUmc?}< zH-qx6MriKbd#$&yoVu{?^=tzOU%4Z)jcw7HYeWTV3#rIPr{jBNri3w0I@s|4)nS;d z!orsQ?WBS%->R%QbIZVDJ@rpe(b}Dj+9~VAB^l;3^>ii`H_5S?@Dyf_yRrjMN4 zY&JC %m6p}F#; znba #k?jhqRU*>S-|09WCml69)p0AhMfTreah>b}|?1Ihw*`hzl77jR~+@-nj1) zWh#f$3jrqu6N1;xGgfmz;5QPcJl+@VeZVbNtW}lIN^rg|BYQIwfl*WV+}`l3f`Wkn zUiY~-q)PWyW8!FEJlN2E*12o-%cp`JlO3pDdK%N*-A0oJ&QF~?{pyzXJxan<^c335 zREVy~xu4S&(-oJWCPl-e^4uY=uU7=!+5a{>a#u|XR}i{boV7E8(o83KYioO(AY sHvvl3&_*}SoWKYhYPXxLf5z5>M{%6H#2^?cT4 z3X0&MZGs;@%fx%R`L$Wd{*sC+-TVfD+Pb$Z!L_^zVpd;x@m->GCgWz6byh8 raM{FA;q*=XMIb+K88>P jvVUJ5@A0yAbF2aOH1s>R%XX^0jUEfx)S3vVMj{-Jnl@?*V7MjaF_{b z^KHnQZ3~#x57AQoOi)-x)?Mo6&DXe3#sdQlhu?@QB2d;ND#AQ#VqO>d^3du7EQA0M zTT(wco6r@*2fXJ;d}u0chcce=juv#mS; !880yV}i)>{Fn7^ z4p5<-tO`selko0$$C=`w(|+RhosW?O36oXEQz!BRBs>wt$eN9wh)D3vmd4aV3S#d& z?QpQEb46Tf(wPX<-oXDp&15>uh`Mkx$?gj}>n=S;WQy9MG!mx19x&gzS?N0x{u$+$ z0coJq-c?Z6%*wg{VN2d5gcG49oO8C<$TT9<=pUZn`X~Z1NLF#*Lk)Cs_>37r&s)m1 zAv2~Dl2DVictbdUrn$hGFGk)mUoVP(K)kZ4TdR~g77ZQcNn~)dI2DNT$MC25QOf$w zsMOC=k2xxQeTbQitWmi+6e8yl_4ZBlY$84n@(#!Sd9{X(q4M=Fz$P3KvCiiLow ?J2aX;hXh$nw0p(ZDfr_Z z{gje$SZ_oYJOGjHY_k*m%v&Q?B7v1 ;K>vf&pry0(POQR_xH>!pbQIFil}&p3MA$f^0sr*vatbf(|E z v15~-A-bNn|mqwOI*Q(S8C9*2T z>VIC 6OX|kyfVXy#m|N`Ip=S!MGhn9Lq8QhiH#0R`%3=@G+HQH% z%@x c<8spXqQw@*zZyxWKbM9tE YCf#%^xGgkLv& zc6H*?*~0=46cWe=H6)ckgIIr>w^l|4MB(zD`nz>oHpoS82`+Vh0bm@-N?uqA*Ejp? ze=l>?d*x&@9DW2~8Qnd74PI_qc}%jeQ=L2Mz(+2o!fXh{&&Uj)Iadp$BO; o($yk?GwU|&z z=`Te_3me|j7ce1qfIXRbWab(nn~ggyeX?X88AS8Y^kLsOrSppDG}?z*ICRY~3Xf2} zt%0I@W=Gn*j6zAlF@*^Yjz9E)B+>iBXN9b_@~%d?8!sI5g1jVLHIkw8X&2f9zhh_T zRZUR^dSg%nm`b(Nk!C5L>ftvB9Zg<(`i4%ZPh2r7FJnyzimR(2%?8DtiiGYADs?CV z$U3h#!H`dGDM&)?g8~bk-q<~RQu@!IO(TmHq2w8B_n^AJ*~xgV6nNLhS&xr@q_lIC z;^}bbDGrzme2)kWcey5kKwK|w1u)aZ#KM&2x&f ~*xU~+0y(e|!rvKu4PTG1rQ1a`X8u~oZ}GWw3WIi6oT3_LvR zcXLZhRRVy`Cdzy#Zh*?Wn}3}i=7LO)EHZxBDuoo({4k!gb!tY9uY7uj*zaq7IT2oQ ze|YW@xlTj_YgKx%TR;WC8WTc(po<$mdjEIZ5#6|zhxC8e-ic(DM}64JX+VQhf+b6L zes8^OFipGeyY~9jO?lg+eVb1gg}(%zXkv)|<-}lT&|Wu@4d9Hi(qu<-^?3Yl;@bzo z>Rzal;(0c3%js&xUoi)*UE@mCEUeXqixd(db#p({b+=Yw=6v)EM~)Zrygsm#cIHQg znxBFK{WLTO!=RoTk*=FcO(jDw2I!4tYLiU4foX2RxJA2Qeumm7&2&6wlt07-L|@Sb z)!H~j2}hdL^M}JN4uF0FG3DvFtwWGfXG#)XK+>bmV4dxC?4dHCPSun_n?YTdWn+G( zu^1e uG`}HB^mqx8_m~H*1myV! })E+&dU_L;u2ZW3)^Nyu(Rv%`U8-#kKxG z_(msayueDfh>PQ!N^T1DHC wt=05IK^mp(`$pz(FkjfAwX)mc3kb(x=T^ec0khi89VL^N1{Am! z9MYzvUBwWLj2&V2m6b+bQ(jYGwuL=TXm~nGmIv3eM6FvZ4IR^yzYumWZ|67g%K2M1 zSRp?8<>Ny}hq-|QP1#>C;ms1}t<#2`k7Fg567{IXUoeUm%o&o%V`y$WmXyXt2yyx@ zCBXJJH32uLZQEN_s?D^N$D*GRfipu&Nk@Zb62rE{8DD-g722!oj03lf+)zOX%57kC zfB=HDBM>@4Rym?Fk!qqQn)f*cIckzy-Zk^i{%2jQeJBkN7YsmMV!pC&AMi>PYPNk2 zY#44y2Jp`Il-4@P*}*n{F<^6M7G`gK5(4~(zywX4Xx3V=(OQj0_1r$6qgfk;=+Lg{ zc9|GdH&=Y_3pY)AvhQ)KR*lxga}KemH{CO$&eNjAHAA}jH5n BiI4wm+yQ& z_@#TNC_rvpp{S&EEdn#i;xc>8I&T-eJU}RJMk+nBGbnxW3Nj#+prDa3;MMOM^02h2 zBAZV3xPX=%LXqc1_SZp )&}EIBSQM|7c%>Q$J+59y5Wh1rt@gAo~)-p0rP|?HTPl;z@9zV za0)LZLhijdlQiKC)MfPz+HB!|-IbFsvEBj@K0|;+NJW8XeLo|3zGuSvNGRz~G&f&! zRzKhiPPdnrSXpoMM*Y|ak_s(@yTV&+zO+uf0R?N$1T1-7&d9CjsIDXTjHd1K9**c| zawH#yDsi(*eO4Z>d=f>>eS-=vm jcBMbSl~)qdox}bT*I;W9LYT;l-MxC zttPBY?J>B%7(9AoJ-;m~+AlJ?Y0fiS|5GqQ^5p1vgq!jfc_lxSG&{ZPP`Ekc#_hry zGXM&&i!kNnJmbX*rRvl4lBso6!^T)dBsY*0lS&%!-FD@XSX!5xr4ZMkL(ylN z-y!{>@w^UCT_7nU&_#3SsUnHF#)M0QKkMHH>G#rhGG}}@Tm+5^DIo~Jf+MPa*^SD` zIq=dY+k&dey`P%uY-59C0pm}RfyQM-)AWJQ7c?H`HwE6$SA=%{A}q->R&*)7N$|z? z=^apfWvir(fj=waz3~Q+=mFC$S`63%jD}(C8z$ff& zB$aV`y7l2)i|K=!gA68-* XCsiT z+xWo}Q3Rl0OpQ~n2Qz3>?=7p!744f%Fej#1>2{ipRq5uuJHCfQ9aubkMq3<6j5zh% zcY-;LbW4m+0K7u)=uribxTa+XSnYej*w35ISp0;|iW)pONi(Q&bj{|^WO%Et9{y2A zn05P&QiF(27D`@n|MQdG@A)O0)!&`enltkzsA|0*%B~^^WrwC=5x`br$njqBze%Y1 zwf(?@ekn>3;Wikcs@YT>>kXJm^lx-5T16>;-FZ1P?e2YV!UF+p9mXXLI3BRr?CW<6 z&LvG(w!H07;Fhu>83hL@kTmKc+V3gdIivuv$es*f2h4$o6Kh4 9}gTnet6IXAXkpTRJyO$yyp*?Kt}aN^Wp+>8Q|Lk0Q|8Z`0dG= zaLL(Yz1r6RvfRd*o22R9n8QFvmThVBOC|nEHa2223~4$WD=lfJ0}>~eJq(2a!=l=A z4r!`K7@t=L{vkLz7)Hn6bC(kI^gF$}2xzKr2OvsyJ{xLrUF+w$<~W;3SsP{+bg}le zul;X3id2%HX+>2Q6Qw{?ed=MFzRWB(Db)c*7VD93Ev?aou3(!zrrGv#(+2dg^}NRS zO{&-(mml}~Xdk1Neq#+o?|2fI{$jC{uf3}Q@7tUQ61-(hcMmOAC5~tLi%xjqr@c#9 zYET)f{^6))Coa()b()EGpW|#(-+|P~L%a=p(}M)-o4#FefF~go=O{N3M8Le^S%^nE zyLhYlabb#D^wF&AKt@6BIk+BkDBjTo5yz$?452@UM4OumO 7GI0{vaOD>u|5|h1LKNr}J>rO==WE8zyS*m7x6ZrqBC22je9U{zA1$ua+qhL@ zbWk4ylb=n0!`;e|miF>3nzk46lU}apNO~a5tqJCG%?M3fbkW3}OZuHKS-%fI6@ZDA zfkim)(xN`|eji<=1akY!5k`=9VNE3jXGh?nhAFD%mRQxm3rIwj$xxj8fw`AuSEHK~ zj*jk}+n8*C;oLHx?<#-l)Nm0VOI2yC8-H5c$AWYZ?ueX_MK`CcDpls;hL>8=1r14B z4+@}c8hW;17bi5i_- +VCj)Rc6Wc zi#>e7M`;8f*Vzz2X4!VT%V>T-_L)Srep|%-4=c-;xl)c%e?!yr55BvL-9{1Jg3@a} z8+$&PoagH~e~_XFD=qqYhS6(&vMwu4=3SD~1_IJ!F$=OrZC}|E9W-0~ZtHjj@o$LP zky&OksT`V|U{hsH>$1FDZr8_+f&;U#+mt5q45Wfuub-6dd`0=9nY=eOj)r{!EIn4j zEw78{{E?x| zczvXuxkydcoi)Ery_*d^)T~8uWiq|uo|JXu^psbS2wm^krtn>tSqbee&}yyRu4KN< zUM{#Ohu9Za>!vdu@YH|3SEDMyVn89>Fz;5pF0u%aGJY*3@A%l93QM!FaBzN7IM)@V z`h3nk1h;0e zJn9X2ZDM4%h}?GyQ?|`D|1?+~-6W ua#MyhC #iqc5Qk`A+;NtL6ntUdVLrF+dgv2#`x!R=hh;5F*tgF|1@;Z&vRaZ=MpxS zpB{a*$ b+8_#spIPw1_#InWeXzBM9wPZYI(djUHcx39B~gbk?vm4 zCze>o6Kz% K=)Dqa!P*k4&GtTJXEdwGXl8H15aa z(-GNsM~VTMu{<`~LV$#Iu`x!$i2^BURAC`wygP)W$51^~R?MlA+s-YBYSJCP$@(1I zb!%?Bo8E;i^X5Y<-_cRKjAd9@g`53KDPLqoRlMc~Mo_Au>WY$iTFG6#91L;RrTHf3 zZp-1Ig(@#2+Xmx$oH5+V7mM>^y@>$gnb&YaBz1B+BsG*Csi`WgcRZd2Qp zm15jJ4?Xn& !Zx!#Vn4KleKjls`i!Sy^HAV6~M9LE9KUByEk)A$+}ai4aYWodY1a>*>rci z62|A w(tF+oIWjc^S5!m`{zdqn!tA6X!BAVKI0A#+Ig%B!86|s zf`783P99eA?Wq531=Q5v9H)F5YG1d@chN}x_GX8RGHg{ U!qS24hiYIk?- zc ADF;Tq@~ycfh OwG (GW6p|njA}qq!K&C<>CVrD<20b%vD#n@gD`HsV>=N>O zNNMfqeU1CPIvSDXBWE0HC7D~sXRooOY2VYm_!OvCmA|01m!)%)z*vNz#tx1K3sr2U zCDRvU|0HVxeKM+%(vE#W iyXb!#!x!G^8RYKcAty}_)@^qpr| z$-+C39Nrd=bqrS+0-eB@MFGt_AKc}hze#BroQ!J<-hnzZ^%6VVY2%2$OHzWpO%VkL z+EWoZ74^MR@q1F$v9CkPr0muQyaRZVlbg^LKKY)_Boj$5hkE%)v(JTXIWi|CQ>--u zG;SNm-N9Uf!>lyMWho(6k!7Er>O9-jES={`p}Wg+iYS)>svrt*+#d%WN~p!ARVt>_ zmn*H&(lsMbPV5ewY^rOZ)gWt)X-+1}1gT`F)i}j2Nixbe@f*%P!B55U@kJP@mMab1 z4A%B;$?Ah5I+4*pcDWCZ90QJwQ=9w^?y?PqLbrYecSVLE`z$(cf=`+XJ8?n~jCj$C zyg~1v1h~w7G`via=w4~8wWFK&^AkD&!MF2`7vI2fC9&mQ8k6x0s&QDY#WIp+1NoBk zj@Gl1sxyV^!IjZaALtnPEWibl@=Ej-CWxp6;V##U)bk~$xeY%}S r(^%T^^Fe`LPU}!yEhnY#x6R&6_RU^V7 z#jAUq?&?MAS7Z+Q8h1&(d74S! K?^Dm@rUQ$T}v9M!&>`H?3$7wP5W5SH7JWI7sLJozVXsi$bh!J^V&h>H^;ld z1*d!Ck-YIE(--*9BO@xK!~sRE%E{f#c22vSix@7@LW>)>jU2S}yW&( |QNhPS12Z?hkj1j}*w=IL5 z>yfX2-<@%Z`gk_y-6m@}9kxg5I)UsTuoUG0L&))hgG+K+bx=^$Wkz)Nqxt@5oWZ{l zb|`B+cSk^*iCMqeqE&6>8?K-hOgr@>&>^haJ6qXaA|u{jbzC6#g@)v@GRzYJ{ozjk zlI_7aUxy0uWgsFd<5`D=k*0 1f1AR|L%@;DhBb2gsz+Qw;ULM$S4l4 ze-pyhP(YWpKuOXjyFg)LqYybJ{U6P<#}~ZP&NngQrC>aL19H-m2bWS>AOAp{?~E1c z5%ZO42N*wvz4c_{i&c(3Jmof+3rG?d^bO6A%JCP;%4+;~ylzL~{rlHl{@~U1$O0}c zN84z1cxE$}#H}J7Ov!(tDkUW%UAQZEo)hinJW{*=qd6RaM?D~Ot8o3Y5=6^f6$t w+`zF*vW5S-@sW@x zNW0nl39m?3bGf+nmoDLhBynHo4BVlwk8U;ZkbK&&@u7)WU0c$!FsgvzsxMVlXkN z7v8Uz`Oie~KOPry7mS2lam)M5poagjfF7VblqObx>#_>Xe_y7jhOgr}#}lWqX=rc0 zw&hN264KS4E2$L88eU96|8Q&Fe(8uv##&n4A(3&9=zoUzS5rY5%E#MGZ|es0qfd*& zijvnS(zm$!oSm7$sON^eX8yZI2kK1gVDduQBQ1_kh*TW1~rWi|de7|s$e>%HupS3KEb60jCW zlkJ_?C9U{=UM>HyoS%NJL&REa1usf!2O7NCx-iw}J+r?GZ5u*=n`Hgvf!K06k<2PN z2Je8P$*ZlLwobyUz3C@$&oXaC9PYsxu{J-c*2;J9*{^7g4=2jJ-HDvi4V(eb`5`Xb z)$aFL3I3F@=z` -@F|8+WuGe`age5(oE9Q!L0ydC}&}XNLRA?+xIvj?zb*T zQLA|jS0pSF;fkX2h_!Ocj$Y@A{%GKHdNrP7-rcvT5B*yE(NJVyVytl#dv~t%gcaid zVW=vijE< hUM+ zD?Q+Cz9eDbumAtc|BpTXvF86j4$j(jAl}WO@!8xlZ(T(ICbl2 tq< zyB}4;!w7l}CBvUPJn&`JrHMh`wL+<|y}iBP%wOJnqXFrNdr^>#8_O}p+e*ez Q#zt;z$66676-e8?UZWlL 02A_L!x#tSlN8pLVvtH`P!{zVqD7^ZB&DhvuI@!EiQhVSX+tnp5_2NiI%- z9e>O1C(R)-Z~L8%Loa(05>L+ud@#QUA&nd1;o)Lj&OU*E4RWv~{K+^|^g52tWm(d9 zhG4vN3FdQbV`KRIrB%)iO*Na$tar5>XjL<-e@DrU5}qC|O%f6Af4|nxtA+#*u?pXz z=dMe)9+#E5wZ_BV;>?v3K~CX{ZNbV1{(tTEn|asH_jcB+_4I$e5N=m{4u3~aNpv!l zkkR8ZY6&nC9e>WUF_4y#At5a6 %)tIPS8r6{)4`E@dO*IEihiBV=)i&BTguwHkiebHfFu|m z{^+zvSw*EB?U@*an(1H2qW>A#w-CN8 v;Y_59}<{D+hLw?eBz#QQ zzTlEx&D!$uJC1!5-|1|tcXn(U s zkx7?1?LXYrMrI 9_*n{wAZ?mJMAlvDr!}nNBRHLtgw6kndQnL{1XKQuyBG9!jPl ziS@_xK(0Z;A1Sw1IVHA~n2k#**qVMx>F=nu-rja;1LVtx4@A&0%7{4sWm=!t@(I9; z7n}K?F`ONt;AG(Fa`|D=P6{)?5QEty7TAt^cY1(l*byPPa7B h?c_?Xm0@JWe4u1I zl*7)_ARNn54qBiwb=<3L)?K&lvxMukP0>5rp{C?))fJNo>NF7aeg{fn3;=cVd7lHX zFoBRmfkw++#gMzOs7UHVgtmQU9 L!SDE~oX5$|YiGr*<*S43DaAg< z>P59;+NRvQpl*IuA^J!k$M22YdZFY{4v6+E#yI;rtdq7-1qFqX6?Fi^O_88}ep?h7 zqL{4|yD=tW{}GESa9bDFx<2V5Y3~;)=_zG3q81t*O=^(9u1G19aCgtqMo~#ovHj#Q zam -)%7z~vuQk6hs3hp(s#jCg?@Z|H$vm*Qp&^Rq$Am6?^3D^$~TKeXd) ztg1qn1>87;5q1#-5ibN8rCilVMFt)(Hi~Vm3-ty*ezWdk*9uu(%?aLHcW(+Hkb;T5 zy^Vc|iFmRi${qeN=|f3a6#4X|o+{I|A8XAdoBH$tHkx2GP^?L75R *ob>d 21RJDJ2?>39493N9x|{n72U;5}agN%*ISBf&NK*T2hjQ ze8u)^d6x&TPWVzI+T6~PdV`z)8Xu&v(3;@&XOm%~^7V>G6jW4HpWs|Bd9iEo3Am!W z2i_4**4Vy5iUM9T_ h|rrzQhdaEXP%AH&FHt7aL`yccsN@ ze?UOK8|5!RbJ{|MKhC%2hcopbPl4KJjUx(>9LN$q$3s6|LHmuU-u&2)YRW<3;~( zDI|>|%7LUK`6B6nT1`J+AWaymd|w$*nXq 2VDq38(>AYg5m zV%3m8M=gFUo+RLF&uF^{^DF_*wdnZh6d=Vs#$lg;4+OexICzhfJowZuF9}sq@J;Z; zPInYQB4F&C>g_F4c4(eFKWV-`XB~I#Zl`Bos8D2;(^f0h98lAV)Tp! Q9aJaX$C?>OK(m4~9x}h>aB+VNK9}Kl3=-CWiWH2gFNsCvck)>oocMjkr(O zxPA98SI*b81~j(Ok~eSO6k2|JR!IoDa6)w_%B;@V1y}tMt|Ou@Zn$=y6}jvajTRXs z78{4_6j|@A3^&u?oH5Unkk3^st=CF71A+1BaXrD;uM~wAi5thmHEwFqkTe%dEOzVJ zkDZ=L!^7#UW2F{Upu=h525CT$;$7^u9pV^fqgRa^D<5SWIvqa8u4yflyB$jx%}UMI zL4iGwupI9bhfPcj^_AO*EDb)=ikp)^!QBngi9I}>ZGZgzg@Te&jQ^upN#5}_0o(ZZ zIBuWTi`OPAGnRPwUogC?ZK#-d8 w6e7~1Wjr~3}Jo|H|fjjxSr=0k7q0Avv^2x516Bz_jp2? zy4VB)iMWk1a$gjD;cBD{1?O~BWtnjv?rWHY_%A{uBXRqLA6* #R($UP5vVCdfkk+^RutGS_jQ1K!QsO zNPeLn=AR!i9OsQ{$E8FQUclg6fey^7!jC|{czFDen_ZkmW|jh$4e0kdS~4@FL&czh z`^0_M{P(9~={W80j#u2IKga?oD97_3uz*NSXGO5`zFDlGbM@+JgI(9cD~l)m-Hqw} zQFdN#?oQWyl<4kL746#h*w}N@{lVw@hZuz82lK2e=RB*UMalr=YKHZ=kca$$kwNCZ zbRnLC*RlIXb-BG5ac=EQV654vR-jR&GcT_ln_wjzfR@r5uTnH0lN7&O0>}aeElK h^!g zrQ;^dyIe(*ujob^>&jr+J@_X$qOa>h4L=N2yO`M{b`m9}tCgBtua_?z$y_|&>3BT> zL+wc+@8T>FM~jqA6-Ht;>Nx|-0hAXl*Acv=ixJSgdUXI=)}`@`=j=eI{NVfh2ITlf zF~D0W-0p)#RlL)WJ7{99A-xd4c}B!c%wa1E 95+y+1zI8qLb`qR~Wu~B^ z@qlJhl LA{;91un=^LCFePF2SiQExAtHxs{|&o`~}(N{RCJ$D&G4t{;J zc)*_y^olNVs>Z?$`(D!l!aK9gcUZRHd4_`5va*b^6!uI-d;IofRh>ry1-v~T{=n`5 z!K2)(T|9HY!w=;t@g~Nuc+RS?2-W`+BmZj4fkfQiv~7Y$T$_tYh6fN-v|NAw&I=*4 zLy%eE6i{hAqm*p}q8KLv>^~Z@PRCiN98;@~mb2}(ylKfg7nU*-(b+^CngZ{e5E %C_g)a3wiAoLkXV`LKXP3fFU>#hJ2TVx zAQCxJzL@fUw(U`V@u;Tl>i&dHkm*#_DA%Wa774)#a-d=sy(lMm7x4>fSlB8{w8Z=Y zhEyC|m;TP;*ys0zT#kG^$EI%%C69Q90oJs}pOAe*muTtbcn}_w_>|ke8`gmWT`Y@P zA>_rk8m31|1NwV-PhP!M`H~TS?hH6wc^;?<==aCkM-5~my}Wor wkEM!E zg6L0+n*FyCu! jny{=K2-5$cQsbI_7 YCi^ogG5&W6^@%Dx ^h#i0En9 I9XbqBJqsH~w^3f8t6ku*lp_)+B0(`GqB!`tGZ3YHtR zlj^WBRU%`6M^ybmU#ph_VtY%K`LSTYq!3g5;ug0ma6JWVAb723@ooh$T0!psTWS&w zX^}{r8_LX!f(Q~9VB?}j(HJvE^9i=fwBRlYVvd!*XU44VuCo-+zwAnBBzYe5_#E?a zH1BEz`I=yj=zL#YTF{+s(WcC9(#Mi~D&ECawCC`wIq?1(<^u`}ig}yjHe_bgN!3}P z-7}}@a|_QDzHDej2S3hgtMxNPyNh-bC_~dyhleYs)B|#Y)Bbw3^-3 fX%*nrg|NNFh_<@e{R;T8>yusI!kYwlze;WR6)um$pjxFc)y8XV&eXoS{4F0Il; zS*x16C5Qvb*66;*E2?Nfvv^i;a%&j%uCMn|WkdW^G4JkwNo> z0_0y!Znv^wWCQ)X7s-tTf t#TE^F*T6(9;(=hE0gc zN!@LCa0?Jfrj(3^ps+fuPO_9y-ePs@R*Ly#>x4=3wje+ mdR*=y%nI2;ioTzN iBKf7n9NcC$Ql^Z-BJ$^Ph z7vbIETx4vz7*VMr2RghAVSH2dibLI@`6Q^e>>bbSq)k&SL=CZzADxQ(TnqE^a;L0I zO^grRuAGXF-JZ%;wg3h3V_>;VqpZe}ZFsEfY~T;gJM~tUu-3gbPQBs0N#_ydXhV{> z@{CMOk}uouZf~7BP)&GfF~20EqEc&XYm=IXVs2~V+`gUSreWRcL@AmS1mHP@MTh|w z>_i`fFp)j$_zuB3g0!`ayIusQ=h1Z==fOTE{}-u)ZGH(zc)FC7V4p)E_UoKkx9| zAhxxUo%i6hY(|)seNphZqpOS2hLd-;wi5rI!>Ar^TjKeNgNqSbOYd~#+E_>@`GF?0 zz7~RXv1F{hs*bcph|Q~0yufDi2)g45L@%^W2Mt9 x!wYwW5bNF3F)15s;8Ul*jgtp(;1#6+Ln6BUb$4`mvPc^gvOF?&PlwKn8sL;=l z6YZ@vt_Ct_Pro&e!B*2MDm$=c_Fx3J9GiKnI0N3;zdXWT LBHc)SSz$!C<8hS4QzFBVx znh~*CZShTpBv7N)lYYB^U|wx+6OMEfN3bdkS#FW50ZG-Lh$QebluWyy9*yc5l4+*Fp?nDtkQttHiTkdrVzp mC1Me2F{iyGJP+V?+Zg0?LxS&Ju+b_pcs z!x%b0zc<4{q_Xj=)NmW;z|l|=(W f>bQe&nfEL{Hw2ur9iv {8wjIqX*rBcevv72Z?@5%V??I~KkYGJ~~( zQi|luM)&a=ty&&?zf2fZLfpO`DpT{aC>D{pzeA{E)kj~pm%<)jZf9budV9^}Xs2Iq zeIiJ5b4-MVM5vj~Y3s-Q3x@G@{US?oU-Y&3P8<)5VS3jREQ6P8 HW2_&*8GEKGB}RQ+s3J!Ac~iPk^Z9Q?|`U z5ACAl+M6GwxurnKkLJxAg4JZH*moxos`B#kvw4@j0pz!bkJJoxK#{~w6GSv)1tmuE zv1XZFP__|6h@fWML!88KO1Z{NyM%0(b@YmJT?yFe(zPqnR*4$}< nDb5J5fI^IJS;8!$#Wi0`Z|-H3Op$((yD%NJ#dT>FztgQaqLzYCgJ=Y~ Dbue($KdX>vf@n*~4S@*~-T?9vn>}4+J73RcqZ-c^AofYcpJr z$4lGT7hHt`InC2{mIwPmMl2GNS8F{-<8*eYylOI4b$F+Fp0K5RW8HLY8mmiMQ`0O0 z>-4lYm=;}{_=h6{{gj45DJU78&47yBwnb5hGkn3pEr-1e?j{Nz-LkHr2rdtma## zV1V;;3 2pCei~0`D1%}dUGrS zenbNu$j$dz+orp!zqyyK<~dlblpi?_7V39KewfA_t#nA7B!2R$jQ4G$65+9|LUCs; zr+&x7qPrqyO-KuTVy#42an>!PXpZ@Lc_k`}%tdXhquY``KARBME-`5m|8 < z`5D02eePs#(fj&t6QVsh_;hQ5mzNAMnc_NP_x%(U71=eK=QJWo`)C=zwJi^7jrreo zmYlqKgN$K%?v01(8>XZ@B@$rRadCu|%;EhjK%My&BibPS+}r@?2B`CP>|2BvnJ`l9 z?pugdCXc@TAj3O3?K)bBO{vo-ea=JhYsU_}dnVoOPNqP^F>-G*2vw_PB-i66cAI%o z8+y0YVTls!Ar*t@Ii9VxPe9Mx%xSxmb*<#XTJ27s#7dkr$U{z>m2+Nvn+}|7dVA-A zB&8qJEYcT)m?fGb@1~PwF5aWO@_GE@$my}olkIL+iHM!IbB`AvHNnS7QB7DYAGw(Y z!ss;mny78&UCHO>AQ 1(OY@vosXSIAy6pY+Snod zoBoiw3@8;CN>_yJp(LnJ-eLFA2`U%AmyWZt$#mx4rev z#$_hgJ~65TQWlFT8X%|GeNcpXh!GV4O0dy-g$bbzzCk0)9UZsWzrFskPAO{ $w8VgmWS93fI29W)ML&D@nBaj(AT!>r`Oycg)2>BmH+oTC zUdT5Jo|ADZ%>f!!D1ar!@_FtSzO0AueHjK6`~^XTOYWkj<$kC)THIP{TOajAXBGgP z-VUZOQ3b*uP1?>;hpaF*_S)Ck7(WuOIFc}YLK~R{{V{|NjGRjyIdo6g3 zkET=nJE$%`LBm%dNpvguLeH?>h}GQ^Z6F=KK3O?tN>MS;1PThz;M2%Dg(Am$=PY)3 zw}{=#>R9^coNwH?@g;%L@VS}KYoYfz66WTChtju->dDng?nYbDmGUzk-5((FhlR$D ztAc2m%%b)*fx8&Qy@xZz=jI4cD(qHFYbv9M1Q!ZGso{KSra34)fg1s#qL{ezR%$z< z(R`RM(UI>hVxAX1==Wd2*V9Pigeg*v=mxAcG-kFKWgL37oWwV23wX~nulRKtHNGXC z|K`dtQ_vciT3kG!DeJKTSj5G_*(Uk~215Bkyqbng%Ee}}ChPlrm9OPmP!-6l`Dl3> zDmn&Zp04N~ZguDSx?_OG1iVpmmKCDYHPsypA3IK1vqaH}xbDI1>X8->yhq^C1 ?{Y7YyviGx{!C*#*^@+EgyY-F&$L|4nln`*a2~5GM$irURq6=_Vly9lQ zXg{;zS5)
=`@`dxUo0yx_x 9hf>t!2pwTKXmChq)l)or)K81z;Nwr=puU-mytWVO zW!@=6xsQq$K>gwTC_mr#bP^aX9F{0fOh}6xzXJ<}1NZo)j{Q1$7N2tpy1x}E?7FKZ z?aZ?>hl~K_DPJ@K{UTqs?OuN}D5aFO{ezlBppv5>9f+$}=LrXA7D20m`HA>_JUG;j z_N^;g+v1JMt<$g_y{%!q0FJ;|@$j50FbXF9;qm#tqZ3AhmI))-CY6@$a^>FD6Q{4& z$dSW!ngb(%fcjVcqw8mqMoOS90$V51@ER;dVt2xMB|z?Z4=Z^k$PlV$=VSA45{%rQ z2wGq9w&*PReiv=$;|65saKS^U=4g;9T`E?6f%!NOqc{U>XSA$#_Iz$-@gQy-X9ty1 z1rEFAdt0AW5z1`wl0XXsGSeQv{tO@qV3NmND?sT(tC4Dkd~1 -^~Hyo2~QlDWG3 zA%%4tHB|E2^9Ux% ueBS12U>}Wb(!jzP#Fx^XGT>QHI zW4{7HhRg!K6mYHEIzRBbIy%DMGw@97p2cX_g7HW`9~exJqm(9OD4jk-BjCd699cF= zRgnptL?5kj^F<}e?i^B>E+@QHPmPac6sgaBC-wY^$IX~3p-3!L`g*&rn(e$byJK*A zTEqQWIlqqLrq{8=&S_s?gB|*l1BhXKfEw(j0Fm*MfHfLlIS>h16OCnJ60qr22jZJs zKucn*of|YivA&Q-SnLDR@lPbeOrc%zoXy+^0!8w7ad6)0^Y-#VAqY=(1S^pPSflZW z_ch+{tM6#LY6y7?#?kT}ara)sbaOz71byEIhm3msTvYC#N*k%seH$}5O%|w`leOj4 z6k_sSovc(IsIXa(CWX6ir%{@cB4@ukLV7fntEOD3E~Bxg<7PTtb2?x7{1sD_VUrh( zB*rjbSyR(|Ue=VcPGKzljcO@6T3Kd(K1h^e%> ZCz zj77DMA s(Rt(vwNJDNUWhr#l+Nb z#wyM$@(o@NpL^sk_mkdpx9F78H%7n4GVu{2y?bXrGIhS`JB`GZZ<(OMw$XKa;<$^L zfuq?~V(s9pZXi=)-T_{wWAedfnjY_$F7M4F;be@~UF~w51wx0%A>6^Uyv&}dNlA4) zaf7vEQy_z1++qo9ye;Yjs);?KpJI?B*``U+ k2Gw=Z4eXKhQD*OBatB` zkS~~GdJKSL!cY(xv*#hiKbgVAW4Crx&*xugrRIZ)Sx>PF2mBfs7l2E$NnWU7c=n^k zjNOax{SCHukHrQ{H>cc1tv?zul<-q=uxb?gBw^)G&K-17u|02ed&)hJ7;jkJuQc6& zz2I1;GeGJIFnNZ2Z;^crl`tI!Y~@8V+>8 5=5LdVOarRs(BXk^vfF`^*z7UgmgjZ4Q(xGY(C*H8rD%Yz#@^s6LX% zw6ms}F`xGS8z1qHQwuo}z WkzSZKt%_kjPGz|lY7@@*{WH)@rd zKGSr=(9&-hUXo13&>jk^`J{c?%XhBdX0!ds{4()ABBs>Koy9vT4F8TK^^_r@qf;PL z*D%bU%@mVKNM@9~ETQ}J0saHlBVk8ezVSG7<%M-eo_!c%!hq_hH@~*Re{NySDkL%B zymgG(iKMd!4no!G*+Fsn@y}1tK$543_?XWDbk;9R1SXa;h1YboJBm@j-tdL`cwssA zJue_P)smNozE0I|xlSH&Z928Fg4q8zQw$Nr68#F;tteu|j-gqsd8ArN%gf6?%o%im zA9Dxhau@jx&F=>76MQCNW$+G!${B^g27$mvy3k!KD+_=khg_P=utWgB_4~w4;mh&p ze+(@j8ETr`2|t?yXq30uh;RLXppS)6wQx{TQITRi7>@xSm8x$4;Wu+sgx~OxlD;Cz z(VdYHmKlJv7;9&Nc;&KI4l}a*+s4)OcjQ!5mIjxeFd%-XPnsr<81v&~!u@F$er22_ z)QE9qh+fjJrS0 ^~`@@!;Z1Ew45*BCjYoFi3*|| z`#MP<_ZEmwrC(T-9b==CVlO{c6HrlcqLB<|C%Y{VcRCfkM*bnq_R{VSf8uP3FfTX& zzU%UmA5z-igheVhrZI5vlVBt69DiX{%(TpiesEb)=ucZ_RsyTLsf}XE2^$+*mq)D6 zrTJ5=G9Ne;+<)_%>AJYYZ50xxEz&?oMLs6B#XeFMmFUpuR*|~w{b;ABpxXg4Hg?U1 z=!`Rr_IC!vM`DM_g=_a*{y_?ZgVkQV!+wFnBsh@L6805uZE1O&Z!0Dv6IonbtU#eX zMNRWu$NkCTesY$$mZCkU5Ovh0#jii#bKn6ikQ4T!0^^SvBv9`*ASGu@ui4Y&&cm44 z{rZkfv$~<<3VoJIh~V*4`8NGTow+R4Qo4N* D3>SK`TM z3x8xGb;?S0DPJ+k9byPCo?;|_9 fbq>E`&l`;swHu`^BGZ+Ez6(g@3 z8NZ=k{B^H^M<5`q7G(bCl`b2I>r}9Bb o@kkX7WdsAMayG*gf;+>ejy((-g#kr#f{K{rdilc1aQ16O)QzJ8<>R9e3e zQvD*B=R|V!7cy%H9v{o#f9J(7W;T Bi*75Hj+Ii&1QSNew;A)= hZ%&Q-GniuOhlFk6vwXC~u}2_xOEDmxPHK_J~PA zdD(3Ln%#dj&rG`DHUMT{kOy_2&%E;;S0nnrq6=Q;r&^B2Ga1lbVqiuPFZ7SQQukR; zJ_*#@rkD>me)v;`MD+V95Wj68y2>nECxKlDr(~i7H7;zM ^KV8PN z{Oi;I@es_KBt<_mD95Ag`KjuUTUm&kuBHspNe$D~qoB)W&yOn`-m-1N+D98!gH1VD zP_3_N>;B|@{&Bybehq#Lpsok&?+g%Ryeup?-O1b^;$dBBgvf)g6 7Z$ zr0VvK3c1>fY)4IV-t 3EJ4CZ+oSo_VkQI Q@Q0o+1_&7LtRqVpU<9-3lQH0!0J-m?R#- zAazh5lz7L}DPkU1K>!aTd8!$d_v0u)*ZsGz#)o OSPcLcdK&aJ6M0R$<)8e#wkLE**4%vfSWZNlN{87}TZ6c!VF`jG$ff R!Ip28An-#se`wumX?k%ZF1E2)+a5d+5v72<#?5&KBI9n<{=F15Cd&K-$6y< z#sf4CQdpYbG`jR}a)=AJv3Zk_N1bwRPVdakKmg%+97$MCj%j92&L>o?9Y+8~mu8yc zrs1Qx6*TceLsNt)9ynV-Q$mb)oULKJBqsf7XC%3UC@z5k@Vcl(YC=Ngy88Mfl2k{x z)DrdNtLOl67-c T0V3Q9d-@y@F+63WA&hu!@Aa@y%kRqxHsDicF~p#0T#8 zJkCVqB619kP+(0h@aDEolQcFqPE*V#WQ=FV3E95FrJo@(8 P)MEaF`Bf$0Gaz0u@f&DTHwcKZ=v;w&=7BWe{@j497>^`rB2)vzLh zJg?5pRt`Ts!-kXFk~8}Edvfq&ctu4iRIbdzZOa5Bs*bdKqLN5&72Z-CwA%{XzGyGA zQT%P7RJQ_->!fww+t7Cx6FiC{T)5*1$f|y_S91ZO*VEDmd3y}U2Bsz2O99JrZUgSY zPxJi08_-|F9dw f>-vvH$)^iZ01)##7=S-!Ym6Xa8+3&P z_F~yK%9DfxWyC??tSNWM7Xy9PiI3Utq+)h&V7vXgaQfd)0OkZqx{cJ`%{qa|jSDD8 zx6oKf+sG$6Gp-hOrr`GQVeLOUVyYhRgF>jLsx>-pT`gP{CA?6nTF`uq`CCK!W2#9q zff dm<&<-~^E6kgWehyzy}q$8Is@z7R?PRu9{2g 0Oso(g$X(ffggWwLpfEZu$ zB?|8;xx@e>-3AiU=>@+1Gs>v35=7x9&kw-E=BMgBLi_gW3NQTRPT5Ayd4L%2n4dm- z`9gx$$eAr_V!lUw9W?42OG>JtmrQX0u6PA5Wj*0vPUv5(S`- Vz_~( zqs`6R7h(hI7{7nNYY?{U0H^zI?J17LextUd?UF1U2JL68!!E>(bPz$iQi@#Z5$GXj zr^jNnksD%pqfBEFn46AG&@rTt>l{XzLHCBQW<&Wm99cGB^I_$?>qg^VEtY-f2?AhD zq$sO@?p%L`ApiXjP3)GP<;JKhUA>k5lj9G70bRABrl)@*pK0{nwl7Vsl%5fwhN2&9 zn_?Y*w?%XX%6gk(e=Yid87mSvBu%$nI+fzZqNqUA1|PZ6Puft^$qFg@s?E5lJt>1s zY8bF^5N53?>bMiWKiFE!n3vKYx`IKqQY1x7$0b1lVHhwd`IsO(l+r1xLpju8fHX5+ z Qffv%Nnx&bj#bC;3UPhx>9L;z>#Fnw+?GxLyuDr5uKQw%w#wRiblXHp{ST1@8Iqp z^cs{Oq6zxy{M^sl(+f>{>G7=lpD)>IP9rBsZ3|+Ke9}&xI6glWS1mQC^EhoM#xyeY zzqBa$pBM$`I0ypTmhI{r7#0R%f?-rJ$}`V68SD)!?4Axv2_7}dSXSI uOyf`yxwaVg$tD97m)Tl-xb+of& z1}}{)0nYMf+zOEQwKP=d6w_ AirG!3*g%gJF#NBE&g;H1IMv4Zo zSNAv4hepSeV*AqQb$i%H+kDQ8&9&KAE6I>FmJ|-psWNRfjHlMCY}efgo%~SCy!1E= zI&0fz#fnj>QBbRn?pm%Dc=vw91dmzTX%c$qD9 coxkxIp$kt7ppRj`2<$3(EI*^|Gm_wMeCTy9#mw_33k89cQlrcsW4Pl3(Z<06OQ0 z#FDj?gw$RfKm~xE26Bs#tq$*5olAg9nA!2(eYqE9nt*Cwv<7qz=%S-{gJipptu>No z_gA&MC790B`w9%NDVm#`w6 lmrogQPnEdgY6ow|Fr896x QpbSot>L|V}k!&Syh$BWH=8R|Mjc>{R;f0fr8XqL|i@o>GFJ> zlNZPyJela+>1vl!xBSe^h ch!h;hO#--P&sGQ-G ziR+ zhbK3s2V2asm{ZbE>+G#hHl)K2OFN(s zID^J20v~M8rqw3SV}O3SUme_NC?v#nPr94h-Lbgj4s4UnR!;8Oc9P(oRm+A(5b-SP z4HEN4+Q}d#JfQT^U6c~gYcXqRKyDwY>0ExXk+2;&8F$teZEZM1s&Y1-ZtZw{XQ3~2 zl2n57d`-cKx7eHTWXsdla+mP@iGj{wL$;vSy7d 79Hg90SmFuLi`X(^llviPMISc02<~JM?xAtdXr;i%Dv;vEmSq z+W$w|TL#7Tb?d&kYX}}B!9wuhG#cCq8k~gS?(PW$clY2PTpB01yKCdtxI^FdzjyCj z`_w)6J!hY{<`=4{rfc 869hjDI$IWPZwIaDb%Si7mXpXef7t67uIN@ z7iEusQudwrd;TajdY%VAFRs%oqe+-ApD@`5YsX)Pkv0 lakh!SX|Y2w4QDai59f zYP}(5vDyDivihHGm@=;efP_u0T#uA?hi|w-h0jX-`yS&rk$CLUy{awl%x8bMg*e>Q zVM}X_xsTtXtUyJ`P&C>o(WBD}la0jsR8F2JuRQf+WZ^HkygJyFlbvz7>m(n3juQ<9 zbO&8@5!MzcLiHG%ibXN9nG)KVZU-x)U1i2=J%2i%@4zY&gVJ$ivz;DOd }7B>*$j7`~lJi!xxZFtV{FLw%tk7X{j`A9#7SxPBFCRe3Kq=Y3i8 zv1`DVT5K^%UvXO(dMniNc*^W?HOX+i5+&l>s^4BJ9&%G-vy7wNddC?b`(15-zbM1; z_tnY#@*EUMkOPyVtoB?cCHIi)A`>hmfkEtgfO$F*ouCico_1@$`c~Tk^^b5CEYy0n zhC7Gq|DWyvY#9L(03Dk^?gA6fYoj@Wp&i%6{Ew^=yWEAJb83JV@)C|U8x52alD(GX z)*#oc{jQ)rZc;#8$@g2BeobK_`qY=3^c_`w4VEHd?pbC~{M+VxoA2k!#KWhO;BJ(x zH!JoseJ}3iS8a72Fjb-Pf#hgA*cYC*25pozc8R5{3he#&+J6Aceg0nl@OFrDZ0ltG zaLIP|s_yRkP4(;14{-s*H!^D}OU5r_`sCTGjbA*o7v-g1&YJw`9C6b9U-LJ#sxT46 za2_wyJeyH)1#pnL$N70GAMhIIbO^7J1Kak8g9Flwbi;K9APc_6p#NYx7+3HzeB{XI zcYj2~v%g)KUKw9zs&^{lx|5ikDjM0pb5CrL1SEd#E|Noh?GSe}P^wxlO0fkdt*JU- zt5wg#TY65{SodA}FsmT(x(ZO|7=L3m6y|wuvRq~Q&12)mP!348J?ZPaF7`TJvaBa4 z6Zw7s!uO&|!uPZ=j#YQ7T`yPI$bs6<7^s85Ucn6j&`_w}&Q|&M8Ww4P iWXQ>AFWW7ucA}Q;k`AVekh$6*QM%tDg`@B;$N!~r`u~>Yp|tEaON;>Wf&3%} z2;viev{@ `UOfWX&kHC>?*`*5Ix=FeKNjki^K=GrQ$B z`b**bZJcxOO0c3xsQtyl5bPfx w<1 qR<#kFiV%KtJF8eIn+{7)8u@V}_5 zsOyoqIwgV>Gk{aJ;AKb)6+gI@CdL^dOV^U&;1mu~iW&tWwZf`nNa>HPX(f29QQu+U zwo~{nPDq(M;2r%(wx%n-dhqdsbMi6F(XTW2`6ueJZ#3gQ{PmcUa(w9b +&I|xCbCaDR zw(k|%Yo^Cv3~v%BKyG2c&`QUt(A?qIifPWR*p3beY}P&WFB2QddD78K5j2S!iEkmZ z)rU18ojF3HB?YE5jUh&%7PoldtTPChM=cO+qT+$bu0Y7v#ag|U7A($ES>!Ts#qm-R z$T(9ZTTTAUJ}w?xK#7|2rCUV+10u@RIkYxFv<7`fI8~`3mJ=8UaEAFkh0ZP`F7{;D zG0yi`|7g0_I{-l=gelV$9?Gw;gL(`CDLu!Ygk*jwVXcbGqiY{wtZ1pfm {J+TW8$As?ECs8MUN((Gt@H89q RIDI4(@&pWS3f;X%*zaG|quNy1o+?QC+H=D^8lUSzvH2CY?a;Pa2P|e2! zR2Bf*M*hJplUwL8cW-BBu^|M9BFudZ0JG6hmK}*oO5S;`tTHF&(XApe=-a Npk-7uC`3n4muN0<%QDRPchRtk1L H$WHOcl8Bu1^U{yWK^B$0tu{`VW`4_fV+9 z2HWG;3kn4|Iwsn@ZtE_s_v83hTU_e*nrjQ2y6Sw_g$;QK-P(W&xI4pdoUZmiqrbEj z^}8h|?58vKPtD%B=DSrHxB|t`^Vf0E9CInJK8jiQorB{%ZaYo1@CEVU;2;sjWuP*V zl;HZ`m<3fe0=~*$3`i9F3mnQo=`X+R1`FkguY1?LTQi?@=8NApM;H-mM0 zpSmU9D0}?5 d?@;MoeM0m6v>3h6N*Hp+b1R|7ySbA8zh{ zsEJ#QqFb2Rm4MFsi7G9`*MG%kWjU9nM2tESDT;_HvD>d4J>}x2v2o~h$BUMQQxT(* zgv8!@;yUQ$rGX!me (YkVv#eB8A{h$BtyUzS$AFZ6mGn-c+7(32Q#c1yklkJZq&2=>dfb?jD&9Q=jQ z0fA6Iku~y=#)P565KR=l!kW6N(<;w>%)!%`9g!rFw#KWJEa Y*E-Q z%CUYJ(g~FY50ZOic*&*geQ5Z{BkYnW>-Ml##=bZ?#(-j{`(p~K8Vff zt)}T>I@AZ6esP%%lL9zWiuc>`$^fwt|F^a%7x`dcWV)hJ9}1{^*{*}m$UWJ>F&6zS zg+{l*HWAc*FO({HFEJ>ioP3WdoCxS40F8_xwC>0FPvR_wXyJz+0G;Hh=5+Xas>4rY zv9&;^{q9>LFh588Von!|qBp$Qd=_~5ebP@jUKv&^(|)-MOLBlj#RGAWv^QVB^;dgd z>+m}ltDBBAjqvxvUbf@Mho+T9*l47&c=xViT~C&V_L#Jm;fS7XBPqF6=@kXm)`i{0 zgCu|%dG9 nAixhi~n`gb&xq{T!F{>eImCN1^~^>`#qlX?K78C>rIJdl~`z| zf8X1benUnrRh~22ol`D?N f4!4Ib;f}-IxX|3UQwws}~M6ZID5#q$fTW %7SMYlfEfI^syIQkxY?4`j_~-3}cm{yCwo$biMRB=3?)L)QVGy|os1;h~K{8i= zl}u&R)?apoJ%BN@HXETR)=0_nY|SbFwagSzLDRck^=h_6jp2TB)lE)PvbVZ3enLX) zfd0=8Fa)-w^?q*o;trw=fFFjBhYv&=U99+hhDtu(=gR^@iqGLe(a@{fh-fFFJyA`~ zBt82Ve#cc8t$#4sY7{rmOIB4i@Z5GCobs-x%t;lxKI=ikZC)XD^X04n)H9xtsXaz{ zbV@wiS7$k2JOt;T5ZUlfvc9VBzqTR8 rmb=@KyZTVURKVy^i0z3zT(R _Lqr~r3K*(*O@Lh<7-HU*}# RoeA*g%PMK^Sy3Q zd1CV0mE4XOEP|A|E|p*}$UK+>Cyjnu?OgDTZm_dQAXcZ= EwdPlO^YfZV?XqQSpF{{U=uEu{Z!nlvd$!xnD4F~>_9p+1i|Gt2a8C `Xf!)xT=2$*99)V;!u53<2PcURb#N2z&a2x8NviRbHwRy#h&k@$}8#CaxUX zk#{KYPM4o1LX`#p86E!iC&j k?0L%hmnZc9sC*{S;Fa0x)gWP94mLc2p=x+%g`L~d z%GbMp1qI7csag$7%dBXbhNnB)g}hNy$^IApyR}yvg9VMJ47ET-8I1`fzC65x6`-(c zHwu4^#CaIpTY`aiKT_e*y`YRe0n}qlH|x1Jvp6 1C702^u_l(djr b;{9#*S2GV8`@gZ!^bx6;He~lLKQcz5MEqN; zoQ%DbpiF9{e$xNnTB4%BABy*%`Tp+TyMsuD0X#NO{g|{-Fg;cuEJVTPD`@9Tr}_W+ z+Q66;W%rLW+G^0e)`Rbihco(Aq48K~@LzBDfA?pt2$V`BYS}+*G#?g_DmaBZ8Hjbw zW)&(TP;{zM$jHep9&a)!f%$r4zbo~pg}T}L{lf)$)U(SqHKMJkq$z%bnke&b)LAkg z_utgpEl0&|sp@Sys(KyrQP`9h;+%j~8kJV*7T&N`qqtJ8DG>{|Y-on(FMJ=88*{}3 zXRs+{f+W4lFa;@drHc#_l45r8S>cPuvvY%73TC2UN102~fuob=8#U9SCO*jet#|k? zr!h(#C%@Ui59t`vN{D72dLZu$v`k??Ig>P^^+ngQD80}M&Z4wFV|AZH5|?ckh54vh z-FVTC0ztdF9oR$uF4FaxWIxUX@=KN0H~L vql+b75oxk$4VC1KFLyfzT`})I@Gj{q%XXz zs;USmq&|n>puZ+3Czn#9x1i;+Ki`u40QzzotD)e0MR=Jx2H8~TG|3C-Q!6Sy|4!5U z_peHSl;XOUZVzIHh+mea)lo5^xF^KLt&o*|Kg5H_-e}|D$@&eDInQ~2hrcE!mPSWE z#~--A7}{ECzEsyDPQCFtUT`QF-rlCQ1W L;5f}_NVb(cABoCh|AHkXr ziHHue1$vzdB0k&b(bCU-^Br=$>w^6>PmWl8ZZFJ2fA)1t4{IMr^2f1ZfkzxKe@=Pp zItqW)yyDyswaRk*IXu`BWOX0{GR&=B?VETepo%ea!cswWDYCMVJpXvAW@F*H&OZ|c zFC2i@`3duOtmqO8gKXXEoy*srT2^JdJ50X`!4lNTAC!>&BM1d_@ubhh)8Tmg^TX)U zy8FzFd{2jj)@}0~jUGbj!WUTWPIS#VL)MGy^yMq-C?#y8R<;V30>pmIlKjFH%Y|Rd z?wedLq4H{dH5Q9nYDEi5!q?aML2oZ`p*cRYkHt0Z86VxB1`bw|Q3`N36MsSLdq4AJ z(b&8#vKbC;S{Zvbe_tdYrEJsi@#G^;z1`Bztlrn?D)$7kg^9C;x_)t#&-H(u5U6V( zWrThHLNsAxi0^3_IcXE`$ZtOl)e+KT>}F>0c?G`Io@Cb@Zjd!H+^@upPnNgyHvK#x z#x^4}SL;PVNy;j^`r%AAXY<2%`NrF8R`WC+R8o_hvD6rzE6m8x#cmVBf`{05)%!@i zxND3Z5gt}x kzuVWdPdJLBSxTR6XdVe} z(2^ZC?tHJ^686>!%*fw!(1%WWJaaG_f4o*0LOaC27~)mY5HFB((wLhef|slRo=Q@+ zOVlcE2lWXV)92fp8Xd5uIp_*qchN_54&;_q1 IQBxQQ5*u zLZnU0pl002LyllL30#R!6hR1sy3vR}ThAxLt>MdFg!NyIWj#M>kuAB9MD7dAMK66A z@3HY}@5|A0eF|^5eB*Wd3vBKQwPIbogiy3~*uBkcvk#uPv$0Tur3)P*;Qj6PxfJTY zhO>6=OxaKjq_};@!SwO(+0Gpg2@)pic8jHCre zpZ+$iy06FZGwKfFDt$BuZzpqMN!6$oDb)t>=#W}`PE{*Xp5{mK=rkunHy#fqV6YLx zc%f`HTz{i=Z#8d2yUl5_#dkPYQPz>a>&t1CQ(2jHanazO0GL|b5CzXCFc@>hOlIG@ zFjT8C98Tt?D>6&RG`=9HC=1>Wj+K >!o6? zz7@RR0qg9u=(1Q>R-3x^K?>$oi-Fq-7E0Fs+uarOoE@$+2jooAo}03gq-mcY@>2nH z_+v}o-6YL(>|yXr&9(l*HGk;d2vh0um9>=#Hlt-^VbjfB!1QImmo^~v>SmnQ zh}of?X}1_GoHgXxb0VT*``zrdR-pLw0xuA-!hbv#6TtA&*QQx@497$=0`jowAI5M- z=p!G=U0uY(Jjk@hweK8*B3oZQ{@E56=s^)h^UrJdXIQX+b?@$(yWHy#8on&5*Qef# zEET(XDvl|jYf2xt_!{4)+kRbRZE-s$;@Ajn{8;(-ESX0{S^iGwP*v2+LUQp#xAz@f z5V s&h|Oh6hoA81K!%thiAVDMxxVt3F42&p%a`sAZB)+X4Oa1V z3iqiglS&r-iU(2Mm#`@|IxYD63Bwkb!;-SCxXd6@sGY~S>Io?-0m6qGuqQ4IoKkbc zmIGCKc-uh$J0|Ul63Z1l8?24Av{4!8WN;fS>g|;`r$!{B%D8&g9DYADWizfX&Ei)7 zdtcnsV{f>$(;TIJ5nlN$eRO@r|78msczXyXCH+jj#jwT81)BwQ?bA|^-(BBKS#l7* z<@1AJw-SWhHbvF}f59YTRDvA|m1c61gUeo2BoS$Ygaq %VP?uKDVAfEHD${1jNMDL*yQK?v?C>BeQqIHZ@`2y|;o#IGgowJDmGs z;IBGBknVztbL=PU&tTN}rPfqvlYfG3dV2bOlC~?g{`4v@!w{#TZ9gJv7`p2R_Avk& z_Sf#($^(%bsk78x;z9P)Cj`Wk)}ZKaMjBO%APZD}A5S&YU &PQ)bC4} z@`xMTMOOu!^L#B3^HZCn#&@1I0+a;)fC7}UA6}C$JC>X+7 k&3RYAGG0cp@Sb=C)8Ea(SmdhR zg#0qBghZv#RN2Xda6Cdao9s?@zJ7J^H)42k7AbMxZHkfG@{jw8&bVhNSd?L!vuOH9 z1p2WlO{TW>g}Lk`Di$99C!hwSc|Ja5pxM=Yo3;)suB5R*<5VfAmXD5_%uK !sCvEa BV{Lgn#RtKn7sXptB*h8aYM$5C)pZq=+4JVusvfa}ez*BypqpZ0?A;qK zJn rRY&d|nR7JWt{%IdueY+^U!-{TFcxZ08H6>=GvjVCsIj|z z%?$DQWOjF+c)Z)r`#B==kpnbeIk2Z1;k8+==pzJf-m46tY3)J}#1_FLQHi3e`YaXG zgw|XK@5P1{)RMvP6O8kku#B2yqT %L=F3kR0ZdS6U(qPyPX_FMsDL7ouA|JpB?s7ad)NN*Cedgosh zR|;2NEY!GwT#Sf6+K*EQ^0R?JYOI9r$7h=~Bd_r!pBLQO91F<#a?2h(Lzu$zx6dNh zf7i-T#y3S93C_Ti#Euw_WBQ}*|7PI?1x4mJ=QlJMn4DnmBl5VR9UB@k;Kw#ZoxKf0 z{U8l*-e2V5TU=hQn)AxPWaFc(-LeesycJxgXj~5xf3d=+JJfQ42?uX)L4A=+%N=3H zAJ#f9udD<6zF_thh~`WAYba@^i%u={!WZK`=OY3S5*TS32Tt%c;|JEyMT3G$xws@8 zWabvwDW-172+9+`1iR=@jS`Y<%?n%S@&aaNUawh9#WU`xu6#hImP@YV(s|g#sBaQb zQSTmD*K6e4?FJ6g)b`lSOgiN$6ew<_uU|j=ZdUuKcaGq(AA1>RqO}sy7f$+vQO>$x z2jp4Tcbk*R`fDp(XFQ&cy~cGR%NtMK_mrIka5!@{Z_zHedEl_kk`ZD?wwc4sawa%E z#@`qI)J0u8-K;d@AkY1Z)UP!E*tZJ(26vdeluc=hk`#1YX>t%icZ_kYlvwmcpp+UH za!q2nUbj2FGS7SYh$am@s7wnkNanDvZU=6#X-k%VyWqv9xOz`8 yc2vt~OMCjG)I+~9cfMda?spO~+6{?13YJxpJ7ML!B`Uy2Ju zcl(ZmUwBKRb?qA)?>axZLO&|@_K4U|Z({nxHL}>9_{#TYXYltXj%5HM#LmcT)WNT& z>0oKU#l-!G_F6(fP$z$p*g5Vq6^Wj0hm)=R0iPl0d(EZ?sgZzYE`?MMH)pM_+>^Bp zTYoY7+fof p&ySl18@eAdY;sA1$BEE z(p)Q)BR!?b
g%@);~9)KI*lW?PDn}2E;)<9g+f*L ufuaDGvSP zRTAD#Ph{3tyU=SMl7a(I?8MmDrZQg$FOm>iEJ|;L0*CmCne&UN5p~EW?t0ccx&_8a z5q$tYrQaE!dyIjYUeOu~ryLiThLyCom3Edi52weSDeNOxA+lkRODBP~xQ4aL@;O9w z7_T8a0P%6E!3Ok nVh(C&>uRYxjUBmN-H^dMvUIHaCj1Ump2;EhOq1xN3k%)v?Q2_v^wrKH+Y23Xe zij`W{e V=g>&Y&hpFMNy65P~y6xdZj~AJBM_d*4$h%mWPd_`4$@F9ry|?XMVgZ(ITB4 zz>%QdGr}UOI~ zMb8non zd$S{wja(GIYB8U2usUWPWLkZ_+rG{2c6t0Y%*Jn^puzB=Sh@&HQg%HGdLIut4$H^( z!wRa~%k=boekw?OyyF9#!#=rq7{^#MVBU;q98{k8R8-g&MA%17jJ{pF_l#L&IfKt7 zK4NGy*5dVf7^1@B3OQu*xV8TIE$?6|7ZdEe4{_RKE*^;flZyzZpLF$Pr|_}-WX7Y$ zTPqnxg#@jO=@Oi@{v(=>{lkFLroOdZp?;k*)6>Dn3+elrC^_ryi^J14$Br*8BTwwd z_?q_|bC)#Qd?)&TA`D|0MnV2PKG kRS9_{<7|7hkYexVZ<5Z-8KwD1vP=sP#Y zvh>ekJA{f)L4Nrfc$G@kr_S6JuG&t1u6CC1&^0$bRX7|79+8pBfl%tTa$RJ+>T%g0 z7!ks&s}dR+m>6j30S(DmE`^3Xk~p#FyM>)>=Sq_ZA1Z-_KhX7^E8*D)S{e}(nvG=_ zAZ6vTkAJ=O;}~ZQN$DyBak`rneD~T8xo8coa(icyub^jq8rWG7F!LGtOhlETxz9na zN|q~Rk=T>g({S(L+`&Lo>$huFBc$DK?_t9-E94)&BJu1_UsbL9^iNH>_JTnbvvzJD zM$^FlRM#rrcSX1}%tME#84lNy`S|s(Qk|^a8}!97VmQ}NIJI##C00eYw$KS3qRLs4 zQ3&}$_e1`6aq~E97B?2Oqpl(011W9DJ*Jd{5B9f6szdJGy&$DVM~D|sb-Ju?Pim~x zg7wgS+Z{qyjt^pMhy#`l+A|-BKV&)j(G$bNiyYP7?hU63oI3)qMM(3r+sQ&5BI&Ip z`+R#AEX^?z!IX#iOyV6^568^MApQ6+dq=@eQS~f+K0Y?&1cWC}dVe30hd&{A7}w=R z f6&&pN1>xuGll5>YK(-|#3+j2a|`YE=wt8F zEE7k3|Hx^BO}VO5?k`tU!XNPNf%TGfRiH^|nm9Y9y1j^)Usnq@L}d?YUFuwA*`U}s zMv!-H(!gLkP@@<(Xxh8tJ_f~@xDRSvRO*ps4Tz^Lp2Df(bcS~QHpi~mr-XJ;Kk}pe z@J92mKcyX4Fr5w1%xpg3hBx>Yx64&LR*#LF*t^tW4~GLA7H|UdT$=NZYDV?LJO1A1 zu~( T_xFZZ;cw+OI7el~_M z)_V!# Q4-C$K7bdEEPZ BaV?PZ@H(BeXIDLxf(k*^w82A^1e^z7Mf z>&@XZO$y2r`b7xR1#5-J>?N<%pX5$%$`rg;ZO3t_1mmPHS?}MWfWMe_#+t==85vhk z6P`9YgG8wiQ<$Qzmq8%;W{v*ZjprqfFObLg?ch(x5qAR<#8`K7`JD@<`4`$ >NL8MK17GXUc4p ze$b%PGW=|Q#gFMV#FKPYH^F&+-@TR%-U< P7cbwSN9`)PKyZ>U&uh;i2ByO9**sCTIvmS6klqxpcUpof&)0N3& zRkIBIDCigtr#j~)r(}8yXLtC}`vqEdGCx0m*`zhBz&dHUa>+}atDGU=qvL}f+vGm~ zu_%|Nt8dF@rS@=azJ7%9m(%7G^4i_;o#M~E$!vTm`Lj$i!JAtkC}PPP+u(m?WEr-_ zlQGv^o2Glk @6rEQ)p6@enmO7`n`|IA@B&0~y76Y-N>uxxX|PDzokH2EdZ zWSb#41Q^O?8ofp3eg-Ip24aA(gdmN}p|#%!PNDs_ExVYC+OGA*&hwxk`5@D6ubJqh z%tU4v1I+y;^%t|h& pQ+&W4_oQ+&KjFD;nqRG}3#AM1EehRR$sw?c!!6 z-nqlBt~=*8YbGVbF4h28^KY`A*l>9AD_1Su9W5(g6YSq+DfRHd60vQ^rx4<@tZj;{ zlB=LWk$eU%;mzG;%FXq!ZpfN>`T5BZH)5aku?uOPfu>XAgLHy+mPQ2O%5QnPC#jx? zqrrc~^q(F}5+axmhb%60S;B@Mbkmrh$9FK!(30Q z%;zT&7*$Cfpp^F}t`Or6Oe(2EGoF{9)5op_U9y6RxTmDoCS=RgPRFso+~?dDQi3x3 zTKti}nJ4F7tul&C1TkjZRGM8iDvrN*<3>9g7@_fNJLi9PRoUAkd4dbIgrH9im96BQ zZfZL(_8t>6;a1X