Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Final project of course computational literary analysis in UC Berkeley
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Computational Literary Analysis on Jane Eyre\n",
"\n",
"## Kay\n",
"\n",
"Aug 19, 2019.\n",
"\n",
"Introduction to Computational Literary Analysis\n",
"\n",
"UC-Berkeley, Summer 2019\n",
"\n",
"Instructor: Jonathan Reeve"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"Jane Eyre is a novel by English writer Charlotte Brontë, published under the pen name \"Currer Bell\", on 16 October 1847. Jane Eyre follows the experiences of its eponymous heroine, including her growth to adulthood and her love for Mr. Rochester, the brooding master of Thornfield Hall. The novel revolutionised prose fiction by being the first to focus on its protagonist's moral and spiritual development through an intimate first-person narrative, where actions and events are coloured by a psychological intensity. Charlotte Brontë has been called the \"first historian of the private consciousness\", and the literary ancestor of writers like Proust and Joyce. The book contains elements of social criticism, with a strong sense of Christian morality at its core, and is considered by many to be ahead of its time because of Jane's individualistic character and how the novel approaches the topics of class, sexuality, religion and feminism.(\"Jane Eyre\", 2019)The novel has been adapted into a number of other forms, including theatre, movie, television and opera. These are significant rewritings and reinterpretations of the novel. Therefore, in this project, we are going to analyze both novel text and one of its adaption movie. The movie is directed by Cary Fukunaga and starring Mia Wasikowska and Michael Fassbender, and released on 11 March 2011 in the United States. The screenplay is written by Moira Buffini based on the novel.(\"Jane Eyre (2011 film)\", 2019) For the movie, we cannot directly analyze the video. As a result, we analyze the subtitles and reviews of the movie."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Experiment"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"from requests.exceptions import RequestException\n",
"import json \n",
"from bs4 import BeautifulSoup\n",
"import collections\n",
"import nltk\n",
"from nltk.corpus import stopwords\n",
"from nltk.corpus import sentiwordnet as sw\n",
"import spacy\n",
"import pandas as pd\n",
"import numpy as np\n",
"import sklearn\n",
"import matplotlib.pyplot as plt\n",
"from random import choice\n",
"from nltk.corpus import wordnet as wn\n",
"from matplotlib import colors\n",
"from mpl_toolkits.mplot3d import axes3d\n",
"%matplotlib inline\n",
"nlp = spacy.load(\"en_core_web_lg\")\n",
"from gpt2_client import GPT2Client\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Get Text\n",
"To get the corpus, we use corpus DB to get the novel text from Gutenberg, and develop an tiny crawler applying requests library to get the movie reviews from IMDB. For the movie subtitles, we download it from [zimuku](http://www.zimuku.la)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Novel"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def novel():\n",
" novelUrl = 'http://corpus-db.org/api/id/1260.0/fulltext'\n",
" try:\n",
" response = requests.get(novelUrl)\n",
" if response.status_code == 200:\n",
" novel = json.loads(response.text)\n",
" return novel[0]['text'][396:]\n",
" else:\n",
" print(\"GET url Do Not 200 OK!\")\n",
" return None\n",
" except RequestException:\n",
" print(\"Get URL failed!\")\n",
" return None"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"novel = novel()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Subtitle"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--2019-08-20 13:26:55-- http://lzkay.tech/wp-content/uploads/2019/08/subtitle.srt\n",
"Resolving lzkay.tech (lzkay.tech)... 47.93.218.97\n",
"Connecting to lzkay.tech (lzkay.tech)|47.93.218.97|:80... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 84930 (83K) [application/x-subrip]\n",
"Saving to: ‘subtitle.srt.4’\n",
"\n",
"subtitle.srt.4 100%[===================>] 82.94K --.-KB/s in 0.03s \n",
"\n",
"2019-08-20 13:26:55 (2.48 MB/s) - ‘subtitle.srt.4’ saved [84930/84930]\n",
"\n"
]
}
],
"source": [
"!wget \"http://lzkay.tech/wp-content/uploads/2019/08/subtitle.srt\""
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def movieSub():\n",
" file = open(\"subtitle.srt\")\n",
" subtitle = []\n",
" num = \"\\n\"\n",
" while num != \"\":\n",
" num = file.readline()\n",
" file.readline()\n",
" subtitle.append(file.readline())\n",
" file.readline()\n",
" return \" \".join(subtitle)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"subText = movieSub()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Reviews"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def movieReviews(title):\n",
" url = \"http://www.imdb.com/title/\" + title + \"/reviews\"\n",
" try:\n",
" response = requests.get(url)\n",
" if response.status_code == 200:\n",
" soup = BeautifulSoup(response.text, 'lxml')\n",
" tags = [[item.find(class_=\"rating-other-user-rating\"), item.find(class_=\"text show-more__control\"), item.find(class_=\"spoiler-warning\")] for item in soup.find_all(class_=\"lister-item-content\")]\n",
" reviews = []\n",
" for tag in tags:\n",
" ls = []\n",
" if tag[0] is not None:\n",
" ls.append(tag[0].span.text)\n",
" else:\n",
" ls.append(\"0\")\n",
" if tag[1] is not None:\n",
" ls.append(tag[1].text)\n",
" else:\n",
" ls.append(\"0\")\n",
" if tag[2] is not None:\n",
" ls.append(True)\n",
" else:\n",
" ls.append(False)\n",
" reviews.append(ls)\n",
" return reviews\n",
" else:\n",
" print(\"GET url of movie Do Not 200 OK!\")\n",
" except RequestException:\n",
" print(\"Get Movie URL failed!\")\n",
" return None"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"reviews = movieReviews('tt1229822')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Hypothesis 1: The movie is partly faithful to its original\n",
"Recently, adaption movies become more and more popular. Adaption movie of literature present the classic story through a brand new way, and improve the vitality of literature. Some adaption movies is faithfully told the story of literature, but some adaption movies have completely changed the original. Hence, to find out whether this adaption movie is faithful to original, we analyze the sentiment change both in the novel and the movie, and compare each other. What I did is to compare those sentiment change in novel text and movie subtitles. As two figures shown below, the sentiment vary all the time. From some perspective, we can find out some similarities. For instance, at the beginning of both stories, the sentiments are negative, for two stories are both describing the tragic childhood of Jane. Also at the end of each story, Jane marry Rochester, who she deeply loves. Obviously, these are happy endings, and the sentiment scores of both stories are positive. However, there are lots of differences between these two figures. As far as I am concerned, this is because the timeline may be mixed by narrative technique in movie to make a better experience for audiences. Therefore, there are some differences within the stories."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def calSentScores(doc):\n",
" lemmaList = []\n",
" for sent in doc.sents: \n",
" sentLemmaList = []\n",
" for w in sent: \n",
" if (not w.is_stop) and (not w.is_punct) and (not w.is_space) and (w.pos_ is not 'PROPN'): \n",
" sentLemmaList.append((w.lemma_, w.pos_))\n",
" lemmaList.append(sentLemmaList)\n",
" \n",
" sentScores = []\n",
" for sent in lemmaList: \n",
" scores = []\n",
" for word, pos in sent: \n",
" synPos = pos.lower()[0]\n",
" if synPos not in ['a', 'n', 'v']:\n",
" continue\n",
" synsets = list(sw.senti_synsets(word, synPos))\n",
" if (type(synsets) == list) and len(synsets)>0:\n",
" synset = synsets[0]\n",
" score = synset.pos_score() - synset.neg_score()\n",
" scores.append(score)\n",
" if len(scores)>0: \n",
" avgScores = sum(scores) / len(scores)\n",
" sentScores.append(avgScores)\n",
" return sentScores"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"nlp.max_length = 1030000\n",
"novelSentScores = calSentScores(nlp(novel))\n",
"subSentScores = calSentScores(nlp(subText))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1a224eef60>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.subplot(2,2,1)\n",
"pd.Series(novelSentScores).rolling(500).mean().plot()\n",
"plt.title('Novel Text')\n",
"plt.ylabel('sentiment')\n",
"plt.subplot(2,2,2)\n",
"pd.Series(subSentScores).rolling(60).mean().plot()\n",
"plt.title('Movie Subtitles')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Hypothesis 2: Good movie reviews are usually critical\n",
"In IMDB, movie reviews are often with a ratings. Everyone can rate the movie and publish movie reviews. Generally speaking, the high rating reviews are usually positive, and low rating review are usually negative. However, according to the computational sentiment analysis result, the figure below, on the whole, it is correct, the slope of fitting line in positive, but some of residuals of rating is significant. It means that no matter how much the ratings are, the reviews are usually critical, and both show the pros and cons of the movie. Considering the source of movie reviews, the default order of reviews is sort by helpfulness. For the crawler only get top 25 reviews, so the reviews are always very helpful and highly recommended. Therefore, good movie reviews are usually critical."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"reviewDocs = []\n",
"for review in reviews:\n",
" reviewDocs.append(nlp(review[1]))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"lemmaList = []\n",
"for doc in reviewDocs: \n",
" docLemmaList = []\n",
" for w in doc: \n",
" if (not w.is_stop) and (not w.is_punct) and (not w.is_space) and (w.pos_ is not 'PROPN'): \n",
" docLemmaList.append((w.lemma_, w.pos_))\n",
" lemmaList.append(docLemmaList)\n",
" reviewScores = []\n",
"for doc in lemmaList:\n",
" scores = []\n",
" for word, pos in doc:\n",
" synPos = pos.lower()[0]\n",
" if synPos not in ['a', 'n', 'v']:\n",
" continue\n",
" synsets = list(sw.senti_synsets(word, synPos))\n",
" if (type(synsets) == list) and len(synsets)>0:\n",
" synset = synsets[0]\n",
" score = synset.pos_score() - synset.neg_score()\n",
" scores.append(score)\n",
" if len(scores)>0: \n",
" avgScores = sum(scores) / len(scores)\n",
" reviewScores.append(avgScores)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"rateList = []\n",
"for review in reviews:\n",
" rateList.append(int(review[0]))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'sentiment')"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAEWCAYAAABBvWFzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3XmcHHWd//HXmwkTAuEmi5CDCRCQQVCXIRAPCCIYVAyrsERdCSzK+thl1fWEnxeCvwWVXdQV180KcnggsvoznsgGwqo7aCagQBKQGAIznBOScMuY5PP7o6qZmk7PTGemumum+/18PPox3VXf6vpUT3V/qr5HlSICMzOz0dqu6ADMzKwxOKGYmVkunFDMzCwXTihmZpYLJxQzM8uFE4qZmeXCCWUckjRXUs8olv+apE/mGVOFdYSkAweZ905Jvxjh+14g6Zuji655SJoh6RlJLUXHMpTR7tN5kvQzSQuLjmM8ckIpiKS1kp5Pv+yPSrpK0uQarOdMSb/KTouI90bERXmvq1oR8a2IOLHe6x0PySjdD/rS/WK9pJskvXQbll8r6fWl1xHxYERMjojNtYm4PiTNl/Q7SU9JWidpiaS2HN53q30iIk6KiKtH+94jiOUqSZ+t93rz5IRSrJMjYjLwCuCVwPkFx2Njw+fT/WIq8BBwRcHxFCo9070G+BCwKzAT+Cqwpci4rIKI8KOAB7AWeH3m9eeBn2ReTwQuBR4EHgO+BkxK580FejJlzwP+CDwNrAT+Kp1+CPAnYDPwDLAxnX4V8NnM8u8BVgPrgcXAvpl5AbwXuA/YAFwOKJ13IHAr8CSwDvhulcudCfyqrOz7gDXp+3wB2G6Qz+0C4Abgu+n23g68PDN/X+C/gF7gfuB96fR5QB/w5/Sz+D1wHHBXZtn/Bn6bef0r4JSh3jedt13mf/AEcD2wRzqvLd2+hen/ch3w8SH2i/L/zRuBZzOvDwBuTtezDvgWsFs671qSH9nn0238aGb9E9IyS4GLgF+nn98vgL0y738G8ED6/p+kbD8ti/VNwB3AU0A3cEFm3pDbDUxKt3UDyT77ETL7dNl6TgV+N8RnNqLPv9I+kfmM3p3ZV38NXAZsJNlHX5VO7wYeBxZuy/eWJDE+DjwCnJXOOyeNoy+N5UdF/0aN6Het6ACa9ZH9ogLTgLuAL2Xmf5Hkx30PYGfgR8DF6by5DEwop5H84G0HnA48C+yTzjuTzI93Ou0q0h8t4HXpl+wv0y/DvwH/kykbwI+B3YAZJD+o89J53wE+nq53B+A1VS43IKa07C3pts4A/lD6Qlf43C5Iv3inAtsDHyb5gd8+jWM58CmgFdg//QF4Q2bZb2beaweSH9+9gAnAo8DD6ec9KZ23ZxXv+wHgtvT/OBH4D+A76by2dPv+M33PlwMvAIcMsn3Z/81OJEni95n5BwInpOuZAvwP8MVK+1XZ+rMJ5Y/AQWk8S4FL0nntJD9mr0m389L0sx4socwFDks/n8NJfkBPqWa7gUuAX6b/8+nA3QyeUPYnOTC6jOQgYHLZ/BF//uX7ROYzyiaUTcBZQAvwWZJkcXm6rhNJEvPkKr+3m4ALSfbXNwLPAbuX/+/H66PwAJr1kX7xn0l3xgCW0H+kKZKkcECm/Bzg/vT53MG+fOn83wHz0+dnMnRCuYKkiqU0b3L6I9KWvg4GJorrgfPS59cAi4BpFWIYarkBMaVl52Ve/z2wZJBtuwC4LfN6O5IjvdcCRwEPlpU/H/hGZtnyH49fAm8FjiY5Wr+e5Mj1OODOtMxw77sKOD4zb5/0M5xA/w/atMz83wILBtm+q0h+PDeSnG3cDxw+xP/6FOCOsv1quITyibLP+ufp80+R/hCnr3ckOWKumFAqxPJF4LKy9VbcbpKEnP2fn8PQ+/TR6f+mN/18rqL/R3zEn/8g+8RSBiaU+zLzDkvfb+/MtCdIqq2r+d4+X/pfpNMeB44u/16O18cErEinRMR/SzoW+DbJkfJGkiPPHYHlkkplRXKEtBVJZwAfJPnyQJIU9qoyhn1Jqo0AiIhnJD1BUn+/Np38aKb8c+n7Q1KlchHwW0kbgH+JiCszZQdbrpLuzPMH0riGLRsRW9LeQfuSfNH3lbQxU7aFJGkM5lb6qyJuJamCOZbkKPbWtMx+w7zvfsAPJGXr9DcDe2deb8tncWlEfELSDODnwMHAnQCS/gL4MkkC3ZkkoW4Y4r0qGSyWfRn42T6X7gsVSTqK5EzjZSRnNBOB741kXST/80FFxG3AX6frPZKkyvPjJIk978+/3GOZ58+n8ZRPm0x139snImLTKGIZ09woPwZExK0kRyeXppPWkeykh0bEbulj10gaageQtB/J6fy5wJ4RsRtJ9UFpj45hVv8wyRey9H47kVTzPFRF3I9GxHsiYl/g74CvDtZVuArTM89npHENW1bSdiRVHQ+T/EDdn/nMdouInSPijaWQK7xXKaEckz6/lSShHEt/QhnufbuBk8rm7xARw36GQ4mIB4H3A1+SNCmdfHG6HYdHxC7A39D/vx5sG6v1CMlnCUC6zj2HKP9tkuqd6RGxK0l7gYYoX76u8v95VSJiGfB9kkQGo/v8R/N5lav6e1uHWArhhDJ2fBE4QdIrImILSZK4LD0iRdJUSW+osNxOJDtib1ruLPq/aJAcXU2T1DrIer8NnCXpFZImAv8M/CYi1g4XsKTTJJV+gDakcYy0e+pHJO0uaTrJj+h3hyh7hKS3SppAUn/+Akkd+m+BpyR9TNIkSS2SXpYe0ULyWbSlSajkf0nOAGaTNMivIEmwR5G0T1DF+34N+L9pckfSFEnzR/g5DBARN5Eky3PSSTuTdrCQNJWkMTvrMZI2h5G4AThZ0qvS/eUzDJ0gdgbWR8SfJM0G3rEN67oeOD/9n08D/nGwgpJeI+k9me/CS4G3kPzPYXSff6V9YkS28Xs7WCwj/d+NCU4oY0RE9JK0SZQGHH6MpOfVbZKeIumBdHCF5VYC/wJ0kuyQh5H0Sim5GVgBPCppXYXll6Tr/C+So8YDgAVVhn0k8BtJz5Acqb4/Iu6vctlyPyRp+P4d8BOG7ir7Q5LOBxuAdwFvjYg/RzLW4mSS+uz7SY4Yv07S1RT6q2OekHQ7QEQ8S1LltyIi+tL5ncADEfF4Wma49/1Suv2/kPQ0yQ/dUSP7GCr6AvDRNOF/hqQDxZMkn9P3y8peDHxC0kZJH96WlaTJ9B+B60j2hadJ6vhfGGSRvwcuTLf5UyRJolqfIanmup+k7eraIcpuJEkgd6X72s+BH5D0jITRff5b7ROjVNX3dhBXAO3p/+7/5RBL3ZW6cZoVRlIAsyJiddGxWL90oO1Gkv/NSA8UrIn4DMXMXiTpZEk7pm1pl5J0Z19bbFQ2XjihmFnWfJI2m4eBWSTda12NYVVxlZeZmeXCZyhmZpaLphrYuNdee0VbW1vRYZiZjSvLly9fFxFThivXVAmlra2Nrq6uosMwMxtXJA15JYMSV3mZmVkunFDMzCwXTihmZpYLJxQzM8uFE4qZmeXCCcXMzHLhhGJm1sA6uzu5+JcX09ndWfN1NdU4FDOzZtLZ3cnx1xxP3+Y+WltaWXLGEuZMn1Oz9fkMxcysQS1du5S+zX1sjs30be5j6dqlNV1foQlF0jxJ90paLem8CvOPkXS7pE2STs1Mf4WkTkkrJN0p6fT6Rm5mNvbNbZtLa0srLWqhtaWVuW1za7q+wqq8JLUAlwMnAD3AMkmL0zsQljwInAmU33nuOeCMiLhP0r7Ackk3RsTGOoRuZjYuzJk+hyVnLGHp2qXMbZtb0+ouKLYNZTawOiLWAEi6juReDC8mlNJ9zSVtyS4YEX/IPH9Y0uPAFJK7y5mZWWrO9Dk1TyQlRVZ5TQW6M6970mnbRNJsoBX44yDzz5HUJamrt7d3RIGamdnwikwoqjBtm+72JWkf4FrgrIjYUqlMRCyKiI6I6JgyZdirL5uZ2QgVmVB6gOmZ19NIbjtaFUm7AD8BPhERt+Ucm5mZbaMiE8oyYJakmZJagQXA4moWTMv/ALgmIr5XwxjNzKxKhSWUiNgEnAvcCKwCro+IFZIulPQWAElHSuoBTgP+Q9KKdPG/Bo4BzpT0u/TxigI2w8zMUorYpmaLca2joyN8x0Yzs20jaXlEdAxXziPlzcwsF04oZmaWCycUMzPLhROKmZnlwgnFzMxy4YRiZtbAfIMtMzMbNd9gy8zMctFUN9gyM7PaaZobbJmZWW010w22zMysxprlBltmZtZAnFDMzCwXTihmZpYLJxQzM8uFE4qZmeXCCcXMzHLhhGJmZrkoNKFImifpXkmrJZ1XYf4xkm6XtEnSqWXzFkq6L30srF/UZmZWSWEJRVILcDlwEtAOvF1Se1mxB4EzgW+XLbsH8GngKGA28GlJu9c6ZjMzG1yRZyizgdURsSYi+oDrgPnZAhGxNiLuBLaULfsG4KaIWB8RG4CbgHn1CNrMzCorMqFMBbozr3vSabkuK+kcSV2Sunp7e0cUqJmZDa/IhKIK0yLvZSNiUUR0RETHlClTqg7OzMy2TZEJpQeYnnk9DXi4DsuamVkNFJlQlgGzJM2U1AosABZXueyNwImSdk8b409Mp5mZWUEKSygRsQk4lyQRrAKuj4gVki6U9BYASUdK6gFOA/5D0op02fXARSRJaRlwYTrNzMwKoohqmy3Gv46Ojujq6io6DDOzcUXS8ojoGK6cR8qbmVkunFDMzCwXTihmZpYLJxQzM8uFE4qZmeXCCcXMzHLhhGJmZrlwQjEzs1w4oZiZWS6cUMzMLBdOKGZmDayzu5OLf3kxnd2dNV/XhJqvwczMCtHZ3cnx1xxP3+Y+WltaWXLGEuZMn1Oz9fkMxcysQS1du5S+zX1sjs30be5j6dqlNV2fE4qZWYOa2zaX1pZWWtRCa0src9vm1nR9rvIyM2tQc6bPYckZS1i6dilz2+bWtLoLnFDMzBranOlzap5ISlzlZWZmuXBCMTOzXBSaUCTNk3SvpNWSzqswf6Kk76bzfyOpLZ2+vaSrJd0laZWk8+sdu5mZDVRYQpHUAlwOnAS0A2+X1F5W7GxgQ0QcCFwGfC6dfhowMSIOA44A/q6UbGx8q+cgLDPLV5GN8rOB1RGxBkDSdcB8YGWmzHzggvT5DcBXJAkIYCdJE4BJQB/wVJ3ithqp9yAsM8tXkVVeU4HuzOuedFrFMhGxCXgS2JMkuTwLPAI8CFwaEesrrUTSOZK6JHX19vbmuwWWq3oPwjKzfBWZUFRhWlRZZjawGdgXmAl8SNL+lVYSEYsioiMiOqZMmTKaeK3G6j0Iy8zyVWSVVw8wPfN6GvDwIGV60uqtXYH1wDuAn0fEn4HHJf0a6ADW1Dxqq5l6D8Iys3wVmVCWAbMkzQQeAhaQJIqsxcBCoBM4Fbg5IkLSg8DrJH0T2BE4Gvhi3SK3mqnnICwzy1dhVV5pm8i5wI3AKuD6iFgh6UJJb0mLXQHsKWk18EGg1LX4cmAycDdJYvpGRNxZ1w0wM7MBFFHebNG4Ojo6oqurq+gwzMzGFUnLI6JjuHIeKW9mZrlwQjEzs1w4oZiZWS6cUMzMLBdOKGZmlgsnFDMzy4UTipmZ5cIJxczMcuGEYmZmuXBCMTNrYPW8aV2RF4c0M7MaqvdN63yGYmbWoOp907qqEoqkV1czzczMxo5637Su2iqvfwP+soppZmZjVmd3Z1PdwK3eN60bMqFImgO8Cpgi6YOZWbsALbUMzMwsT/VuTxgr6nnTuuGqvFpJbmQ1Adg583iK5A6KZmbjQr3bE5rRkGcoEXErcKukqyLigTrFZKlmOz03q6VSe0LpDKXW7QnNqNo2lImSFgFt2WUi4nW1CMqa9/TcrFbq3Z7QjKrtNvw94A7gE8BHMo9RkTRP0r2SVks6r8L8iZK+m87/jaS2zLzDJXVKWiHpLkk7jDaescSn52Y23lR7hrIpIv49zxVLagEuB04AeoBlkhZHxMpMsbOBDRFxoKQFwOeA0yVNAL4JvCsifi9pT+DPecZXNJ+em+XLZ/21V+0Zyo8k/b2kfSTtUXqMct2zgdURsSYi+oDrgPllZeYDV6fPbwCOlyTgRODOiPg9QEQ8ERGbRxnPmFI6Pb/ouIu845vloGnP+rdsge7uuqyq2jOUhenfbDVXAPuPYt1TgexW9gBHDVYmIjZJehLYEzgICEk3AlOA6yLi85VWIukc4ByAGTNmjCLc+qtndz+zRtfwZ/2bNsGaNbBqFaxc2f9YtQpeeAGefRZ2qG3LQFUJJSJm1mDdqrSqKstMAF4DHAk8ByyRtDwilmxVOGIRsAigo6Oj/P3NrABF9GBsmEb5vj5YvXpg0li5Eu69N5lXMn06tLfDscfCIYckZyo1VlVCkbQj8EFgRkScI2kWcHBE/HgU6+4BpmdeTwMeHqRMT9pusiuwPp1+a0SsS+P7Kcmo/a0SipmNLUW2ZYyrs/4//SlJEtkzjZUr4b77krMRAAlmzkwSx7x5yd/2dnjpS2GXXeoecrVVXt8AlpOMmofkB/17wGgSyjJglqSZwEPAAuAdZWUWk1S3dZIMpLw5IkpVXR9NE10fcCxw2ShiGZLHg5jlp1JbRlN/r555Bu65Z+uqqjVr+s8qttsODjwwSRZ/9Vf9iePgg2HHHYuNP6PahHJARJwu6e0AEfF82jg+YmmbyLnAjSSXcbkyIlZIuhDoiojFwBXAtZJWk5yZLEiX3SDpX0mSUgA/jYifjCaewbhniFm+Gr4tYzBPPrl10li5Eh7IjBnffns46CB45Svhne9MksYhhyTTJk4sLvYqVZtQ+iRNIm3jkHQA8MJoVx4RPwV+WjbtU5nnfwJOG2TZb5J0Ha4pH02Z5ath2jIG88QTWyeNVavgoYf6y+ywQ1It9epXw7vf3X/GccABSVIZp6pNKJ8Gfg5Ml/Qt4NXAmbUKaixp2qMpsxoaV20ZlUTAY49t3b6xciU8/nh/uZ12Ss4wjj++P2m0t0NbG7Q03vV1FVFdx6d08ODRJD2vbis1iI8nHR0d0dXVtc3LuQ3FrElFQE9P5aqqDRv6y+2668CEUXpMm5a0f4xzaS/ajuHKbcstgKeStHVMAI6RRER8f6QBjifj/mjKquIDhya2ZUvSllGpqurpp/vL7bknHHoonH56f/tGezvss0/S46rJVdtt+ErgcGAFUOrMHEBTJBRrfO580SRKg//Kq6pWrYLnn+8v95KXJIli4cKBZxxTphQX+zhQ7RnK0RHRXtNIzArkzhcNpq8vGa9RXlU11OC/UtI45BDYfffiYh/Hqk0onZLayy7caNYw3PlinCof/Fd63HcfbE4v75cd/HfSSf1Jo6DBf42s2oRyNUlSeZSku7CAiIjDaxaZWR01fFfW8a40+K+8fSM7+K+lpX/w31vfOmYH/zWyahPKlcC7gLvob0MxayjufDEGbNw4sF2j2sF/7e0wa9a4GPzXyKpNKA+mI9fNzEav0uC/lSvh4czl/LKD/97znv7Esf/+43LwXzP0Iqw2odwj6dvAj8iMkG+WbsNmNgLlg/+yVVXlg//a2+GEEwZ2xW2gwX/N0ouw2oQyiSSRnJiZ5m7DZtY/+K/SqPFKg/9OPrkhB/8NpVl6EVZ7P5Szah2ImY1xW7bA2rWVb+A01OC/0uMlL2nawX/N0otwyIQi6aMR8XlJ/8bWN78iIt5Xs8jMrBjlg/9Kj3vuGTj4b599kkRx5pkDq6o8+G8rzdKLcLgzlFXp322/AJaZjW2lwX/lZxvlg/9mzEiSxdy5Hvw3Cs3Qi3DIhBIRP0qfPhcR38vOk1TxsvJmNsY8/3z/4L9sddVwg/9Kd/7beedi47dxo9pG+fNJ7tA43DQzK0qlwX+lO/+VriqeHfz3trf1J46DDvLgPxu14dpQTgLeCEyV9OXMrF2ATbUMzKxZbPP4hOzgv+zjwQf7y2y/fTJC/Igj4F3v6m/f8OA/q6HhzlAeJmk/eQvJPeVLngb+qVZBmTWLIccnrFtXuStupcF/r3nNwB5VBxwAE7bl7hRmozdcG8rvgd9L+nZE/DnvlUuaB3yJ5D4rX4+IS8rmTwSuAY4AngBOj4i1mfkzgJXABRFxad7xmdXa0vtvYfeNL3Dw41t42bo/MbHrn2DDDkni6O3tL1g++K/02G+/hhn8Z+NftYcwsyVdAOyXLlO6OOT+I12xpBbgcuAEoAdYJmlx2RWNzwY2RMSBkhYAnwNOz8y/DPjZSGMwq5vywX/p4yN338X5T/XfYmjTLivgZYfD/PkDu+JOn960Yzhs/Kg2oVxBUsW1HNic07pnA6sjYg2ApOuA+SRnHCXzgQvS5zcAX5GkiAhJpwBrgGdzisds9EqD/8q74q5cmTSal0yZAoccwoR3vJP795lE5y5PctBrTqHjiDc7cdi4VW1CeTIi8j4TmAp0Z173AEcNViYiNkl6EthT0vPAx0jObj481EoknQOcAzBjxox8IjfbtAn++Met2zcGG/x31lkDx3BkBv/NTB9m4121CeUWSV8guXZX9uKQt49i3ZUOw8pH4w9W5jPAZRHxjIY5mouIRcAigI6Ojq1G+5sNqdLgv5Ur4Q9/2HrwX3s7HHfcwMSx227FxW5WZ9UmlNKZQ0dmWgCvG8W6e4DpmdfTSHqVVSrTI2kCsCuwPo3nVEmfB3YDtkj6U0R8ZRTxWDPLDv7LPlavHjj4b//9k2Txxjd68J9ZmWovDnlcDda9DJglaSbwELAAeEdZmcXAQqATOBW4OSICeG2pQNpZ4BknE6vKM89UvoHTYIP/Tj114J3/Jk0qNn6zMayqhCJpb+CfgX0j4iRJ7cCciLhipCtO20TOBW4k6TZ8ZUSskHQh0JXe0OsK4FpJq0nOTBaMdH3WZEYy+K+UOA480IP/zEZAEcM3K0j6GfAN4OMR8fK0+umOiDis1gHmqaOjI7q6fJ3LhpId/Jd9PPJIf5kddujvfpvtiuvBf2ZVkbQ8IjqGK1ftt2mviLhe0vnw4tlFXt2HzYYWAY8+Wrkrbnbw3+TJSbI48UQP/jMrQLUJ5VlJe5L2wpJ0NPBkzaIaY5rhXtBjQgR0d1euqtq4sb/cbrsliaI0+C975z+P4TArTLUJ5YMkDeQHSPo1MIWkkbzhNcu9oOuq0uC/0llH+eC/9nZ4+9sHVlc12J3/fMBijaLahHIAcBJJF963kXTbbYrK52a5F3RNZAf/ZR/33jtw8N+++w47+K9R+YDFGkm1SeGTEfE9SbsDrwf+Bfh3th7Z3nCa5V7Qo/LCC/2D/7LVVffeC3/OXFO0NPjvda/z4L+UD1iskVSbUEoN8G8CvhYRP0zHfzS8ZrkXdFW2dfDfm940cPDf5MnFxj8G+YDFGkm13YZ/TDL48PUkl5J/HvhtRLy8tuHly92Gq/T005Xv/Hf//QMH/82atXVXXA/+22ZuQ7Gxrtpuw9UmlB2BecBdEXGfpH2AwyLiF6MPtX6cUMps2DCwiqr0PDv4r7U1uT1stjdV6c5/ra3FxW5mVcnjgCXXcSgR8RzJhSFLrx8BHhl8CctDbkeuvb2Vu+JWGvz32tcOTBz77+/Bf2bjVL07ffiXYoza5h2h0uC/0mPduv5ykycnieINbxhYXeXBf2YNp96dPpxQxqhBd4TS4L9KYzjKB/8deiiccooH/5k1qXp3+nBCGaPmTn8tB21s4YBHN3PYE3D2Xb+CD82ubvBfezvsvbcTh1mTq3cv1aoa5RvFmGyUH2Tw35ZVK9nuhf4bOPXtvReth71iYNI45BDYa68CgzezZpD3xSFttLKD/8rv/Jcd/LffftDezrKDJ/P153/N3VOCP0zZjg+/8YOc/9rzi4vfzGwYTih5e+65/sF/2Z5Vgw3+e/ObKw7+29LdybcyjfIe8GZmY50Tykhty+C/Qw+F007rTxwHHTTs4D+P0DezPNRz4KwTSjVuuw3uvntg4uju7p/f2pqMED/ySFi4sH/U+CgH/82ZPseJxMxGzONQxqK//duk+mrSpKRa6phjPPjPzMa8phqHImke8CWSe8p/PSIuKZs/EbiG5PphTwCnR8RaSScAlwCtQB/wkYi4uWaBXnst7LFH0mC+3XY1W42ZWZ6aZhyKpBbgcuAEoAdYJmlxRKzMFDsb2BARB0paAHwOOB1YB5wcEQ9LehlwIzC1ZsEecUTN3trMrFbq3RZb5BnKbGB1RKwBkHQdMB/IJpT5wAXp8xuAr0hSRNyRKbMC2EHSxIh4ofZhm5mNH/Vsiy2y/mYqkGnZpoetzzJeLBMRm0juY79nWZm3AXcMlkwknSOpS1JXb2/viALt7O7k4l9eTGd354iWNzNrBkWeoVS6Lkj5sP0hy0g6lKQa7MTBVhIRi4BFkIyU39YgfYtWM7PqFHmG0kNyj/qSacDDg5WRNAHYFVifvp4G/AA4IyL+WKsgK/WSMDOzrRWZUJYBsyTNlNQKLAAWl5VZDCxMn58K3BwRIWk34CfA+RHx61oGWeol0aIWj1g3MxtCYVVeEbFJ0rkkPbRagCsjYoWkC4GuiFgMXAFcK2k1yZnJgnTxc4EDgU9K+mQ67cSIeDzvOD1i3cysOr7asJmZDanaqw17lJ6Z1Z17TjYmXy/EzOrKPScbl89QzKyu3HOycTmhmFlduedk43KVl5nVlXtONi4nFDOrO9/rpzG5ysvMzHLhhGJmZrlwQjEzs1w4oZiZWS6cUMzMLBdOKGZmlgsnFLMm5mtqWZ48DsWsSfmaWpY3n6GYNSlfU8vy5oRi1qR8TS3Lm6u8zJqUr6lleXNCMWtivqaW5anQKi9J8yTdK2m1pPMqzJ8o6bvp/N9IasvMOz+dfq+kN9QzbjMz21phCUVSC3A5cBLQDrxdUntZsbOBDRFxIHAZ8Ll02XZgAXAoMA/4avp+ZmZWkCLPUGYDqyNiTUT0AdcB88vKzAeuTp/fABwvSen06yLihYi4H1idvp+ZmRWkyIQyFejOvO5Jp1UsExGbgCeBPatcFgBJ50jqktTV29ubU+hmZlauyISiCtOiyjLVLJtMjFgUER0R0TFlypRtDNHMzKpVZELpAaZnXk8DHh6sjKQJwK7A+iqXNTOzOioyoSwDZkmaKamVpJE2jTKhAAAIKElEQVR9cVmZxcDC9PmpwM0REen0BWkvsJnALOC3dYrbzMwqKGwcSkRsknQucCPQAlwZESskXQh0RcRi4ArgWkmrSc5MFqTLrpB0PbAS2AT8Q0RsLmRDzMwMACUH/M2ho6Mjurq6ig7DzGxckbQ8IjqGK+dreZmZWS6cUMzMLBdOKGZmlgsnFDMzy4UTipmZ5cIJxczMcuGEYmZmuXBCMTOzXDihmJlZLpxQzMwsF04oZmaWCycUMzPLhROKmZnlwgnFzMxy4YRiZma5cEIZwzq7O7n4lxfT2d1ZdChmZsMq7I6NNrTO7k6Ov+Z4+jb30drSypIzljBn+pyiwzIzG5TPUMaopWuX0re5j82xmb7NfSxdu7TokMzMhlRIQpG0h6SbJN2X/t19kHIL0zL3SVqYTttR0k8k3SNphaRL6ht9fcxtm0trSystaqG1pZW5bXOLDsnMRqEZqrALuae8pM8D6yPiEknnAbtHxMfKyuwBdAEdQADLgSOAF4CjIuIWSa3AEuCfI+Jnw613vN1TvrO7k6VrlzK3ba6ru8zGsfFehV3tPeWLakOZD8xNn18NLAU+VlbmDcBNEbEeQNJNwLyI+A5wC0BE9Em6HZhWh5jrbs70OeNqpzOzyipVYTfid7uoNpS9I+IRgPTvX1QoMxXozrzuSae9SNJuwMkkZykVSTpHUpekrt7e3lEHbma2rZqlCrtmZyiS/ht4SYVZH6/2LSpMe7F+TtIE4DvAlyNizWBvEhGLgEWQVHlVuW4zs9zMmT6HJWcsafgq7JollIh4/WDzJD0maZ+IeETSPsDjFYr10F8tBkm11tLM60XAfRHxxRzCNTOrqWaowi6qymsxsDB9vhD4YYUyNwInSto97QV2YjoNSZ8FdgU+UIdYm6J3hpnZaBXVKH8JcL2ks4EHgdMAJHUA742Id0fEekkXAcvSZS5Mp00jqTa7B7hdEsBXIuLrtQh0vPfOMDOrl0ISSkQ8ARxfYXoX8O7M6yuBK8vK9FC5faUmmqV3hpnZaHmk/DCapXeGmdlo+Vpew2iW3hlmZqPlhFKFZuidYWY2Wq7yMjOzXDihmJlZLpxQzMwsF04oZmaWCycUMzPLhROKmZnlopAbbBVFUi/wwAgX3wtYl2M444G3uTk02zY32/bC6Ld5v4iYMlyhpkoooyGpq5o7ljUSb3NzaLZtbrbthfpts6u8zMwsF04oZmaWCyeU6i0qOoACeJubQ7Ntc7NtL9Rpm92GYmZmufAZipmZ5cIJxczMcuGEMgxJ8yTdK2m1pPOKjqfWJE2XdIukVZJWSHp/0THVi6QWSXdI+nHRsdSDpN0k3SDpnvT/3fD3aJD0T+l+fbek70jaoeiY8ibpSkmPS7o7M20PSTdJui/9u3st1u2EMgRJLcDlwElAO/B2Se3FRlVzm4APRcQhwNHAPzTBNpe8H1hVdBB19CXg5xHxUuDlNPi2S5oKvA/oiIiXAS3AgmKjqomrgHll084DlkTELGBJ+jp3TihDmw2sjog1EdEHXAfMLzimmoqIRyLi9vT50yQ/MlOLjar2JE0D3gR8vehY6kHSLsAxwBUAEdEXERuLjaouJgCTJE0AdgQeLjie3EXE/wDryybPB65On18NnFKLdTuhDG0q0J153UMT/LiWSGoDXgn8pthI6uKLwEeBLUUHUif7A73AN9Jqvq9L2qnooGopIh4CLgUeBB4BnoyIXxQbVd3sHRGPQHLQCPxFLVbihDI0VZjWFP2sJU0G/gv4QEQ8VXQ8tSTpzcDjEbG86FjqaALwl8C/R8QrgWepUTXIWJG2G8wHZgL7AjtJ+ptio2osTihD6wGmZ15PowFPkctJ2p4kmXwrIr5fdDx18GrgLZLWklRrvk7SN4sNqeZ6gJ6IKJ193kCSYBrZ64H7I6I3Iv4MfB94VcEx1ctjkvYBSP8+XouVOKEMbRkwS9JMSa0kDXiLC46ppiSJpF59VUT8a9Hx1ENEnB8R0yKijeR/fHNENPSRa0Q8CnRLOjiddDywssCQ6uFB4GhJO6b7+fE0eEeEjMXAwvT5QuCHtVjJhFq8aaOIiE2SzgVuJOkRcmVErCg4rFp7NfAu4C5Jv0un/Z+I+GmBMVlt/CPwrfRgaQ1wVsHx1FRE/EbSDcDtJL0Z76ABL8Mi6TvAXGAvST3Ap4FLgOslnU2SWE+rybp96RUzM8uDq7zMzCwXTihmZpYLJxQzM8uFE4qZmeXCCcXMzHLhhGJWAEkfkLRj5vVPJe1WZExmo+Vuw2Y1kg6eU0RsdX2wdFR+R0Ssq3tgZjXiMxSzHElqS+8t8lWSAXRXSOpK78HxmbTM+0iuJXWLpFvSaWsl7ZVZ/j/TZX4haVJa5khJd0rqlPSF7P0uzMYCJxSz/B0MXJNedPFDEdEBHA4cK+nwiPgyyTXhjouI4yosPwu4PCIOBTYCb0unfwN4b0TMATbXfCvMtpETiln+HoiI29Lnfy3pdpLLfBxKcqO24dwfEaXL3iwH2tL2lZ0j4n/T6d/ONWKzHPhaXmb5exZA0kzgw8CREbFB0lVANbecfSHzfDMwicq3UjAbU3yGYlY7u5Aklycl7U1yK+mSp4Gdq32jiNgAPC3p6HRSI9661sY5n6GY1UhE/F7SHcAKkqv5/jozexHwM0mPDNKOUsnZwH9KehZYCjyZZ7xmo+Vuw2bjhKTJEfFM+vw8YJ+IeH/BYZm9yGcoZuPHmySdT/K9fQA4s9hwzAbyGYqZmeXCjfJmZpYLJxQzM8uFE4qZmeXCCcXMzHLhhGJmZrn4/9zdlCZh2KLVAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1c96b904a8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"X = np.array([[i] for i in rateList])\n",
"y = np.array(reviewScores)\n",
"model = sklearn.linear_model.LinearRegression()\n",
"model.fit(X, y)\n",
"X2 = [[0], [10]]\n",
"y2 = model.predict(X2)\n",
"plt.plot(X, y, 'g.')\n",
"plt.plot(X2, y2, 'r-')\n",
"plt.title('Relationship between Rating and Sentiment')\n",
"plt.xlabel('rating')\n",
"plt.ylabel('sentiment')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Hypothesis 3: Computers can also write reviews\n",
"With the development of Natural Language Processing, Natural-language generation has changed from ridiculous to sensible. Natural-language generation (NLG) is a software process that transforms structured data into natural language. It can be used to generate short blurbs of text in interactive conversations (a chatbot) which might even be read out loud by a text-to-speech system.(\"Natural-language generation\", 2019) It also can be used to generate reviews. In other words, computer can also write reviews.\n",
"\n",
"Actually, there are so many model can be used in text generation, such as Markov Chain, Long Short Term Memory Model and so on. The simplest one is Markov Chain Model. A Markov chain is a stochastic model describing a sequence of possible events in which the probability of each event depends only on the state attained in the previous event(\"Markov chain\", 2019). In other words, it generates next word based on a certain number of words in front. However, because it is too simple that it only considered statistics without other significant factors, the text generated by the model is meanless.\n",
"\n",
"Due to the not ideal result, we are going to find out a better solution to generate reviews. One of the best solution nowadays is GPT-2, a text generating model developed by OpenAI, released in Feb 2019. GPT2 was trained simply to predict the next word in 40GB of Internet text. GPT-2 is a large transformer-based language model with 1.5 billion parameters, trained on a dataset of 8 million web pages. GPT-2 is trained with a simple objective: predict the next word, given all of the previous words within some text. The diversity of the dataset causes this simple goal to contain naturally occurring demonstrations of many tasks across diverse domains. GPT-2 is pretrained by a large amount of data. The dataset emphasizes diversity of content, by scraping content from the Internet. In order to preserve document quality, the dataset used only pages which have been curated/filtered by humans—specifically, the dataset used outbound links from Reddit which received at least 3 karma. This can be thought of as a heuristic indicator for whether other users found the link interesting (whether educational or funny), leading to higher data quality than other similar datasets, such as CommonCrawl.(Radford, 2019) Due to better algorithm and much more high quality dataset, GPT-2 writes reviews almost like a human.\n",
"\n",
"One of the reviews from IMDB is start with \"'Jane Eyre' has\", so we use two model to generate two different reviews start with \"'Jane Eyre' has\". The review written by human and two results generated by Markov Chain Model and GPT-2 with same beginings are shown below."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Review written by human"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\"Jane Eyre\" has been my favorite book since I was 11 years old. The tale of a feisty orphan-girl-turned-governess who finds true love in a spooky mansion and ultimately redeems a tormented hero has made it to the top of every \"Best Love Stories\" list since it was first published in 1847, and with good reason. It's the perfect Gothic novel, melding mystery, horror, and the classic medieval castle setting with heart-stopping romance. There have been at least 18 film versions of \"Jane Eyre\" and 9 made-for-television movies--27 in all! I have seen most of them, some multiple times–-both out of my deep love for the tale, and as part of the research for my novel \"The Secret Diaries of Charlotte Brontë,\" the true story of Charlotte's remarkable life, her inspiration behind \"Jane Eyre,\" and her turbulent, real-life romance.Every screen version of JANE EYRE has its merits. I especially loved Timothy Dalton's portrayal of Mr. Rochester in the 1983 mini-series, and the 2006 Masterpiece Theatre mini-series starring Ruth Wilson and Toby Stephens. I was very curious to see how the new JANE EYRE adaptation from Focus Films would measure up. I am happy to report that the film, which I saw last night at an advance screening, is very good indeed, with marvelous visuals, terrific performances, and enough unique elements to make it a worthy new addition.The most notable distinction that sets this film apart from the rest is its structure. Rather than telling the tale in a linear fashion, it begins at a crisis moment later in the story, and tells the majority of the tale in flashback–-which works wonderfully well, enabling screenwriter Moira Buffini to effectively compress a long novel into a two-hour time span.The movie opens as Jane is fleeing Thornfield after having discovered Mr. Rochester's dark and heartbreaking secret. We fear for her as she becomes lost on the stormy moor. The mystery continues as St. John Rivers (well-played by a sympathetic yet appropriately stern Jamie Bell) and his sisters take her in. As Jane ruminates about the past events that led to her escape, we are treated to the story in flashback.The casting of Mia Wasikowska as Jane Eyre also sets this production apart, since she is closer in age than most actresses who've played the role to the character in the novel, who was about 18 years old in the Thornfield section. Although I wish Mia's Jane was a bit more \"swoony\" over Mr. Rochester earlier on (yes, she is supposed to be stoic, but I missed that phase where we get to see her blossom as she falls in love with him, and then is utterly crushed when she believes him to be in love with Miss Ingram), Mia truly inhabits the role, beautifully portraying Jane's sense of self-respect, integrity, and restraint, as well as her passion and vulnerability.Michael Fassbender embodies Mr. Rochester with the ideal blend of charisma and sinister brooding, while at the same time allowing glimpses of his underlying desperation and the wounded depths of his soul. Sally Hawkins as Mrs. Reed effectively portrays the icy ogre who menaces the young Jane (a spirited and appealing Amelia Clarkson.) And Judi Dench, as always, gives a superb performance as housekeeper Mrs. Fairfax.The film's locations do justice to the novel's often gloomy, atmospheric tone. Director Cary Fukunaga makes excellent use of Haddon Hall in Derbyshire, one of the oldest houses in England, as Thornfield Hall, emphasizing its dark, Gothic, masculine feel. The exterior locations--gardens, cliffs, craggy rocks, stone walls, and seemingly endless fields--make an arresting, dramatic backdrop for the story. You truly feel as though you are in the middle of nowhere.My only minor gripes are that when Mr. Rochester's secret is revealed, it feels a little too prettified, and the ending was too abrupt for me. But that aside, the filmmakers have done a masterful job translating the novel to the screen. I highly recommend it! --Syrie James\n"
]
}
],
"source": [
"print(reviews[0][1][19:])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Markov Model"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"reviewText = \"\"\n",
"for review in reviews:\n",
" reviewText += review[1] "
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"reviewsDoc = nlp(reviewText)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"reviewsDist = {}\n",
"for word in reviewsDoc[:-1]:\n",
" nextWord = reviewsDoc[word.i + 1].text\n",
" wordText = word.text\n",
" if wordText not in reviewsDist: \n",
" reviewsDist[wordText] = [nextWord]\n",
" else: \n",
" reviewsDist[wordText].append(nextWord)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"chain = ['\"', 'Jane', 'Eyre', '\"', 'has']\n",
"seed = 'has'"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"cnt = 0\n",
"while cnt < 5: \n",
" if seed in reviewsDist: \n",
" nextWord = choice(reviewsDist[seed])\n",
" seed = nextWord\n",
" chain.append(nextWord)\n",
" if seed is '.':\n",
" cnt += 1"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\" Jane Eyre \" has n't well. I've seen most of the book, which is individualistic, screaming mad women, Jane Eyre \" I could see the music which is beautifully filmed, serious expression and this production somehow, but cold as Jane and from 2006 Masterpiece Theater version of the Rivers ( although I think the story locking any of Mr. Rochester waxing eloquent about his pants on Mrs. Fairfax. And who knows that her gravitas to show how versatile this film ) And who 's given the chops to the book. Hopefully, the characters. Fukunaga 's impossible to effectively portrays the images from sympathetic yet appropriately stern Jamie, this one thing to me think that he also appreciate that is not disappoint ? Her generosity to use tears.\n"
]
}
],
"source": [
"print(' '.join(chain).replace('\\n', '').replace(' .', '.').replace(' ,', ','))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### GPT-2"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Downloading \u001b[1m\u001b[36mcheckpoint\u001b[0m: 1.00kit [00:00, 409kit/s] \n",
"Downloading \u001b[1m\u001b[36mencoder.json\u001b[0m: 1.04Mit [00:00, 2.43Mit/s] \n",
"Downloading \u001b[1m\u001b[36mhparams.json\u001b[0m: 1.00kit [00:00, 337kit/s] \n",
"Downloading \u001b[1m\u001b[36mmodel.ckpt.data-00000-of-00001\u001b[0m: 498Mit [00:36, 13.7Mit/s] \n",
"Downloading \u001b[1m\u001b[36mmodel.ckpt.index\u001b[0m: 6.00kit [00:00, 978kit/s] \n",
"Downloading \u001b[1m\u001b[36mmodel.ckpt.meta\u001b[0m: 472kit [00:00, 1.23Mit/s] \n",
"Downloading \u001b[1m\u001b[36mvocab.bpe\u001b[0m: 457kit [00:00, 1.47Mit/s] \n"
]
}
],
"source": [
"gpt2 = GPT2Client('117M', save_dir='models') # This could also be `345M`. Rename `save_dir` to anything.\n",
"gpt2.download_model()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"49974"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gpt2 = GPT2Client('117M') # This could also be `345M`\n",
"open('reviews.txt', 'w').write(reviewText)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Enter a prompt got GPT-2 >> \" Jane Eyre \" has\n",
"\u001b[1mPrompt\u001b[0m: \u001b[32m\" Jane Eyre \" has\u001b[0m\n",
"\n",
"\u001b[33mGenerating sample...\u001b[0m\n",
"\u001b[36m---------------------SAMPLE---------------------\n",
"\u001b[0m\n",
" home of a suspect in a Las Vegas robbery late last summer and arrested seven people over the past week.\n",
"\n",
"On April 9, the FBI and the Las Vegas Metropolitan Police Department arrested a suspect accused of having guns in the area. They arrested the suspect at his home in a residential area of the city — in an apparent effort to prevent a domestic terrorist attack. No other suspects were in custody.\n",
"\n",
"The FBI made it clear they hadn't been able to use the home, so they searched the residence in question. The home had a locked locked door and a two-year-old child.\n",
"\n",
"The FBI had a lead on at least one of the suspects. That leads to a federal indictment for conspiracy. Investigators concluded the FBI suspect was planning to bring a small amount of cocaine into their home.\n",
"\n",
"Two days later, agents took control of the home that was burglarized while they were searching it. That led them to the suspect's home, where a SWAT team and SWAT team entered and took several people who were living at the address.\n",
"\n",
"Officers identified the individual at their home as a 23-year-old woman who had never been a suspect before. They also found the gun.\n",
"\n",
"The suspect and all of the alleged accomplices were placed in the custody of the Nevada Department of Corrections and held on charges that could carry a maximum sentence of one-year probation. The Nevada Department of Public Corrections had said that was too lenient.\n",
"\n",
"The Nevada Department of Public Corrections is now open on its own probation, but in response to an email to the press that appeared on the FBI's website, the department stated that it was investigating the possibility any of the two were suspects. However, a spokesman for the Nevada Corrections Department said the department would not discuss any potential convictions for this issue during the course of its investigation.\n",
"\n",
"While investigating the case, Nevada police released a video of one of the suspects holding a gun.\n",
"\n",
"The FBI is investigating the shooting as it happened. It may have a role similar to a previous investigation into a shooting in Tucson, Arizona, last year, but it has now moved on after more than four months without any new information.<|endoftext|>WASHINGTON (Reuters) - Three U.S. men on the streets of North Carolina were arrested on Wednesday in connection with a series of bombings, an FBI official said, in their first arrest since the nation's top law enforcement agency launched an investigation.\n",
"\n",
"U.S. Attorney General Loretta Lynch speaks during a news conference at the U.S. Attorney's Office in Washington February 6, 2014. REUTERS/Jonathan Ernst\n",
"\n",
"The three arrested in North Carolina were found carrying weapons that have been widely used in multiple high-profile attacks against American citizens overseas since late last year, the official, citing unnamed law enforcement officials, said, without elaborating. The arrest has angered some lawmakers, led by Representative John Conyers John Sidney ConyersAvenatti: Third Kavanaugh accuser will prove credible against Kavanaugh, other 'privileged white guys' who defend him Grassley's office says it has received profane phone calls amid Kavanaugh fight Solicitor general should push Rosenstein to testify or resign MORE (D-Mich.), who praised the officials as acting lawfully.\n",
"\n",
"McConnell has threatened sanctions against the North Carolina authorities if they fail to cooperate.\n",
"\n",
"U.S. Secretary of State Rex Tillerson and Attorney General Loretta Lynch will meet on Wednesday with Justice Department representatives to discuss U.S. actions.\n",
"\n",
"In an office interview, Lynch said the three men were \"doing their job.\"\n",
"\n",
"\"The evidence that they provided, if they provided any, is significant,\" she said.\n",
"\n",
"U.S. officials declined to discuss the arrests because they do not believe any potential crimes were committed.\n",
"\n",
"President Donald Trump accused the three U.S. men of planning \"cowardly acts\" in a tweet on Monday, saying they had planned to attack \"Islamic terrorism\".\n",
"\n",
"The three are accused of planning three separate bombings in North Carolina, killing four people and injuring eight others before detonating explosives in a crowd outside a Planned Parenthood clinic.\n",
"\n",
"The suspects and their family members have also sought out and sought out other countries to target.\n",
"\n",
"At least 20 U.S. nationals, including a former U.S. Marine, have been killed outside of North Carolina.\n",
"\n",
"U.S. officials have urged American citizens abroad not to consider traveling to North Carolina to carry out attacks, saying it would risk national security.<|endoftext|>\"Greetings of Serenity\" [ edit ]\n",
"\n",
"The name \"Greetings of Serenity\" comes from the Greek and Roman gods of Serenity, as Serenity was an ancient and mythical god.\n",
"\n",
"Greetings Serenity, one of the two major characters in the \"Star Wars: A New Hope\" trilogy, has some major moments throughout the movie, including the beginning when Luke, the Jedi, appears in the New Republic Army. He is\n",
"\u001b[33mGenerating sample...\u001b[0m\n",
"\u001b[36m---------------------SAMPLE---------------------\n",
"\u001b[0m\n",
"[\"<|endoftext|>We're pleased to announce that the official website for the PlayStation Network® PlayStation®4™ and PlayStation®3™ multiplayer games will remain open for today through November 15, 2018. Starting in October 2018, these new games will be available at the PlayStation®Store, PlayStation Network ®Store and in the Play Store, PlayStation Store™ and PlayStation Plus Store. While PS4, PS3 and PS4 Pro owners will be able to download these PlayStation® games while playing online, they will not be available through PS4, PS3 and PlayStation®4 Pro members when this new console release will be available in November. We appreciate you for your support during these early and challenging times.\\n\\nFor a detailed guide to these games that will be featured in upcoming PlayStation Network releases, please see The PS4 and PS3 Games for the PS4 and PS4 Pro, PS4, PlayStation®Plus and PlayStation Plus Games lists at the time of this update. For complete PS4 and PS3 game release information, visit the official website of the PlayStation Network®, the PlayStation Network™ Software® website at www.psn.com, PlayStation.com, Facebook, Twitter and YouTube and select the game you would like to receive in the PS4, PS3 and PS4 Pro, PS4, PlayStation®Plus, PS4, PlayStation®4 Pro and PS4 Pro.\\n\\nYou can also visit this PS3 and PlayStation®3 PlayStation®2, PlayStation®2 PlayStation®3, PlayStation®4 and PlayStation®5 Multiplayer games site, which will be updated with updates as time allows. For more information, please visit PlayStation Nation, the PlayStation Network® app and PlayStation Network® app for Xbox, PlayStation and Xbox One, as well as the PlayStation 4, TV and Blu-ray® entertainment channels.<|endoftext|>The former National Security Agency contractor was working for the company's parent company for a year at a time before being named under a controversial intelligence report, it was revealed on Tuesday. This would appear to be a very important development, but if anything, it's a welcome one.\\n\\nThere are some basic questions about how the New York Post obtained NSA documents that may provide some information that may have helped to expose some of the most serious of the NSA's activities.\\n\\nWe know who the US intelligence community and their allies had access to - and who were able to find who they trusted to be the masterminds of a plot to use a massive and often deadly database of emails, phone and Internet data to steal vast amounts of Americans' data. Even though we knew the extent of the data they had and what they wanted without any further investigation there was at least a good chance the NSA had information on some of the top-ranking government employees involved in the operation. Here is what the article says, but it also contains very little information about what the agency was doing in the weeks before the report came out.\\n\\nAfter all, it seems the NSA's own documents were not a top priority: The newspaper had to obtain more copies than all of the other people in the NSA's network (including two intelligence staffers). That's because only one person - George Tenet, who served as Bush's former chief of staff in 2004 – worked on the intelligence side of the Joint Special Operations Command.\\n\\nIt's also possible the US government was actually spying on others as well. For example, here is a list of three sources who would have known about the operation: a former staffer to the FBI director, John Brennan, a former NSA contractor who is now a White House senior adviser and a former director of national intelligence from 2002 to 2007. They are:\\n\\n- Michael Hayden, who has worked on the Central Intelligence Agency's Cyber Command for 13 years;\\n\\n- John Brennan who served as deputy director of national intelligence from 2003 to 2006 and became a former CIA officer in 2002;\\n\\n- William J. Brennan, who is a major fundraiser for Bush's reelection in 2008 and was part of the NSA's National Security Council;\\n\\n- Christopher Wray, who was a top-secret contractor for an NSA agency that was instrumental in the collection of phone metadata. He was the current deputy director of the NSA's national security council.\\n\\nThis list of unnamed sources is quite long and includes only CIA and Army employees and the director of the Defense Intelligence Agency - all of whom have worked on some kind of intelligence operation at NSA.\\n\\nBut to get even further - and this brings up an important question: Would it be illegal for any person to collect, store or collect any information from people other than their legal representative in such a way that we would be able to determine who they were using to attack us by gathering data about us at the time of the attack? Would we be able to take any legal action to protect and defend the identities of those who gathered and shared the information?\\n\\nIn other words, it's quite plausible. The NSA knew it did what it wanted by looking at records about government employees, but there were so many questions that there wasn\"]\n"
]
}
],
"source": [
"gpt2 = GPT2Client('117M') # This could also be `345M`\n",
"\n",
"gpt2.generate(interactive=True) # Asks user for prompt\n",
"gpt2.generate(n_samples=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Hypothesis 4: Color of Jane Eyre is $\\color{#9b6A6E}{█}$\n",
"Assume the color of Jane Eyre is average of all colors appear in the novel. For each color word appears in the novel, create a color dictionary to record its term frequency. As we all know, a color can be represented by three values RGB. Then, each color is mapping to a vector in RGB three dimensional vector space. If we add up these color vectors in three dimensional vector space by their term frequencies, and divid the sum by the total frequency, we obtain a unique color vector. The mathematical formula is\n",
"$$ \\hat{\\bf C} = {(\\sum_{i=1}^n f_i)}^{-1} \\cdot \\sum_{i=1}^n{{\\bf C}_i \\cdot f_i}$$\n",
"In other words, we conclude a weighted average of all color in the novel. However, there is a high probability that the color looks like grey, for the values of RGB tend to average. Hence, remove the color without saturation can make the color brighter. After that, revert the vector to a color. The color is shown below. The color can be widely used in design of book cover, movie poster and so on.\n",
"$\\color{#9b6A6E}{████████████████████████████████████████████████}$"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"def colorDict():\n",
" colorList = []\n",
" for color in colors.cnames.items():\n",
" colorList.append(color[0])\n",
" ls = []\n",
" for token in nltk.word_tokenize(novel):\n",
" if token in colorList:\n",
" ls.append(token)\n",
" return dict(collections.Counter(ls))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"colorDict = colorDict()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"def colorVec():\n",
" rgb = [0, 0, 0]\n",
" cnt = 0\n",
" for color in colorDict:\n",
" if color not in ['black', 'white', 'grey']:\n",
" for i in range(3):\n",
" rgb[i] += colors.to_rgb(color)[i] * colorDict[color]\n",
" cnt += colorDict[color]\n",
" return rgb[0] / cnt, rgb[1] / cnt, rgb[2] / cnt\n",
"R, G, B = colorVec()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[48;2;155;106;110m\u001b[38;2;155;106;110m \u001b[0m\n"
]
}
],
"source": [
"from colr import color\n",
"for i in range(1):\n",
" print(color(' '*50, fore=(R*256, G*256, B*256), back=(R*256, G*256, B*256)))"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<mpl_toolkits.mplot3d.art3d.Line3D at 0x1cae87d3c8>]"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAWQAAADuCAYAAAAOR30qAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvXl0Y3d9Nv5c7bslS7J2WYuX2Wc845lJKG2BhKaF/MIB2hBCf4E3kJScH21KoHRoDn153/ecZtK+FBqSvoWQkhQOS3hbzrQQ1tAUGLzNeDwez2pb3vddkiVb2/394XzvXMmSfSVdXcue+3Dm4Nh3le597ud+luehaJqGCBEiRIjYeUh2+gBEiBAhQsQGREIWIUKEiCqBSMgiRIgQUSUQCVmECBEiqgQiIYsQIUJElUAkZBEiRIioEoiELEKECBFVApGQRYgQIaJKIBKyCBEiRFQJZEUuL471iRAhQkTxoLgsJEbIIkSIEFElEAlZhAgRIqoEIiGLECFCRJVAJGQRIkSIqBKIhCxChAgRVQKRkEWIECGiSiASsggRIkRUCURCFiFChIgqgUjIIkSIEFElEAlZhAgRIqoEIiGLECFCRJVAJGQRIkSIqBIUKy4kQoSIbUDTNDKZDNLpNKRSKaRS6U4fkohdApGQRYgoEYR4CfmSf5lMBgCQTqehUCigUCggl8tBURQoipPol4g7FCIhixCxDWiaZog2k8kglUoxP7NBCFcikYCiKObvmUwG6+vrkEgkkMlkzN9FiMiFSMgiRGCDdLeKeCmKwpUrV3D48OFNxLvVNgFAIpEw208kEpBIJEwqQyRmEWyIhCzijkI+4iURLyFQAkK8hDiTySTnfDBN01hfX2eWZxMvTdNIJpOYnJyE0+kUiVkEA5GQRexJ5BJvKpViot1CxFtKjpemacTjcayurmJ1dRWxWAyxWAyZTAYKhQKJRAIulwsejwcymYzZPkVRGBwchNVqRSqVgkwmE4lZhEjIInY32MTLTjOk0+lNy7JTDcWCkPnc3FwW+QKASqWCVquFVquFxWKBWq2GVCplIurp6Wl0dHTAZrPB6/VCoVAw2yXpjGQyiVQqBalUmkXcIu4siIQsYleAHe3mku/k5CRqamqg1WoBgFN+txAymUxWxLu6uop4PM6kIKLRKEO8Go1mS3KnaRpSqRQ+nw9erxcTExPo6uqC2WyGz+djliMPCpqmkUqlmIhZJOY7DyIhi6gqbNdKRpZhR7vxeBx6vb6oft9MJoNYLJYV7cbjcQCAWq1mIt66ujqo1WoAQHd3N/x+P+d9sFMgEokEHo8HLpcLMzMz6O7uxtraGmKxGDQaTdbyucQslUpLiupF7D6IhCxiR1AK8ZYSLabTaYZ4yf/H43FQFAWNRgOtVgu9Xg+73Q6VSlWQ+NLpNC/RqkQigcPhgMViQXt7O65cuQK1Wo1AIACdTgcgPzGTVIZIzHsbIiGLqCi4EC+wuYe3WGQyGUQikaxUw9raGiQSCUO8BoMBDocDKpVqx1MBNE1DpVKhtbUVi4uLuH79OmQyGQKBAGpqagBkEzP53CQSiThksochErIIXpCvlWxxcREKhQIqlYpZrlziTaVSWamG1dVVhMNhLC0twWAwQKvVoqamBk6nk1fiJdF6setstz2KomA2m2E2m7GysoJQKIRUKoVAIIDa2tqs7g/yGa+vrwMA5HK52JmxxyASsgjOyG0ly20nI6RBCGRhYQEmk4kpthWDVCqVld9dXV1l+npJxGsymeB2uzEyMoK6ujqYTKYKnPUGSiHkYrdXU1ODlpYWRCIRDA0NYWBgAH6/H1ardRMxDw4OQqvVwuFwiEMmewgiIYvYhHKGJ9ggLV1bIZlMbop4E4kEpFIpU1irra2Fx+OBQqHISzq7Ma+ayWQKHrder8eRI0cQi8UwNDSEwcFB+Hw+2O32LFLObZkTe5l3P0RCvoMhxPAE2U4ymcwi3dXVVSSTSchksqwe3vr6eiZHWk0oNUIutA6X7Wk0Ghw8eBBra2sYHh7G0NAQ06mRyWQY8iUELRLz7odIyHcAcocnVldXIZfLeR+eAIBEIsEQ7sLCAubm5jA0NAS5XA6tVguNRgOr1Qqfz5c1IFHtECJlUQgqlQr79u1DIpHA6Ogo2traIJPJUFtbyyyTS8zkYSf2Mu8uiIS8h7DV8AQbly5dQmtra8mFNSKSw87vrq6uIpVKMcRL2skMBgOcTidfp7hnsFXKohAUCgUaGhrg8/nQ1dWF69evIxwOw+v1Qi6XAxCHTHY7RELehSi3h5drBMwmXvY/ovNLiNdut0Oj0TCkQDAyMrIr87v5sJMRci5kMhl0Oh08Hg/C4TA6OzthsVjg8/mgVCoBiEMmuxUiIVcxhBqeIGPBbNKNxWJIp9NQKpUM8TqdTmg0Gshk3C6bvRSR8U3IpUTIuccjk8ng9XrhdrsxPT2Nixcvwmg0wu/3M9OF4pDJ7oJIyFUAoYYnaJrG2toaUqkUhoeHs5TJVCoV007mcrmg1WrLth4iRCAEhNoPXyiX4EmbIbDRZeJ0OuFwODA7O4vLly9Dq9XC7/fnnf5Lp9OYmpqC0WiEXq8Xh0yqCCIhC4hCrWSZTAZjY2Oora2FVqvlhXjj8ThisRii0egm4iXSkGazGRqNpmKeb0IRshBkUk0pCyB/hE1RFGw2G+rq6rad/pudnYVarYZCoRAF86sIIiHzjGKHJwjxJpNJppWJKzKZDNbW1jalGmiazhLIYUtCAhtFPavVuinnyzeEjJArDb7Po9yUxVbrs6f/lpaWMDAwAJqmmek/sj4p9JHODLYpq0jMOwORkEvEVpY/xQxPEEgkkrxtaEBhSUhgQ5lMo9FAp9NxkoQk+8pNh1QCFEUJsh+hIHQf8lbgSugmkwknTpxAJBJBKBRCf38/AoEAo4vBPgaxl3nnIRLyNhDKeYIImkejUc6SkKVGWEIS8l6KkKupqFfs+nq9HkePHsXq6iqGhoawtLSEhYUFuFyurOtVHDLZWYiE/CbyOU8sLi7mjTjLHZ5Ip9ObIt5wOAyKohihdS6SkKVCqMh1LxFyMSDF00gkUvD7EypCzoVWq8WhQ4cQiUQQDocxOjoKr9cLp9PJbE8cMtk53HGETIiXRLlbWf6MjIygsbGRaSEqFmwt3q0kIe12OxYXF0FRFFwuV7mnuC24aEzwgb1EyPkINLddkBRQM5kMk7MfGRmB1+uFy+XKIlA+Iu5y1qdpGvv370cymcTIyAja2trgdrvhdruzjFnFIRNhsWcJmY8eXplMVjCvy0auJGQsFssiXp1Ot60kZDgcRjKZLP/EOWAvpiwquR8yIJNIJDA2NpY1IKNUKqHT6aDVauHxeLK6VtbX16FQKDA2Noa2tjZGh0IqlZadsuADFEVBoVCgsbERfr8fo6OjaG9vh8PhgMfj2Xb6Txwy4R97jpD/5m/+Bh//+MfzRiPFtpJJpdIsQi5GElKpVBYVRWxV1OMbe42Q+YzWiAgSO5efSqWY70cqlRY1ICOXy5lx55GREbS3t2/K21YDSHtcfX09xsfH0dnZuUlzhE3MMzMziMfjqK+vF4dMeMSeI+Sf//znePjhhxlx71JAJCHj8ThGRkaQyWSKloQsFrnkX0mIOeTshyshYJIrJRGvzWaDVquFXC7HysoKpqenS9blkMlkCAaDqK+vx+joKEZGRmA0GpmIuVoglUpRX18Pj8eDqakpXLhwASaTCX6/nzEaoCiKaZMTnUz4xZ4jZJPJhHA4DLPZvO2y20lCUhQFnU4Hl8vFG/EWglBRK9nXnZJDJnl8dsRL3mpyZT+3Up8rNudLes5zI0cSiQIbaaq2tja4XC54PB7OI+lCQCKRwOVywel0YmZmBpcuXYJer4ff74dWq2XeFsi1RJxMxCGT8lA9VwBPMBqNWFlZyfodWyCH3JwkD6bT6QpKQo6Pj0MikTCCLZWEkBHyXktZABsEyCbdaDTK5PEJ8ZpMJl7fasoBRVGoq6vD4cOHMTY2ho6ODjgcDni93qoiZoqiYLfbYbPZMD8/j6tXrzK2XAaDgVmGfNdiy1x5qPg3PzY2hkceeQTT09OQSCR4/PHH8eSTT+Lzn/88XnzxRVitVgAbud93vetdAIBnnnkGL730EqRSKZ577jncd9992+6HpmnMzs4iGo3im9/8Jv7rv/4Lv/3bv71JErKurg5+v5/TlJpUKkUqlSrvA+AIkZC5gYyFs8l3eXkZs7OzjKdeJcxMK9WHLJVK4fP54PF4MD4+jo6ODtjt9ixJTb5RyndCURSsViusViuWlpZw5coVLC4uQq1WM9ZZuZ+PSMzFo+KELJPJ8IUvfAHHjx9HJBLBiRMn8M53vhMA8MlPfhKf/vSns5a/du0avvOd7+Dq1auYnJzEvffei1u3bm2ZZ+vp6cFHPvIR2O12RCIRGI1GnD59GocPHy7ropbJZFhbWyt5/WIgdMqi2gmZ9PKyC2yxWAzA5iGZqakpmEwmTmmqUlFpLQt27pYU1erq6uDz+TZdw+U+5Mrt8DCZTLDb7VAqlRgZGWGm/8xmszhkUiYqTsgOhwMOhwPAxrTQ/v37MTExUXD5c+fO4aGHHoJSqYTf70dDQwM6Oztx9913F1zn2LFj6OnpAQB8+ctfhkwmw1133VX2sQsZtd6pRT3SUsaOeFdXVxkhJK1Wu+1YuFA5cT5RiOAlEgkjqTkxMcEQMzvHLfSUXz6k02kYDAbU19cjGo1mmbLW1dVlkbI4ZMIdgiarhoeHcenSJZw+fRrnz5/H888/j3/5l39Ba2srvvCFL8BkMmFiYiKLTMmFyRVGoxHj4+O8HC/XPmQ+cCekLEgun02+uZrLbre7ogp0pULo0WmJRML0LU9OTqKrqwsWiwV+v7+sKVEATEGuHLC3odPpcPjwYcTjccaUtb6+Hg6HI+/0nzhkUhiCEXI0GsX73/9+fOlLX4LBYMATTzyBz33uc6AoCp/73OfwqU99Cv/8z/+cN9Ip5gszGo24du0aL8csZA5Z6JRFJc+LdK8sLCxgeXkZ3d3dTC6ftJQ5HA5otdqqKmBthUrkwrlc1xKJBG63G06nk2lDI1KapYKPCJn0ZrOhVqtx4MABrK+vM9N/7GEYIJuY+/r64Ha7YTQaxSGTNyHI3ZBMJvH+978fH/rQh/C+970PAGCz2Zi/P/bYY7j//vsBbETEY2NjzN/Gx8eL6v3M12VRKoSMkIWMEvgifzKhyI54E4kE0zYok8mgUqlw8ODBikt9CoGdFBdit6GNjIxgamoK169fz+oP5go+ImQi35kPSqUSTU1NzPRfvtY+iqKY9kPRyeQ2Kk7INE3jox/9KPbv34+nnnqK+f3U1BSTW/7+97+PQ4cOAQAeeOABPPzww3jqqacwOTmJ/v5+nDp1ivP++CRkISNkIVEsIedqckSj0U29vGazGV6vN6uljGh37AUyLiVlsdXypaZASLfD0tISjEYjuru7YTQaEQgEOBMzXznk7UhdLpcjGAzC5/MxrX3sfHg6nWYImOjL3OlDJhUn5PPnz+Mb3/gGDh8+jGPHjgHYaHH79re/jZ6eHlAUBZ/Ph6985SsAgIMHD+LBBx/EgQMHIJPJ8MILLxT1NOebkIWKkIVEoaIe0V1mR7zxeDxLDIlMl3EZDa+GwZBqRTk5aWJk4HA4YLfbmcGNmpqaLD+9QuAjQiYRLReQ1j6v14vJyUlcuHABtbW1zNsUkJ3KuJOHTCpOyG9961vz3pSk5zgfnn76aTz99NMl7Y9PQt6rFwFFUUgkEpibm2PIl+guE+Il8p9qtbpsVbG9gGrSQ2avyx7cmJ2dRU9PD/R6PQKBADQaDe/7JqBpuuhtkHy4y+XC9PQ0RkdHcf369axjvdOHTHZHRaUI6HQ6rK6u7vRhlAw+b3x2Ly97UjGZTIKmaahUKuh0urIF7wtBqJtHiEi8mjz1tvPTm5ubQ29vL3Q6XV5i3mmlOYqi4HA4EAqFUFdXhytXrkClUiEQCECv1zPLsHGnEPOeI+Td/JpMcrvFvk6SXl52jje3l5fkeTUaDVZXVzE+Ps5oKlQKu7E/uBCKPQ8u/dflEHKhdclIttVqxfz8PK5cuQK1Wo1gMAitVguAn5QFH2Af69LSEm7evAmJRIJAIACj0cgsQ/6fHTGTAuBeI+Y9R8h8g+RbhYgoiE7uVjcLm3gJ+abTaSgUCqalzOVyQavVFtxONQ2G7CZUY8qiEEjxz2KxYGFhAX19fVCr1Vl+etUCiqJQW1uL2tparKysIBQKIZVKMaas+YZM9mov854kZBJp8nHRkcKeEBcw0dyVy+WMPCS7wJZMJrN0Oex2e0m9vEJGrnvF5LSaUhbF5G8pioLFYoHZbMbi4iKuXbuGVCrFaMiUuv9yUSjKr6mpQUtLC6LRKEKhEDP9Z7Va8xLzyMgI1Go16urq9gQx70lCNhgMCIfDzGtPOSCEXKnWrXQ6nZXfvXr1KvNKSSLefEp05UDISb29Ai4pCNIaGI1GEY1GQdM0GhoaGPEdNiodIeeCoiiYzWaYzWZcu3YNMzMziEajaGhoYPK2ldx/Lkh0Wwg6nQ5HjhxBLBbD8PAwM/1nt9uzCpqxWAwqlWrPOJnsSUImnRZ8ELJMJuOlFzmTyWwaosiVh1SpVPB4PGWJ63PBbhAXqkaQ82Frb7B99NgdKnV1dUilUhgeHkYoFEJDQ0PWhB3fRb1ioFQq0dDQAKVSiZs3b0IqlSIYDDJymtuB79HrraDRaJjpv+HhYQwNDWV5FJIJUPLWt9uHTPYsIYfDYV62VWwvMunlZacb4vE4KIpiiLeQv97a2pogFWSRkLmBnTaamZnB+vo6Jicns/L1uT56BOl0GjRNo6WlBSsrKxgYGABFUWhoaIDBYNhRQibrm0wmtLa2Ynl5Gf39/aAoCsFgcNvRbL76mItJtSmVSjQ3NyMQCDBj2S6XC+vr63l7mXfrkMmeJOSamhpex6fzRchElze3pQy4LQ9ZbC+vUIMoe62oV+5+2AMx5CFKHo5EbU6v18NiscDr9RZ1XMDG9XjixAksLy8zUrLJZFLQlAUbuYRqNBpx4sQJrKysYHBwEDRNIxgMFnzDFHqwhA22R+HY2BgWFhYwPj6OYDCY15R1tw2Z7ElC5nM4RCKRIB6PY2FhIa/VO9sGqJA8ZDH7EoIo7yQLJzZomsb6+npWnpf9EN3KHZy4x5QDo9GI1tZWLC0t4cKFC+jt7UVDQwN0Ol1R28lkMmXVNAoRek1NDY4fP45wOIzBwUGk02kEg8FNOXC+UhblCEvJZDL4/X5MT09DrVajs7MTFosFPp+PcfgpNGSiUCiqNpWxZwl5eXm5qHVye3nZeV6ZTAaz2QydTlfwFZUPCBkhC4GdjERSqVRWnpe4RxOpT51Ox/Rlc7k5S+lDLnT+JpMJWq0WXq8X165dY3K6pE94O/AdIefCYDCgpaUFkUgEg4ODGBgYQDAYRG1tLaf1uaDYlEUh0DQNr9cLj8eD6elpXLx4EUajET6fL2v6b7dgTxKyyWTC9PR0wb8XsnpXKBRMxEus3ufm5pBKpeDxeCp+3HtVO6OSII7giUQCkUgkS/gon3t0OeD7xq6trcXJkyexuLiIvr4+aDQaBIPBgiPPBEIJ1Ov1ehw7dgyRSIRpQQsGg4IW9biARMJOpxMOh4OZVNRoNAgEAswbCLttrlqxJwnZaDTi1q1bzNAEV6v3fBDaxkkodblqSiVwwVaWTjRNQ6vVora2lrPwUSn7r8SNTNrRamtrMT8/z4w8B4PBgiJBlY6Qc6HX63H06FGmN3hlZQU1NTVlfSZ8Rci5YE//LS4u4vr164zTNylW3vGEXMjodHFxER/4wAcwPDwMn8+HV199FSaTCTRN48knn8Rrr70GjUaDl19+GcePH992P9/85jdx5coV/PKXv8T4+Dh+8Ytf4LnnnuNs9Z4PQts4ra+vC7KvakYymdyUbkin0wUtnYaHh6HRaGCxWCp2TJV+gLEn6+bm5tDT0wODwYBgMLhJVnOnLJxIb3AoFMLMzAw6OzsRCARgsViKJjmSPioHW30n7L7r5eVlDA4OIpPJIBAIMLK/1QhBCLmQ0enLL7+Me+65B2fOnMHZs2dx9uxZPPvss/jRj36E/v5+9Pf3o6OjA0888QQ6Ojq23U80GsU73vEO3HPPPfjGN76Bf/zHf+Tl2IV0nt4rk21ckMlkskg3Go0ykozV6CzCpx7yVuuQCG92dpaR1WTrHQsdIedCJpPB7XbDbDYjFAphcHAQgUAga5qu0scAcI+yjUYjwz2zs7MiIRcyOj137hzeeOMNAMCHP/xhvO1tb8Ozzz6Lc+fO4ZFHHgFFUbjrrruwvLycJWhfCB//+McBbHj37VQfcjkgo9N7DSTdwG4ri8VijM6yTqeDyWSCx+PJErjnit2o9rYd2OptMzMz6O7uRm1tLfx+/46bnBIfRI1Gg0OHDiEWizFeeoFAIMvktBD4SFkUuw29Xl+2/VWlIXjYwTY6nZmZYUjW4XBgdnYWADAxMZFVRCNGp1yfbHzbOAkZIQtJyJUgGbaRKSHfrq4uRuqzknKflQTfam9cwdY7npqawsWLF5HJZIqyNct3bHxG2BqNBgcPHmRMTkOhEPx+P2w2W8Hrq9Q+5NxtVMObE58Q9GxyjU4LoVyjU4PBgEgkUtIx5mIvukEDt6PKUgk5t1hK0g3EyFSn08HpdCISiRRlwVXN2MliEOkisNvt6OjowNWrV2Gz2XjVOOGKQukGYnK6traWRcx2u33TZ1duHzIApkC/lyDY2RQyOiWpiKmpKdTV1QEo3+iUT2ITuqgnJPlzieLIRCI7z0tsnbby0yOo5op2MRA6ZVEIEokEKpUKjY2NWF5eRldXF2w2G+rr6wXzLtwu/6tSqbB//36sra0x+hM+ny9LGIivlEWx51wN3+FWEISQCxmdPvDAA3jllVdw5swZvPLKK3jPe97D/P7555/HQw89hI6ODtTU1OxYIl7IL1DIol4+MXwimsPuzyYTiew2wXJtnXYjqqlNkDg+u91uOJ1OTExMoLOzE3a7HfX19RWPGrkW5FQqFfbt28cIAw0PD6O+vh4Oh6OqhkuqCYKcTSGj0zNnzuDBBx/ESy+9BK/Xi+9973sANvz2XnvtNTQ0NECj0eDrX/960fss95V8JyBUUY8Ir0xNTTG9vURrmavIfTVBSM0MPpYv91jZRTmJRAKPxwOXy8U4OzscDni93oqRVbFkSoSBEokEhoeH0dbWhmQyWfZxlELI1c4HghByIaNTAHj99dc3/Y6iKLzwwgtl7VOn0yEajRat9bqT4Dtlkas8F41GGcnPRCKBVCrFzP8LnYfcbeDz4V6JLgmJRIL6+nom3dfe3g6XywWv15tFnnw8uEqNbhUKBZqamuDz+fDrX/8a7e3tWVKaxSKZTG471bjbsLfifRZIpwUfhCyUjVM5DhK5Gr2rq6ugabqgi3RfXx8zpSiiMtgqQi6H3Le6FqVSKXw+XxYxu91uuN1uSKVSXh4s5RbkFAoFVCoVTp48yUhpejweuN3uou4xMULeRSCE7Ha7y96WkDZO2yHX2ikajTI6HNtp9LIhpI3Tbksd5QPfbuDlXEtcjoWooXk8HoyMjKC9vR0ejwc2m40XHQo+7gUipVlfX4/R0VG0tbVlPTy2QylFvWrHnidkPkB6kYX88onDCJt8czV6rVYr/H5/SccltEj9XiDk7cB+WIbDYej1evh8vk3ktZVrNFdwXV8mkyEYDKK+vh7Dw8Po6upijqFUUi33gZJ7/nK5nDlGNjF7PJ4tiVks6u0i8EnIlWxHIxq9bHcRctNsp9FbDkTXkOJBPvvcyUPSCpj7sIxGo2hra0N9fT2cTidDYjvxgJLJZGhoaIDVakVvb2/e4xIKhYiUiAB5vV6MjY0xriAejyfv8mLKYheBb9cQPgiZaPSy0w1kDJXcyAqFAsePH694d4NQriG7HSTqjUQiWFtbY4TbycNSp9PlbQVMJpNMwXRoaAjt7e0IBAKw2WyC1CMKQSqVwmAwYP/+/cxx+Xw+OBwOwchqOyIl6RZCzO3t7XA6nZs6R8TBkF0Ek8mExcVFXrYllUqLGp9mG5oS8s2n0RsIBDalGyYmJng55u2wlyJkPvbBHoBhd6SQ7wwALBYLYzfPFQqFAs3NzVhfX8fg4CCGh4d5qWuUCtIhwT6uoaEhDA8PF5yqq9QxbAdSoPR4PBgfH0dHRwfsdju8Xi/kcvmmPnouECPkHYLRaMTw8DAv2yqUssjV6CWvrgAY0Ryj0Qi3281ZozffwEYlcKfaOAHZbypseU8S9er1ejgcjqwU0Y0bN6DT6TiTce45K5VKHDhwALFYDDdu3MDy8jKWlpY22SNVGrnRuVKpZIY3QqEQQ8yFdCj4+C6LTTVIpVKmpY8MwdhstqJTP9VOxsAeJ2Q+Uxbr6+tYWlrirNFbKgj5V7qAuJci5EIoFPXKZDLmO+Mq78nXza/RaNDQ0ICBgQEMDw8jFAqhsbFxS20XPlEoOlUqlcy4cygUwtDQEILB4CZJTT6ChVKFhaRSKbxeL0PMq6ur6O/vL0nnvFohEnIO8mn0rq6uQiKRwGw2V1yjV0ij071EyOl0mnlgRiIRpg+bGNEaDIZNUW8xKOUctupDVigUOHToEFZWVnDr1i3IZDI0NjZu2xfO55RfPqhUKhw4cADxeByhUAihUAjBYJARoa8Gg1OJRAK3243R0VGo1Wp0dXXBarXuiQGnO5aQSfTEJl2SbiDRE9HoXVlZwerqKvx+f8WPW0ijU6EI+do1Ck4nBZutfGKmaTorPx+NRhGJRCCTyVBbWwudTlexse9KTOrV1NSgtbUVCwsL6Ovrg1ar3dK+qZJDJWyo1WocPHgQsVgMg4ODDDGr1eodi5BztyGXyxk9j6mpKVy4cAFmsznLeZoNMWWxgzAajYxIfb4ptkwmw1mjl68uCy4QipCFipA/8YlD6OkxQC4HfvjDGO66i/s+iZUTO9dLol7SDuhyuTA7Owu5XF5RASq+B0Nyt0V89Yh9k9FoRCAQ2EQsQruFaDQaHD58GKurqxgcHEQ0Gi07ncaH9CY7Dy2RSOByueBwOBjJl4hkAAAgAElEQVTnaSLmX65NlNAQlJAfffRR/OAHP0BdXR36+voAAJ///Ofx4osvwmq1AtgQHXrXu94FAHjmmWfw0ksvQSqV4rnnnsN999237T6uX7+Ojo4OXL58Gf39/Th27BieffZZ+P3+kqMnIUXqhUxZVPqcbtyg0NNjAEAhmQSefFKFjo7YpuWI5gabfNfX1xkrp+2+NyEiH75TFvn+xrZvIsRCXsUJCfJByKWsr9VqceTIEUxPT+PWrVvo6upCQ0NDSUVJPvz08hUGJRIJ4zxNPj+TyQS/389rD38lISghf+QjH8EnPvEJPPLII1m//+QnP4lPf/rTWb+7du0avvOd7+Dq1auYnJzEvffei1u3bm1LpG1tbVhZWcG73/1u/OIXv8Cvf/3rso97L2oiC0H8f//3SgC3b4JQSILBwRRMpjCT643FYlmaG6QrpRgrp2pVeyuE7UiVoig4HA7YbDamq8DhcKC+vp4XYaJyIly5XI66ujq4XC4MDAxgcHAQDQ0NMBqNnLdRabcQ8vnZ7XbMzMwwvoQNDQ1VLzbGmZApikofPXoUNE1DKpXi+eefx1ve8paidvY7v/M7nFvRzp07h4ceeghKpRJ+vx8NDQ3o7OzE3XffveV6jz76KPMzX833e9HGqdKE/OqrUnznO9k3/vo6hcceA/7pnxag1+s4aW5UCyqdssgHIq3pdDqZAYmtbJG4gK+Uh16vR0tLC8LhMAYGBkDTNBoaGjh51vHlFrLdg4VtfzU7O8uMs1czivlm4j09Pbh8+TKeeeYZfPazn+XtIJ5//nkcOXIEjz76KJaWlgAU9tUrFnxETnvRxonPol4ikcDi4iJGR0dx7do1/OAHV/Dkk/lvlgsXTGhvPwCHwwG9Xr8ryLgUbHXdFasFQQYkTp8+zXzWExMTJV3b5XZJ5K5vMBhw/PhxppWvu7t7W4NhoQ1OiWGs3W4va59CoKRHZTgc5q2h/YknnsDg4CB6enrgcDjwqU99CkD5vnrARt4rFtucsywWezVlUewNnclkEI1GMT09jYGBAfT09KCzsxNXr17FwsIC5HI5nE4PvvzlU1hd3SBklWrzufzVXykxMVH9+Tw2+NZDLmVbMpkMHo8HFouF0cmYmZkp6nusVFGwpqYGJ06cQCAQwK1bt3Dp0qWCvpaiW0hhFHNG6mPHjmFtbQ1TU1P4xS9+wcsB2Gw25ufHHnsM999/P4DyffWA250W5Wr+Cm3jtL6+XvH9bBeJswWPSK4XuN0SWFtby/josfG3f6tAW9vGZSWV0jhwYBXd3RtDDzZbBjMzEoTDFP7sz1T4v/83jl1QZwGwMymLfCA54ObmZkZbY2hoCA0NDbBYLNuuz3eEnAuj0YjW1lYsLS3hxo0bjMQmGT8H+IuQC7UGFsJeK+rFe3p6tMBG4eyRRx5BX19f2SdJTE4B4Pvf/z4OHToEYMNX7+GHH8ZTTz2FyclJ9Pf3F+1ebDAYsLKysmN+fKVA6MEQ9iAM+ZdMJhl9ZZ1Oh/r6ek4TiJ2dEjzzzG2CPnMmgY6O27n3Rx9N4uxZBWiaws9+JsO3viXDhz4kTG5+J1Do3ihHfpMd4apUKqZXeGBgAENDQ2hsbNyywMZHhMxl+MJkMuHkyZNYWFjAtWvXoFKpEAwGodVqeSHkZDJZ9fngUlDSp3L33Xdjfn4ec3NzjFM0F3zwgx/EG2+8gfn5ebjdbvyP//E/8MYbb6CnpwcURcHn8+ErX/kKAODgwYN48MEHceDAAchkMrzwwgtFP9lNJhNv49NCoVIpC7arSDQaxfLyMjPwQnQ3zGZzyWOokQjwsY+pkU5vEM1dd6XwqU8l8MEP3l4mEMjgT/4kiX/6p43tf/azKrzjHatwOKpL6yIfqkWgPh+ZazQaHDlyBJFIBP39/QCAxsbGvIRV6Qg5F6S/enFxEX19fdBoNLwI3O9Fx2mgREK+ceMG0uk0zGZzUet9+9vf3vS7j370owWXf/rpp/H0008XfXwERqMRy8vLJa/PhlA2TnxEyOl0etM0WzKZzJL5dLlcoCgKR44c4eW4/+IvVBge3vhsDAYaL764BpkMYAdC6TTw3//7On78YxmGhyVYXqbw53+uwne+U17qQoi2t2pKWRS6BvV6PY4fP47l5WXcuHEDCoUCjY2NWb5zQg+WABvfDyHm+fl5TE9Po6+vb8uJxO0g5pDfzCEDGxfUK6+8UvUV8kqI1FeakIuJkNni9my1OYqisgSP8kW9a2trvB3zv/6rDN/61u1o5YtfXEN9Pf3m+dwmynQa0GqBF15Yw7vfvUESP/qRDK++KsMHPrB3Uxe5KKcXmAuhGo1GJl3Q29sLvV6PYDAIlUoleITMBkVRsFqt0Gg0qKurQ09PD2pqahAIBKBSqYra1h1PyDRNSwFU/7slC3ymLISycSpEyOl0elOul0w8kVyv1WotOP6dC75y1WNjG1EuwQc+kMQf/dFtcmXfuySd8du/ncbHPpbA17628ZD4zGdUeNvbVnnRuqgUtotq2Q9GUgS12+3w+/2bCKxSEXIuSFQ6OzuLS5cuwWQyIZVKCR4hs0HOnUwkkmMrNCpeCHvRLQTYw1oWwEakwO7UKAdCiv4kk0nMz88XjHrL8dIj4Cc1Ajz+uAorKxsXus+XwRe+kB15s+9d9mzN//yf6/jpT2UYHZVgaYnCU08p8c1vrlVt1wVJiRBxo0gkwnw/iUQiqwhqsVggkUgwPz+P9vZ21NfXMykioLy0QbHrkh7curo6TE1NYXR0lNE8LiXCLJeQ2cfPPja2BkUgENi2jlHscewGMgb2OCHX1NQU7IUsFpUQGMoX9SaTSayvr2NlZYUhX41Gw/sFxcdgyBe/qMD587db3F58MY5cWd/cHDKBTgd8+ctreM97NlIX//Efcvzbv6Xw/vdXT+qCLWQfi8Vw6dIlALe9DokaYL6oLpFIwOfzwev1IhQKoa2tjfG0EypCZoOiKDidTgwNDUGpVKKjo4OxRSqG2CqR8mCPOrNV2/x+/5bEvFtIthjsaULms6hXrI0TG4VMMSUSSZbaHHm97e7uRjAY5OW4C6FcxxCaBm7evE0Mn/lMAqdPbyZ4mez2PnI/vre/PY3/9t8S+PrXN266T39aid/93TQsFmFTF+xcPIl8iWkp+X7kcjmOHTtW1FsJRVFZPcOkNU2j0ZQsSF+uQDxFUfB6vXC5XBgdHUV7ezvz31yIvlxC3k6Dwul0MsTc1dWFurq6LHGlUrFbyHvPE/J2Y5xcwTVlkU6ns4iXGJmypT7zmWKyIdTodHnrA1/96hre/vYUvvc9Of7iLxJ5l8vOIW/++//6X+v42c9kGB+XYGFBgs98Rol//ufiCo7FdFkQv0N2yoF0oBD7pnzfz+TkZFlEpFKpcOjQIUSjUXR3d2e1GxaDcsWBCKRSKfx+P9xuN4aHhzmbnQpRFGTLaU5OTjKWTfX19ZDL5VVnCcYn9jwh813UI+BiBW+z2RAMBvdkNRjYIOWHH07hgx9MFcz95ivqsWEwAM89t4b3vU+Do0fT+PM/z0/s2yHfTcrWUyYuIsBG365ery+675qPKIu8DalUKly9ehVarRYNDQ2cuwz4br2Uy+VobGxEfX09BgcHMTIykte6iY1yPodiinHEGcTpdGJ8fBydnZ2w2+1wuVxV3+FVKvYmU7yJmpoaXlIWqVQK6+vrWZEVMcVkk+9WUW8x2C2vVwRbHW6hoh4b996bxne/G8O996ZRSvBH0zSSySTm5uaY74d455G3knKV5fjuQzYYDKivr8fc3By6u7thNpvzupDnolK98AqFAvv370c8Hs8axy521mA7lNIdIZFImLTK+Pg4urq6it7Wbrmn9jQhKxSKovK+W1nBS6VSRs6vUn56exGFinq5+IM/4FYwzVcIjcfjkMlkoGk6r2N0tYGQKmn/slgszKv5doW2Sg8nqdVqHDp0iDEQDYVCaGpq4iSryQXlpDyI+3RNTQ2uXbuG9vZ2uN1ueDyePRMx37GsUqwV/OLiIhYXF3m7MLcDnxHZVvuoNNiDIcXWRNmj3qS3N1/739zcHDKZDNxuN89HXzq2k99kf7fk1dzhcGBkZITJ5zqdzk3XQLk6GFzX1Wq1OHbsGMLhMPr7+yGRSNDY2FjSftngY6CDpmkYjUY0NTUxOtGEmAs9rKr14ZyLO4KQr1y5ArlcDoVCkRX1ktdZLi7SQorUkyLVbrmItgKXCJn9ZkJSDuvr65DL5UULHO0GFIpypVIpAoEA3G43QqEQ2tvbGRU3ci2Uq4NR7LoGgwEnTpzA0tISrl27hng8jlgsljWOXQz4GK4ipC6TyeD3++HxeDAyMoK2tjZ4PB643e5de53sCCHn89ZbXFzEBz7wAQwPD8Pn8+HVV1+FyWQCTdN48skn8dprr0Gj0eDll1/G8ePHt9x+Z2cnXnzxRfT19WFkZARPP/00Hn/8cZw+fbrk19md0EQW4qKqNPHndlkU6kJRq9XQ6/WMcalSqdy1D6Tt3jy2+8wVCgX27duHeDzOtMo1NTXBaDSWlbIoJ11gMpnQ0tKCjo4O9Pb2wmAwlDTyTDqOykGuW4hMJkMwGITX62WIub6+Hk6nM2sIZTdgRx4jH/nIR/DjH/8463dnz57FPffcg/7+ftxzzz04e/YsAOBHP/oR+vv70d/fj69+9at44okntt2+1WrFY489htdffx2nT5/Giy++iPvvv58ZLS5VHFxIGyehWt8qlbYgvb2p1G1t5/HxaVy6dAlTU1OgaRp2ux1Hjx7FqVOncPjwYfh8PlgslqIfmNV2sxHCLUScXB+CarUahw8fxv79+zE4OIhLly4hkUgIGiHnrq9SqXD69GnU1taiu7sbN2/eRCLBvTOmkm4hRHv51KlTiMfjaGtrw8TEhCD3El/YkQg5n7feuXPn8MYbbwAAPvzhD+Ntb3sbnn32WZw7dw6PPPIIKIrCXXfdheXl5SwN5Xzw+/3w+/0Abre+sYXwS4HQNk5C+uqVG4mT3l52vpdoKtO0i1nOarWjtbW23MPOi93Um1rsZ67X63HixAksLi7i0qVLCIVC2LdvX9HOzXz1ELO96iYnJ9HV1QW73Y76+vptyZYvt5CtVOLYrXxDQ0Nob2/HyZMni+753glUTQ55ZmaGIVmHw4HZ2VkAhb31uIrO8zWtJ9o4bYBdDCW9vcQ1Ot848c9/vsZat7oi2Z1CqWmi2tpaGI1GmEwmXLx4kSlqco04+ZbepCiKGeAYGxtDR0cHXC7Xll0PQvrpKRQKNDc3I5FIlJzzFhpVQ8iFUK63Hl/TekK+FgvtGpIPXMaJXS4XtFrtlhEP17a3OwnlFOZomobNZoPb7cb4+DhDgl6vd9tt8hEh5yNCiUTCCCiRcezcHC4BX24hxWxDoVBUXVqrEKqGkG02G5OKmJqaYpxIyvXWq6mpEV1DCqCQjVMkEmGkPfV6fVmDLzLZ7eVFQt4AHxZOZFjC6XQyhSy/37/l6HOlxellMhkCgQA8Hg+TKvD7/bDb7cwx8ZWy2ItuIUAVEfIDDzyAV155BWfOnMErr7yC97znPczvn3/+eTz00EPo6OhATU1NUR55fI5PC4VK5pBzx4l7e3shkUiY3l6z2cyLmAtB9qTe7rgpKg0+1d5Ih4HH42FGnxsbG/ManvIRIXMhdLlcjqamJtTX1yMUCmF4eJhp3xMyZUGwW8gY2CFCzuetd+bMGTz44IN46aWX4PV68b3vfQ8A8K53vQuvvfYaGhoaoNFo8PWvf72ofZlMJty8eZOX4xbKxomPLotCU4dknFiv10Or1cLv95esPMYFYspiMyqhh0xGn2OxGPr7+5lWOfYgEx8RcjFEqFQqmXHsgYEBhEIhJJNJXvz09uqk7I6cVT5vPQB4/fXXN/2Ooii88MILJe+rEopv1WTjBGweJ45EIltOHRII8ebARcuiXBSKgOaGhrEwNg5fyzGo9MJU2FOpFMLhMNbX16HVavMeW7m931utq9FocPToUYTDYdy6dQsymQxNTU3QaDQ74qcH3G7fi0ajaG9vx4ULF9DY2Fjy1CsfaY9qxd58zLDApyayUDZOWxXbyDgxKbTljhPX1dUhEAhwiiCEKB4KFSHnFn/7f9OB7n//j42f29rx+3/+p5AX2Sa2HdhFz0gkkqX2B4CZtLNarZvWrfRrtMFgQGtrK+OrZzAYoFary9YyLufa1+l00Gg0aGxsRH9/P2QyGRoaGkpqR9vNfepb4Y4gZL6NTisNqVSKRCKxSUSHjBOTQpvZbC5rnFgIQpbLhS/qTVy7gZ7XfsT8d2xpGevRaMmETNM0aJrG7OxslpqcQqGAXq+HXq+H1WplJtAymQwTBZO8bnNzM/R6PS/nVwyIr9709DRu3LiBmpoaOJ3Oku2bypmyIw/NmpoatLa2YnFxEVevXoVGo0FDQ0PJDtR7CXuekGtqanhLWVRqWi+VSjHkG4lEsLy8zPT76nQ61NTUwO12896+w4eN03YQImVBkE6l0Pvjn+HWr89v+lsqmeS0DbaAPSFfIr+6urrKjHaTSJGQNVkXQNaU3v79+7G6uorr169DrVbzItBTLIhFUiwWQywWQ0dHR0maD3z66QEbfdWnTp3C/Pw8enp6OBmdljIAJEbIVYRqipBpmkYikchyq4jFYsxrLsn1ms1mrKysoKGhgZfjLoRybZy4IDtlUbkbYy0cwS/+42tYHBvP+/ex3j4Y7fas3xFdDUK+7CEXvV4Pi8XCuFRcuHCBUZOjaZohX9KCRuQ02YSTyWSYqPL48eOYn59Hd3c31tbWdqQwRXqY9+/fz7iEBAIB2Gw2TqRVCfsmiqJgtVphsVgYo1OLxVLQxHcv54+BO4CQVSoV1tfXt1+QA4qJkAuNExOroK0MTFdWVgTtQ64k2H3IlYqQ5wdCuPGznyO9XlhTYfTyFThPtGB1dTVLypMUPZ1OJyNgT3qz2b2zSqUSt27dgt/vZ3LE20WXhKjT6TRSqRRMJhNOnjyJ8+fPo6OjoygvOz5ACtIkd0ta5YaHh9HY2LitGH0l7ZtIFE/GsTs7O+FwOOD1erNIvNihELLt3YI9T8h8olCETNILJPLNHSeura2F1+vlbBUk9GBIJVHJol46lcLl136C/t+0Mb+jJBJI5XKk3nwIU1IJ6HQG0YUFjPcPoK7ei/r6eqbjhJ1y2DjGNCiKgkwmy4p4W1paMD8/j6tXr8JqtaK+vp4zkRISisfjCIfDkEgkOHnyJBOlkr7hShNHbspAqVTiwIEDjBg9aZUr1AZZSYNTArY2NBnHZmsdC1FU30mIhFwEpFIpYrEY5ubmNvnokUIbl3Hi7SDU6LQQOeRKEXJ0YQG/+dZ3sTQxeXtfGg30DX4s9V4FAMhVKliDAUxevQYAoBeXYDmxId1KiHirlEMurFYrzGYzJiYm0NXVxUzK5RIpTdNZeehwOIxEIsEY3TY3NyOdTsPn88HtdmNgYADDw8Nobm7esie83PRSIUIlYvQrKyu4efMmlEol0/fPZf1i9s81upVKpcznQyYRfT4f1Gr1nu1BBu4QQlYoFEgkEpwjVABZ48Tsyjq5cXU6Hex2e0WsgoSMkCu9H75SFplMhnkIjvX2YfTXv0GGtUGDx43f/tAH0fvDH2Hpzd95W47C6vczhDx2pQ+H73sno1hWSqpAIpHA4/HAbrdjaGgInZ2dTNohHA5n9YAbDAaYTCZ4vd5NhSqSX6Yoiin83bx5EyqVCo2NjXm7GfiQz9xqfdL9MD8/j8uXL8NoNCIYDDL3DR8RcrHrsycRh4aGMDg4CL1eX1Qvt5iyqDKQTot846TARl6KXWgj7sSk0EZUtaLRKObn5xEIBCp6vELKb1Za47mUol4qlWK+jyy3aLUa8z29mO67xixLSaXwveUuGIJ+0KAxce0687fgyVYY6qyQq1RIrq0htrSMyMwMzCz1wGJAioCEeIm4figUgkwmg8/nQzAY5PRKTaLyTCaDVCoFlUqFlpYWLCwsoLu7O6+SmxCDHewi29TUFCOt6fP5BElZFAJRblOpVJicnERHRwdjwrqbCHc73BGETIZDzGZz1jhxJBLB+vo6ZDIZk3LweDzQarUFLXaE6kPeabU3vrBdhFxouIL9fajVaqwuLqHt29/FytQ0s67GZMTpD/wRahx2DA4O4sJPf47Mm99PrdsFi2ejK8J98ACGLnYDAEZ6rnAiZPJQYJOvRCLJKgLq9XqGoJaWltDf349IJMLJPZpAIpFAoVAwhT+j0YiTJ09iampqU3tapSNkNiiKgtPphN1uZxTckhxbBwuBjw4JIvlpsViYcezGxkaYTKYt19ktqBpC9vl8zAUuk8lw4cKFgrZOXJBIJHD58mX09PTg5s2b+OM//mO8/e1vx8MPPwydTgeDwQCn01mUVZBQriFCtKOR/QiZQ04mM1nDFevr61AoFAzJ1dXVMa/27GLb6OVeXDr3A6RYzhTuQwdx6g/fC9WbHQ+HDh3CyE9+zvzdd+K2zVf9sSMMIY/29qLl3b8PikVMiUSCIV7SgUEeCnq9HvX19QUf0gSkg2JqagoXLlyAy+Uqqs+XpFFIxGy322G32xnTUzLRJvTos0Qigc/ng8vlwq9+9St0dHQgGAyirq6uaKLjy09PrVZDo9HgyJEjiEQiWcRcSV0WIVA1hAwA//mf/5mVViC2TmfOnMHZs2dx9uxZPPvss5y2NT4+jq9+9as4evQoDh06hPvvvx/3339/WccnpEi9EKhUUY89XDE9nQBgBADE4wlmuMLtdjOvr6Svl3085JU+vrKCi/92jol8JVIpjv8/70bjW+7KIoSliUmEZ2aZZRYyKYyNjcHtdsPe2ACFRo1ELI7Y8gr6L/dCatAjHA5vmrirq6vL24rIBSSqtNlsGB4eRmdnJwKBAKxWK6ftsdMY5B/RGR4YGGAeFKWinAhbLpcz/dTsVrnaWu4OMNs5fXDdBjvtodfr0dLSwhQkFQoFGhoamNbE3YaqIuRcFLJ14oJAIIAXX3wRABAOh8t+3QKE9dUTKkLmo3K/1XCF2WxklpXJVMxwBYAs8pXJZHk7HeQWC1ru/wNcPPcD6My1eOsfP4xa921bKILBzgvMz96jh3Hy7rsxMDCA8+fPb+g42O1IhIYAAGO9V3D4D+6D0+msWFE2GAzC5XJhcHAQY2NjaGpq4jw6zSZmduFvfn4eN27cQG9vLxobG4smNz6UClUqFQ4ePIhoNJrVKsfl3PjSQs6Xh66pqcHJkyexsLCAvr4+aLVaBIPBkj00dwpVQ8gUReH3fu/3QFEU/uRP/gSPP/54QVunYsHXtJ5Q7WhCodjzIcVPdr91bl6VDFfQNI10Oo1w+DYBpNPIIl2unQ5Nv/UW0BkawVOtkOfpPkisr2P4Us/t4zTocfHiRajVatTV1WF5eRk1Pi9W3iTklZExWCyWig9kEPIiymsqlQoNDQ2cvfDYxJxMJpFKpVBbWwubzYZLly7BYrFwFpIi4IucdDodWlpasLy8zIyFb6dHIYRbCNHumJubQ09PD2pra3H48OFdQ8pVQ8jnz5+H0+nE7Ows3vnOd2Lfvn28bdtoNGJoaKjs7eyWL5UrChEysW9iky/RUibFNjJcQbaRb7hCKpVCpbp9ia2tpZhouBhQFIV9v/NWZtu5nQ7h4VEk1za8+9TGGtx97z1Q5JDe/Pw8Js63bxSFDuxDaj0Bhbo8O3quMBgMOH78OObm5nDp0iXU1dWhvr6+YLRIWvzYRcVMJgONRgOHw8EU/qanp9He3g6v11u0LkWxKORyQo6FTYCFippCuYVQFIW6ujpYrVaEw+Fddd9WDSETW6a6ujq8973vRWdnZ0Fbp2KxW11DKi2GT1EUo6XMbjMjI96EfB0OB9OLyi62kSg4d7Aiexrs9s2QyUjQ1dUFn8+XZetTCOyIPF+ng8vlgk6nwxuXepl1Gu86vYmMAcBiseC+TzyB8PoaJiYnsbC8BLtq+2PgC4QkLBYLxsbG0NnZCZ/PB6vVynz+4XAY0WgUNE1Dq9XCYDDA4XCgsbGReYiR3HIqlYLNZoPNZssq/HHNVxeL7caeCQGSsWen0wmv15u1jtBuIRRFcW4CqBZUBSGvrq4ik8lAr9djdXUVP/3pT/HXf/3XBW2dioVIyBtgD1cQAojH4wDAOEYT7QBCvIWKbVxTDtn3jhStra0YGBjAxMREliTlVp0OBoOhYKdDdHERMwODADZuwACruyIXRrsNRgAOpxODg4MYHx/f5KpRSaTTaUQiEWaw6NatW7h+/TpMJhMsFgvzgNkqityq8EekPitxTlx7mF0uV1arHDk2iqJ4IWRRXEgAzMzM4L3vfS+AjSfgww8/jN///d/HyZMn89o6FQs+CVlIG6diLXPYKDRcQYSNiHPxwMAA9u/fn5W6IJ0kWxXbuJ8H+5goZoBiZmYGly5dYlIbJCI3GAxFdTqEui4yP9ubG6Exbk9Ecrkc+/btQzQaxa1bt5hRYa65XS4o1MfMbqU7ePAg4vE4+vv7sbS0BLPZzJlscgt/EokE+/btQywWY86plMJfIRRDhFKpFH6/H263G6FQCG1tbWhoaChpUi8f9qo4PVAlhBwIBHD58uVNvzebzXltnYpFJSQ4q8nGietwBemqIDneVCqFWCyG+fl5RtymHPLNxUYuOgZA/eZxJtHe3g6VSgWDwYDm5mbE43FMTk7Cbrfn1YXYCplMBqELtwk5eLK1qOMjhSmS27Xb7fB6vUWfO0mthMNhhMNhztE9cFtHYnFxEX19fTAajQWlJ/Mhl5iVSiVaWlqwuLiYVfgrlwhLiUzlcjmam5uxtraGgYEBrK6uYmVlZdelEYREVRBypcEnIe+kjRPbuLTY4Qo2EUulUmZC7MSJE+jv78fc3Byam5tLPi+i/cGOCtPpNBIJPQDSWy7D3XffvWldl8uFUCiECxcubCuww8Z0/wBiy/N/zfMAACAASURBVBvfq1KrhevA/qKPm53bHRkZQWdnJ4LBYEH1NXZqhZAvcXExGAwIBAIFvfS2Qm1tLU6ePInJyUlGe7kYaU6yHE3TSKVSTBvY9PQ0Ojo64HQ6d8RPD9joNjl06BCWlpYwNDTE9DAXa90kRCvoTuOOIGS1Wo21N6vw5UJI4Z/cghZprGe7iLCHK3KdK7jke9VqNY4cOYKFhQX09PRwihLzdTpkMpmshwLRdGA/BwtpWZBIKhqN4ubNm9BoNFmiNoUQ6rrde+w7fgzSMvKTEokEfr8fTqcTAwMDGBsbY/Qb2Pl2MkRSbGqFC0gOlj1Y0tDQUFCDJd85kO3kFv5CoRAikQhmZ2dLKvzxkbuVSqU4fvw4lpaWcPXqVWi1WjQ0NHC2hSrlGMSURRWC6N7ygUoMh+QbrlhbW0M8HofZbGaEZkh/byHbIBL5lpJyMJvNMBqNGBkZQVdXF5qammAymTh3OhS6UYqR39TpdDh+/DhmZmZw8eJFeDwepiCUi/XVVYyzRIaCp4pLV7BB2vxIyiGRSCAWi+Hy5ctQq9Xwer15XbsrBSIgT3L8o6OjaGpq4hxR5iv8OZ1OhMNhzM7OMlKfxRT+yiVk9v1nMplw6tQpzM7Ooru7e0uHEDZ2wmVFaOzts6sAyo2Qc4crcp0riJ7y8PAw9Hp9Vr6NXWwrptOBK9LpNAwGA1KpFHp7e5HJZJj2q+1yoYVQrKceRVGw2+2wWCwYGhpiHg5GozFrueFLPbeFhDzuTfZMhUDSPuzUyvr6OpPXNhgMcLvdTNpnenoaw8PDSKfTWVOGQoC86q+srODGjRuMGSgXGVmSQgqHw1hZWUE4HIbJZEJjYyNisRj6+/shl8vR1NTEqfDHt58eRVGw2WywWq2YmJhgZEy3ejtLJpNFp9TECLlKIZVKeXnCco2Qtxuu2BgrNjPDFewcLxkCGB0dZUTNyc3AV7FtbW0tS0CdaDoQUnI6nYhGoxgaGmJ6kUu5uEsVqJfJZGhsbGR0gknXgEKhAE3TWaPShYp5bKF4Qr6JRILRKjYajXm1itlwOBywWq1MCqFY/QY+UFNTgxMnTjARpc1my+rxZZMve5CEPOQdDgeampoYWVdS+CNpqq2GOQgqJb1J9KWdTmeWEH2+Au+dECFTRb7K79qs+r333ouvfe1r2/qGbYfx8XFIJBJmkAXIvvELDVfo9fqCwxUURTH/2IMVq6uruHHjBkwmE5OyKBaFSIlEhOThUOh1PJVKYXBwEOFwGPv27Svayp6mAZ3utvNENBpDsbxO0zTm5uYwODgIl8sFDSj89Mv/CACQyuV47+f+CnKVkiElcq5soXhyrsWYFOSCRJYAOEeWfIN8HzMzM9BqtUin01nkS86zEHGRFAa57qRSKaanpzEyMpJllZSL4eFhyOVyuFybdUS4gNhEHTt2bMvlEokEQqEQlpaWmPw5uS7n5uawtLSEpqYmzvuVy+UV74jiCE5X/R1DyH/4h3+Iz33uc2WLy09OTiIajUKr1TJDFul0mvHPIwTHHq7I/YyL0XOgaRpjY2OYnJzc1oiSHSmR6JccGzkug8FQEilFIhHcuHEDBoMBwWCwqEhFr1cjk9m4HldWYig1yEmn0xgaGsKNn72OcGgYAFDbEID5+DHmPNnkW6lOmMXFRfT398NsNpf8oOSCrSJfjUbD5LuLzQeTbZN/5PhHR0cxOzubV15zcHAQWq0Wdo6poVyEw2GMjIzg8OHDnJYn/dnr6+vMoMvU1BTi8XhR97BCoaiWtAWng9jb8T8LpbS+5RuuIM3tarUaNpsNwWCQSTmwyZfke8sttlEUBa/Xi7q6Oty4cQNTU1NoamqCVCrl3OnAB/R6PVpbWzE5OYmuri4EAgHOmrgyGUCkjNPp3Om9rUGmCwkphVdWEBkbZ/7uO3EcDceOCvoqS1rUSO6T6yj4VtiKfA0GA+x2e9YINQFRXSOFQK5Re77CH3HBZk/8kdy90G4hpPsnEong1q1bkEql0Gq1vA7vVCPuGEImNk6FQPK9hHwLDVesrKxgYWGBiRQymQzGMQ4llKij6ipSbEsmk4jFYjCZTJibm8OvfvUrKJVK1NbWcup04AukLctqtaK/vx8TExPYt2/fJjPMXOQW9grdU+x2OqLrACDbUCAWRyi5kcNXG2uwlExgfHy8pIGOcsD21it2DLtU8s0HMtyysLCA3t5emM1m+Hw+zuSXT+qzubkZsVgMAwMDTC6/nKlRoDiDUzb0ej1OnDiBhYUFXLlyBVqtFjabjTMxV0l0zBl3DCGTCDl3uIJU2ZVK5abhClJgI3oONE1DqVRiaWmJGT8OyUNo1bSCBg0rrPjbxN/itzK/BRddWq6NXQgkva/sqa/m5mYoFAoMDQ1hdXWV6XwQEgqFAgcPHsTy8jKuXLkCi8UCn89XVOsbeftgi+qQdjrS6ZDvIXPx4iXm56a7TmPfqVNMqx7xWBMS241hE/JdWVlhzpdNvqTgVu7D1Gw2w2QyMW8wW7UM5kO+iT8yQXj58mWk0+mSxb2A0gxO2TCbzUxh+eLFi3k9B3Ox28gYqOIc8o9//GM8+eSTSKfT+NjHPoYzZ84UvY1MJoMrV67g0qVLePnllzE7O4v9+/fjU5/61KZ8L8C92JZOp5n81qstr+I5zXOb9u3JeHB35m68JfMW3J2+GwfoA5DgdgTH7nQgURK704Ec21aDB8vLy7h58yYj57gTxYtMJoPR0VFMT08XzHE7nWqsrGycw09+cgEyWZjRdSA5Xy7tdNGFRfz72b8DsHGzvefpv4TmzYg0Ho/j1q1boCgKTU1NnIcN+EQ6ncbY2BjTHUOuJ0K+5Hut9JtMKpXC0NAQFhcXS3pI5Sv8dXZ2IpVKwev1lvQ2MjY2Bpqm4fV6i1qPjWvXrsHhcKCmpgbj4+MYHR2Fx+MpWIikKKqsIi7P2L1FvXQ6jaamJvzsZz+D2+3GyZMn8e1vfxsHDhwoajuZTAYf+9jHcOjQIczPz0Mul+Opp57ipdgGAAsLC/hT+k9xzntu22OpydSgJd6CQyuH0DzXjOBiEAaFgVOnw3bnODIygtnZWTQ3N2/q1xUKa2truHnzJmiahs1mYx42sVgM73vfW7GysnFjXL06B69XXdLDo/cnP0Pfz38BAHDua8bbPvqRTcssLCygv78fNputog8pdm47N/IlqoUrKyubOgWEBCmMpdPpkkaVSbS8traG69ev49ChQ5iZmcHs7CwCgQBsNhvn8yq3SwMAent74ff7mU6fVCqFkZERTE9Pw+/3b2rNlEgkFZc4KAK7l5Db2trw+c9/Hj/5yU8AAM888wwA4LOf/WzJ2/yHf/gHfO9738O//uu/Qi6XZ0W95eR7xzPjaNY1F72enJbjeOY4E0WfTp+GBdxGZPMhFovhxo0bjHODEBciSa8QUorFYszvLRYL6uvrodPpEAxqMDOzcT0ODMTwpglMUchkMvj3v/lbxN4szL71//0QvEcOFVyWRO3FjB5vte/c3DY77VAo8l1fX8fAwADTKVAsIfKF5eVl9Pf3Q6/XIxAIbBk1sicWSX+6UqmEwWCAx+OBTCZDOp3G4OAgVldXOQcBAwMD0Ov1sNlsJZ/HxYsXcfDgwU1vP4lEAoODg1heXkZjYyPzfe9GQq7KHPLExAQ8LKt2t9uNjo6Osrb54Q9/GFNTU3jggQfw3HPPcW6/2QrpdBqpaAp48z5TppSwrFswoZ1glpHQEmigQZSKZq2bpJLokHagQ9qBL+FLAIADmQNoW2uDrISvRaPRoKWlBdPT07hw4UJRXRDbgT3kwr5R2ekVu93O+JeR9rTr16+/mR9Vg1yPG3oWxT/Xp/sHGDLeEBIq7ChDnJLtdjv6+/sxPj6O5uZmTh0I25Gv0+nknHZQKpU4ePAgVlZWcP36dej1el47X7jCaDSitbWVGUl3OBzwer1IpVJZ5BuPxxnyNRgMcLlcWa7suYU/EoFLpVI0NTVtWdytpDi9QqHA/v37mT5x4vO3G1XlqpKQ80Xt5RKL0WjE2bNn0dfXh8cffxzveMc78OlPf5pzjqmQpoNcLwfejPgy0gy+P/R9fEn/JXzX+12kqTQyVAZRRHEgfQDvS78P45JxtEnacFNyc9M+FFCURMYEFEXB4XDAbDajv78fU1NTnImIgOS22QMWpOjJnuLbKr0ilUrR0NDADLbQtBnARpGr1KnzUGfxQkIqlQqHDx/G4uIient7NxUf+STfrVBTU4PW1lbmYel2u+F2uwVNYxCFQpvNhsnJSQwODkKj0cBsNqOmpoaTVkdu4U+hUODYsWNYXl7G5cuXYTKZCj5w+BAn2m4bGo0GR48eZTwMLRYLmpuLf3vdSVQlIbvdboyNjTH/PT4+njUZVw4OHTqEX/7yl/i7v/s73HffffjSl76Eo0ePZi2zXacDW9OBBg2KpkBTNJJUEvsC+/D3kb/H7178XXzx4BdxQ30DAHBNeg23JLfwVOop/GbtN4gggg5pB9okbWiTtKFb0o2705ulKUsB6YIgFXISEeXebKTjhE2+ZLRYr9czinLsKKkYaLVaHD9+HDLZ7XRQMll8dLy2uorxq6ULCdXW1uLEiRMIhUI4f/48dDodkslkVsGNL/ItBPKwFGIMOzfyjcVizMi+wWDA0aNHIZVKEQqFEA6HmbcbriDpPWK+qtPpcOrUKUxPTxfUpOBr7JnLdWgwGNDa2ror5TqrMoecSqXQ1NSE119/HS6XCydPnsS3vvUtHDx4kNf9XL16FY888ghjY3769Gn4fL6iOh0AwKK2IE5tWCHNxGaggw6ZTAaDo4N4Xvk8vhH4BtapdWb55kwzXki8gLsztwk4jjhiiMEMftu2SPpgYWEBPp8PmUyGIWAi58keua1E4/2xYyr092/cnN/4Rhd+7/fqi8qn3vjVeXT/+w8AAGaPG/f92f+35fJbRb4ajQbLy8sAgObmZsFbBgn4GsNmy4OSc2UHD6SDpdD1G4lE0N/fD4VCUZQUJkHuxB9FUUz+PhgMMoW/7u5uHDhwoKzul9/85jd4y1vewnl5mUxWTXZPuzeHLJPJ8Pzzz+O+++5DOp3Go48+yjsZ//CHP8TTTz8Nj8eDhYUFTE5O4oEHHsBdd91VdDSohhpxbBByHHHooINEIkGjrxHPxJ7B2y6+Df973/9Gj27Dqv6m5CbeqXwnPp76OD6f/Dx00EH95v/4QD6x+FQqhevXr0Or1cLn88Hv9wvWEsQOjDweP65d64PJZOLkZEHTdFa6InjqZNbfC5EveZgWinyXl5dx9epVzsfBN8jrNUmncBnDzh2ciUQiWe2Dpajx6fV6tLS0YH5+Hj09PbBarVv2lOcid+IvnU4zYkGhUIiZ+Cu3D3k3RruloCojZCGQKwd4/fp1PPbYY3jrW9+Kv/zLvywqUmxUNWKOmoMaalxYu7BpKISmaYxNjOH//P/tnXl4U2Xaxu+k+5p03/d9p3RjFQZkKYsgKAKyKVZBUJQRrDIIIsMiw97CoLIIIgozUHREGD5GQKrSJaVItSFdKW0pLW3TNc32fn+k55B0S9KmG5zfdfW6Sk7OOe9pyHPe87zPc9/kIA77HUYju5He5iZ3w37xfkyQT+j2dXRkGU/JZlKBycDAAIQQlJaW4v79+zqpPtCU2Fhj5OQo/ta//tqMsDA57t+/j/v378PHx6dLwfRHJfdxaV8yAIWQ0LPvrESzkmsHIURFp0ObtAMhhB6HLhdBtUUul9OfC7UYSQhpF3wpmVZq5mtubq5zE1xqHB4eHt1S+KOCMqBYS6AW/mpraxEXF9ftShOpVIrMzEzExcVpvM9gnCE/tQG5I2QyGXbt2oXTp09j9+7dGDq0cwdjlf0ggx7Uf/AikQg/5f+EXf678AvnF5Vt86XzsU28rcuURUdOHcqW8dSXVF2urqWlBXy+YlExICCg1/UBRowwRna2InDcuNGMyEhCj0MgEEAikSAwMFDlsZ260WSmfIfy33MAAOYebvD5y5huBd+uEIvFyMvLQ3NzMwICAvq8PI16oqmpqcH9+/chEolgbGwMDoej8rn2VXCRSCQoLCxEbW0tfH19u5XnVg7MBgYGSE1NhYGBAbhcrkZuMG0RiUTIyclBVFSUxvsMIKU3gAnI3YfP5yMhIQFxcXH48MMPdRqwCCEof1COw6LDOBR4CDV6NfQ2O2KHXeJdeF72POQyeTvXYgDtZkg9+ZJWVlYiLy9P6zZbbRk92gg8nmKc166JEB2t6hVYVVUFPp8PMzMzGBgY0NdqamyMP06fhaxVmWj8sgQ4+PRMra8rhEIh7t69Cw6HA29v714RLCKEqOhY1NXVtatpZrFYyM/P7xU3bG2g8tyEEPj5+Wmdb5fJZHSDzL179zBy5Eha8N/Z2Vmrxp2Ghgbk5+e3W4DvCiYgP0HIZDLs3bsXX3/9NXbt2oXo6O5bBHWEWCzGr/m/YrfHbly2vayybUTlCLwreBdeRl70bFDXj6cUlL5ufX09AgMDe2V2+Je/GCEtTRGQ/+//mhAcLFS52QCKigxKRCkgIEDhGJKZhV+/OQ0AMLe1wfS1f+31lAIhBGVlZbh3716PVdwoLWrl4CuTyVSeaDrTLqY0oAsKCrrthq0rampqIBAI6BtVR2VtyjZYlEOJWCympV+5XC49gVBe+PP29tbob1xTU4Py8nKtunUHkPQmwARk3SAQCPDaa68hJiYGH374YY81EtpaxtfV1eE69zoORRxClVEV/T4O4WCLeAsWyxaDpdln2SPq6uqQm5tLq4Xp4vFYLlfM8qdN44LHU6Qj9uzhYcQImUp+W/lczc3N4PP50NfXR/n1VFQWFgEAIuInIWTc2B6PSVMkEgny8/PR0NCAgIAAtcL8yiWE1I9UKu2xRjPVGl9RUdGlG3ZvQwhBeXk5iouL4eLiAnt7ezQ0NNDBl+roU06ztJ3Zt63IoCqA6uvr1TZydEecngnITyhyuRz79u3DiRMnsHPnTsTGxmq0nzrLeAsLC5iZmUEqlSKrIAt7nPbgvKOqLsYY2RgkiZPgTXrvUZ1CLpejpKSE1lzWJndIBd+2M19zc3OsWBGC9HRFF9eFCyKMGSPv6lAAgCL+XfzyxVEA7YWE+pL6+nrw+fzWFnAfenGUap5RNkZVDr6WlpY67cjrzzZs5brm2tpaCIVCyGQy2NjYwMHBARwORysdlrYLfyKRCAKBgBaG6ig1MsjF6QEmIOuevLw8vPbaa4iMjMTf/vY3lUUoZQ0ASk9Z2TJek3rm6upqnH54GntD9+Ke4T36dRNigo8kH2GFdIVGi4c9pbm5Gbm5uTA0NIS/v3+7wEIFX2VhHaDz/PbUqUa4elXx+/ffizBunPqAnH3xv8i58hMAwNTJAeNeexWWlpa6vEyNoIIvJWJDfcmVraG668LSHag8t6WlpVofvO6grq6Zw+HA1NQULS0tyM/Ph0gkouv4taXtwh+lucHhcNot/HVHLW6AidkzAbk3kMlk+Pvf/45jx45h+PDh0NPTw+LFi2n/POoL2l3LeJlMhjsFd7DPeh9Ou56GnPU4eEXLonFAfAAhRLc12R1BCEFFRQUKCgrg4OAAQ0NDjYJvRzz3nBGuXFFsP3dOhIkTuw7IbYWEoufMRh0LKrPU3qIjcR3Kf9DMzAyPHj1CU1OTxmL0vQEhhF4c60kbtrJWs/JTjXLwVVfXXFdXB4FAAGNj424tQCqnMdhsNvT19VFRUYHCwkKVhb/CwkIYGRlp3LE7wKQ3ASYg6x5CCEaNGkWbjubk5MDf3x+ffPKJzju+hEIhzpeex+7Q3bhrfJd+3YAYYI10Dd6TvAcj6HYG0LasjqrzpQRlKG1dbfPLs2YZ4dIlxT7//rcIkyd3HZDLcvm4evgYAIWQ0My/JYKtp0fnMHVhmQQ8Til1Jq5D5UHbnqehoQF8Pp9W1uuvL75UKkVRUREePXqktg2bWmBUDr4ymUwnWs3KC5CUNre2x+mo449Kn3l7e6Ourg7W1taws7PT6HhMQH4KkcvlOHjwIL744gvs2LFDq7ZOTY9/t/AuDpgdwAmvExCzxPS2IHkQDogPIFauWT67LersktrOfGtqasDn87u14v/ii4a4cEFRSfDtty2YNq1rhaGfT5xEye07AIDAZ0Zh6PSp9DaJRAKBQIDm5mYEBgZqfCOUSCTt9B2oFvnuPNVQTxCFhYX9IhakTNs2bGNjY5Uct1AohEQiUanusLS01HlZn1yuaPgpLS3V7qYpkQCtTz1tA7NcLkdBQQG9qKlpymKASW8CT2pALikpwaJFi/DgwQOw2Wy8/vrrWLVqFTZu3IjPP/+cvoNu2bIFU6ZMAaDQUz58+DD09PSwb98+TJo0SadjKiwsREJCAoKCgrBhwwa1HnPa0tDQgIvFF7EreBeyzbLp11mEhTelb2KDZAPM0Hlg0jb4doZcLkdRURGqqqq0cjqeN88Q332n+PKfPNmCmTM7D8iixkakfLIV8tbc4pS/vgOuY3sNXaFQCD6fD2tr63Ytx+rEdSwtLdXm8zWFcuegKgD6wyCASrNUVFSgsrISLBaLTjlQVQ86mS0+eABWXZ3CsVYiAUsiUQRTiQQQi8GSSgGxGDKRCA9LS9FSXw8Ha2uY6uvT74FUCpZYDFRXg1VYCPatW2DV1UF85Ahks2bRp2q78Hf79m3IZDIYGBh0uvCnDBOQ+4jy8nKUl5dj6NChqK+vR1RUFFJSUnD69GmYm5vjvffeU3n/H3/8gXnz5iEtLQ1lZWV49tlnaRdbXSKXy3Ho0CF89tln+PTTTzFy5EidHp8QgsJ7hTikdwhHfI+gid1Eb/OQeyBJnIRx8nE6C75dQclqmpmZwdfXV+1Ma+FCQ5w9q3jP8eMtmD2784Cc+/MN8L77AQBg4+6GSW+92el7KSH6+/fvw8rKis6JaiOuoysaGxvB5/NhZGQEPz+/Xntc7mqmz+FwYG5ujqqqKu1nqRpg+NJL0P/Pf3RyrLZIR42CuNWQQhmRSITa2loUFBRg6NChaGlpoRc1u0oX6enp9akTuQYMXnGhrnBycoJTq+WEhYUFgoKCUFpa2un7z58/j7lz58LIyAheXl7w9fVFWloahg/XjdQlBZvNxvLlyzFlyhQkJCQgJSUFGzdu1FlumcViwdvDGxuaNmB0xmjsDtyN3yx/AwAUs4sx3Xg64svisSx/GZyMnbo0Cu0plKwmZajp4+PTpQGmcnZDKu38uIQQ5KsICak243RUAcBms8HlctHQ0AB9fX1ERER0WzmtJ5iZmSEyMhKVlZXIzMyEi4sLXF1de9TMIZPJVIIvdbOhbjT29vYdzvTd3d3h5OSktRu2WnoxJ8sWCGjjWyrP3djYSFcqeXt7g81mw8zMDDExMaioqEB6ejqcnZ3h7u4+kDQresSgC8jKFBUVISsrC3FxcUhNTUVSUhKOHz+O6Oho7Ny5E1ZWVigtLcWwYcPofVxdXbsM4D3Fw8MDly5dwueff46JEydi27ZtGD16dI+Pqzzz9WJ5YcOvG3DR/iKOhB5BvYFidfxH5x/Bc+Jht3g3Zshm9PicXcFiseDi4gI7Ozvw+XxaDL+jxpmOXKc7ovr+fQgfVABQCAlxvTxRUlJCB19lcZ2OlM0ePXqE7OzsfutsY7FYsLe3h42NDYqKipCenq6xcwWl3aG86Kas5Obp6amVkps6N+zuQJycIPf1VeR7DQxADAwUqYvmZqCxEaz6eqC+Xqs2JrmxMeoiIpD/4ouo5/Hom42Pj0+7mw2VWxaLxbC1tYWdnR3u37+P3377rUNPvcHIoEtZUDQ0NGDMmDFYt24dZs2ahYqKCrqLaf369SgvL8eRI0ewYsUKDB8+HAsWLAAALF26FFOmTMHs2bN7fYz37t1DQkICvLy8sGnTJo2L+TtLOyirmlEi67/k/4I9PntwxfqKyjFmSmdip3gnHOGo8+vqCMpclJoZKn8xXn/dECdPKqLywYMtWLRINSpTqYaMs+dRfkchJGTh4Qbvv4zROs0ik8lQXFyMysrKfjV9BRSLbVR6zM/Pj75ZKetZCIVCWqFPOc1iYWGhsxuKTtqwCQGrqAjsjAywMzMVP7dugdXUpH5XNluxv1KskZiYoGTJEkiXL4eFra1W19vRwl9hYSGEQiHd0DTAlN6AJzVlASjyaLNnz8bLL7+MWa0LAcrmiQkJCZg2bRqA3nUfUYe7uzsuXryIw4cPY+LEidi6dSvGjBmj8h51wbertIOenh7+EvwXBFcE48T9E0gOTkalfiUAIEU/Bdf0rmGreCsWyBb0evu1jY0NuFwuCgoKkJGRgcDAQLpZQHmGLJGoykpS4jqmxsZ4eFdAvy9uSjzsvb20Hoeenh6tj5Cbm9vrOd2uoDSPS0tLkZ6eTgdkmUxGd/U5OjrCz8+vV/Od1Mzd1tYWxcXFSEtLU9+GXVEBNo8HvcxMRRDm8cB69EjtuQiLBbmfH5pDQyERiWD+888waK1vprZLXn4ZjR9+iKr6eoiFQnAdHLS6QbS1kgIAPz8/NDc3Iy8vD0VFRQgNDe1Ws0p/M+hmyIQQLF68GNbW1tizZw/9enl5OZ1b3r17N27evIlvvvkGOTk5mD9/Pr2oN378eNqYsS8pKSnB0qVLYWFhgYCAANpWCGg/8+3O2MRiMdLz0rHfbT++d/heZds42TgkiZPgQTx0ci3qqK+vR25uLjgcDhwdHbF6tQlOnVLkMN95Jxdz5wrbiesUZvLw6zdnAOhOSIgQgocPH6KgoKDXFe0o2rZUt7S00K4s1DZ/f3/Y2OjWGUYb2rVhEwJ2VtbjmW9GBthKk5iukLu6QhQejvqAAFR5e6PS3R1WJSXwS06G6Z9/qrxXNmwYJDt2QK4kaysUCiEQCGBmZtYtWU6gfcdfXV0dfcMbQDyZM+TU1FScOHECYWFhGDJkCABFidupU6dw69YtsFgseHp64tChQwCASkF8mAAAH85JREFUkJAQzJkzB8HBwdDX10dycnKfB2OBQICXX34ZgOLL8ODBAyxYsAAxMTE6eyw1NDTEyOCR8K/0x2jeaOwL24f7BvcBAP/T+x+ijaOxUbIRy6TLeqX9uq24DgA8ePAApaWlkEgeu3y4uXkjLKz9yl5+eib9u09MtE4CJ4vFgoODA2xsbJCfn99u5t5T1DWWuLq6tsupNzc34+7du/RiW58vQIrFMMnJQURmJqS//AKSlgaT4mKVdEJnECsrtEREoCEoCNW+vnjo7g6prS1d4WFvaQnvmzdhsnKlyn5yFxdINm+G7MUXgTafK4fDQVRUFB4+fAgejwcHBwetF+mUPf7ErVKtdXV1Ay0ga8SgmyEPRqRSKaRSKf3lLC0txRtvvAFHR0ds3rxZ5/9xpFIpbuffRpJ9Es44n1Fpv46VxeKA+ACCSFC3j9+RuI5EImmn72BgYACRSIRly0Q4c0aRJvr0UzFWrFANyPVVj/D99n8AoISEEmHK0f2XiZq5U4tG2qQJOqoAMDAwULleExMTjW8kVM7dwcFBK11grZDLwcrLU837Zmcr6oDVQIyNIQ0LQ2NICGr8/PDQwwONjo6waL1WqsSu3bhlMhiPHg12drbiGKtXQ/LOO4AG1UZUGeODBw/g6elJ+/F1hVQqBZ/PR3p6OjIzM+lJ2fLly7F06VK15+xDnsw65O7SWUNJdXU1XnrpJRQVFcHT0xOnT5+GlZUVCCFYtWoVLly4AFNTUxw7dkxjBxFNIITg+PHj2LVrFz755BM8++yzOjs2RXV1Nc4/OI+9YXshMHqcnzUkhnhf8j5WS1fDEF0/Iirr3LZ9DNdUXOf99w2QlKQo0k9MrMLf/qYauJSFhJyDAjD21SU9uOquUdY77sy2SVk8SSgU0uV1yteri9pm5QCkC0stVlmZIvhSAZjHUzRyqIGw2ZAFBuKRjw8qvbzQFBKCBg8PmLQGXm07+9ipqdA/dAiSzZtBtBADohCLxbT0qY+PD90STn12aWlpyMzMRGZmJmpqahAQEIDY2FjExsYiKiqqT+rOuwETkJXprKHk2LFjsLa2RmJiIrZt24aamhps374dFy5cwP79+3HhwgXcvHkTq1atws2bN3U+rrKyMrzxxhuwtbXFli1bdC5YI5PJkFuQi4Ocg/jK4ytIWBJ6W4g8BAfFBxElf2yL05W4Tmc6t+pYt84Ae/YoAvJbb5XixRcL6LZnuVyO81u2o1moCByjFy2AW1jviyeJxWIIBAKIRCK4u7tDLBbTwZcQAnNzczoY9ZY5AAUlPymTyeDv769Zp2dNDdg8nmre98EDjc4n8/Sk876VXl6ocnODAZdLt49XVlaCzWb3T0qlFao1ffPmzbhz5w4sLS3x4MEDODs7IyYmBnFxcYiLi+s3H8RuwATkrpgxYwZWrlyJlStX4urVq3ByckJ5eTnGjh0LPp+PN954A2PHjsW8efMAKLznqPfpGkIIvvrqK/zjH//Axx9/jIkTJ+r8HEKhED/e+xF7w/bitult+nU2YWNR1SIszF8I0kg0EtfRlg0bDPCPfygC8saNYiQkKCyb7OzsYChqwfWjxwEAxubmtJBQb9CRg4dYLIZEIqFrm7lcbr+VS9XU1ODu3buwtbVVNQlobgb79u3HgTczE+y8PI2OKbezgzgiAvWBgXTeV25tTX++HA6nw1RLdXU1BAKBRm7YukAsFiMnJ4dOPdy5cwfGxsYYOnQoTE1NcenSJSxcuBBr1qzp1XH0Ik/mop4uUG4oqaiooIOsk5MTHj58CECR53Vzc6P3oRpKeiMgs1gsLFy4EM8++yyWL1+OlJQUbNmyRac1tKampnjW6Vl4Z3rja+uvcTzwOFr0WiBnyXHM7hiuWV9DkjgJw4luOxgBQPm7LJUCXC4XMTExKC4uRuZ//4/e5jk0UmfBmEq1UDnftiLytra2tJ4wlToQCATw8/PrtwoIKysrxAwdispr13D/+HG4lpXBNCcH7JwchU6EGoi5OSTh4WgMDlYEXw8PiOztYW5hAQ6HAy6HAxcNm0usra0RExOD0tJSpKWl6bQNm9JEoYIvj8dDU1MTQkNDERMTg5UrV2LIkCEqT2Jbt25FnoY3ocHMUxeQGxoaMHv2bOzZs6fLxbSOnhx6+9HIyckJ586dw6lTpzB58mRs3LgRkydP1vo4nYnrWFpawt3FHev01mFs+ljsC9mHmxaKNEyhXiGmmkzFK9JXsFm8GVzo7magr//4bymTKf6GbDYbTnZ2+E3pMdsjUnMDy7ZQKYeOUi1cLhfu7u6dplrYbDYdcPh8PkpLS2nVtF6FELCKi1VnvrduwbyxUf2uBgaQBQejKTQUtf7+eOjhAaGTE8yUZr6hlpY9mtmy2Wy4ubnB0dGx223YhBBUV1cjIyMDmZmZSE9Pp3U2YmJiMH36dGzatAlWVlZdfr/09fURGBjY7WsZLDxVAbmzhhKqhrm8vJzWZOivhhIWi4X58+dj3LhxePPNN3Hu3Dls27at0/ZbavW/M72DjlpQAWCG7QxElkTiKDmKzwI+g5CtEIM/qn8UF9kXsVeyF1NlUzs6pda0nSFTFPFugcgUFSCWTo64W3IP3gb6avOCyr6EQqGwnZSms7NztwwCjI2NERERgcrKSty6dQvOzs491qNQobIS7MxMRbNF6w+rqkr9fgBEHh6QDh2KutZ630eurjBUSi35cji91vyiTRt2c3MzsrOz6QCcm5sLCwsLOu+7dOnS3qsqeQJ4agIyIQRLly5FUFAQVq9eTb/+3HPP4csvv0RiYiK+/PJLzJgxg349KSkJc+fOxc2bN8HhcHolXdEZjo6O+Pe//41vv/0W8fHx2LBhA0aPHo3i4mJYWFioiOtQX0ovLy+Ymppq9J+dxWLBw90Da5vWYnjacOwP3I+fuIpKh3J2OeYYzcEL0hewQ7wD9uhcOEgTOgrIbYWEAkeOgHtkBAQCAcrKyhAYGAgTE5MuLYU4HA58fX11JqVJYWdnB2traxQWFiIjI0MrqVGahgawb92iu9zYGRlgFxdrtKvc2RktrXnfR97eeOjmhhYTE0ilUrr12UeLEjtdYW5uTgso/fzzz0hNTcWMGTPw+++/g8fjISsrCzKZDOHh4YiNjUViYiJCQ0MHmgzmgOapWdS7ceMGRo8ejbCwMDpgbdmyBXFxcZgzZw7u3bsHd3d3nDlzBtbW1iCEYOXKlbh48SJMTU1x9OhRREdHqzmLbmlsbMSJEydw/fp1XLx4EVwuF/Hx8Vi1apVG9jqaQpUTfdX8FQ6GHESlXiW9zZpYY7t4O+bJ5nW7/XrPHn2sW6eYvb39tgRbt0pQda8E/91/AIBCSGjWRx9Cz9AQDQ0NdEUMm81WscbS5TVrCiU1amJiAj8/v46Di0QC1p07j2e+GRlg5eaCJVfvHUi4XEiUmi0q3N0hbtV2oKo8qGsWi8XIy8tDc3MzAgIC+tTolKp6SE9PR0ZGBng8HhobG3H37l1MmzYNS5YsQXR0NCwsLAZL1UNfw1RZDHaamprw5ZdfIjo6GmFhYfjuu++wefNmrF+/HlOn6iadoIxIJEJaXhqSvJLwg90PKtsmyCZgv3g/3IhbJ3t3zv79+khMVATkN9+UYMcOCW7+6yzyb6YDAKz9fGA9JBxyuZxWc6N0fWtraxEYGNivXVfKHnYebm5wbmpSSTuws7PBamlRfxwjI0jDw9EUEoLa1maLegcHmCndcDSxUVI2OtW2wUUTKPEjHo+HzMxMZGRkQCAQwN7eHjExMRg2bBhiY2Ph7OyM8vJybNiwAVu2bNHYXukphQnITyKVlZVYsWIF9PT08Omnn+q8IoDSfzhdexpJoUl0+zUAmBNzbJJsQoI0AWxoPks9cEAPa9Yo8o0vvVSJZa//jvzzP4C05i9iF8yDZ0hwh4GloaGBzkP2RvBRB6u8nJ71Ij0drMxM6CuJ5XQGYbMhDwhAc1gYhAEBqPT0RLWLC4yU6pt74uSh3ODS0woIqVSKP/74AxkZGcjIyMDvv/8OPT09DB06FLGxsYiLi0NgYOBAU08bbDABWRe8+uqr+M9//gN7e3vcuaPweetPuyiKf/3rX9i0aRPWrVuH6dOn6/z4YrEYt/Ju4aDLQZxxPAPCevzRj5CNQLI4Gf7Ev8N9qeYSqurh9Glb7N+vWCFfsKAe772aifR/nQMAWNjaYJoaISFCCEpLS1FSUgJfX9/em4kJhY/zvdTst6xMo13lHh5oCQ+nF92q3N3BUpr59sSJvCskEgnd1RYQEKBWp4PyvaOCb2ZmJurq6hAUFER3u1G1vww6hQnIuuD69eswNzfHokWLVAJyf9pFUVRVVeGtt96CXC7Hjh07etx629k5zlecx96Ivcg3zKdfNyJG+EDyAVY0r0BzXbNKiZ2ypZClpSVOnjTD228rZshLlkjxfGgSHhYUAgAi4ichZNxYjcbS0tICPp8PQNGo0xOxdYhEYP/+++NWYx4P7Lt31e8HgNjYoGXIEFR5eqLM1RWNwcFg2du3y3X3ZS61vr4efD4f5ubmcHFxgYWFBQghqK2tBY/HowNwcXExXF1d6ZlvbGxs1zKcDLqCaQzRBc888wyKioo0em9f2UVR2Nra4tSpUzh79iymTZuGxMREzJw5U+fnWMxdjOg70Thkewgn3U5CypKihdWCjYYbcUJ8ApsaNyHOOA4ODg4ddn0pZxkM5FV0MGax2fCO1lwfxMjICOHh4aisrASPx9NcUlMmA4vPV614uHNHYdKpBmJqCmlEBBqDgx+L7NjZwbw1+DqYmODBgweQSqXw9PTst1ZjCwsLhIaG4vr165g9ezbc3NwgFAphZmaG6OhoxMbGYsGCBfDx8WFKzgYwTEDuJgPBLopi1qxZGDNmDN5++22cPXsWO3fu7PFjvbLATl1dHUQNIiyoXoCY4hgkRybjT3OF1m2+eT4WBSzCKukqfCj5sMNKDOUHBHu9NPp3pwB/mHRjsc7Ozg5WVlbIz89HZmYmAgMDH1ccEAJWSYlq2iErC6xW4f+uIPr6kIWEoDkkBMKAADz08ECtkxOMlfK+ga0qdm3HU11djezs7N5Vb1NCLpfTkqIZGRnIyspCS0sLQkNDsWLFCmRlZUEul+Ps2bNd+h0yDCyYgNwNli9fjvXr19N2UX/9619x5MiRfunuo7CxscHJkyeRkpKC6dOnY+3atXTzizrUWQq5urrSFjtxsjgMyx+Gw+aHccz7GJpZzZCxZNhlsAvf6X2HZHEyRslHqRyfmiGzWTI4GqbTr7c1MdUGfX19BAQEoL6wEA+OHoV9cTFsCwqgp0WzhdzHB6LwcNQFBqLKywuVLi7QV7JR8uRwNNbysLa2RmxsLO3IQVkJ6QLKgonqdOPxeCgrK4O3tzdiY2Mxa9YsbN26FRwOR2WslC4Gw+CBCcjdYCDaRVHMnDkTzzzzDN555x2cPXsWu3btUpkhKQvJU4tulKUQ5fDRlaWQnp4egvyC8FHdRxiZNhJ7Q/ci3UwRZPPYeZhkPAkJkgRskmyCJSxb91HsG+yWC2M9haqbsbk5XIK0bIVtbFQ0WyiVnJkWFsJB/Z6QOzpCHBGBhuBgPPL2RoWbG+RK1Q72lpbw6mHel81mw8vLi27BLisrg5+fn1a5burzuXXrFq31cPfuXYXORUwMYmNj8eabb8LNzU3tWP39O150ZRi4MAG5GyjbRZ07dw6hoaEAFN198+fPx+rVq1FWVgaBQIDY2Ng+H5+1tTWOHz+O77//HvHx8YiPj0d9fT0mT54MLpcLExMTcDgcFYEdbbG0tMSMkBmIKIrAMf1j+MzvM9SzFeVgnxt8jgt6F7BPvA+T5ZPpGfKooN/o/b2i1AgJSSRg/fGHotW4Nf3A+uMPjZotpGZmkEVGoqlVXL3CwwPN1tYqkpouOjQRbYuJiQmGDBlCu2C4urq2M36lkMlkKgLr2dnZIIQgMjISMTEx+Oijj2i3m6eVzrTMB0K1k65hqizUMG/ePFy9ehVVVVVwcHDAxx9/jKtXr7azi6IC9N///nccOXIE+vr62LNnD+Lj4/tl3Fu3bsW3334LW1tbNDQ0wMbGBp988kmvCLQ0NDTgev51JAcn4yrnqsq2OdI5ePY/O7F6Hhc7Fq+Hvp4ioE59711wHFpn7oSAlZ//WGSHx1M4GotEas9NDA0hCwtTiOz4+Sn0fa2sIJHJYGtrCxcXF9q9pD+QyWQoKCgAj8eDs7MzfHx86G63zMxMVFdXIyAggNZ6GMAC6/1GZ1rmp0+fHhDVThrClL09zdTX18Pc3Jz+Yv/www/44IMP8O6772LOnDk6/8ITQnCv5B5OSU/hQNABPNJ77FBs0WKLYcs+wBxThZaDrZMj4gN8VZ0tamrUn4PFgjwgAKKwMNQFBqLS0xNVzs4wMDNTabYwNjaGRCKhBegDAwP7vK6WEIL6+npkZWXReV8ejwdCCF588UWMGTMGcXFxGtkUMahCaZmnpqZ2GJC3bt0KAPjggw8AAJMmTcLGjRt7rdpJQ5iyt/6ko4aSvrSLatsgMHXqVIwcORKrV6/GuXPnsHv3bp2KJVFiRauaVyEuPQ4H/A7ggs0FAIBLfhVmcHiARNFVGPT1VzD68w+1x5S7uUEcEYG6oCBUe3ujwtUVpLW1msPhwMnSEj6dCAsZGBggODgYNTU1uH37dq9XP0gkEhWB9d9//x1GRkZ0t9ucOXPg5+eHkydP4tq1a7SIFYN2KGuZp6amDqhqJ13AzJB7iY4aStauXduvdlEUP/74IxITE/H2229j7ty5vTJbLi8vx5n6M0gOS8bsA1KE8V8CAOhLxJh/7DAM29QAE2trSIYMQUNwMKp9fFDh7o4WLlel2aK7VkqUIHplZSUCAwN7bJMll8tRXFxMl5xRQjshISG01sOQIUN6X0/5KaOhoQFjxozBunXrMGvWLFRUVNBNLevXr0d5eTmOHDmCFStWYPjw4ViwYAEAYOnSpZgyZQpmz57dn8NnZsj9SUcNJefPn8fVq1cBAIsXL8bYsWOxfft2nD9/HosWLQKLxcKwYcNQW1ursnCoa+Lj4zFixAi89957SElJwZ49e3Q+W3Z2dsaylmWIyYzBz6Iv6W3eeQIY6OtDEhX1WGTH0xN1NjYwVUo9hGlhqqkONpsNb29vODg4IDc3F2ZmZvD19dXo+IQQ1NTU0DnfjIwMlJSUwMPDAzExMZg6dSo2btwIa2vrpy710JfGwZ1pmVMMtGqn7sIE5D5kINhFUXA4HHz++ee4dOkSZs2ahZUrV2L+/Pk6DSpGRkYYETYCho3uqLn8V+QN0UdO1CxIE9fCsNVKicPhwLcbxqndwczMDEOHDkV5eTnS09Ph4+PTrmlCJBKpCKz/+eefsLCwQHR0NOLi4vDKK6/A09OT6XaDohZ8586dKottEyZMwLFjxzB+/Hj6SXDbtm3Yvn07fvzxRwgEAggEAty8eRPLly/X6EmwMy3zgV7t1B2YgNwFFRUVePfdd/Hbb7/BysoKhoaGWLt2LZ5//nmdnqc/G0omTZqE4cOHY82aNUhJScHevXt7NJtQ7vCjXJz19PTgum0juK2C+iEhIf32OE/N3m1tbfHLL7/glVdeQXx8PF0JIZVKER4ejri4OKxduxZhYWGMwHonODk50QHRwsICQUFBKC0t1fmTYGpqKk6cOIGwsDAMGTIEgKLE7dSpU+2qnQAgJCQEc+bMocsFk5OT+7vCQmOYgNwJhBDMnDkTixcvxtdffw0AKC4uxnfffdftYw40uygKS0tLHDp0CJcvX8bs2bOxfPlyLFy4UO1NgXJxVvayI4TQ9b4eHh7tBOWrqqqQlZUFd3d3ODs799mNhxJYV1Y5e/jwIdzd3bFnzx688MILuHTpErhc7lOXetAFvWkcPGrUqA4nLVTNcUesW7cO69at686l9CtMQO6E//3vfzA0NMSyZcvo1zw8PPDWW291+5gD1S6KYsKECbhx4wbef/99vPDCC9i7dy9cXV3p7SKRSKXDTyKR0C7ODg4O8PPzUzsTsbW1BZfLRV5eHrKyshAUFKRzQR7qRtFWYN3W1pZedFu1ahV9Q2hqasKBAweY+t9uMpCNgwcbTEDuhJycnB6Vnik3lLi6uuLjjz9GYmIi5syZg8OHD9N2UYDiTn/hwgXaH+7o0aO6ugytsbCwwIEDB3D+/HnEx8cjMjISDx8+xJo1a2BtbU27OHt4eHRbXJ1yEK6pqUF2djacnZ01agXuDKlUij///JOe+d6+fRtsNhuRkZGIjY3Fpk2bEBQU1OnNwtTUtF0tK4NmDAbj4MEEE5A1ZMWKFbhx4wYMDQ2Rnp6u9v2nTp3q8PUrV660e43FYiE5ObnHY9QVc+fORVlZGaZMmYKSkhK6KsHDw0On56H0GQoKCpCRkYGgoCC1PnFyuRylpaUqqQfK5oladIuKiupQBvRpoi+MFQabcfBggKlD7oQrV65g06ZNuHbtGv1aVVUVoqOjNdZHHqwQQlSC2U8//YR3330XCQkJWLJkSa8Eurq6OuTm5sLGxgaurq4wMjICIQRCoVBFYL2oqAguLi4qAut2dnZPdfDtiL4wVhiMxsH9CNM63RMIIRg2bBiWLFmC5cuXAwDu3bunlWC9LvD09KSNL/X19ZGRkdFpnWdv0tjYiA8++AB//vkn9u/fD3d3d52fQyQS4cyZM9ixYwf8/f1RVlYGU1NTREVF0QHY19eXKTnTkKKiIkybNk1tQB6grcZPGhoFZOZ/diewWCykpKTg2rVr8PLyQmxsLBYvXozt27f3+Vh++ukn3Lp1CxkZGQCAbdu2Yfz48RAIBBg/fjy2bdvW62MwMzPDvn37sH79esybNw9ffPFFh4s0miKXy5GXl4dvvvkG7733HsaPH4/x48fjxo0bmD9/PioqKjBhwgSkpqZi//79WLhwIfz9/Zlg3EOSkpIQHh6OV199FTWt+iGdVT8w9D3MDHmA4+npiYyMDBWh8YCAAFy9epVeNBk7diztNdcXNDU1Yd26dbh9+zb2798PT0/PLt9PCEFVVZWKwHppaSl9o4uLi0NMTIxKyZlcLsevv/6KkSNH9sEVPZm0nSEPslbjJw2mdfpJgMViYeLEiWCxWHjjjTfw+uuvd1rn2VeYmppi9+7dSE1NxYIFC7Bo0SK89tprYLPZtMA61e2WkZEBPp8PLpdLC6wvW7YMbm5uXc522Wz2ExeM+1tw6klsNX7iIIRo88PQx5SWlhJCCKmoqCDh4eHk2rVrhMPhqLyHy+X2x9AIIYQ0NjaS1atXk8jISDJv3jwSHR1NoqKiyNKlS8k///lPkpWVRSQSSb+NbyBx7do1kpmZSUJCQujX1qxZQ7Zu3UoIIWTr1q1k7dq1hBBCfvjhBzJ58mQil8vJr7/+SmJjY7U+X2Fhocq5ysrK6N937dpFXnrpJUIIIXfu3CHh4eFEJBKRgoIC4uXlRaRSabeukaFTNIqxTEAeRGzYsIHs2LGD+Pv701+usrIy4u/v388jI+SLL74gKSkppK6ujsjl8v4ezoClbZDs7LN8/fXXyddff93h+zRh7ty5xNHRkejr6xMXFxfyxRdfkAULFpDQ0FASFhZGpk+frnK8zZs3E29vb+Lv708uXLjQ08tkaI9GMZbJIQ9gGhsbabPRxsZGTJgwAR999BGuXLkCGxsbWryluroan376aX8Pl0ED2uZ1uVwuamtr6e1WVlaoqanBtGnTkJiYiFGjFIax48ePx/bt25+mMrEnDSaHPNipqKighYykUinmz5+PyZMnIyYmpsOOP4Ynh44mSkyt9ZMPE5AHMN7e3sjOzm73uo2NTYcdfwyDD6bNmEEZpqiTgUEJT09PWuaRSg9UV1djwoQJ8PPzw4QJE+j6XV1AtRkDaNdmfPz4cRBC8NtvvzFtxk8JTEB+Crh48SICAgLg6+vbJ00kg53easSZN28ehg8fDj6fD1dXVxw+fBiJiYm4fPky/Pz8cPnyZSQmJgJQCE55e3vD19cXCQkJOHDggM6uj2HgwizqPeHIZDL4+/vj8uXLcHV1RUxMDE6dOoXg4OD+HtqAZCA24jA8ETCt0wxAWloafH194e3tDUNDQ8ydOxfnz5/v72ENWKhGnKioKHz22WcAOrfeGqjo6elhyJAhCA0NxfTp01WqOBgGNkxAfsJhdAq0IzU1FTweDz/++COSk5Nx/fr1/h6S1piYmODWrVu4c+cOrK2tB5S0K0PXMAH5CYcpn9IOqpLB3t4ezz//PNLS0uhKCAAqlRCDgeHDhzM34EEEE5CfcJ608qneXKBsbGxEfX09/ft///tfhIaGdloJMdCRyWS4cuUKnnvuuf4eCoOmaNrSR5jW6UGJRCIhXl5epKCggLS0tJDw8HBy586d/h5Wt5BKpcTb25vk5+fT15KTk6Oz4+fn55Pw8HASHh5OgoODyebNmwkhhFRVVZFx48YRX19fMm7cOPLo0SOdnbM3YLPZJCIignA4HDJu3DhGl2JgoFGMZRpDnnD09fWRlJSESZMmQSaT4dVXX0VISEh/D6tbKC9QAqAXKHVVMfKkNOJQOWShUIhp06YhOTkZb7/9dn8Pi0EDtC17Y2DoN1gs1gsAJhNCXmv990IAcYSQlf07soEFi8VqIISYt/4eCeA8AB9CiKR/R8agDiaHzDCY6Gg1kplRdAEhJAtANoC5/T0WBvUwKQuGwcR9AG5K/3YFUNZPYxmwULNjpX9P76+xMGgHM0NmGEykA/BjsVheLBbLEIpZ33f9PCYGBp3BzJAZBg2EECmLxVoJ4BIAPQBHCCE5/TwsBgadwSzqMTAwMAwQmJQFAwMDwwCBCcgMDAwMAwQmIDMwMDAMEJiAzMDAwDBAYAIyAwMDwwDh/wHMtiAxCiKjVwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1cacdf1fd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# draw figure\n",
"fig = plt.figure()\n",
"ax = fig.gca(projection='3d')\n",
"\n",
"ax.set_xlabel(\"R\")\n",
"ax.set_ylabel(\"G\")\n",
"ax.set_zlabel(\"B\")\n",
"ax.axis('on')\n",
"\n",
"ax.plot([0, 0], [0, 0], [0, 255], color='#0000FF', linewidth=3)\n",
"ax.plot([0, 10], [0, -10], [255, 225], color='#0000FF', linewidth=3)\n",
"ax.plot([0, -10], [0, 10], [255, 225], color='#0000FF', linewidth=3)\n",
"\n",
"ax.plot([0, 0], [0, 255], [0, 0], color='#00FF00', linewidth=3)\n",
"ax.plot([0, 15], [255, 225], [0, 0], color='#00FF00', linewidth=3)\n",
"ax.plot([0, -15], [255, 225], [0, 0], color='#00FF00', linewidth=3)\n",
"\n",
"ax.plot([0, 255], [0, 0], [0, 0], color='#FF0000', linewidth=3)\n",
"ax.plot([255, 225], [0, 15], [0, 0], color='#FF0000', linewidth=3)\n",
"ax.plot([255, 225], [0, -15], [0, 0], color='#FF0000', linewidth=3)\n",
"\n",
"ax.view_init(elev=30,azim=-120)\n",
"\n",
"a = 115\n",
"b = 106\n",
"c = 110\n",
"r = 30\n",
"alpha = 30\n",
"ax.plot([0, a], [0, b], [0, c], color='#9B6A6E', linewidth=3)\n",
"x1 = a-r*np.cos(np.arctan(b/a)+alpha/180*np.pi)\n",
"x2 = a-r*np.cos(np.arctan(b/a)-alpha/180*np.pi)\n",
"y1 = b-r*np.sin(np.arctan(b/a)+alpha/180*np.pi)\n",
"y2 = b-r*np.sin(np.arctan(b/a)-alpha/180*np.pi)\n",
"len = np.sqrt(a*a+b*b+c*c)-r*np.cos(alpha/180*np.pi)\n",
"theta = np.arctan(c/np.sqrt(a*a+b*b))\n",
"c2 = len*np.sin(theta)\n",
"ax.plot([a, x1], [b, y1], [c, c2], color='#9B6A6E', linewidth=3)\n",
"ax.plot([a, x2], [b, y2], [c, c2], color='#9B6A6E', linewidth=3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusion \n",
"Jane Eyre is a classic literary novel which have been recreated to many different form, including theatre, movie and so on. The adaption movie of Jane Eyre is a significant recreation. It well told the story, and applied the unique narrative technique of movie. For the movie, audience usually write reviews to evaluate the movie and show their comments. No matter, the audience like or don't like the movie, a good review is usually critical, showing pros and cons of the movie, but not blindly overpraise or belittle. Since people can write a movie review, why can't computers? Computer also can write reviews. With advanced model, GPT-2, by open AI, computers can write reviews as people write. Back to the novel, if we want to find a color which can represent the novel, we find out all colors appear in the text, and calculate its weighted average. Then, we get the color #9B6A6E, and it looks like a mix of purple and red. These are my computational literary analysis on Jane Eyre."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Works Cited\n",
"Jane Eyre. (2019). Retrieved 19 August 2019, from https://en.wikipedia.org/wiki/Jane_Eyre\n",
"\n",
"Jane Eyre (2011 film). (2019). Retrieved 19 August 2019, from https://en.wikipedia.org/wiki/Jane_Eyre_(2011_film)\n",
"\n",
"Natural-language generation. (2019). Retrieved 19 August 2019, from https://en.wikipedia.org/wiki/Natural-language_generation\n",
"\n",
"Markov chain. (2019). Retrieved 19 August 2019, from https://en.wikipedia.org/wiki/Markov_chain\n",
"\n",
"Radford, A. (2019). Better Language Models and Their Implications. Retrieved 19 August 2019, from https://openai.com/blog/better-language-models/"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.