diff --git a/docs/tutorials/Earthquake-preds-Clay.ipynb b/docs/tutorials/Earthquake-preds-Clay.ipynb
new file mode 100644
index 00000000..74caaedb
--- /dev/null
+++ b/docs/tutorials/Earthquake-preds-Clay.ipynb
@@ -0,0 +1,793 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "0e2c4b4b-063f-4b9f-8a6e-df8d48ba4b3a",
+ "metadata": {},
+ "source": [
+ "**Problem Statement**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "26154498-17c4-4aff-94a4-f69fdfabbdde",
+ "metadata": {},
+ "source": [
+ "Earthquake monitoring and damage estimation is essential to ensure that necessary aid reaches the affected areas in atimely manner. However, the coverage of earthquake monitoring network is limited and inadequate for remote areas. Possible solution to this problem can be use of satellite imagery to estimate occurence of earthquake and also get a sense of the extent of damage.\n",
+ "\n",
+ "This notebook presents a workflow to use the embeddings generated by Clay foundation model on Sentinel-1 data to predict whether earthquake has occurred or not. The code below provides a walkthrough of this binary classification problem (detecting earthquake) on Sentinel-1 imagery which is free and available through the Copernicus Sentinel program.\n",
+ "\n",
+ "For more information on Sentinel-1 bands, please see https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S1_GRD"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5575d9af-8917-49bb-844b-64356060d72e",
+ "metadata": {},
+ "source": [
+ "**About the dataset**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "77210df1-d1e8-4142-833c-0639052c0e1c",
+ "metadata": {},
+ "source": [
+ "*QuakeSet: A Dataset and Low-Resource Models to Monitor Earthquakes through Sentinel-1.*\n",
+ "\n",
+ "Citation:\n",
+ "@misc{cambrin2024quakesetdatasetlowresourcemodels,\n",
+ " title={QuakeSet: A Dataset and Low-Resource Models to Monitor Earthquakes through Sentinel-1}, \n",
+ " author={Daniele Rege Cambrin and Paolo Garza},\n",
+ " year={2024},\n",
+ " eprint={2403.18116},\n",
+ " archivePrefix={arXiv},\n",
+ " primaryClass={cs.CV},\n",
+ " url={https://arxiv.org/abs/2403.18116}, \n",
+ "}\n",
+ "\n",
+ "Huggingface link: https://huggingface.co/datasets/DarthReca/quakeset\n",
+ "\n",
+ "Github link: https://github.com/DarthReca/quakeset/\n",
+ "\n",
+ "torchgeo link: https://torchgeo.readthedocs.io/en/latest/_modules/torchgeo/datasets/quakeset.html#QuakeSet\n",
+ "\n",
+ "**Dataset Structure**\n",
+ "\n",
+ "The dataset is divided into three folds with equal distribution of magnitudes and balanced in positive and negative examples.\n",
+ "\n",
+ "Dataset features:\n",
+ "\n",
+ "-Sentinel-1 SAR imagery\n",
+ "\n",
+ "-before/pre/post imagery of areas affected by earthquakes\n",
+ "\n",
+ "-2 SAR bands (VV/VH)\n",
+ "\n",
+ "-3,327 pairs of pre and post images with 5 m per pixel resolution (512x512 px)\n",
+ "\n",
+ "-2 classification labels (unaffected / affected by earthquake) (**used in this notebook for binary classification**)\n",
+ "\n",
+ "-pre/post image pairs represent earthquake affected areas\n",
+ "\n",
+ "-before/pre image pairs represent hard negative unaffected areas\n",
+ "\n",
+ "-earthquake magnitudes for each sample\n",
+ "\n",
+ "Dataset format:\n",
+ "\n",
+ "single hdf5 dataset containing images, magnitudes, hypercenters, and splits\n",
+ "\n",
+ "Dataset classes:\n",
+ "\n",
+ "-unaffected area\n",
+ "\n",
+ "-earthquake affected area\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bf424db3-765c-4f13-953e-4bf180061696",
+ "metadata": {},
+ "source": [
+ "**Approaches to the problem**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "84c1ddaf-3149-4461-a0bc-91a4b68d99a2",
+ "metadata": {},
+ "source": [
+ "Each sample consist of 2 images (vv and vh band) of pre-event and 2 images (vv and vh band) of post event and the image size is 512 x 512. The ground truth is 1 or 0 indicating whether earthquake has occurred or not. The binary classification problem can be solved using multiple approaches such as:\n",
+ "\n",
+ "1. Using traditional machine learning \n",
+ "The images can be flattened such that each data point has dimension 512 x 512 x 4 with a label of 1 or 0. Then the data can be fed into a traditional ML model such as SVM or RF classifier directly or after the inputs has undergone dimensionality reduction through PCA / t-SNE etc.\n",
+ "\n",
+ "2. Using deep learning \n",
+ "Deep learning algorithms such as CNN models can be trained on imagery treating the input to have 4 channels with labels being 1 or 0. Binary cross entropy loss functions can be used to optimize the CNN network\n",
+ "\n",
+ "3. Using embeddings of pre-trained models \n",
+ "Foundation models have revolutionalized the deep learning space wherein these models are pre-trained on large amount of data and are able to learn a lot of domain knowledge from the data itself. Recently, the application of these models have especially been visible in the NLP space (think LLMs and chatgpt). Clay is a foundation model for earth observation and the embeddings it generates on satellite data (of different platforms) can be used for multiple downstream tasks such as classification, regression etc. since the embeddings contain rich information about the imagery in a latent space. \n",
+ "\n",
+ "Our approach in this notebook is to use the Clay pre-trained model to generate embeddings on the Sentinel-1 imagery (of the Quakeset dataset) and use those embeddings as inputs to random forest classifier for binary classification. Our beleief is that since these embeddings already contain lots of information about the imagery, they should serve as useful features which can be used to do classification.\n",
+ "\n",
+ "This approach is also computationally cheaper and faster since high end GPUs are not needed to train classifier models on embeddings and these models can be trained in few minutes. On the other hand, training large deep learning models require extensive hardware and long training times spanning days and sometime months."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "16dd744e-0f96-47d8-9766-49771e01e71b",
+ "metadata": {},
+ "source": [
+ "**Using Clay embeddings to detect Earthquake - Code walkthrough**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "5bc8c2d1-f2e1-49c9-911b-a4b1fb5efed5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# git clone https://github.com/Clay-foundation/model #Need to run this for the first time"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "52d10e8f-ebfb-4b17-8d84-c57af1188f53",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# pip install torchgeo[all]\n",
+ "# pip install git+https://github.com/microsoft/torchgeo.git #Use this to be able to access the QuakeSet dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "89f8bc4b-73ca-47e3-aa07-f444a871ca56",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# importing the required modules\n",
+ "\n",
+ "import torchgeo\n",
+ "import torchgeo.datasets as datasets\n",
+ "import sys\n",
+ "import torch\n",
+ "import numpy as np\n",
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "import xgboost as xgb\n",
+ "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "import matplotlib.pyplot as plt\n",
+ "from tqdm.auto import tqdm\n",
+ "from sklearn.metrics import f1_score\n",
+ "\n",
+ "sys.path.append(\"model/\")\n",
+ "\n",
+ "from src.model import ClayMAEModule"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "d87a1df1-9e67-40af-9b76-147e7c3b6a38",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'0.6.0.dev0'"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "torchgeo.__version__ # check torchgeo version"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7f5ae92-1978-40a1-adcd-56a087f1f67a",
+ "metadata": {},
+ "source": [
+ "**Downloading the QuakeSet dataset**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "57c7327c-e454-4ca6-bb50-fe67272ca3fd",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Downloading https://cdn-lfs-us-1.huggingface.co/repos/67/91/67919aae2184524f91dca1003493d36f4fc4799f55277f03c820fc4c90423eaa/11527e6a21c425b787d0952443e434f53d90a22ee16b75d20e17d54c2b091a78?response-content-disposition=inline%3B+filename*%3DUTF-8%27%27earthquakes.h5%3B+filename%3D%22earthquakes.h5%22%3B&Expires=1723272724&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcyMzI3MjcyNH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy11cy0xLmh1Z2dpbmdmYWNlLmNvL3JlcG9zLzY3LzkxLzY3OTE5YWFlMjE4NDUyNGY5MWRjYTEwMDM0OTNkMzZmNGZjNDc5OWY1NTI3N2YwM2M4MjBmYzRjOTA0MjNlYWEvMTE1MjdlNmEyMWM0MjViNzg3ZDA5NTI0NDNlNDM0ZjUzZDkwYTIyZWUxNmI3NWQyMGUxN2Q1NGMyYjA5MWE3OD9yZXNwb25zZS1jb250ZW50LWRpc3Bvc2l0aW9uPSoifV19&Signature=AAAWpgowEaqyI7lPQs6QTjMYZq03OgAjaKuaW5fLO5gGfj5rbLd566zV5%7EiImjr0ejHSQi1-VIaimbTHd1AG%7E7SBOBqNgLmsbWOYjjTndDN5kWTEBlYggCiBa7msD57x-3ZENB%7ETdMtRx%7EmVdURvgTiWVxOfT3uisCo78EtEL8AycpuU9or6zX0ay17VFc5uPb7wWmU0kpMsG-yF62jo13DqGMScwEFy-OgntW9oPyfOd0NbCo18y7rjtSp1uSbGachkkPzzQcp-0vqX7Z31UjvFHJoom9R38FzcnbJOW0xk%7Ez2YQpcP6ZOwYXSyYZj1CM-7eTI3UPyAia4uMvPyHw__&Key-Pair-Id=K24J24Z295AEI9 to data/earthquakes.h5\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 9666460547/9666460547 [03:50<00:00, 41959334.33it/s]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# We download the QuakeSet dataset available in torchgeo.\n",
+ "\n",
+ "train_ds = datasets.QuakeSet(\n",
+ " split=\"train\", download=True\n",
+ ") # Change download to True to download first time\n",
+ "val_ds = datasets.QuakeSet(split=\"val\", download=True)\n",
+ "test_ds = datasets.QuakeSet(split=\"test\", download=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "c2ebdc0c-d4d8-4ba2-b97d-babb0d0d4d70",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "torch.Size([4, 512, 512])"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Checking the Sentinel-1 imagery size.\n",
+ "\n",
+ "# Each sample consists of pre and post event data with two channels - vv and vh of Sentinel-1\n",
+ "\n",
+ "train_ds[0][\"image\"].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "df682dd4-7eee-48a7-a42b-3c45cc2a7460",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Downloading: \"https://clay-model-ckpt.s3.amazonaws.com/v0.5.7/mae_v0.5.7_epoch-13_val-loss-0.3098.ckpt\" to /teamspace/studios/this_studio/.cache/torch/hub/checkpoints/mae_v0.5.7_epoch-13_val-loss-0.3098.ckpt\n",
+ "100%|██████████| 1.61G/1.61G [01:49<00:00, 15.7MB/s]\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "78f781a4d10b4a05bffc926451cd3d4b",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "model.safetensors: 0%| | 0.00/343M [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/zeus/miniconda3/envs/cloudspace/lib/python3.10/site-packages/torch/nn/modules/transformer.py:286: UserWarning: enable_nested_tensor is True, but self.use_nested_tensor is False because encoder_layer.self_attn.batch_first was not True(use batch_first for better inference performance)\n",
+ " warnings.warn(f\"enable_nested_tensor is True, but self.use_nested_tensor is False because {why_not_sparsity_fast_path}\")\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Download Clay-1 model\n",
+ "\n",
+ "device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
+ "ckpt = \"https://clay-model-ckpt.s3.amazonaws.com/v0.5.7/mae_v0.5.7_epoch-13_val-loss-0.3098.ckpt\"\n",
+ "torch.set_default_device(device)\n",
+ "\n",
+ "model = ClayMAEModule.load_from_checkpoint(\n",
+ " ckpt, metadata_path=\"model/configs/metadata.yaml\", shuffle=False, mask_ratio=0\n",
+ ")\n",
+ "model.eval()\n",
+ "\n",
+ "model = model.to(device)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "b115e660-fb27-4340-a8e5-09d29c330d1b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Dataset class to use for loading the data\n",
+ "\n",
+ "\n",
+ "class EarthQuakeDataset:\n",
+ " def __init__(self, ds):\n",
+ " self.ds = ds\n",
+ "\n",
+ " def __len__(self):\n",
+ " return len(self.ds)\n",
+ "\n",
+ " def __getitem__(self, idx):\n",
+ " pre_image = self.ds[idx][\"image\"][\n",
+ " :2, :, :\n",
+ " ] # First two images are Sentinel-1 images (vv & vh band) of pre-event\n",
+ " post_image = self.ds[idx][\"image\"][\n",
+ " 2:, :, :\n",
+ " ] # Last two images are Sentinel-1 images (vv & vh band) of post-event\n",
+ " label = self.ds[idx][\"label\"]\n",
+ "\n",
+ " sample = {\n",
+ " \"pixels1\": pre_image, # 2 x 512 x 512\n",
+ " \"pixels2\": post_image, # 2 x 512 x 512\n",
+ " \"time\": torch.zeros(4), # Placeholder for time information\n",
+ " \"latlon\": torch.zeros(4), # Placeholder for latlon information\n",
+ " \"label\": label,\n",
+ " }\n",
+ "\n",
+ " return sample\n",
+ "\n",
+ "\n",
+ "# Construct training/validaton/test dataset object\n",
+ "train_dataset = EarthQuakeDataset(train_ds)\n",
+ "validation_dataset = EarthQuakeDataset(val_ds)\n",
+ "test_dataset = EarthQuakeDataset(test_ds)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "bbc4fd0a-0483-4dfd-a82e-a0da1a1530de",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Dataloaders from dataset\n",
+ "BS = 8\n",
+ "\n",
+ "train_dl = torch.utils.data.DataLoader(\n",
+ " train_dataset, batch_size=BS, shuffle=True, generator=torch.Generator(device=device)\n",
+ ")\n",
+ "val_dl = torch.utils.data.DataLoader(\n",
+ " validation_dataset,\n",
+ " batch_size=BS,\n",
+ " shuffle=False,\n",
+ " generator=torch.Generator(device=device),\n",
+ ")\n",
+ "test_dl = torch.utils.data.DataLoader(\n",
+ " test_dataset, batch_size=BS, shuffle=False, generator=torch.Generator(device=device)\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "6ac0b263-f334-41ee-88fd-cab4195cb767",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Generate embeddings for the data\n",
+ "\n",
+ "\n",
+ "def generate_and_save_embeddings(dl, split=\"train\"):\n",
+ " gsd = torch.tensor(10, device=device) # Ground sampling distance for Sentinel-1\n",
+ " waves = torch.tensor([3.5, 4.0], device=device) # wavelengths for Sentinel-1\n",
+ "\n",
+ " embeddings1 = []\n",
+ " embeddings2 = []\n",
+ " target = []\n",
+ "\n",
+ " for bid, batch in enumerate(tqdm(dl)):\n",
+ " datacube1 = {\n",
+ " \"pixels\": batch[\"pixels1\"].to(device),\n",
+ " \"time\": batch[\"time\"].to(device),\n",
+ " \"latlon\": batch[\"latlon\"].to(device),\n",
+ " \"gsd\": gsd,\n",
+ " \"waves\": waves,\n",
+ " }\n",
+ "\n",
+ " datacube2 = {\n",
+ " \"pixels\": batch[\"pixels2\"].to(device),\n",
+ " \"time\": batch[\"time\"].to(device),\n",
+ " \"latlon\": batch[\"latlon\"].to(device),\n",
+ " \"gsd\": gsd,\n",
+ " \"waves\": waves,\n",
+ " }\n",
+ "\n",
+ " with torch.no_grad():\n",
+ " unmsk_patch1, unmsk_idx1, msk_idx1, msk_matrix1 = model.model.encoder(\n",
+ " datacube1\n",
+ " )\n",
+ " unmsk_patch2, unmsk_idx2, msk_idx2, msk_matrix2 = model.model.encoder(\n",
+ " datacube2\n",
+ " )\n",
+ "\n",
+ " emb1 = unmsk_patch1[:, 0, :].cpu().numpy()\n",
+ " emb2 = unmsk_patch2[:, 0, :].cpu().numpy()\n",
+ "\n",
+ " embeddings1.append(emb1)\n",
+ " embeddings2.append(emb2)\n",
+ " target.append(batch[\"label\"].cpu().numpy())\n",
+ "\n",
+ " # Saving embeddings and ground truth (label) data\n",
+ " np.save(\n",
+ " f\"{split}_emb.npy\",\n",
+ " np.concatenate(\n",
+ " (np.concatenate(embeddings1), np.concatenate(embeddings2)), axis=1\n",
+ " ),\n",
+ " )\n",
+ " np.save(f\"{split}_label.npy\", np.concatenate(target))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "8a12f703-ffde-4967-9e8a-ecfca9ba5e93",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "b03096d21c484c41b35bcbc9d5aedcf6",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/284 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "generate_and_save_embeddings(train_dl, \"train\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ed0bcfdf-fb98-4343-84b9-9d8d5d9813a4",
+ "metadata": {},
+ "source": [
+ "The time taken to generate embeddings on train data was ~48 minutes on 1 T4 GPU with batch size of 8. One can go faster if more powerful GPUs are available"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "144d79bd-833e-41b4-9c61-22fe4c0c0f27",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "0329e1101a2047929fd690db9803c03d",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/69 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "generate_and_save_embeddings(val_dl, \"val\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "5d2a0cef-12b3-498b-b696-56ba3e777a48",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "78370eae24fd4011b75bdfc1df90cb2c",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ " 0%| | 0/64 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "generate_and_save_embeddings(test_dl, \"test\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "95b8ffc3-f030-4d83-83eb-c449be524603",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "((2266, 1536), (2266,))"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Load the saved embeddings and ground truth (labels)\n",
+ "\n",
+ "train_fea = np.load(\"train_emb.npy\")\n",
+ "train_label = np.load(\"train_label.npy\")\n",
+ "\n",
+ "train_fea.shape, train_label.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "4545418a-6a19-4f70-8665-f5d9f8e09204",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGwCAYAAAA0bWYRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5YklEQVR4nO3de3gU9dn/8c9sQg6EHAhIwkrAKMpBERRsGg8ImhLQH0Khj0WjRkVolahAPUCViKCmRUUMIngE6QMVrUqVKjUFJSgRJBgPiBEQJYob8IlJSDCn3fn9gaxuw0o2uyHJzvt1XXM93ZnvzN6bi8e9976/8x3DNE1TAADAsmytHQAAAGhdJAMAAFgcyQAAABZHMgAAgMWRDAAAYHEkAwAAWBzJAAAAFhfa2gH4w+Vyad++fYqOjpZhGK0dDgDAR6Zp6uDBg7Lb7bLZWu73aU1Njerq6vy+TlhYmCIiIgIQUdvSrpOBffv2KSkpqbXDAAD4qaSkRD169GiRa9fU1Ci5Vyc59jv9vlZiYqL27NkTdAlBu04GoqOjJUkX/eNahUaFtXI0QMuoG1Xa2iEALaZB9XpHr7v/e94S6urq5Njv1FeFJykmuvnVh8qDLvUa/KXq6upIBtqSI62B0KgwdSAZQJByGR1aOwSg5fy4IP7xaPV2ijbUKbr57+NS8Laj23UyAABAUzlNl5x+PI3HaboCF0wbQzIAALAEl0y51PxswJ9z2zpuLQQAwOKoDAAALMEll/wp9Pt3dttGMgAAsASnacppNr/U78+5bR1tAgAALI7KAADAEphA6B3JAADAElwy5SQZOCraBAAAWByVAQCAJdAm8I5kAABgCdxN4B1tAgAALI7KAADAElw/bv6cH6xIBgAAluD0824Cf85t60gGAACW4DTl51MLAxdLW8OcAQAALI7KAADAEpgz4B3JAADAElwy5JTh1/nBijYBAAAWR2UAAGAJLvPw5s/5wYpkAABgCU4/2wT+nNvW0SYAAMDiqAwAACyByoB3JAMAAEtwmYZcph93E/hxbltHmwAAAIujMgAAsATaBN6RDAAALMEpm5x+FMSdAYylraFNAACwBPPHOQPN3Uwf5wzk5+dr9OjRstvtMgxDq1evdh+rr6/XnXfeqQEDBigqKkp2u13XXHON9u3b53GNsrIyZWRkKCYmRnFxcZo4caKqqqo8xnz00Ue64IILFBERoaSkJM2bN8/nvw3JAAAALaC6uloDBw7UokWLGh07dOiQtm3bplmzZmnbtm16+eWXVVxcrMsuu8xjXEZGhrZv3668vDytWbNG+fn5mjx5svt4ZWWlRowYoV69eqmwsFAPPvigZs+erSeffNKnWGkTAAAsIVBzBiorKz32h4eHKzw8vNH4UaNGadSoUUe9VmxsrPLy8jz2PfbYY/rVr36lvXv3qmfPntqxY4fWrl2r999/X0OGDJEkLVy4UJdccokeeugh2e12rVixQnV1dXr22WcVFham008/XUVFRZo/f75H0nAsVAYAAJbgNG1+b5KUlJSk2NhY95aTkxOQ+CoqKmQYhuLi4iRJBQUFiouLcycCkpSWliabzabNmze7xwwdOlRhYWHuMenp6SouLtb333/f5PemMgAAgA9KSkoUExPjfn20qoCvampqdOedd+qKK65wX9vhcKhbt24e40JDQxUfHy+Hw+Eek5yc7DEmISHBfaxz585Nen+SAQCAJbhkyOVHQdylw08qiomJ8UgG/FVfX6/LL79cpmlq8eLFAbuuL0gGAACW0BbXGTiSCHz11Vdav369R5KRmJio/fv3e4xvaGhQWVmZEhMT3WNKS0s9xhx5fWRMUzBnAACAVnAkEdi5c6f+85//qEuXLh7HU1NTVV5ersLCQve+9evXy+VyKSUlxT0mPz9f9fX17jF5eXnq06dPk1sEEskAAMAiAjWBsKmqqqpUVFSkoqIiSdKePXtUVFSkvXv3qr6+Xr/73e+0detWrVixQk6nUw6HQw6HQ3V1dZKkfv36aeTIkZo0aZK2bNmid999V1lZWZowYYLsdrsk6corr1RYWJgmTpyo7du3a9WqVXr00Uc1ffp0n2KlTQAAsITDcwb8eFCRj+du3bpVw4cPd78+8gWdmZmp2bNn69VXX5UkDRo0yOO8t956S8OGDZMkrVixQllZWbr44otls9k0fvx45ebmusfGxsbqzTff1JQpUzR48GB17dpV2dnZPt1WKJEMAADQIoYNGybTNL0e/6VjR8THx2vlypW/OObMM8/Uxo0bfY7v50gGAACW4PLz2QRH7iYIRiQDAABLaE7f3/N8kgEAANo1l2wBWWcgGHE3AQAAFkdlAABgCU7TkNPHxxD/9/nBimQAAGAJTj8nEDppEwAAgGBFZQAAYAku0yaX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FcrIyGiJOAEA8A93E3jlc2WgrKxMJ598sqTD8wPKysokSeeff77y8/MDGx0AAAFyZAVCf7Zg5XMycPLJJ2vPnj2SpL59++qFF16QdLhicOTBRQAAoP3wORm47rrr9OGHH0qSZsyYoUWLFikiIkLTpk3T7bffHvAAAQAICCYQeuXznIFp06a5/3daWpo+++wzFRYWqnfv3jrzzDMDGhwAAGh5fq0zIEm9evVSr169AhELAAAtxpCfTy0MWCRtT5OSgdzc3CZf8JZbbml2MAAA4PhrUjLwyCOPNOlihmG0SjJQN6pULqPDcX9f4Hj4976i1g4BaDGVB13qfNpxejNuLfSqScnAkbsHAABot1iO2Cuf7yYAAADBxe8JhAAAtAtUBrwiGQAAWIK/qwiyAiEAAAhaVAYAANZAm8CrZlUGNm7cqKuuukqpqan65ptvJEl/+9vf9M477wQ0OAAAAobliL3yORl46aWXlJ6ersjISH3wwQeqra2VJFVUVOiBBx4IeIAAAKBl+ZwM3HfffVqyZImeeuopdejw00I/5513nrZt2xbQ4AAACBQeYeydz3MGiouLNXTo0Eb7Y2NjVV5eHoiYAAAIPFYg9MrnykBiYqJ27drVaP8777yjk08+OSBBAQAQcMwZ8MrnZGDSpEm69dZbtXnzZhmGoX379mnFihW67bbbdOONN7ZEjAAAoAX5nAzMmDFDV155pS6++GJVVVVp6NChuuGGG/SHP/xBN998c0vECACA31pjzsA333yjq666Sl26dFFkZKQGDBigrVu3uo+bpqns7Gx1795dkZGRSktL086dOz2uUVZWpoyMDMXExCguLk4TJ05UVVWVv38ODz4nA4Zh6K677lJZWZk++eQTvffeezpw4IDmzp0b0MAAAAio49wm+P7773XeeeepQ4cOeuONN/Tpp5/q4YcfVufOnd1j5s2bp9zcXC1ZskSbN29WVFSU0tPTVVNT4x6TkZGh7du3Ky8vT2vWrFF+fr4mT57c3L/CUTV70aGwsDD1798/kLEAANDmVVZWerwODw9XeHh4o3F//etflZSUpKVLl7r3JScnu/+3aZpasGCB7r77bo0ZM0aStHz5ciUkJGj16tWaMGGCduzYobVr1+r999/XkCFDJEkLFy7UJZdcooceekh2uz0gn8nnZGD48OEyDO8zKtevX+9XQAAAtAh/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L+i1117T2rVr9cEHH+imm25yH1+xYoWys7N1//33a8eOHXrggQc0a9YsPffccz7HA6CVmEAQyszMNMeMGWOapmm6XC4zLy/PDA8PN2+77Tb38YSEBLO2ttZ9zt/+9jezT58+psvlcu+rra01IyMjzX//+9+maZpm9+7dzXnz5rmP19fXmz169HC/l2ma5oUXXmjeeuutpmmaZnFxsSnJzMvLO2qcb731linJ/P777937ampqzI4dO5qbNm3yGDtx4kTziiuuME3TNGfOnGn279/f4/idd97Z6Fr/TZL5yiuveD3+4IMPmoMHD3a/vueee8yQkBDz66+/du974403TJvNZn777bemaZrmKaecYq5cudLjOnPnzjVTU1NN0zTNPXv2mJLMDz74wOv7AmhdzBlA0FqzZo06deqk+vp6uVwuXXnllZo9e7b7+IABAzzmCXz44YfatWuXoqOjPa5TU1Oj3bt3q6KiQt9++61SUlLcx0JDQzVkyJBGrYIjioqKFBISogsvvLDJce/atUuHDh3Sb37zG4/9dXV1OuussyRJO3bs8IhDklJTU5v8HkesWrVKubm52r17t6qqqtTQ0KCYmBiPMT179tSJJ57o8T4ul0vFxcWKjo7W7t27NXHiRE2aNMk9pqGhQbGxsT7HA6B1kAwgaA0fPlyLFy9WWFiY7Ha7QkM9/7lHRUV5vK6qqtLgwYO1YsWKRtc64YQTmhVDZGSkz+dUVVVJkv71r395fAlLh+dBBEpBQYEyMjJ07733Kj09XbGxsXr++ef18MMP+xzrU0891Sg5CQkJCVisAFoWyQCCVlRUlHr37t3k8WeffbZWrVqlbt26Nfp1fET37t21efNmDR06VNLhX8CFhYU6++yzjzp+wIABcrlc2rBhg9LS0hodP1KZcDqd7n39+/dXeHi49u7d67Wi0K9fP/dkyCPee++9Y3/In9m0aZN69eqlu+66y73vq6++ajRu79692rdvn+x2u/t9bDab+vTpo4SEBNntdn3xxRfKyMjw6f0BtB1MIAR+lJGRoa5du2rMmDHauHGj9uzZo7ffflu33HKLvv76a0nSrbfeqr/85S9avXq1PvvsM910002/uEbASSedpMzMTF1//fVavXq1+5ovvPCCJKlXr14yDENr1qzRgQMHVFVVpejoaN12222aNm2annvuOe3evVvbtm3TwoUL3ZPy/vjHP2rnzp26/fbbVVxcrJUrV2rZsmU+fd5TTz1Ve/fu1fPPP6/du3crNzf3qJMhIyIilJmZqQ8//FAbN27ULbfcossvv1yJiYmSpHvvvVc5OTnKzc3V559/ro8//lhLly7V/PnzfYoHQOshGQB+1LFjR+Xn56tnz54aN26c+vXrp4kTJ6qmpsZdKfjTn/6kq6++WpmZmUpNTVV0dLR++9vf/uJ1Fy9erN/97ne66aab1LdvX02aNEnV1dWSpBNPPFH33nuvZsyYoYSEBGVlZUmS5s6dq1mzZiknJ0f9+vXTyJEj9a9//UvJycmSDvfxX3rpJa1evVoDBw7UkiVL9MADD/j0eS+77DJNmzZNWVlZGjRokDZt2qRZs2Y1Gte7d2+NGzdOl1xyiUaMGKEzzzzT49bBG264QU8//bSWLl2qAQMG6MILL9SyZcvcsQJo+wzT28wnAABgCVQGAACwOJIBAAAsjmQAAACLIxkAAMDiSAYAALA4kgEAACyOZAAAAIsjGQAAwOJIBgAAsDiSAQAALI5kAAAAi/v/o1mpm1TanNIAAAAASUVORK5CYII=",
+ "text/plain": [
+ "