From 416b136d630aa79f35954ead78c7f0c31cdbeae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Gomes?= <44953699+shouldbeclaudio@users.noreply.github.com> Date: Sun, 11 Jun 2023 15:48:06 +0100 Subject: [PATCH 1/2] [lab-nlp] Claudio --- challenge-1.ipynb | 352 ++++++++++++++++++++++++++++++++++++++++++++++ challenge-2.ipynb | 327 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 679 insertions(+) create mode 100644 challenge-1.ipynb create mode 100644 challenge-2.ipynb diff --git a/challenge-1.ipynb b/challenge-1.ipynb new file mode 100644 index 0000000..9e730fb --- /dev/null +++ b/challenge-1.ipynb @@ -0,0 +1,352 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Challenge 1: Prepare Textual Data for Analysis\n", + "\n", + "In this challenge, we will walk you through how to prepare raw text data for NLP analysis. Due to time limitation, we will cover **text cleaning, tokenization, stemming, lemmatization, and stop words removal** but skip POS tags, named entity recognition, and trunking. The latter 3 steps are more advanced and not required for our next challenge on sentiment analysis. \n", + "\n", + "## Objectives\n", + "\n", + "* Learn how to prepare text data for NLP analysis in Python\n", + "* Write the functions you will use in Challenge 3 for cleaning, tokenizing, stemming, and lemmatizing data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Text Cleaning\n", + "\n", + "Text cleaning is also called text cleansing. The goal is to clean up the messy real-world textual data in order to improve the text analysis accuracy at later steps. For generic textual data sources, we usually need to fix the following problems:\n", + "\n", + "* Missing values\n", + "* Special characters\n", + "* Numbers\n", + "\n", + "For web data, we need to additinally fix:\n", + "\n", + "* HTML tags\n", + "* JavaScripts\n", + "* CSS\n", + "* URLs\n", + "\n", + "Case by case, there may also be special problems we need to fix for certain types of data. For instance, for Twitter tweets data we need to fix hashtags and the Twitter handler including a *@* sign and Twitter usernames.\n", + "\n", + "In addition, we also need to convert the texts to lower cases so that when we anaylize the words later, NLTK will not think *Ironhack* and *ironhack* mean different things.\n", + "\n", + "Note that the above are the general steps to clean up data for NLP analysis. In specific cases, not all those steps apply. For example, if you are analyzing textual data on history, you probably don't want to remove numbers because numbers (such as years and dates) are important in history. Besides, if you are doing something like network analysis on web data, you may want to retain hyperlinks so that you will be able to extract the outbounding links in the next steps. Sometimes you may also need to do some cleaning first, then extract some features, then do more cleaning, then extract more features. You'll have to make these judgments by yourself case by case. \n", + "\n", + "In this challenge we are keeping things relatively simple so **you only need to clean up special characters, numbers, and URLs**. Let's say you have the following messy string to clean up:\n", + "\n", + "```\n", + "@Ironhack's-#Q website 776-is http://ironhack.com [(2018)]\")\n", + "```\n", + "\n", + "You will write a function, which will be part of you NLP analysis pipeline in the next challenge, to clean up strings like above and output:\n", + "\n", + "```\n", + "ironhack s q website is\n", + "```\n", + "\n", + "**In the cell below, write a function called `clean_up`**. Test your function with the above string and make sure you receive the expected output.\n", + "\n", + "*Notes:*\n", + "\n", + "* Use regular expressions to identify URL patterns and remove URLs.\n", + "\n", + "* You don't want to replace special characters/numbers with an empty string. Because that will join words that shouldn't be joined. For instance, if you replace the `'` in `you're`, you will get `youre` which is undesirable. So instead, replace special characters and numbers with a whitespace.\n", + "\n", + "* The order matters in terms of what to clean before others. For example, if you clean special characters before URLs, it will be difficult to identify the URLs patterns.\n", + "\n", + "* Don't worry about single letters and multiple whitespaces in your returned string. In our next steps those issues will be fixed." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "\n", + "def clean_up(s):\n", + " pattern = r'[^a-zA-Z\\s]+|http\\S+'\n", + " cleaned_text = re.sub(pattern, '', s)\n", + " return cleaned_text\n", + "\n", + "cleaned_text = clean_up(\"@Ironhack's-#Q website 776-is http://ironhack.com [(2018)]\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'IronhacksQ website is '" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cleaned_text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tokenization\n", + "\n", + "We have actually discussed the concept of tokenization in the Bag of Words lab before. In that lab, we did both tokenization and calculated the [matrix of document-term frequency](https://en.wikipedia.org/wiki/Document-term_matrix). In this lab, we only need tokenization.\n", + "\n", + "In the cell below, write a function called **`tokenize`** to convert a string to a list of words. We'll use the string we received in the previous step *`ironhack s q website is`* to test your function. Your function shoud return:\n", + "\n", + "```python\n", + "['ironhack', 's', 'q', 'website', 'is']\n", + "```\n", + "\n", + "*Hint: use the `word_tokenize` function in NLTK.*" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package punkt to /Users/pedro/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n" + ] + }, + { + "data": { + "text/plain": [ + "['ironhack', 's', 'q', 'website', 'is']" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import nltk\n", + "from nltk.tokenize import word_tokenize\n", + "\n", + "nltk.download('punkt')\n", + "\n", + "def tokenize(s):\n", + " tokens = word_tokenize(s)\n", + " return tokens\n", + "\n", + "tokens = tokenize(\"ironhack s q website is\")\n", + "tokens" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Stemming and Lemmatization\n", + "\n", + "We will do stemming and lemmatization in the same step because otherwise we'll have to loop each token lists twice. You have learned in the previous challenge that stemming and lemmatization are similar but have different purposes for text normalization:\n", + "\n", + "**Stemming reduces words to their root forms (stems) even if the stem itself is not a valid word**. For instance, *token*, *tokenize*, and *tokenization* will be reduced to the same stem - *token*. And *change*, *changed*, *changing* will be reduced to *chang*.\n", + "\n", + "In NLTK, there are three stemming libraries: [*Porter*](https://www.nltk.org/_modules/nltk/stem/porter.html), [*Snowball*](https://www.nltk.org/_modules/nltk/stem/snowball.html), and [*Lancaster*](https://www.nltk.org/_modules/nltk/stem/lancaster.html). The difference among the three is the agressiveness with which they perform stemming. Porter is the most gentle stemmer that preserves the word's original form if it has doubts. In contrast, Lancaster is the most aggressive one that sometimes produces wrong outputs. And Snowball is in between. **In most cases you will use either Porter or Snowball**.\n", + "\n", + "**Lemmatization differs from stemming in that lemmatization cares about whether the reduced form belongs to the target language and it often requires the context (i.e. POS or parts-of-speech) in order to perform the correct transformation**. For example, the [*Word Net lemmatizer* in NLTK](https://www.nltk.org/_modules/nltk/stem/wordnet.html) yields different results with and without being told that *was* is a verb:\n", + "\n", + "```python\n", + ">>> from nltk.stem import WordNetLemmatizer\n", + ">>> lemmatizer = WordNetLemmatizer()\n", + ">>> lemmatizer.lemmatize('was')\n", + "'wa'\n", + ">>> lemmatizer.lemmatize('runs', pos='v')\n", + "'be'\n", + "```\n", + "\n", + "In the cell below, import the necessary libraries and define a function called `stem_and_lemmatize` that performs both stemming and lemmatization on a list of words. Don't worry about the POS part of lemmatization for now." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package averaged_perceptron_tagger to\n", + "[nltk_data] /Users/pedro/nltk_data...\n", + "[nltk_data] Package averaged_perceptron_tagger is already up-to-\n", + "[nltk_data] date!\n", + "[nltk_data] Downloading package wordnet to /Users/pedro/nltk_data...\n", + "[nltk_data] Package wordnet is already up-to-date!\n", + "[nltk_data] Downloading package punkt to /Users/pedro/nltk_data...\n", + "[nltk_data] Package punkt is already up-to-date!\n" + ] + }, + { + "ename": "LookupError", + "evalue": "\n**********************************************************************\n Resource \u001b[93momw-1.4\u001b[0m not found.\n Please use the NLTK Downloader to obtain the resource:\n\n \u001b[31m>>> import nltk\n >>> nltk.download('omw-1.4')\n \u001b[0m\n For more information see: https://www.nltk.org/data.html\n\n Attempted to load \u001b[93mcorpora/omw-1.4\u001b[0m\n\n Searched in:\n - '/Users/pedro/nltk_data'\n - '/Users/pedro/anaconda3/nltk_data'\n - '/Users/pedro/anaconda3/share/nltk_data'\n - '/Users/pedro/anaconda3/lib/nltk_data'\n - '/usr/share/nltk_data'\n - '/usr/local/share/nltk_data'\n - '/usr/lib/nltk_data'\n - '/usr/local/lib/nltk_data'\n**********************************************************************\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mLookupError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:84\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 84\u001b[0m root \u001b[38;5;241m=\u001b[39m \u001b[43mnltk\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfind\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubdir\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mzip_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m:\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/data.py:583\u001b[0m, in \u001b[0;36mfind\u001b[0;34m(resource_name, paths)\u001b[0m\n\u001b[1;32m 582\u001b[0m resource_not_found \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00msep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mmsg\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00msep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 583\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m(resource_not_found)\n", + "\u001b[0;31mLookupError\u001b[0m: \n**********************************************************************\n Resource \u001b[93momw-1.4\u001b[0m not found.\n Please use the NLTK Downloader to obtain the resource:\n\n \u001b[31m>>> import nltk\n >>> nltk.download('omw-1.4')\n \u001b[0m\n For more information see: https://www.nltk.org/data.html\n\n Attempted to load \u001b[93mcorpora/omw-1.4.zip/omw-1.4/\u001b[0m\n\n Searched in:\n - '/Users/pedro/nltk_data'\n - '/Users/pedro/anaconda3/nltk_data'\n - '/Users/pedro/anaconda3/share/nltk_data'\n - '/Users/pedro/anaconda3/lib/nltk_data'\n - '/usr/share/nltk_data'\n - '/usr/local/share/nltk_data'\n - '/usr/lib/nltk_data'\n - '/usr/local/lib/nltk_data'\n**********************************************************************\n", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mLookupError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[39], line 29\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m tag_dict\u001b[38;5;241m.\u001b[39mget(tag, wordnet\u001b[38;5;241m.\u001b[39mNOUN)\n\u001b[1;32m 28\u001b[0m words \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mironhack\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mq\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwebsite\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mis\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m---> 29\u001b[0m stemmed_words, lemmatized_words \u001b[38;5;241m=\u001b[39m \u001b[43mstem_and_lemmatize\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwords\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStemmed words:\u001b[39m\u001b[38;5;124m\"\u001b[39m, stemmed_words)\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLemmatized words:\u001b[39m\u001b[38;5;124m\"\u001b[39m, lemmatized_words)\n", + "Cell \u001b[0;32mIn[39], line 14\u001b[0m, in \u001b[0;36mstem_and_lemmatize\u001b[0;34m(l)\u001b[0m\n\u001b[1;32m 11\u001b[0m lemmatizer \u001b[38;5;241m=\u001b[39m WordNetLemmatizer()\n\u001b[1;32m 13\u001b[0m stemmed_words \u001b[38;5;241m=\u001b[39m [stemmer\u001b[38;5;241m.\u001b[39mstem(word) \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m l]\n\u001b[0;32m---> 14\u001b[0m lemmatized_words \u001b[38;5;241m=\u001b[39m [lemmatizer\u001b[38;5;241m.\u001b[39mlemmatize(word, get_wordnet_pos(word)) \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m l]\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m stemmed_words, lemmatized_words\n", + "Cell \u001b[0;32mIn[39], line 14\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 11\u001b[0m lemmatizer \u001b[38;5;241m=\u001b[39m WordNetLemmatizer()\n\u001b[1;32m 13\u001b[0m stemmed_words \u001b[38;5;241m=\u001b[39m [stemmer\u001b[38;5;241m.\u001b[39mstem(word) \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m l]\n\u001b[0;32m---> 14\u001b[0m lemmatized_words \u001b[38;5;241m=\u001b[39m [lemmatizer\u001b[38;5;241m.\u001b[39mlemmatize(word, \u001b[43mget_wordnet_pos\u001b[49m\u001b[43m(\u001b[49m\u001b[43mword\u001b[49m\u001b[43m)\u001b[49m) \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m l]\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m stemmed_words, lemmatized_words\n", + "Cell \u001b[0;32mIn[39], line 21\u001b[0m, in \u001b[0;36mget_wordnet_pos\u001b[0;34m(word)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_wordnet_pos\u001b[39m(word):\n\u001b[1;32m 19\u001b[0m tag \u001b[38;5;241m=\u001b[39m nltk\u001b[38;5;241m.\u001b[39mpos_tag([word])[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;241m1\u001b[39m][\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mupper()\n\u001b[1;32m 20\u001b[0m tag_dict \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m---> 21\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mJ\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[43mwordnet\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mADJ\u001b[49m,\n\u001b[1;32m 22\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mN\u001b[39m\u001b[38;5;124m'\u001b[39m: wordnet\u001b[38;5;241m.\u001b[39mNOUN,\n\u001b[1;32m 23\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mV\u001b[39m\u001b[38;5;124m'\u001b[39m: wordnet\u001b[38;5;241m.\u001b[39mVERB,\n\u001b[1;32m 24\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mR\u001b[39m\u001b[38;5;124m'\u001b[39m: wordnet\u001b[38;5;241m.\u001b[39mADV\n\u001b[1;32m 25\u001b[0m }\n\u001b[1;32m 26\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m tag_dict\u001b[38;5;241m.\u001b[39mget(tag, wordnet\u001b[38;5;241m.\u001b[39mNOUN)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:121\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__getattr__\u001b[0;34m(self, attr)\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__bases__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 119\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLazyCorpusLoader object has no attribute \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m__bases__\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 121\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__load\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[38;5;66;03m# This looks circular, but its not, since __load() changes our\u001b[39;00m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;66;03m# __class__ to something new:\u001b[39;00m\n\u001b[1;32m 124\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, attr)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:89\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[1;32m 88\u001b[0m \u001b[38;5;66;03m# Load the corpus.\u001b[39;00m\n\u001b[0;32m---> 89\u001b[0m corpus \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__reader_cls\u001b[49m\u001b[43m(\u001b[49m\u001b[43mroot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 91\u001b[0m \u001b[38;5;66;03m# This is where the magic happens! Transform ourselves into\u001b[39;00m\n\u001b[1;32m 92\u001b[0m \u001b[38;5;66;03m# the corpus by modifying our own __dict__ and __class__ to\u001b[39;00m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;66;03m# match that of the corpus.\u001b[39;00m\n\u001b[1;32m 95\u001b[0m args, kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__args, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__kwargs\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/reader/wordnet.py:1176\u001b[0m, in \u001b[0;36mWordNetCorpusReader.__init__\u001b[0;34m(self, root, omw_reader)\u001b[0m\n\u001b[1;32m 1172\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 1173\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe multilingual functions are not available with this Wordnet version\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1174\u001b[0m )\n\u001b[1;32m 1175\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1176\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprovenances \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43momw_prov\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1178\u001b[0m \u001b[38;5;66;03m# A cache to store the wordnet data of multiple languages\u001b[39;00m\n\u001b[1;32m 1179\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lang_data \u001b[38;5;241m=\u001b[39m defaultdict(\u001b[38;5;28mlist\u001b[39m)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/reader/wordnet.py:1285\u001b[0m, in \u001b[0;36mWordNetCorpusReader.omw_prov\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1283\u001b[0m provdict \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 1284\u001b[0m provdict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124meng\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1285\u001b[0m fileids \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_omw_reader\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfileids\u001b[49m()\n\u001b[1;32m 1286\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m fileid \u001b[38;5;129;01min\u001b[39;00m fileids:\n\u001b[1;32m 1287\u001b[0m prov, langfile \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39msplit(fileid)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:121\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__getattr__\u001b[0;34m(self, attr)\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__bases__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 119\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLazyCorpusLoader object has no attribute \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m__bases__\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 121\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__load\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[38;5;66;03m# This looks circular, but its not, since __load() changes our\u001b[39;00m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;66;03m# __class__ to something new:\u001b[39;00m\n\u001b[1;32m 124\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, attr)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:86\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 84\u001b[0m root \u001b[38;5;241m=\u001b[39m nltk\u001b[38;5;241m.\u001b[39mdata\u001b[38;5;241m.\u001b[39mfind(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msubdir\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mzip_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 85\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m:\n\u001b[0;32m---> 86\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[1;32m 88\u001b[0m \u001b[38;5;66;03m# Load the corpus.\u001b[39;00m\n\u001b[1;32m 89\u001b[0m corpus \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__reader_cls(root, \u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__args, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__kwargs)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:81\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 80\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 81\u001b[0m root \u001b[38;5;241m=\u001b[39m \u001b[43mnltk\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfind\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubdir\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", + "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/data.py:583\u001b[0m, in \u001b[0;36mfind\u001b[0;34m(resource_name, paths)\u001b[0m\n\u001b[1;32m 581\u001b[0m sep \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m*\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m70\u001b[39m\n\u001b[1;32m 582\u001b[0m resource_not_found \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00msep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mmsg\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00msep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 583\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m(resource_not_found)\n", + "\u001b[0;31mLookupError\u001b[0m: \n**********************************************************************\n Resource \u001b[93momw-1.4\u001b[0m not found.\n Please use the NLTK Downloader to obtain the resource:\n\n \u001b[31m>>> import nltk\n >>> nltk.download('omw-1.4')\n \u001b[0m\n For more information see: https://www.nltk.org/data.html\n\n Attempted to load \u001b[93mcorpora/omw-1.4\u001b[0m\n\n Searched in:\n - '/Users/pedro/nltk_data'\n - '/Users/pedro/anaconda3/nltk_data'\n - '/Users/pedro/anaconda3/share/nltk_data'\n - '/Users/pedro/anaconda3/lib/nltk_data'\n - '/usr/share/nltk_data'\n - '/usr/local/share/nltk_data'\n - '/usr/lib/nltk_data'\n - '/usr/local/lib/nltk_data'\n**********************************************************************\n" + ] + } + ], + "source": [ + "import nltk\n", + "from nltk.stem import PorterStemmer, WordNetLemmatizer\n", + "from nltk.corpus import wordnet\n", + "\n", + "nltk.download('averaged_perceptron_tagger')\n", + "nltk.download('wordnet')\n", + "nltk.download('punkt')\n", + "\n", + "def stem_and_lemmatize(l):\n", + " stemmer = PorterStemmer()\n", + " lemmatizer = WordNetLemmatizer()\n", + "\n", + " stemmed_words = [stemmer.stem(word) for word in l]\n", + " lemmatized_words = [lemmatizer.lemmatize(word, get_wordnet_pos(word)) for word in l]\n", + "\n", + " return stemmed_words, lemmatized_words\n", + "\n", + "def get_wordnet_pos(word):\n", + " tag = nltk.pos_tag([word])[0][1][0].upper()\n", + " tag_dict = {\n", + " 'J': wordnet.ADJ,\n", + " 'N': wordnet.NOUN,\n", + " 'V': wordnet.VERB,\n", + " 'R': wordnet.ADV\n", + " }\n", + " return tag_dict.get(tag, wordnet.NOUN)\n", + "\n", + "words = ['ironhack', 's', 'q', 'website', 'is']\n", + "stemmed_words, lemmatized_words = stem_and_lemmatize(words)\n", + "\n", + "print(\"Stemmed words:\", stemmed_words)\n", + "print(\"Lemmatized words:\", lemmatized_words)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Stop Words Removal\n", + "\n", + "Stop Words are the most commonly used words in a language that don't contribute to the main meaning of the texts. Examples of English stop words are `i`, `me`, `is`, `and`, `the`, `but`, and `here`. We want to remove stop words from analysis because otherwise stop words will take the overwhelming portion in our tokenized word list and the NLP algorithms will have problems in identifying the truely important words.\n", + "\n", + "NLTK has a `stopwords` package that allows us to import the most common stop words in over a dozen langauges including English, Spanish, French, German, Dutch, Portuguese, Italian, etc. These are the bare minimum stop words (100-150 words in each language) that can get beginners started. Some other NLP packages such as [*stop-words*](https://pypi.org/project/stop-words/) and [*wordcloud*](https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html) provide bigger lists of stop words.\n", + "\n", + "Now in the cell below, create a function called `remove_stopwords` that loop through a list of words that have been stemmed and lemmatized to check and remove stop words. Return a new list where stop words have been removed." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package stopwords to /Users/pedro/nltk_data...\n", + "[nltk_data] Package stopwords is already up-to-date!\n" + ] + }, + { + "data": { + "text/plain": [ + "['ironhack', 'q', 'website']" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import nltk\n", + "from nltk.corpus import stopwords\n", + "\n", + "nltk.download('stopwords')\n", + "\n", + "def remove_stopwords(l):\n", + "\n", + " stop_words = set(stopwords.words('english'))\n", + " filtered_words = [word for word in l if word.lower() not in stop_words]\n", + " return filtered_words\n", + "\n", + "words = ['ironhack', 's', 'q', 'website', 'is']\n", + "filtered_words = remove_stopwords(words)\n", + "\n", + "filtered_words\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this challenge you have learned several text preparation techniques in more depths including text cleaning, tokenization, stemming, lemmatization, and stopwords removal. You have also written the functions you will be using in the next challenge to prepare texts for NLP analysis. Now we are ready to move on to the next challenge - Sentiment Analysis." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/challenge-2.ipynb b/challenge-2.ipynb new file mode 100644 index 0000000..79272bb --- /dev/null +++ b/challenge-2.ipynb @@ -0,0 +1,327 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Challenge 2: Sentiment Analysis\n", + "\n", + "In this challenge we will learn sentiment analysis and practice performing sentiment analysis on Twitter tweets. \n", + "\n", + "## Introduction\n", + "\n", + "Sentiment analysis is to *systematically identify, extract, quantify, and study affective states and subjective information* based on texts ([reference](https://en.wikipedia.org/wiki/Sentiment_analysis)). In simple words, it's to understand whether a person is happy or unhappy in producing the piece of text. Why we (or rather, companies) care about sentiment in texts? It's because by understanding the sentiments in texts, we will be able to know if our customers are happy or unhappy about our products and services. If they are unhappy, the subsequent action is to figure out what have caused the unhappiness and make improvements.\n", + "\n", + "Basic sentiment analysis only understands the *positive* or *negative* (sometimes *neutral* too) polarities of the sentiment. More advanced sentiment analysis will also consider dimensions such as agreement, subjectivity, confidence, irony, and so on. In this challenge we will conduct the basic positive vs negative sentiment analysis based on real Twitter tweets.\n", + "\n", + "NLTK comes with a [sentiment analysis package](https://www.nltk.org/api/nltk.sentiment.html). This package is great for dummies to perform sentiment analysis because it requires only the textual data to make predictions. For example:\n", + "\n", + "```python\n", + ">>> from nltk.sentiment.vader import SentimentIntensityAnalyzer\n", + ">>> txt = \"Ironhack is a Global Tech School ranked num 2 worldwide. 
", + "
", + "Our mission is to help people transform their careers and join a thriving community of tech professionals that love what they do.\"\n", + ">>> analyzer = SentimentIntensityAnalyzer()\n", + ">>> analyzer.polarity_scores(txt)\n", + "{'neg': 0.0, 'neu': 0.741, 'pos': 0.259, 'compound': 0.8442}\n", + "```\n", + "\n", + "In this challenge, however, you will not use NLTK's sentiment analysis package because in your Machine Learning training in the past 2 weeks you have learned how to make predictions more accurate than that. The [tweets data](https://www.kaggle.com/kazanova/sentiment140) we will be using today are already coded for the positive/negative sentiment. You will be able to use the Naïve Bayes classifier you learned in the lesson to predict the sentiment of tweets based on the labels." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conducting Sentiment Analysis\n", + "\n", + "### Loading and Exploring Data\n", + "\n", + "The dataset we'll be using today is located on Kaggle (https://www.kaggle.com/kazanova/sentiment140). Once you have downloaded and imported the dataset, it you will need to define the columns names: df.columns = ['target','id','date','flag','user','text']\n", + "\n", + "*Notes:* \n", + "\n", + "* The dataset is huuuuge (1.6m tweets). When you develop your data analysis codes, you can sample a subset of the data (e.g. 20k records) so that you will save a lot of time when you test your codes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import re\n", + "\n", + "data = pd.read_csv(\"training.1600000.processed.noemoticon.csv\", encoding='latin1', header=None)\n", + "data.columns = ['target', 'id', 'date', 'flag', 'user', 'text']\n", + "\n", + "def clean_up(s):\n", + " pattern = r'[^a-zA-Z\\s]+|http\\S+'\n", + " cleaned_text = re.sub(pattern, '', s)\n", + " return cleaned_text\n", + "\n", + "data['text_processed'] = data['text'].apply(clean_up)\n", + "data['text_processed'] = data['text_processed'].apply(lambda x: x.split())\n", + "\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare Textual Data for Sentiment Analysis\n", + "\n", + "Now, apply the functions you have written in Challenge 1 to your whole data set. These functions include:\n", + "\n", + "* `clean_up()`\n", + "\n", + "* `tokenize()`\n", + "\n", + "* `stem_and_lemmatize()`\n", + "\n", + "* `remove_stopwords()`\n", + "\n", + "Create a new column called `text_processed` in the dataframe to contain the processed data. At the end, your `text_processed` column should contain lists of word tokens that are cleaned up. Your data should look like below:\n", + "\n", + "![Processed Data](data-cleaning-results.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Bag of Words\n", + "\n", + "The purpose of this step is to create a [bag of words](https://en.wikipedia.org/wiki/Bag-of-words_model) from the processed data. The bag of words contains all the unique words in your whole text body (a.k.a. *corpus*) with the number of occurrence of each word. It will allow you to understand which words are the most important features across the whole corpus.\n", + "\n", + "Also, you can imagine you will have a massive set of words. The less important words (i.e. those of very low number of occurrence) do not contribute much to the sentiment. Therefore, you only need to use the most important words to build your feature set in the next step. In our case, we will use the top 5,000 words with the highest frequency to build the features.\n", + "\n", + "In the cell below, combine all the words in `text_processed` and calculate the frequency distribution of all words. A convenient library to calculate the term frequency distribution is NLTK's `FreqDist` class ([documentation](https://www.nltk.org/api/nltk.html#module-nltk.probability)). Then select the top 5,000 words from the frequency distribution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from nltk import FreqDist\n", + "import nltk\n", + "\n", + "words = [word for words_list in data['text_processed'] for word in words_list]\n", + "frequency = FreqDist(words)\n", + "top_words = frequency.most_common(5000)\n", + "\n", + "for word, frequency in top_words:\n", + " print(word, frequency)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building Features\n", + "\n", + "Now let's build the features. Using the top 5,000 words, create a 2-dimensional matrix to record whether each of those words is contained in each document (tweet). Then you also have an output column to indicate whether the sentiment in each tweet is positive. For example, assuming your bag of words has 5 items (`['one', 'two', 'three', 'four', 'five']`) out of 4 documents (`['A', 'B', 'C', 'D']`), your feature set is essentially:\n", + "\n", + "| Doc | one | two | three | four | five | is_positive |\n", + "|---|---|---|---|---|---|---|\n", + "| A | True | False | False | True | False | True |\n", + "| B | False | False | False | True | True | False |\n", + "| C | False | True | False | False | False | True |\n", + "| D | True | False | False | False | True | False|\n", + "\n", + "However, because the `nltk.NaiveBayesClassifier.train` class we will use in the next step does not work with Pandas dataframe, the structure of your feature set should be converted to the Python list looking like below:\n", + "\n", + "```python\n", + "[\n", + "\t({\n", + "\t\t'one': True,\n", + "\t\t'two': False,\n", + "\t\t'three': False,\n", + "\t\t'four': True,\n", + "\t\t'five': False\n", + "\t}, True),\n", + "\t({\n", + "\t\t'one': False,\n", + "\t\t'two': False,\n", + "\t\t'three': False,\n", + "\t\t'four': True,\n", + "\t\t'five': True\n", + "\t}, False),\n", + "\t({\n", + "\t\t'one': False,\n", + "\t\t'two': True,\n", + "\t\t'three': False,\n", + "\t\t'four': False,\n", + "\t\t'five': False\n", + "\t}, True),\n", + "\t({\n", + "\t\t'one': True,\n", + "\t\t'two': False,\n", + "\t\t'three': False,\n", + "\t\t'four': False,\n", + "\t\t'five': True\n", + "\t}, False)\n", + "]\n", + "```\n", + "\n", + "To help you in this step, watch the [following video](https://www.youtube.com/watch?v=-vVskDsHcVc) to learn how to build the feature set with Python and NLTK. The source code in this video can be found [here](https://pythonprogramming.net/words-as-features-nltk-tutorial/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Building Features](building-features.jpg)](https://www.youtube.com/watch?v=-vVskDsHcVc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from nltk import FreqDist\n", + "\n", + "words = [word for words_list in data['text_processed'] for word in words_list]\n", + "frequency = FreqDist(words)\n", + "top_words = frequency.most_common(5000)\n", + "\n", + "bag_of_words = [word for word, _ in top_words]\n", + "num_documents = len(data['text_processed'])\n", + "num_words = len(bag_of_words)\n", + "features = np.zeros((num_documents, num_words), dtype=bool)\n", + "\n", + "for i, words_list in enumerate(data['text_processed']):\n", + " for word in words_list:\n", + " if word in bag_of_words:\n", + " word_index = bag_of_words.index(word)\n", + " features[i, word_index] = True\n", + "\n", + "feature_data = {word: features[:, i] for i, word in enumerate(bag_of_words)}\n", + "data = pd.DataFrame(feature_data)\n", + "\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from nltk.sentiment import SentimentIntensityAnalyzer\n", + "nltk.download('vader_lexicon')\n", + "\n", + "sia = SentimentIntensityAnalyzer()\n", + "\n", + "def get_sentiment(text):\n", + " scores = sia.polarity_scores(text)\n", + " compound_score = scores['compound']\n", + " return compound_score > 0\n", + "\n", + "data['is_positive'] = data.apply(lambda row: get_sentiment(' '.join(row.index[row])), axis=1)\n", + "data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building and Traininng Naive Bayes Model\n", + "\n", + "In this step you will split your feature set into a training and a test set. Then you will create a Bayes classifier instance using `nltk.NaiveBayesClassifier.train` ([example](https://www.nltk.org/book/ch06.html)) to train with the training dataset.\n", + "\n", + "After training the model, call `classifier.show_most_informative_features()` to inspect the most important features. The output will look like:\n", + "\n", + "```\n", + "Most Informative Features\n", + "\t snow = True False : True = 34.3 : 1.0\n", + "\t easter = True False : True = 26.2 : 1.0\n", + "\t headach = True False : True = 20.9 : 1.0\n", + "\t argh = True False : True = 17.6 : 1.0\n", + "\tunfortun = True False : True = 16.9 : 1.0\n", + "\t jona = True True : False = 16.2 : 1.0\n", + "\t ach = True False : True = 14.9 : 1.0\n", + "\t sad = True False : True = 13.0 : 1.0\n", + "\t parent = True False : True = 12.9 : 1.0\n", + "\t spring = True False : True = 12.7 : 1.0\n", + "```\n", + "\n", + "The [following video](https://www.youtube.com/watch?v=rISOsUaTrO4) will help you complete this step. The source code in this video can be found [here](https://pythonprogramming.net/naive-bayes-classifier-nltk-tutorial/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Building and Training NB](nb-model-building.jpg)](https://www.youtube.com/watch?v=rISOsUaTrO4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from nltk.classify import NaiveBayesClassifier\n", + "\n", + "train_set, test_set = train_test_split(data, test_size=0.2, random_state=42)\n", + "train_data = [(row.to_dict(), row['is_positive']) for _, row in train_set.iterrows()]\n", + "\n", + "classifier = NaiveBayesClassifier.train(train_data)\n", + "classifier.show_most_informative_features()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Testing Naive Bayes Model\n", + "\n", + "Now we'll test our classifier with the test dataset. This is done by calling `nltk.classify.accuracy(classifier, test)`.\n", + "\n", + "As mentioned in one of the tutorial videos, a Naive Bayes model is considered OK if your accuracy score is over 0.6. If your accuracy score is over 0.7, you've done a great job!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "accuracy_score = accuracy(classifier, test_data)\n", + "print(\"Accuracy:\", accuracy_score)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 9ea1baf4d2caf02cb7e3c97c4447edcad76dd80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Gomes?= <44953699+shouldbeclaudio@users.noreply.github.com> Date: Sun, 11 Jun 2023 18:19:38 +0100 Subject: [PATCH 2/2] [lab-nlp] Claudio --- building-features.jpg | Bin 0 -> 39269 bytes challenge-1.ipynb | 49 +++++++++++++------------------------- data-cleaning-results.png | Bin 0 -> 76856 bytes nb-model-building.jpg | Bin 0 -> 38413 bytes 4 files changed, 16 insertions(+), 33 deletions(-) create mode 100644 building-features.jpg create mode 100644 data-cleaning-results.png create mode 100644 nb-model-building.jpg diff --git a/building-features.jpg b/building-features.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0dd24d26bdb3c39afc54f704014f4e7221d0ce05 GIT binary patch literal 39269 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 R3cqee{~G;o9nyX@@oyp-AS(a> literal 0 HcmV?d00001 diff --git a/challenge-1.ipynb b/challenge-1.ipynb index 9e730fb..df9fbb5 100644 --- a/challenge-1.ipynb +++ b/challenge-1.ipynb @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -91,7 +91,7 @@ "'IronhacksQ website is '" ] }, - "execution_count": 18, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -119,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -136,7 +136,7 @@ "['ironhack', 's', 'q', 'website', 'is']" ] }, - "execution_count": 24, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -183,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -197,34 +197,16 @@ "[nltk_data] Downloading package wordnet to /Users/pedro/nltk_data...\n", "[nltk_data] Package wordnet is already up-to-date!\n", "[nltk_data] Downloading package punkt to /Users/pedro/nltk_data...\n", - "[nltk_data] Package punkt is already up-to-date!\n" + "[nltk_data] Package punkt is already up-to-date!\n", + "[nltk_data] Downloading package omw-1.4 to /Users/pedro/nltk_data...\n" ] }, { - "ename": "LookupError", - "evalue": "\n**********************************************************************\n Resource \u001b[93momw-1.4\u001b[0m not found.\n Please use the NLTK Downloader to obtain the resource:\n\n \u001b[31m>>> import nltk\n >>> nltk.download('omw-1.4')\n \u001b[0m\n For more information see: https://www.nltk.org/data.html\n\n Attempted to load \u001b[93mcorpora/omw-1.4\u001b[0m\n\n Searched in:\n - '/Users/pedro/nltk_data'\n - '/Users/pedro/anaconda3/nltk_data'\n - '/Users/pedro/anaconda3/share/nltk_data'\n - '/Users/pedro/anaconda3/lib/nltk_data'\n - '/usr/share/nltk_data'\n - '/usr/local/share/nltk_data'\n - '/usr/lib/nltk_data'\n - '/usr/local/lib/nltk_data'\n**********************************************************************\n", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mLookupError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:84\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 84\u001b[0m root \u001b[38;5;241m=\u001b[39m \u001b[43mnltk\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfind\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubdir\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mzip_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m:\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/data.py:583\u001b[0m, in \u001b[0;36mfind\u001b[0;34m(resource_name, paths)\u001b[0m\n\u001b[1;32m 582\u001b[0m resource_not_found \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00msep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mmsg\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00msep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 583\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m(resource_not_found)\n", - "\u001b[0;31mLookupError\u001b[0m: \n**********************************************************************\n Resource \u001b[93momw-1.4\u001b[0m not found.\n Please use the NLTK Downloader to obtain the resource:\n\n \u001b[31m>>> import nltk\n >>> nltk.download('omw-1.4')\n \u001b[0m\n For more information see: https://www.nltk.org/data.html\n\n Attempted to load \u001b[93mcorpora/omw-1.4.zip/omw-1.4/\u001b[0m\n\n Searched in:\n - '/Users/pedro/nltk_data'\n - '/Users/pedro/anaconda3/nltk_data'\n - '/Users/pedro/anaconda3/share/nltk_data'\n - '/Users/pedro/anaconda3/lib/nltk_data'\n - '/usr/share/nltk_data'\n - '/usr/local/share/nltk_data'\n - '/usr/lib/nltk_data'\n - '/usr/local/lib/nltk_data'\n**********************************************************************\n", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mLookupError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[39], line 29\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m tag_dict\u001b[38;5;241m.\u001b[39mget(tag, wordnet\u001b[38;5;241m.\u001b[39mNOUN)\n\u001b[1;32m 28\u001b[0m words \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mironhack\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mq\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwebsite\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mis\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m---> 29\u001b[0m stemmed_words, lemmatized_words \u001b[38;5;241m=\u001b[39m \u001b[43mstem_and_lemmatize\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwords\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStemmed words:\u001b[39m\u001b[38;5;124m\"\u001b[39m, stemmed_words)\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLemmatized words:\u001b[39m\u001b[38;5;124m\"\u001b[39m, lemmatized_words)\n", - "Cell \u001b[0;32mIn[39], line 14\u001b[0m, in \u001b[0;36mstem_and_lemmatize\u001b[0;34m(l)\u001b[0m\n\u001b[1;32m 11\u001b[0m lemmatizer \u001b[38;5;241m=\u001b[39m WordNetLemmatizer()\n\u001b[1;32m 13\u001b[0m stemmed_words \u001b[38;5;241m=\u001b[39m [stemmer\u001b[38;5;241m.\u001b[39mstem(word) \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m l]\n\u001b[0;32m---> 14\u001b[0m lemmatized_words \u001b[38;5;241m=\u001b[39m [lemmatizer\u001b[38;5;241m.\u001b[39mlemmatize(word, get_wordnet_pos(word)) \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m l]\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m stemmed_words, lemmatized_words\n", - "Cell \u001b[0;32mIn[39], line 14\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 11\u001b[0m lemmatizer \u001b[38;5;241m=\u001b[39m WordNetLemmatizer()\n\u001b[1;32m 13\u001b[0m stemmed_words \u001b[38;5;241m=\u001b[39m [stemmer\u001b[38;5;241m.\u001b[39mstem(word) \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m l]\n\u001b[0;32m---> 14\u001b[0m lemmatized_words \u001b[38;5;241m=\u001b[39m [lemmatizer\u001b[38;5;241m.\u001b[39mlemmatize(word, \u001b[43mget_wordnet_pos\u001b[49m\u001b[43m(\u001b[49m\u001b[43mword\u001b[49m\u001b[43m)\u001b[49m) \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m l]\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m stemmed_words, lemmatized_words\n", - "Cell \u001b[0;32mIn[39], line 21\u001b[0m, in \u001b[0;36mget_wordnet_pos\u001b[0;34m(word)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_wordnet_pos\u001b[39m(word):\n\u001b[1;32m 19\u001b[0m tag \u001b[38;5;241m=\u001b[39m nltk\u001b[38;5;241m.\u001b[39mpos_tag([word])[\u001b[38;5;241m0\u001b[39m][\u001b[38;5;241m1\u001b[39m][\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mupper()\n\u001b[1;32m 20\u001b[0m tag_dict \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m---> 21\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mJ\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[43mwordnet\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mADJ\u001b[49m,\n\u001b[1;32m 22\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mN\u001b[39m\u001b[38;5;124m'\u001b[39m: wordnet\u001b[38;5;241m.\u001b[39mNOUN,\n\u001b[1;32m 23\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mV\u001b[39m\u001b[38;5;124m'\u001b[39m: wordnet\u001b[38;5;241m.\u001b[39mVERB,\n\u001b[1;32m 24\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mR\u001b[39m\u001b[38;5;124m'\u001b[39m: wordnet\u001b[38;5;241m.\u001b[39mADV\n\u001b[1;32m 25\u001b[0m }\n\u001b[1;32m 26\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m tag_dict\u001b[38;5;241m.\u001b[39mget(tag, wordnet\u001b[38;5;241m.\u001b[39mNOUN)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:121\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__getattr__\u001b[0;34m(self, attr)\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__bases__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 119\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLazyCorpusLoader object has no attribute \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m__bases__\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 121\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__load\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[38;5;66;03m# This looks circular, but its not, since __load() changes our\u001b[39;00m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;66;03m# __class__ to something new:\u001b[39;00m\n\u001b[1;32m 124\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, attr)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:89\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[1;32m 88\u001b[0m \u001b[38;5;66;03m# Load the corpus.\u001b[39;00m\n\u001b[0;32m---> 89\u001b[0m corpus \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__reader_cls\u001b[49m\u001b[43m(\u001b[49m\u001b[43mroot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 91\u001b[0m \u001b[38;5;66;03m# This is where the magic happens! Transform ourselves into\u001b[39;00m\n\u001b[1;32m 92\u001b[0m \u001b[38;5;66;03m# the corpus by modifying our own __dict__ and __class__ to\u001b[39;00m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;66;03m# match that of the corpus.\u001b[39;00m\n\u001b[1;32m 95\u001b[0m args, kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__args, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__kwargs\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/reader/wordnet.py:1176\u001b[0m, in \u001b[0;36mWordNetCorpusReader.__init__\u001b[0;34m(self, root, omw_reader)\u001b[0m\n\u001b[1;32m 1172\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 1173\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe multilingual functions are not available with this Wordnet version\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1174\u001b[0m )\n\u001b[1;32m 1175\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1176\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprovenances \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43momw_prov\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1178\u001b[0m \u001b[38;5;66;03m# A cache to store the wordnet data of multiple languages\u001b[39;00m\n\u001b[1;32m 1179\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lang_data \u001b[38;5;241m=\u001b[39m defaultdict(\u001b[38;5;28mlist\u001b[39m)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/reader/wordnet.py:1285\u001b[0m, in \u001b[0;36mWordNetCorpusReader.omw_prov\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1283\u001b[0m provdict \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 1284\u001b[0m provdict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124meng\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1285\u001b[0m fileids \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_omw_reader\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfileids\u001b[49m()\n\u001b[1;32m 1286\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m fileid \u001b[38;5;129;01min\u001b[39;00m fileids:\n\u001b[1;32m 1287\u001b[0m prov, langfile \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39msplit(fileid)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:121\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__getattr__\u001b[0;34m(self, attr)\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__bases__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 119\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLazyCorpusLoader object has no attribute \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m__bases__\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 121\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__load\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 122\u001b[0m \u001b[38;5;66;03m# This looks circular, but its not, since __load() changes our\u001b[39;00m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;66;03m# __class__ to something new:\u001b[39;00m\n\u001b[1;32m 124\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, attr)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:86\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 84\u001b[0m root \u001b[38;5;241m=\u001b[39m nltk\u001b[38;5;241m.\u001b[39mdata\u001b[38;5;241m.\u001b[39mfind(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msubdir\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mzip_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 85\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m:\n\u001b[0;32m---> 86\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[1;32m 88\u001b[0m \u001b[38;5;66;03m# Load the corpus.\u001b[39;00m\n\u001b[1;32m 89\u001b[0m corpus \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__reader_cls(root, \u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__args, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__kwargs)\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/corpus/util.py:81\u001b[0m, in \u001b[0;36mLazyCorpusLoader.__load\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 80\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 81\u001b[0m root \u001b[38;5;241m=\u001b[39m \u001b[43mnltk\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfind\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubdir\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", - "File \u001b[0;32m~/anaconda3/lib/python3.10/site-packages/nltk/data.py:583\u001b[0m, in \u001b[0;36mfind\u001b[0;34m(resource_name, paths)\u001b[0m\n\u001b[1;32m 581\u001b[0m sep \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m*\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m70\u001b[39m\n\u001b[1;32m 582\u001b[0m resource_not_found \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00msep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00mmsg\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{\u001b[39;00msep\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m--> 583\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mLookupError\u001b[39;00m(resource_not_found)\n", - "\u001b[0;31mLookupError\u001b[0m: \n**********************************************************************\n Resource \u001b[93momw-1.4\u001b[0m not found.\n Please use the NLTK Downloader to obtain the resource:\n\n \u001b[31m>>> import nltk\n >>> nltk.download('omw-1.4')\n \u001b[0m\n For more information see: https://www.nltk.org/data.html\n\n Attempted to load \u001b[93mcorpora/omw-1.4\u001b[0m\n\n Searched in:\n - '/Users/pedro/nltk_data'\n - '/Users/pedro/anaconda3/nltk_data'\n - '/Users/pedro/anaconda3/share/nltk_data'\n - '/Users/pedro/anaconda3/lib/nltk_data'\n - '/usr/share/nltk_data'\n - '/usr/local/share/nltk_data'\n - '/usr/lib/nltk_data'\n - '/usr/local/lib/nltk_data'\n**********************************************************************\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "Stemmed words: ['ironhack', 's', 'q', 'websit', 'is']\n", + "Lemmatized words: ['ironhack', 's', 'q', 'website', 'be']\n" ] } ], @@ -236,6 +218,7 @@ "nltk.download('averaged_perceptron_tagger')\n", "nltk.download('wordnet')\n", "nltk.download('punkt')\n", + "nltk.download('omw-1.4')\n", "\n", "def stem_and_lemmatize(l):\n", " stemmer = PorterStemmer()\n", @@ -278,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -295,7 +278,7 @@ "['ironhack', 'q', 'website']" ] }, - "execution_count": 42, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } diff --git a/data-cleaning-results.png b/data-cleaning-results.png new file mode 100644 index 0000000000000000000000000000000000000000..59f91c307983ac4c4dbc00fafd678d7edec11733 GIT binary patch literal 76856 zcmd?RWmsInvakz*APEi$5Zv8^!{AQP;Lf1If-|@U9UKOS;3T-ayK5jg1b274L-slQ zoPF=z`}zKV{2A7owOXpGyQ|)=o=_zPDbzO~-oU`Xpvp*#tH8j(&%nUIVj>|x@6>&# z$AMmWT8fD&$%u)ODmmDhSz4RIz|h734GrmK7-{>Bj0_F?M;PedIJl~Wgn(5H+q&9E z+Pg@*4SPs4l5}-f@i11qe6c;7dfSn*S@!*hWzQc#Q~5QXPw%Uf+y*1f}nd2LHEkPxGg+i)R*PIK}4S+QX$AKk6GFgGGm?AqsCw0L} z8tHzej*Yc}Vj>4K_eut%79k`Z%}B@h_W*tyK z)H-;D>b_S~)<{craIk18N_F(NkHh4m;h1CO2qF4?GRNVM!Wc5>Z#Vog+}^$zfFYOC z+g|R44j0f(7nn3CfPmm_g%D)3{RS%>YYol(p;t7-AkEAg-sqf%jkSFF{`tA;1038v zB|=ae_Ve>|%g*z2Te#m9-1>nq8VseYSkkY>&WLONdET;KIs21w^_(Z|32bmB}lIMNr_a<&cT$F zlldbvD>>i|DJiLdgNYfRin!!|y$-z+B)4#K`pU<`;_B+k?8?Dx=U~pl#>>mg!phFV z&dvmVg2@qN>ty7{Wa~)rk3#;t9C1@epo8UCCrdk9(wB0LjP0DA1j)%?D*ET&KiX;P zX8Aug**gALx1b$ldHIHgjhU6@pJhW|6?nPJr)247YON`5X=7^Z2(1Ia#?HYb@b`uP z&sYCb<^OtB>wjKl=jQm|Z~m`u{_9NvmX{vn!17Po1Kwm+ps5Mb+#bpH zyv**Ax61kca`<96!F9!B+Y@j-DleyYSyr@Xkv?ywQYa@2kL4#$iYfi?KJqYlCRH@H zdqRcDqmd|I{ksn(OzAFdm%#s2lDOe(_{s9xR~8_-|5#LXP|X3{zpLkO8`|F>+% z9zTQp$NET7t>zH_bMM|^NO#S@`M$~YAL|qTFjI;C@B9AJCI(Vyv)>61>HO#VY^*fz zM_pT|S{^o8j?n}!#%<0aPd9x+GhCLlChT)uhx0@PXOoGo)eBZ-Esbz!Jce8AEyrHR zMYCyZDCS9^PZ`qiF3#{*D?ZQjV3K$6H)5CkLQ`s z4?*fxTAQ{O6s|Fy>J=Q;I$iTpfU}sRb~y9{;``rywgfjmmqiA@xGXh3%y3=Tq^-i! z>|8Cmt}sWKrG`5~T0O|W9($}bjj9;38wlolml}#&T(^UV%om(7 z>$f<|=5GICyN2fECy=`4JoV?w#FpX@GvdWm|19-?w2FabJrq)dD7YiCL_vHSGT%Gq zb>z78joB&dsJsiUs4eq;aogqou+G4B7)V^je^n8+q<7Pad$fEvQ`dX$l-MwAx_4=C zH<{STpnn>+R1xW1d=x?vxkD?p&A)QnxK4EJcA4@b`^(0K<*V8$51+?<1J}BS5u3)T z%%_Vb8AbQWqYtz7lIHjr#>%aCzsdkD>Me@iXK@8>=R>{ZC$)7gC9RqKi)(08{wp`V z+%CBF?XUOvn-@2kXNkOT)}|b9sW5*NVcaYod(SRCY;hke*oUc3TZ|M4Y|`-y%s|z) ztstHP+Ov@2*VfB+`&Fc0bKlF|s@xZNdqyL4E7Niu>Dml*T_;$n_kP|MdY%(JvX9yy zbuM-M#pX01r(el28XJUpb6_r{vrXy=y9Dj{5%F!m6q^16)B?+z)==#!%_ZhHS$uAf zfF$?7Q>?ZG>)!tInyJdDp#c8aZk%ngy@oc%N4q!s9O(2NwSps_DqD*rFqTM@QSIWhyF>cjE{y$=_$iOnW=%mPzTBOcx5Z$2<(;iqeu zrIz9yRNmw4X)kXQZ~^oYNBV;L($td1a#?@MXnFI@c^tRwS75QJP0%5v-8Io}$Mp$p zvBhPQ4x~7e=bJv~Rz|dM?!|bosju6fANReu>pM{QDjd_+3FC@%H|gVy<5QFP z-%`wVDU*0VRDx@bktvRI@f4`XJeJR?g`RK6_U-y!R44!Rbls+?;FvNs4eY_^pp%oL zF&Da@+dpnvzAUXdLHAsRo4U1nkN&|{f_P~TYKY2do>Td0(9uwKd>t)@_M`8F^f8Oa zpBf$1FGg*G(`InpIQ#4TE@Gwkyr$H-WFS<*Df{j|{xFN!;o?St@ACY@J z43<$pi)Au&DH(8RmN)SFcqCh*Y;xc+ejS^je=J(WA1MqLd-{$&E*J)Dt%9OaqkHxy z%<7I^md*N8Bvd}rR&%P=+x=1ihjfl%qC&i9>OSa5Etsv3{M75{x%SqeaF)^C_6{9i z_R+-p@QlF4VgfYFIO)eVI7+JVyEYdl6q9jBYs`HnR~%J7jI);bZno`-lMXWWhMC%5 z6e(W-QdslzLMf!#7i&|w?6k}+ZNGxGSXoI=wYX!-3aRCgji}$wr{|2fg}KdI;FVX` z2eA)}BscAd3Jh<%zI>R;kKRbs!}G&R(7CVY1)m}qN%!!pMg<#{xW()VXf_XAru;D~ z-Ht$)B*qEz4lVrACO10hjtbP(RV6RntHA0|FB|abLW)PK4x55D?9yFirTi*@rTlT0=5p(9OerREgZ0ZD8xhxoE^Z#t)+zKe$| zBL*NI@~ckPY4@{*n&fGtLfE$Ze4@+Mx%nehd*xQ-thrU-31``jhYhC!e!cWra-_9y zES_sPfmsd(H0Ljl2w0R9<#(FB1-N*%u|Vi?*Q%Eq80Qgix7mBDm1*>m|LHVJ=$D`@ zj&_1#KP45GZ9W*wxncx9A%UyLiz=*?n7)X6?>Ke&BHvzybNMX{Ed!2}Aol{emUZ!) z=V$VRpJ|(OxalN0a5nMjMu~$J>L_&So4gPMP4)BBD4*v05j$_y@}ov$lcLPi<1BP9 zi%;Iib*5Q`dV_R6iGkB1Tynw^q@`qGt#ad`fQL2o*|CSZbBvQ^@&1imY?zlM$-pF4{liz(=X$9wv>gBmU?(20E}jX~GS zUGJW1i~F{t)N_+zR+Y^>g@j3jY0$?*&YL7uI8=Q<%uods`w?MT=G61hw*v0mZM=W) ztkNb(I25qYSVYYqZ?V@1hB}`6?5}re0gtA zNjA(VCY4B_N}1H^iA+Ew@%;KJs;0Jj(?@SlB{5}>mttqFGpfhyI z6=MG3?v5<~^ZId}m>Fv~oX-^_Y`mX$G zP24%cyP~a&-z!g7b-S(xtmvObKUjHFtZedDa!_^fT5gjY+I*xR5-LEoY*R$vN)$K5 zl`t%f@`$g^YzkUKt%|dP0mfh(#jq2fr>0qN)qGD~IxxGm@&SO)ZyWIZNFH~joK*u} z1Va=MmM(Uh|FVKkrS_eC-|e|I)gc!aMhVlUJ#7;I>0AbNHJU0v=6GB;tt_?dsg?co zq3U$sD|EEsze4IS%uU_d*bysPR6*Zp`-l87pz?nYl|Pn;ww2ba`GG@ii0!AS%@^(b z)`T~^L@gkUo-m zBagPMr0be(>{BiCuGUXos&Zkpx|e02lcr=92DG%59>uq{D=fyRS>$uMAh>^B%Uvw- zM*v+3;y<%Z+Po)D&Md2WzFL*Q**dk3^;)izj*j(&E=E~hmom#$D@-lnS9v!3Z7l;UBfpXlTasS@N$y{Hzp$2byjk%eyaX;Vv%y!h`b3jPW)_-u=b2K|iXv7W)dn;5DFXNahcwt&jO>v_w55rK&==1sk=zd{E|ClN3 z&T0^^D_~|ZTBsKF6_?DPPn(~%s1j~;J{ym(nPR6yeb?7ZmWm$pyT6ThyeH!_KBL;8 ztWYT$yd$Q9Wsxi1D-jqC1QHN=ZgFJ(=+kbX8XOz@EBTpl;T=Yx6VYgPEJ?Mx%yR`> ztjR9b^Cj9yh=VIn%uB3di1Ui9Anx`1fj4h(Ou9o%tQ`jDJ_p8mWqMs{sT#yLZLOw} zps0b3oL*fA9VtUnT(~$zyznJXVn*KXFo6wdoz7$HT0g9h@NQ7T!rDjNcJC2%sF2^{ z3SPf>U84v{r8VRgj8bI;D%x7Kdj^#A&42xqDh_$vX4@(jQ&%LblrR471h3<9b>sGU z)m?^C`iVY^!t8TK%KQlqI?KYza!xr=RN#`~8Nw=Zx7%o^W69N5jh~Z2)<}!jlcDKh z*C`8y?=hX*t!_2`o*JL0xqwo$RKWX4XmutB8ata7ScOF|^ojA11^mbrH`I{&&RV^j z2E>MIfD9|%wFm))^*L8;EKb5SnvGRZc(GGUx;c9oRE>DXK%=TrG6%Qi!GgtGR`l{s z#8tO_FV5G%)BUl5&k!o)BLOU^e3hS}Pn+%M^!Zj6Rz84kLN>0F!9q|yd-h8Q&~5zS z{YG+ns4yjBZA@%)hB@Foxqv`98Z~U9WDu>VinroaMXOeDX{Qj$uV$C5sQ*#6Hrh%& zlO3=b7C}hE)h7KnS~jG>z?;Ta|vmCb9KAZ(R3_6St zU}xTRH~QtQn7rTY<@CbO%iZ{SNJfJjY@A?ceYdk5Yg?qQ12Ixh9^m9st(x$UcxxT~ zwHs4v+UmVv-NW8sJmQFe_;bwj#FlYSz27T%lWH;T^J-CAeLy~k*-U;uvidh9~JS{pM!q&;&f*k0aGQ}fG|#HmF%p1=RKuZr8-J` z9@zPoRvH^Ls7H{ZO-qSDaX=*)Uq62RvDjvmzh9+}7&fTt@oK@24-xb0;p&gf)QgFh zBj>U~c|xFJ6`dSja@S43uC(}G%AX%Uu4QrQbO^J-)t(@+`vxRZ2g5BMBS$1g)8HwCzq_)pIm!tbi3C9@0S zaTrwbW$|4Me4ta2ez>O7vII0Bh$!bc$g7-ew~_0_ETMtOS0NQS^M0#&em!1F8<{h& zSKC}hfT7uoIdHxKpbJVqQm<=Nqv(q~fAc<{sgGS9z6vzNeE5S28g0#{tjl07$Yw3XR&!RIHcd{u@Oxij#uIMMKW~|4y*~gfFP#!f3Vq zF*7W+xe-4iTW88=+Ngb4g4>CWG~otbVx7hS3#~Za9AU~z1}m?9v)4l+5Dl9Dh9g5{ z(E=8{&1ZZ6TIh(FaC{1C5;N2ZpN)X!D$5tl*%0h4uQhKT^&I@yNB{MzMAWeFb*YY; zXb{0|(hof-V{)LLTVC&hoq_MpZ7 z2EA0dZIsFR&))wJH2Ej+`#)}2`?8qYam}p0Sn#>#e`p-kHSeQfO_rxe2ned7h~zPj zLZpTLw+QlY@3+XJ(<9`*(e_i3fbO(VI#PjcoCiKaq7YT0tUr<>4^0~rR z!~aWChOQ#3Q14Cy>MuT)@^>IBK%;yWfE0PT6vYWN0{U_Puq|Z3#slROlj%@ku}pP( z17#U2MC*8cJCP3YIR~+aW0EwlJosMWSJW0<`+7d1O0ABIp&!14uTC%CkvYVxVMwo3 z|NN&$%a<)q0??lqqET|}T;{PP`Mya^EA#QdylG!|n{SC1x~?CoBsPA&&c>Xc*X-`LID_HG1ts2t|lQ&7<~_j!v_!S2ayhJ`d|w%(uV$ z0P0cvKD%-TjrYgTPsg0w+mH2s-j)4sIkd4`Sc`RSJx{NR7;Nr*S33R@3eB&jXdymb z`#jezxUP6Lb)oTFyAKFKL%pLf8co`+2}Qc5BP%a#XqWRa@r7budhJS`x;C#9l|k-z zq=Xvp?^mAnS$w8amp=*~H@+;}ORt%~`W4hf*aPfAB0@cCdZm_+~f5(?K^vZnYCe^&xM z3bQOV2}G%)s9q8Hw!cL6KM+fpM#axU6+N>BtADH@ciOpi5j4KQp`{K)l4eV1sQ!hD zBy%W8Zu^%wGH-{E1~pn8T%qPsR&sK7dtmr2Cg5N4KnxJBsYT0D6+kL^23S-x8 ztes2e8P^A;-j_uhMgcTq*LGg}I+v5sxc==@La9^U5tQRNZ)^89zu;6gi{r#!Pfz;> z&+~#%1s_96c9c_V-362~Hr1ujmK$qx|;F{-4gXdp@P`IY!$P1UczkC|$>hxl3O)qSy z<`GKnJ@%aeIcYCc^b${^+{gM;)-AzKa zm4eF4>H<&1&wkI0yGcvWy(_6lxH~n_jkDBaX-65if*ZImtz+uUeLI&H|C+ahc8`c6JwN`@1HW zb6~p7Pi55p`1K6k3Mp2IdcKKz-id_HLAGD?wA`SJ+5s_=Cfk}F$G{u7m}(k?z?ustzEwAZxUfO#FY^f1$1BL`ybX^UF6f*QV5b- z_Cj=C2}(}qy-uY`@8k^YS9Cw}O~0%Nf^t#C5cl?^o!TP?ev?B=zOqR@C&eLqMHS%FEC z84@~p1H^F|GF5#kVB0Jc7n>xjOK&r#@;75j!#8!a-6`n1b;DNHyv%vJ@PDfMixuX9 znv;PcV&CAzbj+EKx6_c9Q5kG*+YtduMW@Ym(22i5?Fq_0OHEr&zOkecJ2H8mB%6Ny z)!MFT^g_e;9--5YdA=!!MQvmX58J*VkI-B5?I-BkH!JP<=$F;*5yBNsAr7ISdpo~f ziunA9z7qSh!-E<-M&#m$)<^Uet?RG;Be5Q$TUhT_u(s71HMVXj5SyVK{^(@W>uRn* zQqF#USG7R!(6Z@;87;ji)Dp9<@mC2SP;!IEoWS}b)6R39;MeIcD8W=lCE5kBryTY3 zQJ-Y9a2kF5Wd^we@X8-Uw<)I2{qMejNLKKR?^5Zfdk5mJydN?n4FiD9hdg2S6_1 zw*PJ+CA>8;FhQ#pPoGjvX5->r<8>*qCUu3H#h8Aaw#3rOtiiMgG>+PHGsb1^etRVpaOJ^&$ut(@Soo$oUKi6_!uE>=7;9;bn2n`8_$b1J> zNR4?jn%G>1tA$|M021D>C!}#Ou8l0DD@|uHL?zObyW7SI76hNS}Az!=>hpB2 zv1ta039*;H-!y(ZDd}HIXe-Se0rjYk>>IsPbdifh;wxB{_=1vI4etnKF+3L6iR(VR zTKCSx8vMyWcnhVI^^&|!sFD<-!Tr=AzMnIvBxwih#M$F8}&C=l{0$$3`f7bGCQhqB~0ecWEb2l*$}bN)ZMv9g_K z<)lLobRzLVre94DEFFv3i|H23qmjP8@yRr6L7W}woa5zLJ--X^hP4Vps6<#M+(p7; zNZZH0h1Z`~7%&eZH_+_l58qnj-zPryge+pSYn(jL!nv$D#XtQqW%1DBj0Qk=g388< zVrt9z)Wux)(M1OKx2iqU!6yu%ut7!KJ zR0$BTB2OG#N#4yNVHQ}$l%3}5LCf{B8pdV|D;;}oO)is-W^-t&C?%F34OUHzZQ!T4 zs!DC(R#IWB_V2dmIT$}!Oke=fx_*4e+dWOz=K3g_#Ki5FLvFo+)E;5HXf!wzxKE72M~ z9y+8gwPiOr#;bUp1o%nDanKcK6Q^@wEy_T0ZV&4hm_-#3KUa`-jS-Zu#SQ$Kodm`6}Z zN6#r+za0Y@b+td&gV@?D<F<%pF0ZWkK` zc*IG=^uhcxe_6<;{O3A!`C9x;9jpNsd~`bS6jfg-29?YnbU>F1*XE`Ug4BRi!B+g= z_?jgym=oY;tMk`htY>sAlWo}pP|JS|pMp~qo!lE&9^t(B27095iYm05plOlUb9x`d zEM5oRIj{F29t#1nloH)-IIU7zZR-K`PLMxv|oYayBF08Jak1zeXx>s_-`c3M-2N z{3Viu_(vP+Y+h2J()cpL3bG64dy>9Cb&k}U87!UfV_9czlgLO_@SU{5xY71XyaIKP zE=r9^xF~+j)@1Fyk3*iu4x*PvB?_{dtbt0c^Jjthz_897b4;or8d)uYf<00U?EY;` zqjcY`u~;mW=xvZR{%#`09c&!xw<;fi&tEoEP7F^Q7w_oELKVqQt-=)V4I3UJC=mx5Nspav+Sd0hbzRJ@}9?o8UfZr3v89kv*>84YcCCs!t-RGfDrF{C)vLDnG-{uL-}az(!ju0 zSgV4ezG(>VVZOrSo-bC!?^r9Ia{M)Qvh{fcEyBAE?YlR@U&qZ~4V&z6)vk{TEJYqm+-a<`njPitv)v%>hD-Y_?s#wB^2l`F5I9Sg%RK0_jIkkvm(MGU>L18%L-gKt9v0FxV*C6-;E+?QviRo*h%4; zeWsM=xT6hFrg_2}apS|k_jgOU6Hl5dCGE`zb)Qd0MTV`6-saF23L$ZMza1bZ@8!Au ziX`cfjPwqT8e^8^b9N6BZu1IczV?-mZq+aiODZi}3}*8|AReY?px!IbOt(p+VL96A zxlAe{l;n8YjaEQ!b9hw-|6aMgBwme>zVeX1ITL4?$DcUSpk95FYn#ggRvS$0_~T2g zMbMQwa`8Ts&@oA{FD|ml<}Wlo+$56J#`)j3>8b=`o)Mj^Vh+it#~fVDIOJ z)=N)=$f=Toe7zfeOfFF)XZKgqZaUm|F(^S8(&h;x0T`gVc`KyqX2n42P8|Zv?l^%9 z^G*~j03$BEVu~pd1nI;U4U^@KQKMq`SFHIjpa4F%ZMV96(aGj*)~^z;F_jWT##Odl zXoyMt^LE%`w8gMfHpyZ%IWvNB128b;r2gFeR#dhG%cHnwH~)z$h+XpwrVPoR!pb2C zP)QxKDqK1g6bN{95QxJtAiKqZ3#vUyYE1Ms96*O#zz99SI+P$AH@NRCFrU)66a)sW z*6UX~&EB&^kj@~7XUijJjcCsFlfe zMD|V}Vtn#TrkXhPb+CR&?~t>yhN)a#kUctT{h7lCb$*q@|Fz70({gVeyeSGYP}+JPZiF$~N7r4|44Xoq zK0%LpnlA8zh6%!Ba7=G3`j7^>aVH*bDAk*xq>nUV-M#2^xi-0@0uSQCr=BFs8!lwn ztjyJNrCSLTLcw)s*@{F;~xvB4^j{DEwk{?R}U8K@QpGLy`y63BN!Q)AnA>_#Lv9d#39Nf zrcU#N93^9}}ieXaPRijBi+F20W4K3~*n;<%10Xlhbd~W0!gcxJT z()tn&L;GakVqty;_QDEiGYZi34Y*J>`d{t&Y*F-z^8|TT9Jr-kr)}kXw{<`7>J44o z7mBrU3tc$BYP*yX_{D$j35l=W_~4+q5ctS|HqJ+ z*={~P%s3n`Xt7$4Mj-?)&@7dpifVprg$pp<9<65q^j$DWR#Z54G`A8u+rp2rQs1rT z)%+T^k^=v*7;_hzHPx&dO<@Q6)37Q#xN;kV%N>zACQ9FDBp40Z1`^1?!^N;Xj?T{* z72sLjuw6sMsf~ykm%(Z{>P^GqI}NT=&+BV%Vg1w+ztbesvCwbEP2^pw6h@uMXwjtA z_!l~ce>Ltmislf(PNMw%8MlMMV!{#Wo2wvfR}0EVu=P1>c%|zWP1grI!JM^mb|ssf z-`Ypg$pIyyy&j~|#vg~UzN!2ck|CgwHRpc^vhWFDS zcXNdQHdb1bF-+UCH^2D>aAs5DnOzwcNzc{?BZsB5GTt#i8KZX=?HBGh7w58ivgHjHcuK!UEe&nDxj?5cTfZw5tb6 z?}8*L0t$PcZ;d|IEzS<37#H}R5eDaB_I3}K-!d*|IFG%9*e5cI=y4(6LEN!Yj;t8! z5n5xtq*+l^kIy5BZYjLP!xL_m71pC~k1N;$uVYxq3&JZDA>WhzS=vT``>Y1=qpU3O*w3K^JLYc3~ zjO$tva*nyD(`S3M7|-zxh$N)w$qc-O7&!+ROr5Sf86bx!t|QenLCE>8)fUG&K%h1j zj4xZenQ7tylqVKGLol_+@6?fCb|9`zm4tfFX(%_z*FRC0M*x*8MrAoHz!9_F1^unex-BqD< zBW*RBw694)XGeW+)&MA0mSrzlN6{85VIK2@#%(&ek3X>cHA|KG?}+;ivH|M~*?D?g zK?mHa5HQt~R#bz8b9)GTke5fiLS?_K`M(EkTl@1d`8uof{fGaC6P?pe^Zcy#ky%jE-oQu z*lh8vD<*wv-CqfJtUReE8(m2&jiVm`6FN+4k~AD-fvEtNgs0^HqvV1w7uZ-EV|Shb zM`8XO=a+fsgo3gJ!rQg4{Mc)Ku}X0f2p@<>$XVX+c8Wz zCftN=fqXIPH8th@Cq>pn207s1hsL0aOe`~Nj_9Akb+*DYO03nuz1L6%9m4dZ9U71Yj< zh4Zbt0NL&!=})3R@`i4L8vs}^O|!bv72wTIZ9jEXWhn2t|7f$YYO?j7_V+g#MLCxAVsIXgsl|L`X8R z;~il6-8Wuv>YnBWnt;!!SQKp9=VH1jM)Ywj-lgfR%6Zp_j-YXa1G3N ze)qj#I5hm@5uO=b{9wAYg@oa^>VNR~@1h75=NVL3ERs*(U*CKV0{M%ifMu5{n^>EF zhQm&!wHr3j$5>S-+FB4!h(+Y6>wkx1tJJbB(XWhi>Gr_?V2<*79>74_!LhozMbwDI z`z!OFT*YVZ)&xJTZ`2C7aVN3v(R5*XJb(Yo94zs;14w8$hLX+F=9!6smpw z7LO&EJLarrocH;Po@Mu${mavRrxqOZ;F@4|{Yfk4cX51HH>ID>XzJ%n-{cwNg|SUB z%3ymY+VxpZzp9jCJgm+uq$#&5$c35&=6tWfp#Z~mL5Ei)VIVTL*}WtW0(}r1wk*=e zW@bEii8K+!-84QbDluNhoi(j^n9qo|_|xQRvIN^Ej1JXy+^-USTpLxfmXL3>?f+hD?Uf2@am}*3 z?wk1OtTKo{jx5$hp!|Ipx%qeY80~McLjS{n(r|l-vXLjby4&6zr9_(XeHi`A)|;FFumBfH`=8&8K!2iNkzQKv(R2g;q1B zT@SZs%09BvKHJ0PKH+)lb@GXP2dZC}mm3Nk-0P&6Nj%Q&vpWfIbb)@t$Uc6%TmKcX z;$4k26tHkV`uqm?ng2K=bLAELL|s1?eT^rKDWH)GkCXJ!+gw5;st zt4stjordbEt~2)M0S$|3tN2C?Z+bNeAPhxHpll6G>_YNqSAPe;o}&=H*k^`u%=7HGA_4+xZsEP zaX=9`X)#Q&l3@z9f5!-3#*Gpv)8g;1HrddsK3L@aJeuuYV^O-37>ekIyEU10S`lJC zykB>?SZ24gkVd}Y1I*bZdWno&*gbdP4o{!1@fa8+ibHwG3RQSO=@?mf$jBE;O>n2e z#>R}-Ot(ZvyN9Q0t>=LiTlcA)NwgT*eQpPLly->JQvK7rfnZeyS_(0u#18Pu0yE}? zfIwmArG(}Q4ttt1D>*pXm0^A^Q?qZi8|J+vr{u>sY@3ux_u1R5Srl+(R6%c03|+}l zoXnA#dN16;UzP&^T{*l%gTucv5%sd6>7>3|6vT72S zk!3Tc+TqE+$6SAFRG3IokxFqASvjA%#mf8ZeDn! zjLk4|Nuk@mgOol+;dAZP*~9BKOvt0-Q~xh9jOsM>%#Y^wm264L$N0)jLy{<(;4l3( zC`#b8>~e|0v+1ySvvE30RVFvtO53y)@QtA*9{8RLT~+ zIM>e6zap8n_!88Y#P-gH;+|vvEdXE6BdVpmCDI5!l< zymw#2h_@t)|Cv$p76u0}kE)%(1m`sZ#}F0LbMv{46K+wnsd0S1o85%>?fXDW_VS9Y z4~vP+n7BaNa=dWt*Kgx+D~ys~YhMtOe+XPvl}06XX8RNNgg2zrD=?JdhUy0-j$6WJ z8!*==f*p*oAkA6^KlIwl#Uuv8@P&gd<)(3CDz_2>{8WO_g&s~MBv3POmG{dO1%gg> z!BXT4(G5uzJ-S089XHq}%kYqH zA}DQ~!a>O?m6lsBQ9RH7hShi=eAksg=6jT;if_D#Ek+OH*)Z<|ElL!MMRNhThMQ#~ z3b2_E?3TcJEkK6ic)8m4%;wKF?eGU)sGEi^Ih*$WSU5B6dJclU60jnkdB%*74YW+4 z<$p*_jGwZ^G*h;H*|>t{dTAj=H;Ex?{^F_AvRMdmICb}YTed1~dCp)Xe%mC6pIzyS z2r>w~IXWRMx+nro1Qo^CF)UUUu2lMHMi}S$f_y0wy0}cb)iPtc#@|GmT2OU;fW^B+ zr6U6$GY4^Eb7m7(Z@8veMcMVb>buK1b}p=x1xRI(o9`m$;7umeB2+B%9A&{96+TL1 z%4Q3YG(YhbSfI!Vm2B7LS}6y9GGu#C6Be$ZXqgRG`rRuKJUTKZnYDR4t)Prf&KRpM zW!V3<+}#pnPCou?M+;L9LKr6fg>EYjB!`=}UZ^ELxOe<8y$sYhs@^`;`!>uC7WDce z*g$SRze6)Lji>51#Ml&Sp<|kK&d6)x`C-3)XSOA|E$#ov!hJ|kXVV*;8| z8f89~1(4fp>~4DDyygzSpnJ4?-@`k58s?xfz>kB2Df5*eKx;8E^KVigG<9>5Dr9kI z-zHUUMLp39)YcxEdy90y+*`N=J$~0#vR38sr;5ehOhE@$I;|AKRE0Slenu$i(w7sy zw{#j=sxwgjKJ1lWW8MwX_JU*6A6L0QNFxx=nvH99H_yP29Ml!l?4)Eyp^)!4BgQ0$ zt1al0W(W+o6WZB3VHi77MOw05L)b$gIz_&Me(wEx3S1o>^?NTA1+YPB*F$u)BE+O& zg7Ti|oN$Im=g*#^NeC+J#u>6izKyE)OA=#xI1F{4$Mg}PNCK17B-A6dfK8i$eE_en z+6$8|+&rZsFG80?C~2F~Ls_5k-Mhw7p03pybadCnTL|kfiHBj3OoI-V_o%cfvJa0y z8ZMD(X?S75RmS0oR|ZDMs)Q0UV@`{=qYG=0)*q4}?l*+nV4h7Jv*KE{Hj;j72z=wd3XXgio1P%qvuq-5IB zS(2s`A^)b4S4eYAw>GXBBh+CC>&fYqo5trf1~8k$u7^Nf^53d&bSecxjj>E_(E`#0 zEWNT#&MpFts(rjCj@fuZ@i1B@RdiO8w#!kb9YdCLit&XZ0g|uwY7ZV>w#)c&VIAXd z<^1oY8GlNM79Fkv9dRVf00W0TKgOe^_YAhV#X@;2P_N&241G7ZHFV?F;OHmq#fZcl zxX>{cUo*7e_O%>ixldn1Aput-4=uM5m6>l;I;r3!_cz^OYxRFM10;U&Wvfzj!xW=Q z3%H93a!9}oq4nLHRLn-pgoK3U1CuT?@CIU0ub3bk6NBf*n--+1dS;=&68vY@sEZA}I(u;_ANgl200nyFCLl&J z@Az^hfefpJN+UA&3F4xuz)KxwMUjEui!*f~D{%p>$z++k;a zG6fZHV1Cwr{}w>SxAgAIn;4VTEvAXDTOz3l;^HxBcB0+*i{eAI(B5VMAyetc0Rlb-Dldb&MD-xE~j9LF|Q$$$W=ZW23la60SEi7Ue3CVN%}f| z>8ERrDb%dBqe9MrX0^SX`Bf(~bVdZ(QG_ho#igowCvS_7a>y=)`Q2Kz6m&sHw=5Uk%%1%wsI!BD zBz0-Unju^qUXyR0xh$+Q2!OjrnM`XMFFJxGJ(1-U!ahDQk-Z%v{i;`DIJ1-4N0A_z zd%9Ktf@JLq57t=s?;N8wV`SyiqGlQl6KN;RUE#KFC00q&m^MS2hya`iqxn6M~FnMNYDuNw@vN|I}!DQL#!^kKfv8vd8Bd8qT z!U>8+c;M>`lu4_PZSk%Rt(w`IfH7gA8Ffe$oiYFx5Irx9c4hU1L8dsPJ=QSAc}YLd zu|lc~qOmk^_0RWH`In>XJtEVjog61p6Q&sit&m0c%*nUa-6sr)>9jna31kc|p=O3= zCY#cjWPPOO%jmbFAQXL+Y!l2!t#q-bKzz9Qh_TRD+tFBBeW#RlJ4%rX+n36jdlx8o zIP2e^nukXR!db1@29EzVJ$#6QwBOvkEM>6>sqMLrYkg&m)YuX;6tA+U`GFS)+n-H> zg*^TJQd?2Fc{vuFDDCm~)*SN~xv21Ds~YO3Mt}2Ml;G^@gDU9QGQd0(jzJC3Zi|!{ z6G6tk>}5}nM>;@5V*SjDA=tc;CEDvtwVLgNwkORwu$gLC%*k z;@81EZc*SrsmfN$2IX0V&+jy#u0ACy{wdbES z?AS+cT4PdJCJMvouUb^LWwLFC zq*bRU1Uk71?-(!(d{(eeYPue@E8)iBcYVBF_Q9n;&_XJ5et|POGd7Q~5xvkfGMFm~ zR0aEAzMRpiEqVgt?*fN7gD?D=hNOrA_?_$TX(b1KBxP=j((YQDVRul8$6~~P`XK3K zd@i@mtrn|cMw1-)p8MXBQL#(RyTn=}L<}X3`ita0I(R?X7m_oVtUEvltj#xJ$QvDA zWcOu771L$|KNAO{zgBzt=PN}-t;xsyA22nv=ZNO>)yX`Kx^2t%`)@=P$vMcKc(DD^ zqoI@hDM~~^r;_X4(246SrXdEo?@$8e9SSvpwT_r%6-#F@$&R+((KoD#(}OMY=r`Zw zC^lN5Z2AGz-Gg4)McwH}dgI7m|;*R*Fk9>aNZ;h$ps{XMlkC;md|!vjUI;vw+S z=gVp$fAm&7krgxJC@4^VglZ1im_vmtj9Y%hUHyHRm}KYeT?x0 znwrkCjpx9`)>49CwEeyiXln~v7D5Ky|DGrep2=Nv%GS1OeIfOXoBmq%D?%>p%cyTb z*4w76SfiGa!zzycf#Fag@nqRl?9b)D6_F)umILxX^F7^Gy^KwNh_$D!x_OWO!K*m#w=CH(s;?0eR|Shr~^LA=MgfluQ;pz8S9Xj zcxQImx`G^e2XquqvTKnv!4F99NQSVx00@}-UB-RQM5cTg*OvT2t9ReP1sFsQ`$>q$ z-x*M?WV(NIj@yXvvVP*8{;Go)Q6r+he(t4m1`vU4nv~eo`7)3MVFptH7v>I;C*V3D zpdTkhpb#rqz3wetvd%8|_llX58i-#o-HG#XKAW46gL)xY+U}?~pZs(pqvI*>XT&j~ z&btFceG_&`@UZo^xTj}ZQ4O=hehS>*7@1#E*|GAEm(}3pnI$~+PP(tp4ue5NLRlah z@A>(q8j9Iw@?+;`HbJ8ZYo8dRdc=jU>W292!&;%>wayQX=**SM)O+i}!kJ;dcbA*y z|3q`F8DKI-k38#{=zRdu`I0K4jmg(EZ&+>oOX@emB}zy&u~`X$1hw;P$H@zk|CpYM zKbSMipXVpfufN6AyZ{U<$~OJIJIDyjDKdVb4vE>G2qn%h0bI08#>`C?!$fImaiPz! z*u5UlTRW9}O}W4S{I><{x>PycxY&zWA1%VUs81I4uh!LG8H04Jjh`lc1Qe zzF2}tklNwo{dmRzSbV69`L${wxdTFJ7TeyxOzq#kCIq`KU+MNWJ1z7hnx}Rfd7r0D z)$Ht$bIlM#cWgk72q7RE9#Z%zeYeC$-+5ASq4Bhy5HVl{I{Q3?3Q}hO3z6wN-EoZm z*n;_MN^#+JnGmb2zVf~M7erSd7Pqq(dx%RS^|fe{yuI$1?eE3Ba|~_BMhE`hGa6{m zxhD6%2}jh#pl1dNpnmL$Lc)8u0Qi)Y$^?F}?q+QCo+B6^G7w530xT`mjT3v=wl-*? zCN`S=5dpvNW52UBNJ6OHw$B0WraS-RKmBWdPmvz|TE5F^?AJX|BG5H?#-+Uf#Ra0A z>K;HN2l_EG7x}ZCM%DL4$zOxGP`<&!X`nH7XXUY;_5%oFYQyf9 z_R>kLdjja-q(C#0wZCjr=p4Wmrt^3r6V+eh#A9hghOO?G3kMuL-W~R26?a_5OWby! zLIFx>i900vJ1jWXX<*Lr!%S5RR2lvqaie&X#17pbNiQDmpDP;!X_N@sL8SCprsBj~ z6&%v3_Vg*cI^DM3XOSM&|EUa{h1Z}r4%^-Opj^ron$q5ivNaeIYIFad%Xsc%voc|_ z#n0RBi9d-@TKatKebEn5x>D({8#(0H!y}8{n=@=1W&iuf3C6q=d1s(?X%t& znG*e98}rod)II>NU$kFhYoGeZe*%pE^VLUY*(H8&_RC`8m2Q4w4PW^9x zTqI&hVgK8A{`p4(E?5>Ln}6j=|HoO=NTJSW@c+HO{vWUY|Lc7A|8nUJ4&NR0{(A>C zcX$Ap@!5F*e3G2Ixu?qA%}=(Rg;oG4OY#z0^RVwcfj||}$<{nil>+O^Yq9!|FhjfVqMIsnO1It>Px!Fabpu@oq2 zqr2+?*qk**b{;59L7icq7`57A{#!?^<|DsG=$d%ZghkWg31vE9iK~}!0fvS~4*FzE?RgA#9v(ociu+K~P_Db@~j1bpHZ*FlW4PhZd@9E=85ftvJ&SDY^8342f$RZdFJ`p5BO5` z-!z|PUhx31+XApVW4=vzGZNtJ0~FG`^Z;eIo3o|sa+XQd!~=j|v(RF3zZoFjgQ@HJFRnb7+05 zSLOknl<&T&FHZCvYQMD)MGH%m&T1OWM;&aOg z@)!=MCN>8+iOcO}?wd>C`pjG6*8!JN;3h?t@ooi9K*Q}8>Pn&-g6*|j!XJ*nw~Yr_ zr5(_y*GpXj+)o)*MR(G>0Z2})fKBhPgt*#_Mcn!& zmstPm`ciIr3YbE&qsdb5>RW(gY!rSDHikO3xNtTDR4D*WI0fK;mT*ZqP0ICvBB`2_ zj=)uu=NSkd>BDxeF4Qe<1Q56d)THlJ+)s3CA%K`JekVLjd#d>FLr?GJ#p-w#cjTVz z#1R)Vl%5&=Q`NFE40VFRWvdpfizbF9e_*DSV-H;~spr*Vi*B zkXzzDS*X^Y#`332;|lN=%A+^hbP+lS_|2uic;lKTv>l9Ikd zzi^IsB~W+0pVK8uua_R7Jg^7A@{Kn^0lDlzuz3jTN+|g0G!ViPs{^g z7?<4$lwFHZaJ6VlBs>|AW9&WoF@?K!kU?03WLzIkQ}u^g_Y_N9r)`}pf9)%zya@Hm zz%#?C#;$y_qkECI`|}#;k+mK`2VT$xmPVf}D1dbxW8tU?C1594P}}7PfJv!VRf*=P zT!Fj+dHnm}+r>k@aKwA`Yi9sUEloM;{VlP5BKHEFQuOiof<)1Sbcz8OEL;F)NY^T> z`-z<#63`>c(zhiaFZA1lS_aKH!w2F&EoAKB7xryk@Lc}jZFI1}9?+L6F%WO}AZ zC$ULm8ZpS)!vWPWxJ_+b^*_Dz>Bd*3>>S>a^s7;73}$IPAFF5`fqP?KurNWPp? zLD+FFsEbgH>^vF3aSr6%`jnkH>U(7yphLrWKei*C{X1&VxBioUey*2-mi-X@ zJEKcLquwlr&&25mumlKR2s%$pBmlOzxFctPGx0a57J<5XbLT`c(hB^R{+Pd}Us|+` zIqanyJ9c0!UZ0OqZ=`c|7SgCq;K-h?#;b{_Bd`AVepR(5y}8@fH8O24*0f?~^;))h zgjY#R314hM>t)>8%Y1n+OU1}1mkeiP*a4gj&B$$a>6JmRtHAojlXH?c&15WfAh~D_ zEpC4wx`J^uxl@*{FV~AKybd|e305s9KTB1X);#FGhhMBnhhoF)+qmsQ?^?MkC~XW* z_@*QU13+V7UHu zWCS)M{6m6IH0K1Z!=D_)nvycR99G8h$uO{o3e%titLni@S$T(2^8HqrRX0E7(vl0x z1278b9a6Z`*FTfrpn`e_D9ryLQcCIXi0qM0a}7opOj8?-0|b znDI*FCie_&9lq}xTexDQ)Z`_2rm~uvV&$Ep{hZ5pyoEIWX#UTmA$pEE%4aPPyDi+P zyYPg7Gk^ocA!Sfnw#OTsEzi2Bf!h`U5D)3l&@ra(hEwTvRCxHwUa>V&mc8Mol z_A2hqo(rblR}q=KG7b&Rl?UvV4QJ4DOFf$K_P37qa!)KurwR&dps+_{riEPA7S<;^L$zD{54E|vv^-=gNYu!>om zmy4YzJpDD@3OX}(+Bjtg!E>BihW4}H_r<$mb)B9OZvAlq=J=))l(6#$mNVux%en27 z&ifQoJy>TQfw#kM!~V6{?aY_JZifZ$_)D|Fbj7U^^PcCM*tC&7h<&VwxOmNLs*Z^g zg2LfrKF0>+Ct}zZKeb) zOst7vOxt2qtd)GzB~h6uP4};=&Pc(sZ=&O4wu>cu6WFLDmCtp8gc31G+>}B;L_^(6 z(M@AsTPTsvL#~Ys3QaLdJe10w^@CU5Q*%{Qm|LsByq1>Qi)E5rygXP!<)5)j<%^oW|!LvTx9X zgrkl23ga=qmJ&j3_E@QdyUxIjDY@`D`60639IVA>PH zb3olTow(Ks&qe+1I&1w|Ubpm_ev|FCSDhM;D5|EiKRdS`_G04N6Z-Eg4||jpC0#M3 zE1I8zVLaZkpo4H5jrN*{8Y!X`4!K!5RMbel!>DcT5} z2QH=SOkDwO?i&RrV6--!(B1W3u1Joi8LcE>Y?Kat1kJfBVNAFeP+>)9e3A`b(YxLN zrW|megLKR%KK&&2pIBJJ!&y{>(MG%ly!j%xVFl_Wmq0yXNdR*C&_vV)V%!qJ5$qh{ zpbqZNqEd;58f-+9_Q(%8=CH~d@Q8?hOvZRI0NjrHG2wk%#)K{H1P4rC1?Y}c?`Ayp zFh;eKwitr@2exc?@xPbuhEyn*TOHCPWoj`#`1jx(O{HXX$V-)s_Z5aju{0ru(?!lz zGe$WCAD8l5F@Kn_+H69{iiv@X&ajpbZc|Hr^m)AWp#(~h>4Lj&;?TJ*6+?U#Rv%f9 zxA<;ZpEsliGqWp;ss!Duk#mV=8M$79ryB9yclC|&tJ;&Md84~TjO^QG(8DquR|&Ql z4FjmaQ)%q0jNWPD^u$eYhIY4(CLuR<7g+L4`2P1PR{Kg8_A81TA7<+bexZv54*rR| zugIQhQ@Nq5RmC$_FJ>b=zkto_u*gobuqi3lN1~Q8nu)M8j6#c8w$TAATS>)u$}VZ< zvf{`cBSL#GW=<9S&}7|&l=C8URh?Cw(2s{1*%|TE4}WH`!677Iqe7pZ7f`1IOClzQ zh(r#GiX^>s^}Yx>MI@}ch>G&KDH>qhAvIMd1DEbJRd9c`fmMW-SYeJ8J! z8b``Dha=_vDe%zDy~%78+!$y_orV3dt0N_Tq<4n6*2nAH6T+!C7hDjRTD+dOCOBTYx#hcP7~J=l&~ z*qrM4GC%cKPAx{kV5!ERje)61J2m?}%3T#5cuzZtc!3|Vr(`TZ)Sjv+8Llm|Q+aGf zhPa*RxN(!i&;^VWnt57KP%+yT6O~~X_99(d*=rR+U*c$8DxxrBCW<%|8Uk9w+2|(GjKU0Ut9qA2Z#G97`DE^n4E z7OPDC4F^w^zTLkoH8YL%g_A)TWG&(vHjrYrqDHi$$Gzr5ow-Ma_nWyJ{3?8eWMq)3 zf~6tZ>90pI@8)SMM;lzt-z=t86lqDe#XzxW`O5UTKn7YJ<5i> zfySXiu2!_;9bCg11jU)skIr`h?r3; zssTVe%d12lUe;i@4jwAh#K|&k`MtJBHMXL`_IYeSn|blG-Uw+f+%{&^5qr8%@5#F0 z*358ltu%g3+Zso<*MeSw?zs@GLT*k+bQWSc&K75s;M!SeXmuz+pKW9xX;8<`aoy#E z{0o+~n^j1Y3QIN`m`@K#nd z4;-nIP8J>*G=Fp|dcfz-y>X{mfA(sP_^yk`>X>=>C)J9(q?JaK`@A%0p!NWxsu{hU_UiWZ;otYcWK z^yaN{aX(s8nXhQwAstOh5?jBu4rL53mpVoL&#8aVDZkjG zxHKb!-6I}pFVC9()YU|{VS;JvE^|eRDGaM|B9>>~G_{4Maj^;2CUERmnW{@c55`=& zv;r8y3hGG)Y@iO5N3vZEc-Lp?9vqj?*s8Q5C+ea zT#W1UH`IV9TXNKWo;H~dojuy8V0ZOS!x_D1aj(<>7v>13&O9AcZ5D0&h$+xztXX>l z_9rWb)ft^PpT-g;5-Mijmo9c5smJ}OwJFp2Ie=T0C(!M*dtHU0>0M&Pxhn;0D*I9a zVRf8z5NqA2zTo>nWx2I#Lo(34d7DMeLzvN=uHI7|^&5e;I7?Rf`>p7=I39byf(dck zl?UwL2pkpEzhPVAWh))g?PjZ$245F=!KH+U%~IN2$dTz+owC>Oo_;gk-0&t4Zs|T! zzN8%+%|r1b)YM>6b)BqEIc0W!JXSVb0>n&~tAb^fhQS zU}dsoi;`H%n^8Zp7s*h_>vK`DHd2Bcxr>CrrTU%o5D|&`z2MZ`EuR$!M;E71(S=c2 zXn65+1+Eh*jYj!r8{<-kMj}m z7BdGc9aENK*%9V>s|ik`dVqQ6hfpu}Ar#-#0a7Ufapj<~f-rWjZ&V8OgI3BOi|);r zw_hr5?uosl$*^ZuU9|1yr&O0-hxTfCg>vniQAa1~F7;zah3t8lqEoD8i`+~jem$~f zX~TxYdZ|7{*oXH$7p(aC;HBHv>C$D!v0}!Gm7B@PoyW#XFZ})Ky9Zg@?dmi zz!deXHr0wf#meOde}4Lfom&<**~Ylh6$M%B_EeZLUsr*Z*0ua2A|*u3Fn96Zo4+&_ zJ9FPP)VZn~^L(q$oG*2qQ;z7G{0CkaozG{M3}$1q0q}gc&}`Vw;RA1NeFn(*n=x!n zNf7f`OAZ0+XIlu|XWGOTZ8AfT<@iHmw>QFEYsC2LpUsMv5g@z9!cGy#x10?~VfYq; z{R92>!{A}&yNUY{$9Xp=gkRP4rP`Jv2N>j{Ek30rz6LqV6@=f+IC8LUgS67roC=uFEYo)QXGOvv{xsievj9y zO2lB4W=N{WsNW?_xS1gX&%{5LgYKMf7O~JjYo@kzkj)QjCZi)0|5l(p`)Wzq4l* zrzOW;FVPh(&e)v@HS+3;L%74{3$f&81W4_%UG@hQO|h&X-C3_KjQL~x|As*kcaRM!L% zciIh-6^_N5vkvVfX1qQ2xNE1dYFA7`!SgUn0XBhO}7* zq{H{pS@rIQ`R-G85wGW!_NVExzM_Y!tJ0eOd$(5JW7@jz?y0a&Kq97EdsrSUrBwY<9@YV>vGlI8La&cYG z9_^dlh-%G6e*eOsq=&g&sD+}F%*@Y#5x1*90rHPbs^n4#aw++Ib~~adT?>c(_O{#6 zpNtXUmvby;?}sY#o%2gB(CQ+~Gs7;zSJvzANziMzDCiXA2=z#JLxH)CEbw{IiuG*Z z;%_~q~tISs|ll!uR=Rf;v6A`Y`f zJyXSP{rK$tOjZjChc&E0tM5}SDP_(D`*?7bAXLb{<56+tCodgXN_jvf*-zDe#^=Gs zIZ=jIp8=939}&kD(M^O%Vc{&kE__g4@@+tgO?Z9?*_Y7P_R}V?gdUH%H9ICchr`L*O`|VAttG1JW_c-h#A1T7k zF6b1>bWgUzx1fTD>)4kA+Iu|6S&^GsF1Y3nZ#ZPYWIO>{i8zPSkC(hjf$J0wNe`{q zy;t03o_QhB;*Znpue?txjCA+bx}29O2TbS4Ch6MAsP-c*Rp?iHM@lXT~@ zvvjQJ7Auyi)xCW*9w8Tqcr@rm89U4*v?E+vf6ihas_Zq_IBCwQyQuwnUbSA3AQmp9 zYZXQ0rfvj*+%D8$STOrr23tu2BcgU)i-=MiXB%|DPwxE2%rv+H~j_AmwlCz2v zi+c6Ed^{8MXLVq{W_J|zinHy>>ojaVc&6_)JwuJxt3t?Uwv^mm3;QX8=-h4tw`CIs z%w)14x>oQQ*hhBCTouq{GU~Cv#^s+2KQ?MN^J04-Y1hPR_{)t$o^i3<+NBs;CMji0 z^SW;0qnF)xx~_>@>qgzu6wy0Jy~Rz5nX3MpEnWTLpK^^1G<^=T6&h~}C7Y*JXV}5@ z*tQg%(Ofo~2?h`(ynBM@xma}9opSP`u1UX#Q`awqRk#gg-)Ow*es6E2qwf222T3gK zU8bmPlm@ntPQ_*=(|ICsEqwmD>&|xd0cnqHDXmyp;(DFT!FfD^Xz-TR+z?BvOzF8P zs+?cKw71c8QCfz=^g3h+F|s4ylu0hQOhq26)kn!Ud?!0hnubyE(K&-uLoMkISu%T} z3?19Y$FmRDO4xgj>I&V`B4Yb*!?1u&DLzq&qFRjfyjV?a!Fz(o-~j6Y^1LBQ1$~Nj zwqDCM!qg}Qh+QX@CI=(c(o6&TPxlZeEe=|XTVX?^Xd?;B5bV1WoqG|khdy5wm+YVr z&=Os=r|iNZSBQa{3sLatzB#jq+^u$K_!V7fer#bF=aje96pl)$%)9BUMQ3KeG_r-P=K8i(f!=>(JR4`7L@9($Dd=3Y&Ok4YGZ3R2w zwK*y*qHnwEjlLA%DPR~!j!=QM!O02%ii8=5}E1xRbX$|+Tgj0j& zk=1TE!$_yd)g3c_&D5Fwtx|49Qd|V#Fg-0br248WV=L_Q+_32Ijuy{F{e zU6|yrTjIk-xybdZx}l-y&RM15Tey&lH|aH#Z0v5ot)wS(o6H7yM%5?613C{pJBhVi zG*xokrg@k9^v7StFm`^?nx7`5?FwWYRzlcTPMEvfBgh-(JW&rtA0I@R`|NpWr>7A5 z#_4X`Sah_Ix0AJ9TF7CYs|R+e)}`Ryq%zHI?K@JAP3N{|Hzh)7y3v(ZC5Z%c%;X@# zL?NM9i!86L&W?5`wZ`$N+GmjvW1eseZTl>>`ex3yjQqw0bDvWf&h1(zKaidXRuD7a zE4#a385r~UYr0pPI~r7Cg}u7KBiEahi9fm+8$Q7VZln0SI@`Rb>lz$m?|Mk*_7``A zI|X@@54)jkjJN2~g;2uV+(PCN6o<;PtHK8E3N97WPC z&wP1H(^W#Vyfd7F)m%K(Xt6}lUTfW8Bn)@T&b$4#Q=?jJO6PsaT)jx+IpVLnSxH=a z_tKJ`HLkjp5S+7NYIkHi=NsCm z>SElro$O!}@TGi(?`bhF68zbOJdWv9NobtO64=oUac%qsz?#@&>($5hy4YR=JWthT_d5d5N`5Oq-#u9nyV=6nQvz*+a?8;yFzJ zv>7++NtT*jFJEpLmDls7Fob`YfgM9PZ_n>693r7MoAFU`AGgmEjWN(qg^njmxd;WQ zkcNzVED8~NK@-m(LAO!>Yaw1IzHCqBLzA9T}Tn<|W-UweK=Ba?OudYPhEd z8l34Kv6an(0_T;Mu)uvh$VN$)w+i_Bhm_uVd*xY(UF|4;QkTS!a*9`J*UL1K@ZK>RU!tLSc#2*pIayKTc~}YBt;sfV-h7mu@)aWa;7xd>G37@NH!l*PY zr!$O==Zg_C7O72W>wftdz6^Pg+2enuuYF3?sksRg{EO2LbgvPPkmeMFHijtThVdQIX0yoXgEEPgt!^i-(_X z?5OcSfK6?9p)S+c_NjUcxKnMJM5FQJA&HD#0xuRxjpBnX0@AIhU-PE$4q0fnCj$Cn z44ykw|B<3VHdGIAUX3?04ar6|{T18`B(hN&DXo~=N`BGwlU0YBn2oN+=IvcNV6f3U`p|0J3lSf#^dxishl&yhR!8@WJ@9WrmI?O>{i@U6kPXa<&W-oGI)I z&X;{-zxrxjfA&|DY039~Rml_rdyLA@wLiz$nk-CpC%hXwM`*_XfZz;jk$(4nl9uH~ zb;`gLS>b-D8A9%yjNk=bh61*R8y^l4&dLOi*vsK(A)3Pqw2PaMQ9jnESXH8fZ`Gq%~%HQ02 zCdH=*5~4f#;gb}yj=v8%YiEabeNP+2W)fZMrEXMU9lJ&ovBB6GmPm|lv_&6djq|-Y zIs;Wtc_bRNeAC!Od)E|V{I%qmjV7~lPvU;0|286&o1=bI3$nHa#(yrR`-@hLy^@LE>`Afo6%7k;9yj_C`|V zCV77BoN3ANZ3FKf8lh-Afbah#@$!dAXrA^_zxtJEMGw(Y(R&2fkLjmY(Wgi^M;a;Q z$Hj+iAitkZY*~*+V8QAyR0{pdmYb9m(zR3~mV&t1Nu_ey*|VXXQDupguu5NAPq4wj zT$`CurQ)rb5pETR?AoV}de_~9zt!J zr=c-jH3wY(%?^sYh>;1oER0|hn%L!no}Z?wY(b4yf zin;5{poMbdBwD>+iA6s%lrm7v4`#6aU@=cWjmb$yNykXl4!1;KuskG}kUy}m%yocc zkoqLa8N%FGm7{!KOvsUSzGb!e6l!(qzzl)ahhpdvN~=(RhH4<&X(d+R&KRQC%)6svVF#^-T&^DVbxBgIxFqH23|--RGMpH68^n4qhxYWES9Eg<;@jq)9yMR1o#)d2I4+I-1`duhv~G{Bh|%!d|1EltLj2(Y!_B}6$T$(FOtb1t@ zUUSNartYF#&bb?jC)CVhvFsAA#^1^O7x}UQ2iX@!4XpecWqS!Do37~eXWA6t^`O~L zG0SaIHCj{)3nEaf0d7GiNvirqNJpm&I<_G*1@%@;uPLo}Eg?}Guqu)X_BV>sJRzM7 z8vL|O+Je>k`ZypWv`ld$QK!yUTOLrR5O#sNTn~@EQI&!Xw5MS$B0UC-0W~xrgFaKd zDXr);KgSKJtXGTs8EdJ*J!VA(sO5BNlCUOtsoiEQQ#I5glJIFTlwEZtvvf;~OOe`z zdta#ErbnGxeg-oJa(c=4n${cM76@RY_R$!zb=Xg`I78fcuUvCuz~}@geRUa(SgWsF zq6%}|xyA2)Fdi||3aeF2)bsXeG3Qt^7GG*K`usec^EKVCKYk0hA*volRH`%~wMFcO z+F^q?JtSq@;3u*6lOYj+n*OW$+WIYwWYOT)Ci0omKQV0tzVSzGE1jmdY9V)w6gm5; zOmfle^PVR&Xe|u9;xjp)WTKO!h{5g(A_Q)>5zIm(PB zliK46rdH;2->}SPg|OAE-AMdr%;Xe=tk0tV(DYBuP z)4J6JqxlDH9Rdk=BnlF14MtBfze@!PYHD;TznnyIIh14OBDM(HD$k3D6UHb*GjLuGl*u6|QL-RTUQk%CkO15Dkz zn-0}vt+Us4ikzr?MHUZ}8GQ90p)e4ib^4)S-L7<^PZ2j!eP zI$|z$dt7%~>IZ0#A1OceCbuT_V@q789)x*Z?PYZ(UC9_$R6c*B`% b!`Owevaw0^(vocX@0TpMMd0VS;aiqBhT+2sg`EM3ZYm| z=YMbl)=T~YR(${Ro1{b$qg7VYcl|hi^>sOx9|wFms-BVQY7LoPq-jdP2RyBM8Bw;E zmpzTbJv%fN@N#YTuE~g}IK`ivc!5;(x9~?7)E$Dlh@T#^)5%2`1G`(kx?xP{jlqs%8=M+k>N()#bOG#XL#hUEEjjqn9wAc+LlgV!3wsCdp zg`c6(rE?M6UO#V+YBn}7^h$XH*PlhRevS{1?0y$cQFny4kbi$e!-*g2P{re_-D5#l zii=D??5xF)Xza%lny(EiNk_EM{_}F*g_*R>E$BbI07wZYRA5fB`$(|36l)>gl?zba zt`Gc?25nabu37Wr0srCONUY@VzqNz}QCS`?X!1Ah--TR;rFtfC7D*MMkhsj^kP$p*O2n$}lX2ie6BYS}w+V=)c)aL@oc3gd? zH0Xp9ISt-qqrHyLnnSt1Zux;8IM1v!I4kryH`4L~Pq{WqCB%w2Jdn)RN7uvz`N-2yFl=2RN7@SFP+lh{<_iOpNDY%Wb>!;d5<~3Q{bnpKnQ3ixC z@UK#GUiqQC2y9)Qs%>^!G$F>pWhfGp{91$jQOv*l%0__Y7eaJxKXcbFv)sO3N`NUS zj6HwiJ)uCAGc1h6d#EdO+frDwcV&K&N^g1#?7?Ivd9P-l=#w zX4JBOef6zA07yFmsNa6Us*S14cVrjK^bG2MPS9mMs4G7y;!NO^Kez`~4sjRSHUQH1 zB|d-$Nm;k@n(fz{TKt3LvRzb^{5M(NR`7#9Ch1|7MJf*rhj(gQ+Ai$_G=GJ>CA?(+GJ6ou-X|KMc*>vS@M2w(LI76}G(#7HBs1#e;H)gqKGNbFWG zv8)IAwUUjy9%^9^@mds;^G(&fnWf`+>Q^sOUDwHoG}~D=BHxdln9I9C z&4#6oVoEpK!*)wG*dg>voXE@Z-gZ)cqx0LVwhz$YWR(zEzO*}ZB-}qa<@Eo>Z^ht} z*x-aJz;az#^%M{l-?P0GS@25|c4-(-ZqNp#&Q8aKTr)~f1l)`)e3fBRPgQ##j4J9I z2tOyH2545NchwYg&Pe6x5`blz8b^QFsqUP}UL4g3WI)p-fAP`O6X3A+DhG(? zkoe9<5_@JIG?IW+UDppTP__ul@K~}8kIM@*xfekxk@%QMARPQ3lcI=$3&|(IY^M=- zIrI`dRgrF=Un-v4#~R{lLDg8BfEJwnb``&mn=i-6Aq6|Dg)o*Tv)X)7oIr;#F$Kb z(ewQW)x75ltC7X%+WK}%A*{Ub4O}`xtsDH@+PeBRK#_62CbGHQ_)8G~?LNuy8ZQ^F zh+b9y(e+iog*v_bDY;92f@n)bKfDi58r=fi6p-rRyo}b9HuK7UMs>`oW&ASzH*uC_ zvhYtP5r!Gih`L57#K+du!LABo{PlFc6j5Sf!OOkOLA-y3WA8)1=!mqXlOM%avi%M7 z6EV1l&+4ALVIKTD0RDF_b;cQ%&gAU8)Te14!jxyzGFtTEY0Q`p{D5XP5AUtV{db=E zSM(P6*anxR5$S1-m$RmW|0IF`^~f63ujErTsCQt;zf|$x|M1Tt@h@t8AW9rmy?DD< zvH3sV`EQ5+Kewx6?!e1g^YlM@)4#R~?W>K*%AN5v{~`Fai+!u+e>+mdV43Vw`di&R zqX9KKJ~W#06=uTr!VjQ*HVCxM;GWA*$5Sv zE*{^LJ3r&5zlx{hbUev$q)VJnbhXyk4I^WtkX5u+90*((H zd#UGZ(15{9pbk0sBD{3B$uZ4MbBg8t2de>kZaDmL+p8XN{;@@Xu;E-e1b{^?zEIK! zkCsc1MdbkGCz49$tELig#WBTi^qY`povYTO-ncCrAkf+!9ju zTo#b;N06Na&Xolw7lDfRfd4#SUbe4_uMg+ebL2bWd#)!k_5*7gY`wOy5C2l^>(q5ZBg(13y55PCL}#whP>33P4I+ zJ82noT9RE?pnTy0!J%t+mSy1zKbKobGZ3W8xXs{F-(O5%#ofL9u)i#42~eg24ULn< zwrtl;VT?~4GBoP$7Y)P+t5M?;$h&KfEuXY;SAM5^v_8N5aIpxa{;eDUY4utzOmo^H z%U~K?QM`DULD5Tnz}5kx2h=K4?UzD4@lMPAH6f4p%a8jHK;mKDZLQC3tz`N9kI~fo z+0@D7C)74euHPGHwM<4^??S8b`igwY`EtGfj?BLT$%8&;>PXghhCVURGMgSxObq7xuov)-dmIc042@>k3C zuSF#$_Aj&#}0G9}*PYF!l3TDgHk-S|704z3;^_}H!=0NU} zd!EPZmJN)e1Bnixr`Rq+1KSS(B-hgAY*gIkshY!lf8_)%BLD?_<1W$v;p;8KqH5c| zeMLk{85$%9kdOxHp@wcS2v^C1|8DPg zf8h%o%$l{%b*|$)*RlV0%Gk;QzX6ww@f%*}zk4rJEYuV&m8Crcy}#kX z`28$Q?9b3&W;ptGBbvGdF5ob=4WB8y8A3rc9-Y+Qwn)6Y1HAaopOf65X5aa4@({hC zkfbY-!30W4fenMpktFwE8sGCE)~PdI@nhack$O@;efE*Q4#8v4cj>^c&c~2x_3wPw z64Oq3mhG2C`i@Iv5}A z&%f5trc>RfH@$0(en0^+b^~d_wb*h5sxsX0{H9oVfdWvB&2QWSmv>>;_mI@DRAdoB z$Y}mDTYni9PO~8daNk>Ss(U5k^0`iLQl70S61ygh2Ku6 zZ$TZf9j4)NCCzo)zi_Q``Wi=h=LL5IpjI=8mTJ7|DZW;0c(n42V6qY#uv57UxG#-t z2mVQwsd{*yy8G7s$3`$p5^4X#3wVVJ7jV1vg?Lic6cbjXW|8gNLz=tNIv~a6H+&H3 zGbkKBP7{Sw&s6nQXZx`uZ9$eIN%g7gPV~ zf2K@ig>bwK%{&j?>-4+stTVhBH{AUTFu%;W#CBR``I=VBMLA;+2qv{&va3peh67~& zE^tQ{zjk;I4wd{Nv=%}iwIK#*9;4!{_b!0hK9gU$28N5-8gej-H0R00KlBLHbi`vp?{=T4tEGMQvX?f{RI8l?dig&=D!5W+&!m{%}oHutoxV+ zb-EdoP$>7CPAELiQKs`iI;wGmtUXmg`VNj#^PZhv4xm>^`0K!spELeb~HL*+#Fp^f()yV<0 zJQbcf51yLWFBGl&$$1f=<_o7PjpZt1eu*Qm%aR%jmP>sCS@p6^T9noS&9gLL4R;@z zE`lM5i#f2-c;~Ed;k3wOeD2tl0ON%q?kP=B1tvIr`@BLQP8NWcNrJ4&xPkOUX1U@U zY(o~{9(XSWDy%?%pqW_$T#Q&&YZ?S-g!7wwYTlkG39UprmG@eTrE1GZ&%nFO;yW*P zD8-r^p2+36ii6ka!EZsYJWMGx4H`qA-vQx&?= ze97QBv*A78kE*dLMv^E!S7P~I(hlIi-66A^JpP>e#9WhNh%|i6u~9r0bV*hw4-cAr zdUb<(|1ckYB!tanTTK8@wJQ>j_{N22Qt;$(Mzl4i^c=WZ)pkBzbx)}x#ZJdwZHstJ z83()J0Vx?jvS!P94DyLSF~&ux)m4ywqQXn%UQ*e$Em@ndg+bk3I#yN+|8ItdPk( z@Gq^RYXIUu4iLiBR(KsOaCle2C3@6oMk-b0?&wnQXF9%` z)g$Id!27&AFs)xwlt{}V?dMmcIty$3)xYmy9(7A7>#P_v>Wz2`Q`5;MnYxbD4=~5| zo!UgLAsSw7hS`)cz~jmr%`+ zDBc9R8RlV3Wk1s_(W4kzG~MBgI`;(A0OAj2%OINsyq+!8eBqIhmn?|&=w?*>W>hip zD9(j#n^-23pfRGR$bSaiC__4`X@UwqFH|f3@7@!w0Z5o3Q`UfhA)Iu_0@`}Y(RY1@tHf{B+p+X{&%`OhfmBd~T?#>mW_jcnf9Til1mPnuix<2kUPbb1NYE0QDLAh0+&!gN&jQNa zKdNAYE6p588@rk<9fG+i6IS3~yS^kkY)Sat zk<1OWG%s@zg}-$h!V@WTNu-L=W3vFT) zC(-&r$2)1mn9=;%?F%g-mcQ$o3(REc5-*s}2MO-)M#I_4m2}c0e?rEvB^ALRnTKMh ze&3@^gg+n-RDHKVHvE+`of}6rhHcAKeG%SnLbUXjNMMB`OWNe%@rwleCE?qS`uZJ# z^Dh4h#p^0HF>b1Fk}0PhD=nYp4_8Bj>T< zC%73cdP5Yb(1wlhL{ukbvoG*kQh#%;R za75~pfkade4sxaY}Xxc8l;60OB#x1g(uT^bVgVN-UZIz4d^uMMe58l&5 zu2qzxjVRZ@OT#`M#+Wk1lRjZ|g6|rLd|hvYQ&g*L>{5hrPv3Zvxc;p1==_dD0G@x4 z)0d4T+4X^mP6gh67K;dXl!nv{6j-X}&Ed7&+tQ!l2WgV{(76hDQSn5CupMU5+e$Hw z`!-BEGQ3P2y4#F$odijjE*YL>+JvA@VfFl{ZSj4~}zjTQ&R+QnY>dD$P&Mj)Y zgLa=&3TW2%a{&7evAxFx{trQ1UFv#|$1v_IYHtfu%g`2>7)9A7ustBdE2N!ZMt~D2 z%~W9z+s@8&h)Rga`(_Z$7)IEZN(CD4KfHDkJL)>6hm7;58!^Lt@!HX|9vhd4`_5RR zwO~tJXo(GnmN{yy=_ux5MRU%3Vu~j=7>hF3Fg{{L7gqeR`NQNM&c3jwi<`x&=wTb7 z00^!jhJyql_-x#-!taOryk1F@Dan0Y-d&D|GRk*LJ6K%8eHx+Uu;Tw}d%u zC22B#)yQU;bP)3MZClTbYs>`BpnJUI)Tk8*JtKWxf@vvGNcO#u1M~EA_*R!c=_kk6 z=ti(>dLt6{@&*j50yy3@zwrKiF1}4jlI9q(tSj~9!@*e3!Fo|YPG6)i58CLQNz1;N z@xX&!YGA8&rK;fy^N+kZG&)M*=Z6*$=teVb11392YiQ~XS~&F9q&V379c?C{_9v^o zCcFS!r$Wr>`hb_te0q1?7^@3r%m{JkWVDUh;(iy zY4IVGBEw??S@HKi(%Gqa3C>4Jm#sM7X0A* z64%AqgxL#~I!o&m3}d~z{fMpih=m{HR8w0(G(91K;u_k6j+#N6cc3naA*QD(RB9BTaM znME8F>vKicBUdw9VX5sM9NUw&cRNe%kztPj??*NI2S?Me^c>a0?jl9fla$}46p zhA(xyc-z)zxHVKYw(hqczBt=f@-*NYp#2|Vd}oM;y9K7BD_I)66pyQKbkewi(alYY~#5J>>EvAs$X1Zvt6H? zDJeJ?wG|n*pX<#Yg!D}3XLf-%g|81+u=aVAM|FaCL&ZqpiB()}FkGe^%FyGEs8Tyk z3JI^n>=m$$ffEvHw(YW+4-TJTilXt|TF8#9xUv`zm%2}YQ);odEZ|QQi}4Iou4yqe zVIe|!`#}PW#}{Vu`Jj#mH&5}_G%e=Tyk|9iGu`pF+w7+JMRhUmO~$m^QLAn@-dQ1c zgj3ke32??G$kg9=K0TY_BdLvc7&o)L5%`Ar(LXMv}|DepC`~`nj?%a$F<|*$sEsj`BV#2wYMZs}KnD z((VB41AOY59SCG{TkcWB!8}EnH!sY_d-_ILdZP%b9-@R9{@KGsSvjhvH{TMMfN0A_ zQI%=}JUHx<*IaF0)1irF&fF4SyGMiTL^YwSsXtgxjGbxucm{OC!YO6keQ*?PwmLBA zZAw1ukb;Z#CG1w3g4AHhOOV#EHs!dH9J^TchLA2H`QT`Tj1XG@>6sDHYSxM=Iyi?O zw>l$|bF+aA(lpo)HXSdwb1D(f`uR z^GgbmXLaQ<3GXGQZ4z-#4VQY4Z+&kE8$3W^8gi7*6yg*#Ocy6lkK5w??)PP%h{3z8 z!@jy%uQ1%sV`HHbQ&9Hy24^ddBXtHO$J2u>Q+Lj2{xoPZ6PcQawf|&Z(73?*vFq_b zb>_fl!(-L&`Ia!Q$J8Y+YONbqU{A0_NBB2KIvxl=<$PHCJK}x^+Om2@lNE9+V?*&| zZ$pZ5TjyW|3u=$XYeke@VZV=6hmJ;t@ea>rUb9oBu8k#{L4_+#64^>hMGv)$HzwJ;!6e;49+ zJenRfYO&3`fAi;>i&CjS9mZQt#(o89S`{nZ(OD3quCwB?dD+KDgjpEe8`i$}ZM3FQ zY0q+Km5wUEh&FVB1>;3&C&s2#c6{8}{7NM;70a{7n@msU5pU+>9P^~np4_=UUsN&U z`9)_%z_K6Qop=AC=R}yLO__ZRx!Ag=Aegj*INq`w%(5vDMUM6q*x>H}+CLMUc6J}} zP)vP@j@xKlOFn_e(%fPn_vAtRgF&!nKRLDde)T|08`^->;xB2yKgEvD4OYWt{p6@< z@R}&py#A|R_!T5hLBxF!Dp5oFN?oOcnFcC6K3K_&e^$!yIM94v#P}$SouY4wUEtK*wq!&~P< z3LLtJdiwZ?d4c`9S(ey5<{tgi(G~xI+~_|S&E@Yqsg9Vs8sGF9tU=&m-kD5C_dWeY z<<7TgDyYyI(q@KMJS?&EX2TVUOcXq7K*6>Ab3&lWVbic^b#rL+`|S+nyz+85bRNMt)`JhuO|Ch2`(UFA}2wj&X;U8hn6bJ=*X zD2p@_l>CWh#RJyXgh_8Uk-v$c&j>72rtOSi9qoyR0Kx_ZV_2xNh~>v!#$O%QKa;ql zqrT8k2X#E@UF$b57~&+Oms(p?ARV9d#K4rZt5RvBS}j-}ZKw%4oFpSeR^Ucmy389z zJU8x2)f6zG&qzAVIvvY&zpmdc3MP||8z$c5@8VtNj3%$uAom~_oBdK{!v_7?Pd~1g zD&Sp@H~n29Mgo40M+3qRUz*jnXh z(SvAeC@EfCxMbw7=9;~RQPqZE*C_K-w!u_tE8Oflt9?wK?Y#h^5IvT(` zwraZgkI~3B>-t;*oj6CMD<_i$^0*k^;b9`(IYtso`;cx+9b^RtC35dRnR+sU^Oq`K zWzG~JKV-!`i1U~_wFoq(G7d)oDTZG0+n;v?DF2A9~EV zM-DKIH5VExtaiU$o&WPrqV-@KH!t)_f2*7;u81QWhr(_l?3H}Uf*8XHb;_WZ!UoLrtAXt? zd^I;8;wAAtiMknQZg%0v3^q)IJsHo0b+P@$sb!1QxbdPDu*0uH)Ro$>_az3yV($lG zuyxkRX(|w^5M*#&4%BoM{ABxyCmH@`P|4jKu8H9Za~d7 zYG2`W6JBKkh5nW<7$EHN_iclhtCljire-}_gE9mmChB=+ZXk}h^{wKAe29SAJpl!w zLRjAcG;8BiGr9Q5>3nU>0hg>;9s^n()_vh%Jt;{p@5u;(OQRba(Qfp{QzP9IAg(lo zE?#Rtg;JYQf7CVFxVC6eJ+Q)}YnX|pRoe_rZrGrDqZ($!1**-xg;AGgFZ}t{{&|SN zW{V$B4XA-$i|6?ne~z#$E%J_+rm^n;A=}=6r8#B`8pbX!`fjL&p-%_h%B3o%ncUy5 z7BB^c9#x8aMTpyl8n~$*GDM3_!U_txY-{8)C|n7I+q3DO{;G+V_{<60oBq%}#golG zL=NK|_Fn6*_fB( zxXXM$Is=F^xK-QNs`6F6GL)`A?xMS_IL7zCjk&)jA0A=~WZ$S#%_~SJ@E4}%Q<&1) zT7=$07x-NnKNqLGV%4I^#j%Nx-M2M>Tj;w?HxeqnNEW&mVe}P`ON=aU<8yCMz0gCG z$3k0A*EF|d+!i~AB;^7doH`xgw7+pxMGjGWAdW1!;Cb`pcat3g7`MqDE+hxO?|8#| zz~*sNcz79S0hOJl>POQi3eq98<{%M9zJlb`$RzvX%JhYX5Jvx}h9TbkPAATGn%a<( zPIMMYjWEe3b_!!Ff=~pnWVkvbIE^u$jT*`fWv*qjmm+vV7%s>KYQq_XT5t*A=fOY* z=EAQK-<`FI13atC!W=Ff1}0Nj#P(pFY}&fZj@a}~-GxY6Z5B;I z3>E_aVeb_y+o+4R*0LUnQX*Rhj_@Al1!dwdubmohs2yy_{q~HlVt3K|MWJdGa<&8d zE&Ypwxqi+HrwM+hdwP1!9J*$vk=|!@&teto&|5+cTj;ybP@ZF7J9cv?wfZU02MBQ_ zdpY7|4h`Xt&oq?S0i%edSbxi3Wm%sY5#{ykV`_$dm%>D0*?Q~)0(~zTMg5k8)Zn6D zoq5|94nBFGR#$x>_-e-FquJm>TbH&JL@k~HPI=TSH2)@E zIn0LArVMc)!$wvPGpiO703qwiJtIp_QriwL`MR^x4h^8put&_3?8CNwxi#FrwEh)T zwcyCb1fj_nXImcbsbopyn6X6LAb8+9;Y}Bh`BT%AXN>PJ9WLV=C(GxbJ3Ti2w*GS? znLD2Y*pAT)Kx)nt;>9NuKEMvA0NVcL?1nzpdxw_D^*=Puw}%srDzR$<5w?(%xqmhJ9O_G!wS zTgOb~tA!mejXU$xD`vt&6%SKsv8l2rv)N6&{7+`~EgYvq2kj=V7JnZOnf8TWkU=)K zit+f3pU$SGH{^;bL0gz)7~sBB8nSMf60B$(@Xb{Zs!{BVAR>#6N% zDwmc5k~TH9itv)nBXZM5XG(|2R1+`0m$p=~(Ema`bWKqgZGkMh?RowpcZV_}m8ZlZ z==Cc(yN(=>r{CAeH2u?6e|*ogT%R%zD$qvwL0P$`e4@pv0Ej)zlZdGm$uM5@Tk zRUCDyRQ6)tLn_Cd=H}&gPpgmW#QgMgK6%kaXoAPnwr@rzW$*eo>OP_;*!&E-WiGOs zu`r{~=qfC1WFp*5wB-q6SNxH}3fr$h?mqF5gD8*YS8#hddS~{E37FeH`ktEs46Plp z3bpudE12zCO0>R1o`aM+-a6CqmhClp9KrEGN)?bxg8ehsYegYG|TJ2VO zV%47ek3IZ9#44HXuFWzyfd|^EzW8+lHO9E(wXT3EP2G`yfLL!^2+| z1YcTtjkTrG!gT~$lwd4__!COV_Q!9%x$$*mE#^9TR#!?Fpv@xnU7tU}o}q=)O0Xd9 zagrpCj#X`*Id>gwB{LEUg13&Pb;^5&o76J~bcUx|^Sc(*b0mNk_Csu?#744|>}Y5i zrQ4WB{HxP;XC&DDB&8?v(8XEZHzo953ky^!!b6^a9)nwx{Ek79sY7;|?pbn~JmQG! zHF-W+Sd4Rh1)NC|TcLsd>FpR``s1415C`-nk#9%(8Qhm3cRFAEU27{D`KTAyk-A9XiXmYXjhT8{Qsy!KJ1sSw;uKoG^hho#djd^ZPDW8=VG4W26{$187N%)dO)R*OXLTKCbv z=}`epeG>0iGqu`=Hh!``&-^$`iYfg(1MXB#FHk#*nVqhgiQnZ;`8_vkCUVBz&~HbG zy-da4nlhwIL=OYr`0>r&wr-z>ZV$l%O9{akozcp3{M=u{^;+nQt>sEE1y)}g-0f5@ z24$A;%vp)s8kU~kwYtG?!Sx*AEw+RnUaNL#(o((?&3K3b2Q9W3#w0?9j5Ls$MB-g9 zxvwEQ)1>rCDdyo+jCT-IhQdbK9&&WgRJ-_Z=i^N9Jx<+y@4Cx^X$0x+i(*P4YD8J5 zQ~6#qH>4wo_3gvj0A&pW?M&@2uv+kJkjWJnSak&a<67j{fAJ(V@33rNmVFi6BCId$=%2xxXnI@508Kj-;2upYHr-7WyYKVM!*yF^Ad{m^Lorq@?4ZF89f>ycj74#bxmo$M>bK_~;JN|zsG zFdm*Dowr!qg%er*>7j6ol!`Yuqe3RgB&{+g*fKh~Qf=!4NJs=q){mftF~#^6fwizk z$ZOO7HbDHJ=F1Whkamjpmv0@?ZDms}c*ty8yw#rAu}o(++*s12U0wDB55m#2!4(Nr z@Qm_2%sbSsD*Lz4v*?)62gUrXKQvZ9t=-nE_b!Kl&dm3UIN0IQmSvJw}C=|Un)KBIY| zi2Im4$Y;UpbhW~#vGqB|mSCzZkNWTvT};r;XE7#RG3Q2wvq(omuVBP7hCO6Cv~8w< z82lYGYBBTY0O6z+R=a2C`Ypg6xV^v{iwy5@T&{M4K%SBZ!rVK(Taw!!sKR2-Kuh{w zfbB|C6n~ZeF?WaX9)eKy+j4GML_enJF7;t9WIz3*O64Gbh4$6zuSmV)Te?LPV}^BL z_4A(%qdQN~HR&b_Fs)xgm3Ne*5Y!zDL#;L*65Iw#y&rUS`Z5u>f148?btJD(!mxCk zh>Ziycz^S!#Lvi~nU%JJL)binre`HeIgd)aaTqGFosfGTO?9et7SAxEkKqHY3d~RN zKBAhoC*I7hMDqSJ_@AdyXtOG``6`TTBndl(L~Pj`R!xg`B6$=F9%Pu2{;W$&+lEdR z%D`Ya(0-u)xR|T0R_5V~!x4vKT9lboj>AXV3IyVb77Y}L8;M7<@AF}x<=k!NWf~;G zCkHv6YrZjCG5%A^P^GSf9_I6=-aYoIq{MU{p7We(v}jcv4HpdPkkaQ42Q}4HePld+ z)7q3s8EP7wd8wP>B)No(T;DI0xu+ARzWkWckmjf-lN;ShDW*81Vb-oozwOf*L-1Q0 zh)4mOyiwW<-w_vROcM#mA9D-bM3PqRb*g7w+|sE?Ro#T%v3*chC$2|_&DhwNv1#+u1bWcW0Pti$HU4OLV=u7wAFM5G5UMt?Ly+tUuui_t*mbTundiL~d)f zG9V!cb5b7iiOH#lcx~yofdcq((gR(_9C8`TkdG^G-p{G-P6i{Bn@Hu}Kbo=>J5KrJ zOdFxtA@6yZNaeTjqH7P<6jTW^DbO=;lv*rY`*{+~t)XU|CD!ohH%X^@kKO-%`xwj} z2s*S=uiLaAJ328r^Q?MOo-aDOtWUThp4fme@Qnf=lG&{NB0tVLd@1MJoQbbTRRR5s z4vle6p3C?%7!Y@2(z7(Ri^2LZzOM;_XVEtqzYAwa$SH^1VwbMzfioe_Z#gxM-?hkk zdfDaGXi-a<<~$vwqqZ~kTXY+nm}|~0*f2b?BvB)avmS_D(9mXg$Vs0qu0|#;BuPmK zKgh9Sh77D#lI@ztj(|#zDioyNZ)7mm_X9O^=W$G$?2q5Y8D~tta3T|cE*V;*>-EPr zl$LsA^{Xl&1*-Xmc)Kg~ z-97Hl6)hq`)gR%pNmj6kg)^ZL8;+F`>j+c7aD*v`cLPKWpN!53 z`rPNO_m`=!e+O>~2RiIK-R@V%7~OHjk%)KIwf%P1UIEKdB1HtY5EFKEX|{*}B2>rW zaKqwbhi`37P6oo5CVFx|6uvi`>V6Z}Uj$;<*BSWk6GV$OA25(^nsd0Md}^&EiMjjR zgf57QDc|n|bTHPPsQ^E(exlqpd_5Q`vM5c+#26KcM_jg|HMw+}xP~CzjcLHEf*7C6_#{A?GF+cqm@Ifrpu1J=}Ktu|0uM4aoV|= ziH5C+0uT1)OZ-29PJp7Vl*BfcjvDUETzS6g*I+lKSw_P za8mAKj;==ap!0FsP^#hm873jv1i`Gy?$~2mq!3Jxit#UH75{1bCA<&bAc31mfX+Ce z5?iDzq{b2wjXGS%fRRo6@zvOR;4lAm_AmFp1RSrPS2Ghk?*YC`b(JgQ#VXCdk0)?l znF4d>cj4~;S_>&ae=_>UF983P+G8XP;C8A3?hN!Ii?)!q9}zK43brm7E)--s)8RgD zrMY#i{G&}Z{8{SaNno8Q=RZc;f6$OK@X*ul>9@2aMLw&nljDd&XkU5y?GU!<%+LqX zGo1UPM_u&!_|cZB*LL+{|KMDL$(XdweI7a9#_~qA5*0F2SAbh(=@X3#*@kiZHm-t& zA11v&Bn~nJvVd;39w!~Y7gIOuY&%RCah9Gs9QEtZe)0pZh5pv+JRi6Q5bKqdMYKJ4Tw-yzyxs?T>Q?ick|2boc@X5fAsgCX`=y#M~1Bz zT$raN(03>hjjbmR55T?f_D~(P6W3^eH9kKwwd$tFt; z@i|UWqN$AMR_CZdvhJRh)`b?iUBJV&Ah!SV-v&Mn^b=#iWA(sVyRI?hQ6Xg<3F99( zrM}=3mrKTsN2}Jk@^n;?g>8bbr}xl*x@k8 z_%lloIiV+}b|{^X>rV1);{Vn+B7}bloN=5F)F7OK0~1q3UGqbZ67{d1K`~wB)_Y9F zx`<$o*Yec=xKtVO&pQMfHAq=XkP+omQ4^9)3)&0E(`(|uI6 zHC(qmX;mmFBphdB{cq^lAU&w2gRX=P4W%sniR!Da>v>beb2^6VQ9n&a5mcYN`h-2M0Sd^v zVIGAaxRH2E=vbz^X?l!l$hiemxodl%9*`)-)!Zq(X|d*&s?gWE!$^l&{atIVZB@ZV z#2zm|9R%I9(x8YEVc5-7^o_R1aq2?-Rk`?8`QzYvRDRyf?p;deMao{qsOn6K-$XP8 zfc?w?kkHnHC!Vbo^Xl8*`skwsvr$wIteJZ^2*oDPMcTW5d2ri!R#`mW+Hv;#jJ4^A z)s8!U|L)A;PBSyfoyZRbum0>cI4heor9MvH^SfR5+bXq8bLuc_T5jB~Ys|mu&b;p4 z1Ey6akF(#FYCYvB4DI^V@b0v`^xp|J{r!92bHICdm;2)=he`B1st7H0CcoT7@eQn* z;@fR?0DE6qoZ;420B<_8X`0YK$tKi*KtT`J%sWW`6`FkqS zW3P7I9TkY7$-?+Q9HTZpTI#6wgmx_3bNneAOdmilxDDb!Wj_eaKK;6b%4Z0&)4f5Gd>+T2kX9j>(l+GS9FSJK=Q-b zUoU%SD^~0o3h%!12YSKx05ju8PM<*2MgJV$?H@dM6ofZ-v%7F>hXk%_6M?PYWuD*L zL6r6E7^V2M5WW3a>|>s%Hv_o#aK`LN>!#Wn%~zBDy-(94n}O%!t1Hi-uQvMIZ)e{A zrnz0DDKaf7&EWb2P(n9vsPd~TO=e(+V8-pD9zZCFw6=ZCQLrfrfO+YYz+H%vHv-e8 z5f(5{=%N)sUf^qE+(+O=SAa`9%DNtG8^zjmCGX$N@9$;+8bepi4AijQ^F5LCb4}6J z+0f3J^YC5w&?JZsCPLd8&AfFDrj+sloS}wWz5rHO=iSa~FnqJbd27NRf8-giJDV+X zu@cX!^P+xeG~=v7vEX57oA=IN-6aZbnnP)ez0?4bL3~aWP*oM?9dVok{MFUo*ekVk z#RBjZ3Sx9O1Xf8wNdQNtiUK0*7B12kQWCmf-T>&F+w;;hKnq$C7Y0;3JMU6DY5cB( zc0+!l5W;{&y*h!t{>k@y(Td5hD?B*QA4f{;1ZjD|0(^I z`u<%KH~tTbBg2257N}ih|0n^$LC2t+U7}?oQ`Me3Iiq}T{Kql>?(~(EgQn((VV1_R zl?vz+VfUiHC)KY!n?qe@J7&_~{A((K2j>@=cNb5m{UOkMGJ8axuVJ=elbDw+;)sVB zSrvZ{CqT30R3S3m* z4{I!q!)xa^d-9Tf1(jcdoCJpD9O_EB*XO}x9|G^sq-g@eA5Eyw@^TiY&h1#l>q82B zuRHyG2*fUds0x!--$&SiwyjD!&iMA=f}dP}Y6Bf9vFWTgjB}qrCPKO+EDuY9MQxp* zo3KOu=#^c{Tn=Pl-$3frE>MdkV(BFmotlyd7L4^gxae)V?oH`j8~8g$X+PslYF$cC z`Jf0~Bu>)-PWpjF5U!bjaje-Q3GLvVfszkS9g7*yYCF z-*#K=NuCZaF+@F}1}(n11n4{D*zt_(y~`On@yp>klxg>^p+S3j3kdj#yXv#Zj#$(> z#m$yTQ9w!0bmF{5o{B6bA{Y`*E{RAAvM*ta>Ud)O8C?@ni&bp3oO(2uSt4!F2R=UQ zbP@ypkW{NLa@`fR+P8nXa3;9$_+h=p=roK-i$3n_5zfe;HXua(wXo`!Fy42sTTt$noEjM^C4$_n3lh3kt-;t(-TipVlfcv?5_s2kqx zn7L4Y;CE)}SM?O_#$fHYU!pqV|X2ly+3EQ}Wmy%$>hz{2{ zx?E})Pf7!_)(2lg(N3Qs%CuxPBCfLg#%}@vuV3OpXCp%A>{*hIA<<2v z_K&NjEIt;$^RLXZ@b2&9r292L^I<}#ffd_I+J9Dtpme7)PCL;;Ysp@E-Aogtc;7Cy zh<jov5i6K<@D!bqmg*{zD zn@`Q@#ufnO==L2zLz=e=9ZFFt6_qwBBTQZyb~T1sX~4Ft?f_hQqnE+1Y=IQ{D&efV z3PlIrxB<%4?)@{R6o#{BwqNG}L(xdmUgiOU$#zN;s<{nM2$gDo64Xv%>#PhGzJeN@ z^{_5x-l*M-si|;fQl9K`w%ZhQVjl!qazSKghJ(WB>WsC(;47NTESfDPj-;Oru)Fc) zj*MW_j~a|Z6g|vlwsQt8#sap3G(fFZ(uB|4CTl2vF>TlgNQ5?Veoc@bHF35n?!E$$ z>}q5?twv|b(tZ6auI1O@P{w9*-kzK~PK@;Ks`DcNpKpxPdFI++KavRqoLs%eaIzCk6FG=lspqocSBR!FxwokEqyeCt6pa0RTA#ixPI8#ot4Z#Kd; z@^3j-bni(04oTtMPft+~R&UdtWHuhLfqW@2&ec-7erE$J$_EaHT`mplmvWeOj0ld9 zVrRX)I$Ua)B{eDMG}G`y(T|+6sXwF=5-=LLf1k^(?FI)P2H3yEl_B;RJm0_F+u!0v zDu+F~Ad@EU6r3z)M`%(lR}c?URt1)9D%p=4P`s>$K7TVCxqqDD0@!g|MQRorGEZMP&p_-SPDtL_Lx=4|LP#v4c$=sQ(ijW5VbluwY87A$m8c9jaS;U`uWCEtol=Hu&G6FP z2`^GsXG6&TkCBB8fitRZO%jT4EAvwfApy6j{23FIrP7cHe4F+U#j0pV63lx<&Pe>3 z=`#EeXT*2`joRPy2@G0vuaQ*L7(y=87RBPq3L z!rFe7aYSUu1jMAEhh3v4ipOY}Pv9xto?XCR(ZO^yZ7}pird{{zE!+Gnw}{Zg2Ue~? zLdUx;ZH<nEr(9RY!=#Bk+VpWOVpg77Q_Y_?fCYVxj#*om@ezxsxe5QtKNk^HYdfJ6*FeEn;LHji#xbRlJ{(FAuKzTAU z?PF^)g6MJ942<9OC1mAl>0xaam5t3F*52_6%TM$#8|s;dlpjmUO&;?n7aRNvJ63z5dv@_r9&rl@r5*XqWWilx`+>+z+KDiv^-fV{$jDO4Ph;KNf9fG| z`WT^!9_ExdOj}|!XMN&_;BJj3_~56Bj)U6VK?96?Oa=pSMHKGG#PIDS6guHZmv4oQ zjB&Aj6RWF2)=69pYyUK;qWaV1YatE?<}a$SlGG)kYH-@P3I3iE!8$+bGz#Y)Q>P6F zv(Z5f1G8e5BGsh=SN#Z|L(~wf2@2AWcauGA_ta2z;5{@=8V>0ZbX<6&V-3$?hVAIx zQ>74wEhzUYF7dQQL@J*qnHu5@fALg~+S3dr6D@QlnA^{E+61!1&Q_`q zBgl{uksZAG%GGoZdFtKJv&vMFe9i4w?24m`;Fs3t`QGI5I?G>PV;pbM*7|U#*^vPw zB#`Wrp1lqw6O->%c#NNMrfZZYL~YPw-Z$$D_~h}Rj9`f+REwE<`_W2xAu7`|(>{XOtr+C>_bD^Ru9u~P5pA13@T&35PaiPDG$GEVmMg%+@}W<)Q#)rxQ~ ziHc2tQS>pue{0Qfi5jxI@tf1-bDjOU;W|4LsS6LDs z&fUeaIxOq26I8j2a5?&S5<#F=#G6*@4b-ma%<)I@*T4!+Aw8LP(&S@j6;Hdc_QzxQ z)cpjCD`;BNH`?SCW>(G4PYY}VQq~H9MeXUsgk)P>0IHcjD({aY$c9Pm6?Z+f$P~X2 z33&Yq2vPjj#4gCi*j2N%s6`#gcE410Zl0Jiga!a=O? zV!W;l2O+xFpK+30v7;xICQG5{l=De}tYMu?_mM*xGrrXuAAD@{L*D3gmnmL6pPcR! zV*J1ebg|i)@zNz_)^jo1NgcWIuCCRFHj|-Er+Vm#=icnSAwR3#g>P}LK8YXgUYXU_ zg3eD%@%zXXaPw=+JS}B3)IJo;zkse%vr{+o73-$8F%#yqc2=Fg5F;m~8Vz$I)UmjJ z*KR%36Xug#I_MCT0JPlu=;b`YRW>#CsI$|d40dyKa9&cW6Uf&eoL(^bYVgdgd`+%= z$@TEleng?>hP}d|F;(u3#fl^_&FKvO_6!kiOVcaVM4$8}OX+CyX3?T;C5R&(-Wr^m zQ4II16U7Z^y=h(86$&uw6U_G3HdHh=k;?y~D39>H+BR)KeEvO_`jB)W){Fuh{27C!br2MAlxfmdb z{9M+vqDo3)hC`wqTDHPXk8TqX8nt1gJB{{f}@ z<#=ro$XWY_U;9m-iv1F$!Q)ovSwc?Ebb?-i?0%Og!$30y7dI6lRtD<*iuI~_DYfds zY&d#a+2&`xmP^I)U*#_Br2ymEx*c!20=IdA2u%|;$>7{125LfuQn03de^*<_%o4_9nYyd3SnZdA&cmb<~t}) zS9gj0PVh0lS@BR#P9HkO3cq8mj|(VqqFN60wl^oIoH_RKaJY=CValAYbea)-;ozs6 z;RRL{m0J#3s3#y_4l;PZ>p9xU>#7}*Ejp?FuJ5xq2i;yP9qEaaDSDjkr$dBTbNHNz znybaibhe$MKHJD5Z1>woW07}A_9K0LBWowT1@eS0o^v1w``_Eug1pQrO}Oim{~u#-8C2J{F4_ViL4#{>cMb0DE)#bP?(PJ4mteu& zEx0?uodChzf(3tLuC-6S^KRW;^?p$llOetL+4XB*Q)L3V5&w0>n-de13CkFQL!7cc z5#(!G=nOrmI%#p7Z(x?V4A8h&9|#iVg8Pt_IBB>=3Zh(;!`ISvX~Pk&m(khL z50m=qz3Y2=rkJ!?D2b~mNJqUEp}ZTB`crvyLh8PG8K;$xVV83CR%9A}Qv<;Z$FeLl z*mlg%CNl{3q)hqP4ZG@P6|yAz@r>coAjGz0dNFxkh?e1r_Be3*nhTFD;uviTSzOAB zj<|RleYp(~zIgLT-;4ITryyqFNYci@I#OSR5 zNU1bGwx(Lx<=*jN*bedv=PiMN1Ws9_xy&C`{#2@E{ZehuW#LK(Ty80Ju;P?~*|k?FK*e z@a5F?#~J-qUaAjhe zb~!b2niMzVZ3u;Xe1J3Zb(GJ2^?$5FP5TgUXS%B|Js^3a_ncf`PmYBuo2R8jF zbVAl4Lm-Won{D@z8)aTjO1w;tMFZ^5E!W?r3WzD7ryL5SUn>4PWcdjbvvmc0!SnmqsVsx!)&$!d3013Aj)oZ)pWS>t=5`X&R#)n$E|yK=s=T5U5Bj7Y5ngm~5{9ZX z*MM`w{orUE8o<6brD=|zf6Y=j=TCGQ07LJW$4+2rhxx(8*?DJ;S=;<`+O~XEoc5rJ z`{#pd6$_K!*Fe%09{;&>TwuD3S-0I>=bw&dXs2a1ttAcLOV%s#k_5rmr9)%RBn{cf zH1=mVb&Ob3gVjm{I_p$-D+==|a`tntqSF%#O{BcRhwUyoJ}PO?ogevG3Lw(@Dr#GH zPX}e8?f8$m6c!?SdF8cruHMQ#$G26C7^Ifgo)MIEtTJl4e6p0c_|=6!Mtn6_WHV+! zk%Iz^8iG}cY99heIp`9(o8_XZ)_m$@)UPT}qR@DxE8DgLY+sczRD&2a0^LU)~RczO7{(yM=tRp@!CH zP=qpq3m6xxt)AU$3&AKI{kC?eMCs{Ek|;55#YwBds~p=cB6Q1ulqe}1q*FO{E6{W# z@}Wswu1iOreRb@zL37)>wVLJEL5n!52>hs;W6b8+!SeR|J8X&$%3V+w`4DIceg@`; zL|y1Waa&Jt2(ID5Lo3r+OA2ekw@R5sJEAATC~QQH_XLD^QP|KQ%o4RVOz7af4V?Nv zBG+`cSY1KU4IM`rDs>=o>f(Vwkq9)wCVC@% z>>;(KkLAb74PmQ%(eSP^mgD`MeZ`1;F=sXN*tHeJV5@btz76|WX?znd&kon-n0JOg zbgbI3eA0@QLUIEO%nj4?6-y)st}U^d96BDgQndB5P55Tx6q3Y;hCN-Cn%`T{&weLz z(8JMgq{d{jr}efn?;c0cMUS~(mtL{-%*IltqKf#Vrikt;PIz(jpZr}<)flPu zGC0PiyJ5V3PL@Re8gnOo5vbKp9eyviW-}=BXXsCIc7zbi;XI~?M%nuEwSIHfov-HI zuezP4pO)9FbvtP*=7IGhBlON=yP6l@9#-2-xy%_{gaEirgQ@cix zxbuE|yQdVYg20h(M53v5(j#qW-tes}TvR6;9%CRxOW_mMZNyRC=MPg-+SWyHSE4t` zR2;X$Zh7wVpp)lNRZ20!97FlqiCMvCt)kmUb<1`{fMy-_3#M<>SG#`wHgrJy>bX?* zn8hqXWl4lYx|AZ zpXMvC9$!@5{TJ;{0wVMz%i+_7GgwNxrj*)D84gUvkkP7U;Oai5=(0)4EG%`4!x%LM zb?bP|m{IePzGB`15rJJpg(3L##y^`-yo4t#MF$&-5_2AzZ4KUJNMyB$piYPvadKpi zgWDoW^8W&<^%e_*C@$1&6$ib|>Z@Li_k=$r=AB|0+iG5z`DIS0iEE{Dn^g@T+ZW@a z4>6kh%<88mc<$_wx=z0}4Ha+QE(Mxg-Q|>tPOK5RItkwN=T&1pX*{^Roh{ee;0}t` zG3CS{WEXGPu18UA%AF3wn{~`or_Q_^8q;!F%LisSe?XpoL&avBQR2sm!}x$x$v6hJ zK&)4ew)ZerioFDpr7I&WwWDR>x1rx4S9m;Qj^skRu|c?dMuX%PeEAbDLggPkR&rp6 zp~`WxQV}Q`=IR~9cag31=Ya~C`F@Byh=|AX7glh_!&>YuyWQ1ZlqQmJ-Zc^z#EV>X z(Y{TY%3$9bCb3RUGI;QnQD!j7;Ss}q0 zSBc@NTYQ{ErHHgOCO64)v~L)yq8_)T4I6paw>Q7pxI2tihERv`fd`{iTn0u}lsLFVI^Azv zXQMte%Y#uA)tF+a)g?7a?_6@3gwuN~a_@cRmaOhU)LuE^@K3hmQF%Y=s9#}TG@@NC zEROs}!A`o4TNoT$9uHI^!C0x-C3FNHHmlCLBFi#VoecLB{r9}G0*h{8 zKhbFj3w@a-JVOV`>O%dsex`kC7a@#d_iv<@evT;`AJN1^A8OGNd)fLx=3$!#8#aec zPdh|K(l$QQ0iL(R#^8>>Z&SeEOUoz%H_-GSz)r5xtZT%R#(BL8rMNm%vYl~)gUMcn zyN>$<-*9cNdfK+0=Gp?QS5M`i{WG1Ll?l4xSM?mCPMei`vPwQ*Ddz_7pzdL86uKO)N00O77^mTp=39)ZW{JTX8-Oz zV}t~Rk4wZKlMkddFp(54i9?8a4OzZ(xi216IwR0%&vi*vkfo$BgUT?2H)M@|ugHv& zH4TxH7O59*(ug_92Zki6xEpV5wR4cGVSUK#+}G@!6l`|fXzu$XA70d_xfEtpFSIQ@ zNoT@&y5ty7BK+I^bnW>jc9N&3)R@78l(s%HH^P1p$bA;?%Wq3Q6T~)5cXTqel}}ziP-pV_{7iH@}Z* zlcaaVP#B+~1wur-*x<@_9$chhWz6M+&XOvua;U9A+*10c7P`**p8YS6V|9ZV^9<** z3NY{=XRya}3u{tL@n+ESnHaHte|sn0JsG~WE~_O71YoP-^3N}w_qw5 zk-MU~w;^U29`Hbrh?6le8n_ky^*#R}PFQeCOWRLi?+D|A3W8Ba+$g%00__1;{n`cd z&^Wt!ULsnGn)8=t*L2Qiq=Uk<)-(5kjH`r0^!R{qY;yUl#>&TU!M7~_uF*d0BcBmA zFl&lsew304L#KWzYn#?suiX`t;DXL+<&s1(W)zT(OAi}NR8Pleq;fyZ!osD`F?1EM zM})KRGcvCY(#5x;sUnHK5k@tk%3zAPzi2dNj z@{-+V^1>r9-CTh}VQZ(Jf8!`1f^E;@(}aG{Iqd)b!2Dnwn5rPt;CT zFl2p0Pz;Dfd4I)$)w2LJ^~+E!2n)A?;kDPKU#6Obf~{OMM_XxVxxiKdeMb|nd-Zan zgaB`Ccy-y1RQCwSC8jxhxO4Ad8U8ji$qm5-Ad2BU1I@mtYgvHO% zTjcQjQc>?{@sLW4QOn@rlj(*}4?{_AdaM`v2WJKv{K=yBTf&DcEqw(QDTx=ZBIPR^ z0w;GrTzw?zy^y%b5SD{`#Mz`AaO*mEV=Hq)ufvdcS$47;oAoo$gK?Wn}aw6j!V^Ze7d) zv86u^qT@oN8lZ?DwU-SL4!ye%#prhZ5<8zxUQPK?y`D}j1ikaWU+0UKJ1X88JLcZ5 z6S3epXs|mj-hl&04G)L|Ml6IsRbvq>(%2n57UU6ARXXt4FK`~vAY6%i);=o2PO-e; zx7hEAmr~CLFQN9y=gvl+^9?cKTd0iZ`$(qiRE^dq8()=@1YvH zW&;qi%mS#;H2e;27{`F-v=1|S9K@UaYDf+8GKFJjWT1^|tP>w!jotaZ&1B{buDUDh z7~F=qiB90GjyW`7A-xEr-io=#+bD7WlCPRe8Rx)Q;mF5ij?GBu)5*PUgZ=;X+LGy3 zr*WIrM~c~D&tG}q-WA@HYz>`T+vw<;tW0^{^Vq-DFJ-#=1iwyxUaY!)wOAMyXyX=1 zn?td{^+FFs=(H{Me;`05z3q{IwLXB?ar_COd68tZg9s5Wy}^%@RdH(sef9g9uUnC=@5nz0UCEbfSEQi~{*9w@nR zh?u(YZTWHYnOFE%d>y@PJ;-S{5;4Vd?7sRVuD8p~ifV2t4URm`4he7vz3p|1*S?=2 zfq7q1TI=#Mqr@#*O~y0^Kk95R)lFXlZN@T-digu0B#?daJ6OZ@?gXblJd31iINeVo z7R3nh1Z4o%SRPhn>|8hi$^t(|Nr~NJkckd{5e`OHaJ<<8O}4Ftv?DEnR)l5M_ksVP zn3C*p2-cuiembg6g-Z8DOHb%SJ$$U-zgJkSVSGTav9)Q^gK;n`qY7&QWi|o}Di1z? zIlYSp0dJ_;1fEXVu;NpdPiv#d<;P$<3jyj9tcxbMSi4CDBJsYfi9b4rzOei;Eo*J2 z8=aGD!1RtfEG^BmGhWZjBm8NYC0vbn*;t==;%{A?uT3`DbOwrrgAtLg`O!X#E*F$>w5i=0R%iW|<}SCVi| zbgU!?#{BcIB?y(C{)YoP_&zN^p?S8?kR|x9KSlI_NQlLhyi+d%w|fdIFfU4LS$5<8 zQG8{R=euV4t#~VgUdv1yp3QCTSjIkIFrGh+FcdE4!)dR1(O>Hkpvqa~c_hEM|fZ*N_q&ZsluiWdE_k&8hm>`)hIvf>-{z!T7y)ByV z64u?Yx82_sSfgV5efdnMOVsJ}u&D`qZXp9YU*I@D-uIAOj##q4xfPZOB^pkXz0CO+zXr5&lm5inPjZM% zQ25$Ek-j6&|7Djbdo*jADhxSCdDh@Jl=dvGLN;eJkAikt-8`Oh=v0!TKr3Z4r(|I_ zZJIMO70zQrD>=W`K&pw@+zjO24XFzs0!R8dS;|q~kjKtnHmySav(|rRM$Pn_N4HKL zjHDy17c5Q*3Q;#M{(VeGLgy5A8=esLHb*4B5Yx25w)lXy(bp5fX0=_oW-_Bwh zYz61*-iLfYmR(jd2ruqpe)iQOFbhfC&sE`R>hiFh;G3QuF*EMiN*4*fon#Qxt+KET zaFyP^`!1rnuot{$dv-4}bZa(P(bW-uTT}bydv*K;Im3qu6xihgO4{sax;`)Pm|AF7 z2@m>Mk~-PhOmzmoVTQ6?OMV&pbv$l%&z5LoWU3k6J`3@R;suWFAGaObhpUb=P@ zkH&*LH?(nGj{h8NjBjJkrS0bU!l_?e0AbULcAbbSt`C>_VmIJ8%g4mzCdO9153^p; z?t_1JLV}N@U=$3bsy5nnKh#R&W6#iTu4C zyl(y1J616seNu2s@Yt7lQosaSUR69K6P+)iHfTb2>Nq*Jj#Q@ytYc<9HBYBRuPMDh z2vtWqHhklxSzvEMo&^p0)a;Zch82M1YGU6}3}N^x?p8eQ!ySKli^)u;wiSB6D8G6N zcId34b`J3_HWLkZ0%^F*Y}Hp{uchy4#%wSewp4lPA5=JPuF2N=AmevKfm3~eu))|7 zUAT>ctSKQ&9_)R@SwiaDyGDb73`AR8=>~%ORvjpurFPWe-m+|%Mz@|4cf9_rrESkF zroDIJu;JZLH#znZJci-;G?SF`A@pcu)1) zJ@8&0N}MlC>nR9OaZ!Ly)5A?f1@2X}RXX1Mh z{?}uHw|%{}XKB4CGGYFbLfVS%muZDlx*0oHgXc_lc@KeI66A>f13&m~9cj70@H={R zW%-1uQ7s>Rih|q^r9b5K72Z+kI)yFPUL*tzX1ne^9tmZ2uTRx_VBS!!+e-fUBfl3B z(ZeVdkUy=^(K$YN>nWn9?04IMk%2-EDPExI`nX*Ml5RqK#c8+pFEU`HW510i`LLSE z>sa5diT4zxcWUfghoaDIJB)pA<={$`i3uNEpDcZ20oFM@l0?`Wj2oy-Ksz_I zh{o>#k--TnZrv(DV37;UrrbXr#Is#JZ(Dzz##@uhQUEZwcf@wDS5wqWz~ydCJ5 z^_B6O4U2WfRAuD!R223uWLPCa)H`@aykb3PEo0jvd~35Hjhze%J`4^`N+$MS7ECpZ z{n_<$e(R61m{&Wt`b}nZW4o?$Q!rPhp@Vp_H5*n<@xA(^{L;gj+-| zH}1PyDAiloJi<}zNDZJlE$trq`b2LuKrn9Adc4`b&Z9FFC*$Ze6D?|4x@&%ce_S(~!F|1>%biT8D+rl0cKkeD(Q%d{e1H z0Z_zgLKRs`HZ*k!uzG~Bo-^8YI1o^)U59_e01ul#wK_&6XcwnJsYe0xf$d*V>EDPA ze%O(%vF}tDiCN-*Fz3)ou^ZruF2Jq^>x~f@APYQuTw(Bz6U(@@j3CXHva73Y>#B+y zA(T_lM%6ByB=P9GwzOXi8BN|W>mudfPbxGIgW3qa|ps%sop8?jN)EG z!zt-!)3Nyfhmmc^gVbNgG9|&%qoEfsRTcc>A!g@^@;0K-Ve6;T+C$zo6@RA#w z6!~7rw5o;qO*J!HjIc?4{oKp;{#J+HXLIrqf5JMg!xIlH9B-TX%pJ{oE`IdvABq6q z^dHmO!omkx)|GR>L7_pVo22AW<-i8ktqqUq&O+NLIjp^a6-{l4_Lc2Gz^S^%P$7oS zic;y9e_PH!7b1rW6q5EJG-yxUZ1P%Yp@aKVDY+q~Rrf`6y|Cw>$fAfILNS0%;Qy<1 zoeEwAxRWS>YRewvC%JZ_6$HZS(XKuORg&lN2SA8^Q?@y~mekDiYzs*ak+Sk*?`9Bv z1^d$WC53yyqKuOtKH8^fy5}QOQe)p0m$aq%PMqjg!8jq7qu3mes&Sh(VIE|!jGlvahdPz zsE+hsh!JlnIa{UOf$)9@l`e;ASk7#l38w$NJMg2n2K9@oEb%;fbexh>5A%E{Kow*i zl0SW_?0EPm&J`YNGlBX)?1c>xpfcm%!JRrJ1RO5zX1G_Mv`ISph~n6s08n8e1irGz z4AUI`3;_S8+m1`rJ2ev%%;UV~3urTjoaK#;K;~Py!HK8Oaeg-i>?CyqgJ7eXMrva9 z)AfG>k^kjSM4>CEeUHmZ7S)>>Qe6OKU`bv0=u?J)Z8+#v0hs!~M1sRpZbuJ%!6;{} z&_B*Gy#-YP^a_t=e?Ww`V?|H}K`S@Udhe8>3#4hNJm>(laoNA#72O*HikYx44TX2$ zRP~duBfiG!c+yc|;p3#$WJ#`{mtN0rw6q@sh0*_3|G!TZAr#f~)6T8oJXuwtY>2zn z;2&ui8+ymtzo4EJbXQ0Z3B{5^uHk>m3PAJ$wsC4f-SgGJ+a1zQN4@i-PhizwNo8SF zOmuO2H5>6$h*OC{yE+tfbY3B4mb&){IvAKbsCek_czgS*FJ7@Wxu*EW^(;1>FSze> z-1(-sy)ROnJFTlxFL0czZJSrjO}~Pn0XP50x!lJzjOf)KStJGSz2uOsf`aDJdSVpl zAR!c3C}Cn)L{ugA?sc~{*AhUk5?b+x7Zy5@xV9J-wywF@-k(tb{OkYw>HqbMp*}P# zhKv4gy}`d1`d@z{{?9-4e3Kv^SpC-Z()#!Rehu&kJ%L+sFgdL-{r5Y`lc5;f%5T2v z`uz7>b-)H|W@5LVVnhGWoBf{;^#AjvL@Iwq>E0ng0cG=lUg4i|(3}JAq%+qdh)wig zZ^g_6RYKGRc5m`nIi|ki@b`e;pYhs{A2(wK>ZHQVhBazCBD~R}sB(Jzw_odYpA!Pp((lxmEzGrl()|@?eJcZoFy}NLA6s z*>x2YwW#>$2=*I+jXqC;nfO2o0be|VYYEOa<$EwLo{=w2{yR_9?L^7g7Pya zylbuB_rG=s?+*b*6_qPMBwZ|?e6l()>RwG>QnmdesAIFXckAoCXa>d}mI$0DSX|3w zU!Q>tuCpf)S3UdmHNfk%%j*A0#M?y!>__S0Ayv7?toae*&7%kr`N%b6ylO6 zK$5wFF1ysW*wh9V@~nfIlyh*_ANQfpId$zPdKas?*DF(gZueljjyK>YU9oLhcgx-s z1mZ9s%?dt+1OtN*;SxA3^BhQ#Fzx~bv(mM7-mO;bNP$s|i!MOZ=Em7ND*w1c7A9~N zq4=+Ti=lZrzkM$Iob5RNg%ycQ5;%-ds`3FNUUoo;`JJslVAxqew;vHvSO$RVTerE8 z3jhT2A+iBip`Pac_>rRjx5!Qa*6aMzN|Y4TyPA$3K~L@=QpkUzHFX?s1I8?@8~h$P z)@g^sg(AcC%;XpV7%fLqii997mdKVZ%}Ja-7=tt__| zIQ;(gF+j1;P8CzS?v~^=b*Bx?5x9e!J+@Ee9@qX5-w;qyPaD{})y_yy>MkozB$+!l z)v%3s#?GBXx1H4})+bShcgRpCC_>DmuSgN>B;%lhYT z0b0xZqSM{|cOVQSK059({!Vxk*kG9LJYE``2xfVru*jg1c~5K4flwa3MxVd`B>r~? zGYJN#=w%};Zi+g_F>|q{b+3I8Ff1EDH(JKUv6 zTXy_dIfN8k&3I^xc~M zW|GXATWADnOqP8~w%ajXFHnr$474pv`l7n(ncS15PS)dUl1NwdL@wR^6t+e(Y3QBsy&Q%$2G641H?qOEu|Z6>2|B`$}IRl0cB^LHchadW-0dgqH1=;^^ zKlTy*DE#Pm!2POAU~FJ4TJ-6~-a}A%&l~8>OWy3>z9I|!csnOrAMmTCh*jK_sZEx% z>IWCln=}tUKwTW&)^Q{Q$)p5))vGt#FS@)9%5+b_IRegUHCknI8}nLL7V>Jx!GLHx zIONK=ejA)cBwrq&OqXs>DCo%9mZKbvzYyr!oLpeF{1DIWsOMj+ImW@FeV+J8aiu20 znHk&TXT!sb@Ku?$0-4y6YSbBEW?EVnE^!owrwO|+RXh7(47-;(UksCNCO9DMvdd^g^I7$p?wi-_*6st{j^W^%|8)OSjOdE< zf8Kc^QCmQ!Tcmhs)M8B{aszfJsy5vgy~{SGr)7f6^EGS*EK3&)@1zaCQNEK{b@}Bu z{E?~ijsFOT%w01tBc6#HO=zf#M*&W5z}eRKDDr#T4H0)pms~^aeZ6Y zR>>38=a=ja_UD$ETsiR``&0~b9rDwU2KIZv0I7d*A-jrfLf+NlZPOTqO1QZ6auprx z#Rw3^!#6w~{KKUek2|Q6_%m@stpgN{Gem3G=5|8wKf3U3X8X}(+*L-r5#H5?-Kw5U zAKXateiS9J_(hfZb8;b>t=S~*0%&Rsr+eJHOl`%EQ?1V7vPRR9GlJ)?@}j$4GY>9pU02J) z0&dFP*7wP+_syu99bUsQ|&<6PR! zbq1H>Ms}-vqwHrOfHH;bInc9$LM&7DDjCX(35lyitC~p-jIO$6co>vHAJA9%LB=;bPIlTR* zF`f)5)dItRD9o>ACM8%hN0e;^E4cN0>C*460N);oFEK)%)n=0$T683E_Bv^m_^+We z*kDKhi~cU2jIm5?qGsS#or0@f<#F}WPYf%8^4SFff;wATOjvDO5hW^G2(h{EwH2wi z@|t)H+8Mkl@%R&ki`Mr7U~F&NKxhN@>Of-o?_}E0foPJzTD#o~ZI4FLQ>L57#sHYX z-A2$w;0^~>l^bzrKDhx6*iTa+dS%+k`y{L3FT^B;GG&6fz7jOm8Y2z?RS1!{KRC)A zY@%GcPasuZd*N`)Trqx8SBikW)_WR)dy^vl>AOb+=XOh^BF!~yBx+kxL#!-oh{)uB zUc|kmmY3GO>vv>be!lXA0LV8HglWA`2tk7Ga>L6`;|$*2Jx;=c8GHKWi~if_xyzfP za}t-?&;!LdxKv52FxbA?7at^Ti71j{S*)H?v^k{XzRZ#9aa0>HlrYYHm~xXnpOrq( zokA;Mihp02BfiOLp|}4i0cX7FOfK=gAm&&oKY7|VN6(b}SG?T~=wYw9!25{h(H@8F z=sq@v>v6(DU~Y|h*nKlWpjg837g}9Ecr7eoUTU@@a4R{S81FR2FKH8P8lm|vk1}IH zf&cTFmdRH+d6O}G9*7w;{bQ|=Nkd*eI@Ery9E$=p^=%5b6610vpDhG_Tnb3?tMA>5 zhXli4o=P|8#D2*Pw|x+uLH%Z|Cys9VP2Zeu-DHpwa9?_R=}?}F#wSWowcZ+Y+I|^q z(xH?lv)svohI#`>n)XKYf2}Ws{ z`4hPBxA|Tr)IGJBN=0y*RJyC4ZfpG4={yzaiblefjmzPo<-;36jUi}^z+zgJXXnW* zADVhV*MuUPzW+#*A%o_JRwPbeq!5NpFH)<~B8iG7exYzKFBQQ@Y{-m9u6e5S{7nE?H6t$b3WrwZP^jWIlA-ZD+6Z6Xv{r=@r zSI)XH8#;v$6scLkG5zL3w;rxUYLosuT#p)+9999vcwin17P)yT_rx`N?AW@!$5s>9 z$bdusea~kAe1HEmn4_M8o_!|HQY$iBTcKmyq;CJTEEb3qO;@@#vD6hSC^Pf`5suc3 z$)dqj;Aks_ua2GCbm!z@<57+y44v|m$gTm+b`fjt^QHSxQ^ji8F;bb7Zd@evoSf9I z)-WZRbcB%nrU!W7`mIPjeM2(JY1{_ah1Wins*N=KjZb$vnol*5Qj-rDQdg3?VEK*p zZX5i1e*?>=(P5#=!r`myuxuO#g*S{$;%AwG%*C>}J`gIu({e|BwN#k%Vf&+>JnZQd|f z{$1Xt>f-E6B(|{`4ppy%f@;mlFpA!ND3mRKs|eVxXaKxr&pEst0feU312is=^g)d! z)^PRnt-o|^NnIKWw8#M_?Y1%xc#=PLvHXrfMcR1h6~$iDRO{IOG(k9a&t}7^6eIo3f{n zqvSt$K~jC~4cZ8+^WL}jEg6BU<9L5li3D}>6+&FT&PfvoF8ZZ(3kJ4=H0szVItZQv zQ(L@JnU*38f2i%};yh1oatJ-|-YU{U-ZZKmL){RKO$1?V_Vv=G+VDbe+sW{xz$0333gug$%963r{_o4!x3JFiX4O#%Vd zq7Y@XUj}umRulqPsaYG>-B#V*+}T?^aUj~=nl&%Y{t`Gf3~Kl%a8-~9`w)v+MOb|G z5csPcx(}zIK0)02mz2VWok$`+PE$1@PZ5@Oc=U&N#K3}Ln5s(YGd{3Xu%T+Q*Tq}i z8+VMp^T2!bj>>he;?NtiKfwOP*zwe+jCg~%sgsXa7InB=u{aXjXI*tz-?s6HfBPIs z@^|Mn(V{X@qzQR@=(F;G_8OJ;%NK8HGBlraEx=hQaSL=cUkp4PNFnC?I8*r#wgR$2vW1UgN-_#LDQ64 zlMzks_IJ{SQyBF7*5cBP;{st9lZe8_j(%$$}VDDp-hhP?O!!U5|Oj zg2Qq~Ye`pQrS%lS{0StvV1M#V;u)#dz-03blHiw#cMP2*{)wogGNdHZs6hXTN@w_Y8|jIytJTd=ozd?P zNv$lWu2?ERSxgH@D%bAuYI+2Pk*P$8JG+e2kxB}}gKqitfrVry9#oP|_%Uk=OO_q3 zk1%41Ge`@GH#FH8-E>yngR5JR+~9qIy5n?nMIzTJi0 zqXD*a4+n}p#WK<4R6XLF7)G6tY));URUm?tREw-fsHaQ}g`D_ndA4iTT|;M%o9D{$ z)?-`hV%(Q|o#Xq3U;BAP1x%&OUrPjECDxsDp=f&DjK~l12n#NabpGN>$-vRwN9fs! zld9+L-AiGuZg3BeUg|HnxxO`(V3PN7Wfb}D+*N^F7SH0)U;MCK=b8_C=F9a)HqX+| z{3NzV>TLn~LX}l!dK{-@{T4MY-0S-pwOzh`z9lVdVz-3?Bs9PM(%0k`lHq^c;qE-q zv7!)pE=Dh3$<@R~U*DGSTc56=AfKhX_!g{|`IDfcCW%*)oUV9WmaV(T|5w(B#xVx~JFqDnV|Zyh7H=FJv1M{1Z#M;M{I2K94Vtvwcs#iI@Al1M>M z2>ube!*CYFum7Tht30_=T3L5HS1k&`VDc53MawY4$#RJ?>idrMyWy_Y9^u3U)%OFA zd1_{fOKDPN*Y>4~kr_~76?Ja~7%_S8FTaQnB|?@O!JM^eb&W^&7H8AX`NfX5rZv@g zI)z>blB}c1*t)r^wF9cTNmjmCYZX5RlirAhO|GJp)~(a=oM>kO^*EZ$gXB`cz-6sU zd5*hqktP~%kR#g9CZk4v7*`OCD&b{mfvfy-U+8+x(TK|xjC?A|tx^!%E-;R>_esBU z+r%XNx)dTl&}m8s)uC;PJuS)ghNdsME-XzDvT4h>K3EpjYaE3DeK574Fb=_Vjh>Wh zqLvBiOi9gkHjtg0o}h@Z$B%%SS{N&TTXl5zhjzu7qixq$~4S!tV#FM`pqRn zphUZVTOzRCTl(U%KWtWD+*&%#(@!UH;#&4lbBdZMQE*`>W_zO?f^d8J6_i5zdTF!x zoZ!;+qaITlNfk2O`Js+IMxp(ulTYqlWf{JzI0KTkNzY==&sih^_U;gY?Ws1xI*#_Q zTw>+wd>rFfsckWL{aV{)1HM(B`6WkYWUkBopbnpr&gAdk?y|@xf0>Nll@Ao$%QlM3 z5i4jAge#%Lgv0zL#8jNWYw%%I2%D%M4!4zyr79&z{T{dMlB82OpXmtAr7~R0bj_ab zV9z}$YVH@)9Qnn=2eQI(C};`9<&+FLJEcnm1?q(eOI6zM7bNH`kBEoO@F zZ~wU_wqI)>2cDId*UFP_uDbu3E=Z+NxnjCe9Zwg*_#95rLxd>$TikcC%Lq+2KYgX~ zUNxl4Evy3_F#1 zS@=vm9azS_Z>48ubgcOZH1ef3))S2WK!A;zn zJHHA$V)k5xH@`u&^84PyNlI$OT`_T;6GiHQtW%0>PIy9zCA8Z%AIfNB`R!j5!+rh!#h{PbZ}263VI;hBYY*hdvD^AjU*rt|#?5ca~3d71F8ku&7)~ndM8L0V_HBm;0 zg>@Z$ipP2m^HQbiRz*>uYB;e$=~#}^vL%~bf~{Y?dLXW@%jPkjcWoY5*nCYtXqQkD(i}B@cfdVq zwH{`KRcOpSdVT^c7K#-!B$;RH6zWvmQS zA*rPbzkTw7l;_)1$#(G&CK)?d9ih)8b(px$FsgrpE=&RG&cPNAe3)=^A5n3RQfhr1 zER+`BWTf@XCTx&MZGVKsSQW^TpneK}f#YeudCAvFv35_KT)7ge&B<-;ti-n@{8zi< z0M6H~_fTf0C=H0;1jJfL>=39WKKkOj+ntG*AH_j^$fy0jK}|MZF`H-<9C1BzPKpsG zN^@pSUC^bHB&7o))eKDOBDwrLUz~D`oqDun8=AjvH}9U}icuw)l0{3Yr>O2{)pAn$ zJ2p^-AUwLDgT`dZEYr>JGyJ!DefZ*nRZc71pbX}3IlfDAT((n!R^5C0Lk|5S4tcbu zSxq>3t%w^Hw=Zg5Hvwj{dY>-SMJW||*O z=2^Ig`)!xupqqv8EGPVk@!~^s&{Z&pvZ6!Y(vTQYc%e0%MSJ}+aFV@+7wakLFPab)EfiOhYuCQfu>UMkUtI z>Cp(J@|PDH0TN~l>F}=bF%1S5K_|R0pzAg}&wjbC++JPw75h{_$+FILZ;zGN{h)r{ zwEOL@1^5PndMg=h5S-9b3xfSH!>`k9$*2q5BL;E?8c$Si`>Lx&>&wC#S#P+66WPK$4I?ejGN@Oi_1*Vv$(;ld5t;`m!ZSJ+I zHgD4`+iaF=R;{%d^(6eu`czz$q@n6iSo7tln-1=LooCHNb3Hw(ZZiq*_(&&V2_|aj zuAU>l9#J=o3l=l2(|P$PPM5hr`g-?3!rT-VA4o%ue2%tB{d+KVgzeIBouIWQc=X)w z+Q4Tm;W2IWthE$HK5H?sM$s_9IY|-fm`!ndv~^P6g`##HnI1~GWfF(ZQKbLN1aI?- zN2#c%vAVI0)T-F@+~LrM zx)JwD?kD;!Vz{2V-3e}qqrYy{)VY!CbRysR?}z@z#v8#P=9wUjsN8<{jfeC})e2o% z@#7x!)O+`4n03BSCjBKglQ-F)q*v-qF|pn~^rQN$n7{Emc)=;&PMD}X+uH7)-jX{| zpZP3zNtH8wU^^}Q?yA$cm0iPYMYk8>uo0Yn*TIk5q|0)0kB92>DgjWxDAieevg@;{ zAC40aNffnMkIVqE<_7_tPRQl6~Gemd%G3k?i^Q`%n z&^4fMH2p!_0NS6irpsX4Vv2VDe$p0CyCcQEHjUS?+^>9RhjZ!pWBjQ4da2~4q^YSn z`*x1yeJq{~$T{@z-ZQ&$d31!AF*v{eQC>2_JzSxl!&0Kx;(fFWx0U>_EEYX z|4b*=M9ylb;{>|fhL!K8*AfkADk4Brk>)6S&ZhJ!%6q{*CkrJ=YXo1a>f$e*5uF4o zsHsc9!q(qb@Z^Ag>eH+rzN7u2zq|k&(r#{9>%ZSBCUnN6f?6ZkSA-}sC>M4N?P3Q$se~aC8FpK*mu7ZkjmOJ7_yOmi zY>A!2ZlAkC?{Hbem_L8enWk-6Q1A*rQ*X0_osGX@kLZkKhR(DpMA8=}OTG3QB9OIY zQ<2AvI_Asgi6N;P9k4by{oz`R8zyU;Iduf9#6^cYB5!Zhyqt{ko7zL*W2^EIKRy)b zdN=xWVs#26o0#u6uEoL~hpq&ukx0)06b^q;)ZKYkk_WmZacnY;Lv2yG2^e(|Y%<$; z=F_m9Mdp@O%3QiA2o+7zFq5g~|EI6>j%p%Z!?<8pf=dLXHvs_=5D<_iqCf~uIss`? z1*ArL5fVT)lm!G`dIzP1F484LKv6>Py*I(&N;kASVb495z31k?IWx)3eDjq#d4JFI zsIeO5s^Uk@Y7!;zv^;2WHDtmdO;&32Zy)W|@*WsQ;$|uow*p4*oc_i4ke24d)+b-{ zd+Nm=s&-Mv*&N+NZq4;52ca&@)t=Q<$Hh;}vF-UjK~-?c(q(7UQi3$m`Q^NHWNX6B zz4vQE+nRFh{)t=NuoB8kSN)bEHJ-JL6;<7^l0+D=(3*TQIxO=hY(l=?M^B`)FDwg* zrz>)WPnJaX8=@(i!G?^p87LdeMau1U!X1V&XjQm`TDzu-MQuOdmW0veG?xa+m7l27LoVyYA3BGxxCR zgH3rbhzwj|a-MONF7JkYWq6u|2WICGCZz?E@+P;hu0iolR6kppHr9E2Yec3g(MNe5 zqPl3@koH?k~2ck;kGUQ`* zU241bVx9))2rgrx+3F&dPY7xI+x$W5!45K%EuFf(MrhA#YpA?*2?oSr!D*G>ik2vCWerJ1c z#9z&(gUku(y)|q7{DwKWOr?bmp_#z^^-8l5jr&C^!tYk&J9m#_WenmUXqSD+f1&{S zGH4@8Yh~F~(*B}0tS67!zcR#0v&PA|Z~6j9HT9ah0msRBq^14%yH1`*#ZY?I2ZS$rb z_P2Zjr|NXNQX=Iv+>=|X$$lzkWwF?4EB__~J)bz?0X_G_OI&TKwS>Y$U7y%RrBRls zda*XPYU~jKu{W|5qb)cH5&=tX4J7xd(ae{sO-n`SN>F{P2Au5dcT{>~LcF^xZ_-{@ z?yb1aAO_B}h9x-+#z7e*$&n0_=*Yjgir|xl7CV!L`HqynpoUte4eY_jky&sT!xAKg zO&|XDaxyxs&KjVT0K$hvQ=t|r=2o5o!CfOue1Zd4Du&!{_6OdpfQBU}X`!>GH+@tC zdLQjymh1dxpKBVH#=SySkn^_}q^T8Itwddv$#(3xe#1R8Q8&FNXt*5c#V$Pl^0tHt z=XjTkiY~&`F!J zg|vEW&#p@Q*fO6?5hzgnkEqt$>g$|LHLT+{VKnXS5%iJP+I1-o>B{Vd`ahEC)MLfsJLiG|sZSGkmFHane* z<8?6QPSdo{=XuEAoN4oPMqUkA1M1UCmQ!n^!#ueqqR${X@*1MoC^9q6pi1Fekp#dh zK113eAk(m%yMq>m8PmM@=b1Fa&Z<>Aq3K+EOX!s0r6MnH*D^XRSh^uzTWo~omGUO; zZ;!1PDGTmjn)WQbOj|ouA(8+n2c?$x>Z@tx+%D~q*>jUQMAo??%e6sqjTZZ@*wiX| zvh~ch0%A>vn$$o*k8M+1ZWF6#wR^`t*t<0-aXJ*tPvhAW_~0(ULQN|3e3MQ8sI`+7>&H+eV;JDL;>&TD?F1_e015r zulY`Sk09CF_JRQJGjm@xy6-KfiT7*-Mv!-hmSdWGdQ=N{aq8T>(ZS|Zj+d!E)+>t zfV9xpYBV$~={d%G6NY5lIeLhW6VVgW_$N3gC=Rr&R z@M`IW2$)5a*9}*f4fV{Kiw23k#FJ65_v%1+RIY2h2WPR0U3Wdw|7r|axD@es?f&!Z zfu&jPae@JXO~8;0MaqQZ>giOq-!~BwwB(g6kx*q}aa*X}so`q{MdZA+psz5sQ%f%$ z_Q}8hQ`Z4DfO#_7O=4WtIy7Ejo`pBnQ7#rx0w4pft#@h#0bc#Pc~jBk;+E9{ozW`k zuaTL>0LD)3G{#TjUn(@gh4ilB3Ymb6?dUkV?+UctG6F6;UprG(MkLK-bsT~g$Pr(uVjOHJ< z7aTnG?ghS>oh7k|du{x;D^V;BFY?&(QG&vFer**{h!z={!MI;Y zPEIxgAS#JTiKl$@?v(Eg_8W;`Js4Fl8Hkcih(`-OD!r&LEL05pMj*u)k`~ts>0?WqpQF|u?`Tb;hB%p zUL&mw_yWf~C@1U({#n9}?LnPI_S(Tmdo#`Dyj$pAqCvb05W~T?BPuwGXg<1$UIg6K zKl86{59=V>x8Li&Na=)#mri@w)~yJ;x&L|0yv$T_LJDIzhU8Lkc^fg(3NI$1Wp#U0wZ3G3-%#_Bb_r{=z)73@n!~JGqAb@>G5t(Wn zqc8tKO5!-e&$$4`5d2wz9($zV3R3>Y%+ukN8f505=YJX_?5M-9LG`a{2M0mvJ0^&C z@D7)Y+J;VYgx3bO>t&6*Lr&qG$bBWDQ+5*2=lS{q1G=ek6(%~)c42*e2^8B5OgP)T z9GANTLFi0U0Ns5V73}xd9cMPOHkOlFAV`4_!h9^%6}H2l;nhEWPVgR}-M~e0SL_U% z?IHHIJwgFSyN0uA;U#E3hfq6%eHsbeh_Cl?n^F>xNDz>*1NbLbAgYob`-%P{E`NG^ z5)OUqYz6w~HV-fS^RN?Ov-g^bhNl#`96+qdzT$o*e$1SpH_t~w0@)eSPh-cg;QvSO zU?EFzQrX(4Kk$=%tJ@~;aC0Dq(c--HI+5gqF7LP(?QqMs4xc+i0&q^`JWGT_`R<(l zOfg#sAZKv1Iom^$HXOf?W4#;&jPX*&)~%S|8C#! zM@5k2Am1gEy5q;M2p>0UlS6+U;or{z?70h_Js|_De)2bwvq(Dw OeAHpu%4JGcq5lCa(&Eej literal 0 HcmV?d00001 diff --git a/nb-model-building.jpg b/nb-model-building.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f42bbe2e4609f1dc21a3452ec0a3247e614a4e87 GIT binary patch literal 38413 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