{ "cells": [ { "cell_type": "markdown", "id": "5cff2402", "metadata": {}, "source": [ "# Homework 4: DeepBind-style 1D CNN for Motif Discovery (Synthetic Dataset)\n", "# (Due: Monday March 30, 2026 before class)\n", "\n", "## Structure\n", "1. Set Up\n", "2. Dataset generation (synthetic sequences with implanted motif)\n", "3. Prepare data for Keras\n", "4. Model implementation (1D CNN)\n", "5. Training & evaluation (ROC AUC)\n", "6. Motif extraction \n", "7. Motif visualization\n", "8. Advanced Analysis\n", "\n", "Run cells sequentially. The notebook contains starter code and exercises to complete. \n", "\n", "\n", "Submit the completed notebook and a short PDF report with your answers and interpretations. There are 6 Questions. \n", "-----\n", "\n", "- This notebook contains starter code: training parameters, hyperparameter search, and deeper analyses are encouraged to be updated. \n", "- The dataset generation is reproducible and small by default to allow quick runs.\n" ] }, { "cell_type": "markdown", "id": "9fe7b009", "metadata": {}, "source": [ "## 1. Setup: imports and utility functions" ] }, { "cell_type": "code", "execution_count": 1, "id": "bfa4b88a", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import random\n", "from sklearn.metrics import roc_auc_score, roc_curve, precision_recall_curve, auc\n", "import tensorflow as tf\n", "from tensorflow.keras import layers, models, optimizers, losses, callbacks\n", "\n", "np.random.seed(42)\n", "random.seed(42)\n", "\n", "# Simple one-hot encoding utilities\n", "BASES = ['A','C','G','T']\n", "_base_to_idx = {b:i for i,b in enumerate(BASES)}\n", "\n", "def one_hot_encode_seqs(seqs):\n", " \"\"\"Encode a list of uppercase DNA sequences (A,C,G,T) to shape (N, L, 4).\"\"\"\n", " N = len(seqs)\n", " L = len(seqs[0])\n", " arr = np.zeros((N, L, 4), dtype=np.float32)\n", " for i,s in enumerate(seqs):\n", " for j,ch in enumerate(s):\n", " arr[i,j,_base_to_idx.get(ch,'A')] = 1.0\n", " return arr\n", "\n", "\n", "def seqs_from_onehot(X):\n", " # convert back to seqs by argmax\n", " seqs = []\n", " for i in range(X.shape[0]):\n", " seq = ''.join(BASES[int(np.argmax(X[i,j]))] for j in range(X.shape[1]))\n", " seqs.append(seq)\n", " return seqs\n" ] }, { "cell_type": "markdown", "id": "663b2218", "metadata": {}, "source": [ "## 2. Synthetic dataset generation\n", "\n", "By default the notebook provides a functioning generator that creates sequences of length 101, implants a motif at a random position in positives, and returns train/val/test splits.\n", "\n", "**Exercise:** change motif, embed multiple motifs, or vary sequence length for analysis." ] }, { "cell_type": "code", "execution_count": 2, "id": "3d828c6d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Example positive seq: TCCCTGCTCACCGTGGGGGCGGTACCCGGGTAGATCGAAGCCCTAAATATCGAACGTGCCGTTATGCAACTCTCGTGACAAAACACCGTTCGCCCGTGAGG label 0\n" ] } ], "source": [ "# Synthetic data generator\n", "\n", "def generate_synthetic_dataset(num_pos=2000, num_neg=2000, seq_len=101, motif='ACGTG', motif_prob=1.0, random_seed=42):\n", " \"\"\"Generate synthetic sequences.\n", " - num_pos: number of positive examples\n", " - num_neg: number of negative examples\n", " - seq_len: length of each sequence\n", " - motif: motif string to implant in positives\n", " - motif_prob: probability that a positive contains the motif (allows noisy labels)\n", " Returns: (seqs, labels)\n", " \"\"\"\n", " rng = np.random.RandomState(random_seed)\n", " def random_seq(L):\n", " return ''.join(rng.choice(BASES) for _ in range(L))\n", "\n", " pos_seqs = []\n", " for _ in range(num_pos):\n", " s = list(random_seq(seq_len))\n", " if rng.rand() <= motif_prob:\n", " # implant motif at random position so it fits\n", " k = len(motif)\n", " start = rng.randint(0, seq_len - k + 1)\n", " s[start:start+k] = list(motif)\n", " pos_seqs.append(''.join(s))\n", "\n", " neg_seqs = [random_seq(seq_len) for _ in range(num_neg)]\n", "\n", " seqs = pos_seqs + neg_seqs\n", " labels = np.array([1]*len(pos_seqs) + [0]*len(neg_seqs), dtype=np.int32)\n", "\n", " # shuffle\n", " perm = rng.permutation(len(seqs))\n", " seqs = [seqs[i] for i in perm]\n", " labels = labels[perm]\n", " return seqs, labels\n", "\n", "# Quick test\n", "seqs, labels = generate_synthetic_dataset(num_pos=10, num_neg=10)\n", "print('Example positive seq:', seqs[0], 'label', labels[0])\n" ] }, { "cell_type": "markdown", "id": "582a8c24", "metadata": {}, "source": [ "## 3. Prepare data for Keras\n", "\n", "One-hot encode sequences and split into train/val/test. By default we use an 80/10/10 split." ] }, { "cell_type": "code", "execution_count": 3, "id": "05bb037c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Shapes: (6400, 101, 4) (800, 101, 4) (800, 101, 4)\n", "Train positive fraction: 0.49453125\n" ] } ], "source": [ "# Prepare dataset\n", "\n", "SEQ_LEN = 101\n", "MOTIF = 'ACGTG'\n", "\n", "seqs, labels = generate_synthetic_dataset(num_pos=4000, num_neg=4000, seq_len=SEQ_LEN, motif=MOTIF, motif_prob=1.0)\n", "\n", "# Train/val/test split\n", "N = len(seqs)\n", "train_end = int(0.8*N)\n", "val_end = int(0.9*N)\n", "\n", "train_seqs = seqs[:train_end]\n", "train_y = labels[:train_end]\n", "val_seqs = seqs[train_end:val_end]\n", "val_y = labels[train_end:val_end]\n", "test_seqs = seqs[val_end:]\n", "test_y = labels[val_end:]\n", "\n", "X_train = one_hot_encode_seqs(train_seqs)\n", "X_val = one_hot_encode_seqs(val_seqs)\n", "X_test = one_hot_encode_seqs(test_seqs)\n", "\n", "print('Shapes:', X_train.shape, X_val.shape, X_test.shape)\n", "print('Train positive fraction:', np.mean(train_y))\n" ] }, { "cell_type": "markdown", "id": "26452f46", "metadata": {}, "source": [ "## 4. Model starter code (1D CNN)\n", "\n", "It is encouraged to experiment with architecture/hyperparameters. The code below implements a small model with Conv1D + GlobalMaxPooling + Dense output." ] }, { "cell_type": "code", "execution_count": 4, "id": "7764803d", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2026-03-16 13:07:54.642968: I metal_plugin/src/device/metal_device.cc:1154] Metal device set to: Apple M1\n", "2026-03-16 13:07:54.643000: I metal_plugin/src/device/metal_device.cc:296] systemMemory: 16.00 GB\n", "2026-03-16 13:07:54.643004: I metal_plugin/src/device/metal_device.cc:313] maxCacheSize: 5.33 GB\n", "2026-03-16 13:07:54.643037: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305] Could not identify NUMA node of platform GPU ID 0, defaulting to 0. Your kernel may not have been built with NUMA support.\n", "2026-03-16 13:07:54.643046: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 0 MB memory) -> physical PluggableDevice (device: 0, name: METAL, pci bus id: )\n" ] }, { "data": { "text/html": [ "
Model: \"functional\"\n",
       "
\n" ], "text/plain": [ "\u001b[1mModel: \"functional\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ input_layer (InputLayer)        │ (None, 101, 4)         │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ conv1d (Conv1D)                 │ (None, 97, 16)         │           336 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ global_max_pooling1d            │ (None, 16)             │             0 │\n",
       "│ (GlobalMaxPooling1D)            │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense (Dense)                   │ (None, 32)             │           544 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_1 (Dense)                 │ (None, 1)              │            33 │\n",
       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
       "
\n" ], "text/plain": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", "│ input_layer (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m101\u001b[0m, \u001b[38;5;34m4\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ conv1d (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m97\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m336\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ global_max_pooling1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "│ (\u001b[38;5;33mGlobalMaxPooling1D\u001b[0m) │ │ │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m544\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m33\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 913 (3.57 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m913\u001b[0m (3.57 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 913 (3.57 KB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m913\u001b[0m (3.57 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def build_deepbind_like_model(input_length, num_filters=16, kernel_size=11, lr=1e-3):\n", " inp = layers.Input(shape=(input_length, 4))\n", " x = layers.Conv1D(filters=num_filters, kernel_size=kernel_size, padding='valid', activation='relu')(inp)\n", " x = layers.GlobalMaxPooling1D()(x)\n", " x = layers.Dense(32, activation='relu')(x)\n", " out = layers.Dense(1, activation='sigmoid')(x)\n", " model = models.Model(inputs=inp, outputs=out)\n", " model.compile(optimizer=optimizers.Adam(lr), loss=losses.BinaryCrossentropy(), metrics=[])\n", " return model\n", "\n", "model = build_deepbind_like_model(SEQ_LEN, num_filters=16, kernel_size=len(MOTIF))\n", "model.summary()\n" ] }, { "cell_type": "markdown", "id": "2552e579-6dde-4bec-b2f4-ae2480a710cd", "metadata": {}, "source": [ "## Question \n", "1. Explain the number of parameters and hyper-parameters in your model. " ] }, { "cell_type": "markdown", "id": "8e90a54c", "metadata": {}, "source": [ "## 5. Training\n", "\n", "The training below is small and quick for homework. You are encouraged to run longer training for better performance and experimentation." ] }, { "cell_type": "code", "execution_count": 5, "id": "2b1ba8a8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-03-16 13:12:32.204019: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:117] Plugin optimizer for device_type GPU is enabled.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 11ms/step - loss: 0.6900 - val_loss: 0.6821\n", "Epoch 2/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 0.6821 - val_loss: 0.6689\n", "Epoch 3/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 10ms/step - loss: 0.6613 - val_loss: 0.6297\n", "Epoch 4/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 0.6187 - val_loss: 0.5682\n", "Epoch 5/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 0.5447 - val_loss: 0.4923\n", "Epoch 6/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 0.4765 - val_loss: 0.4326\n", "Epoch 7/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 0.4146 - val_loss: 0.4051\n", "Epoch 8/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 0.3919 - val_loss: 0.3862\n", "Epoch 9/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 0.3703 - val_loss: 0.3688\n", "Epoch 10/10\n", "\u001b[1m50/50\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - loss: 0.3574 - val_loss: 0.3569\n", "\u001b[1m25/25\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 2ms/step \n", "Test ROC AUC: 0.9047, PR AUC: 0.8651\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAg0AAAEpCAYAAAAQzREpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVr0lEQVR4nO3dB1yV1f8H8A97CQgyVVREBfdAxb3NlaOs1MqVo6zM8lemmfq3LNN+Wb/KMs09UjPTMnNkam7NvfdA2Sh7w/2/vufhIggo4EXW5/16PS99Lvee+1wyng/nfM85RjqdTgciIiKiRzB+1BOIiIiIBEMDERER5QlDAxEREeUJQwMRERHlCUMDERER5QlDAxEREeUJQwMRERHlCUMDERER5QlDAxEREeUJQwMRERHlCUMDUQmxZMkSGBkZ4d9//y3qSyGiMoqhgYiIiPKEoYGISpS0tDQkJCQU9WUQlUkMDUSlzPHjx9GjRw/Y2dmhXLly6Ny5Mw4ePJjlOcnJyZg+fTpq1qwJS0tLVKhQAW3atMH27dsznhMUFIThw4ejcuXKsLCwgLu7O/r27YsbN2488houXLiAF154Ac7OzrCysoK3tzcmT56c8fVhw4ahWrVq2V73f//3f2oIJjM5f/PNN7Fy5UrUrVtXXcvvv/8OR0dHdX0PioqKUp/p3XffzXgsMTER06ZNQ40aNdTrPTw8MGHCBPV4ZvL55ftQvnx59b2T6/7ggw8e+XmJygrTor4AIjKcs2fPom3btiowyE3RzMwMP/zwAzp06IDdu3fDz88v4+Y8c+ZMjBw5Es2bN1c3WqmVOHbsGLp27aqe079/f9Xe2LFj1Q0+JCRE3VRv3bqV4w1f79SpU+oa5L1Hjx6tnnv16lV1o//kk08K9Ln+/vtvrF27VoUHJycnFXaeeeYZrF+/Xn0+c3PzjOdu2LBBhYGBAwdm9Ez06dMHe/fuVddTu3ZtnD59Gl9++SUuXbqknq//3j399NNo0KABPvroIxUurly5gn379hXomolKJR0RlQiLFy/Wyf+yR44cyfU5/fr105mbm+uuXr2a8VhAQIDO1tZW165du4zHGjZsqOvVq1eu7dy7d0+91+eff57v65T3kfe7efNmlsfT0tIy/j506FBd1apVs7122rRp6n0zk3NjY2Pd2bNnszy+detW9bXff/89y+M9e/bUVa9ePeN8+fLl6vV79uzJ8rx58+ap1+/bt0+df/nll+o8NDQ035+ZqKzg8ARRKZGamopt27ahX79+qF69esbjMqzw4osvqt+0pUdBSPe7/GZ9+fLlHNuSIQX57X3Xrl24d+9enq8hNDQU//zzD1555RVUqVIly9ceHHbIj/bt26NOnTpZHuvUqZPqdVizZk3GY3Kt0hsyYMCAjMd+/vln1bvg4+ODsLCwjENeL3bu3JnxPREbN25UvRNElB1DA1EpITfsuLg4NQ7/ILlpyo3Q399fnUv3e0REBGrVqoX69evjvffeU8MKetI1P2vWLPz5559wdXVFu3btMHv2bFXn8DDXrl1Tf9arV8+gn83T0zPbY6ampmoIRW7y+toEGa6Qeo3MoUGCkQQkqa/IfMhnFzLsIuQ1rVu3VkM28plleEOGRBggiO5jaCAqgyQESJ3BokWL1A3+xx9/RJMmTdSfem+//bYa85faByksnDJligofUmj5uHLrdZDektx6PnIiN/bo6GgVboTc5KVHoWHDhhnPkZu+BCPpgcjpeP311zPeQ3pJ/vrrLwwePFiFKAkSUuOR23URlTlFPT5CRIapaUhJSdFZW1vrXnjhhWxfe+2119S4fmRkZI6vjY6O1jVu3FhXqVKlXN//0qVLqv2XXnop1+eEhISoaxw3btxDP8s777yjs7e3z/b44MGDc6xpeOONN3JsJzU1Vefu7q4bOHCgqkUwNTVVdREP1jjI58pcU5FXn3zyiXr/7du35/u1RKURexqISgkTExM89dRTqrs+87TI4OBgrFq1Sk0llFkVIjw8PMtrZXqhTEfUd/PLMMeDayF4eXnB1tY22zTFzKTbX3oxpAdDZllkpt3/77cVGRmZZUgkMDAQv/76a74+s7GxMZ577jk1M2P58uVISUnJMjQhZOrnnTt3sGDBgmyvj4+PR2xsrPr73bt3s329UaNG6s+HfWaissRIkkNRXwQR5W0ZaVmXYMyYMahYsWK2r48bN07dqGVapRT1Sbe7jPvLlES5aWaecilj9jIN09fXV613INMt58+fr6Y0fv311zhx4oRa30FuuFKAKO3IDV2689etW6dqCXJz8uRJFVCkLkKmOEo9goSYP/74Q7WrDy1Vq1ZV1/HWW2+pkPL999+r0CHTPjP/WJKhjDfeeAPffvttju8nUyLl/STQyPTOzEFEPzzRu3dvNYShr1uQ4QZZS0KGM7Zu3YqmTZuq4RgZnujVq5e6Nql1+O6779T7nzlzBvb29gX+b0dUahR1VwcR5W94IrfD399fPe/YsWO6bt266cqVK6eGEzp27Kjbv39/lrZmzJiha968ua58+fI6KysrnY+Pj+qKT0pKUl8PCwtTQwLyuI2NjRpK8PPz061duzZP13rmzBndM888o9q3tLTUeXt766ZMmZLlOdu2bdPVq1dPTRGVr69YsSLXKZe5DU8IGXbw8PBQz5PPlRP5XLNmzdLVrVtXZ2FhoXNwcND5+vrqpk+fnjFks2PHDl3fvn11FStWVNckfw4aNEgNyxCRhj0NRERElCesaSAiIqI8YWggIiKiPGFoICIiojxhaCAiIqI8YWggIiKiPGFoICIiojwxRQHMnTsXn3/+udq8RtZ4/+abb9C8efMcnysLyMiiMg/q2bOnWuxFyKzPadOmqRXbZBMdWXxFFnqpWbNmnq5HFm8JCAhQi7s8zk56REREZY1Op1N7uMiicbLK6qOenC+rV69WC58sWrRI7W8/atQotYBLcHBwjs8PDw/XBQYGZhyy6IuJiYlaqEbvs88+U4vHbNiwQXfy5Eldnz59dJ6enrr4+Pg8XZMsavOwRW948ODBgwcPHsjTAnEGXdxJlqFt1qxZxpKu8lu+h4cHxo4di4kTJz7y9V999RWmTp2q1pm3sbFRCUfSzX/+8x+8++676jmyJr0sLyvL5soudo8iz5dlc2XbX/3a+kRERPRoUVFR6j4uPf2PWi49X8MTSUlJOHr0KCZNmpTxmHRldOnSBQcOHMhTGwsXLlRBQAKDuH79uhrmkDb05KIlnEibOYUG2Twm8wYy0q0iJDAwNBAREeVfXob381UIGRYWpjZ6kV6AzORcbvyPcvjwYbXxy8iRIzMe078uP23OnDlTBQv9IQmJiIiIStHsCellqF+/fq5Fk3klPR0yJKE/ZFiCiIiIilFocHJygomJCYKDg7M8Ludubm4Pfa3sWb969WqMGDEiy+P61+WnTdlyVz8UwSEJIiKiJyNfNQ3m5ubw9fXFjh070K9fv4xCSDl/8803H/ran3/+WdUhvPzyy1ke9/T0VOFA2mjUqFFGUcahQ4cwZsyY/H8iIiIqNDJEnZycXNSXQflkZmamful/4us0jB8/HkOHDkXTpk3VMIPMhpBehOHDh6uvDxkyBJUqVVJ1Bw8OTUjQqFChQrbCi7fffhszZsxQ6zJIiJgyZYqaUaEPJkREVLRkppvUmUmFPZVMMstQfkl/nPWM8h0aBgwYgNDQUDVtUv4BSe/Ali1bMgoZb926lW1xiIsXL2Lv3r3Ytm1bjm1OmDBBBY/Ro0erf5Bt2rRRbVpaWhb0cxERkQHpA4OLiwusra25kF4JC3xxcXEICQlR5+7u7gVuK9/rNBRHMpwhsyikKNJQ9Q2378XhcnAMPBytUNnBGpZmj9+tQ0RUUockLl26pALDg73FVHKEh4er4FCrVq0sQxX5uYcWaBnpsmDnxVBM2XAm49zZ1gKVHazg4WCtgoT2p7V6rGJ5K5iZcBsPIiqd9DUM0sNAJZf+v5/89yxofQNDQy6szEzg42aL2/fiEZOYgtDoRHUcv5V9PM/YCHC3lx4JrVcic6iQv7vYWsJEnkREVIJxSKJkM8R/P4aGXDznW1kdMnoTGZ8M/7vx8L8Xp4Yt9H/3vyvn8UhMScOdiHh1HLp+N1tbZiZGqFTeKr1nQuudUIEi/c8KNub8n5GIiIo9hobcXN8DHPwORq51Ud6lDsq71kX9Ol6ASdZvmYSK0JhEFSRuZwoSWqiIR0BEPJJTdbgRHqeO3Ho1HgwSmcOFvZXZE/rQRESUm2rVqqnZfnIUZRtFiaEhN7cPAxc3a4eeiQXg7A241gVc6gCudWDkWg8u5VzVEIRvVYdszaSkpiEoKkELEnfj4H8vHrczBQv5WnxyKi6HxKgjJ3aWpumBIlMvRfoQiIQLK3MWaRIRPahDhw5qhp8sDWAIR44cydg3qaxiaMiNd0/AzAYIOQsEnwNCzgPJsUDQKe3IzMpRCxIZYaIu4OwDWJSDqYlxeq+BNVpUz151nJiSioCIhAd6KLRwcedeHMJikhCVkIKzAVHqyIlTOfP0Wgqtp0L+XsXRGk2qloe1Of8TExHlRnqLZXaIqemjf1Y6OzujrOMdJTcutbVDLy0NiLiRHiDOAcESJs4Cd68C8XeBG3u0IzMHzyy9EnCtBzhWB4zv9wxYmJrA08lGHTmJS0q530vxwNCH/BmdkKKChRwn/COyDXt08nFBz/ru6OjjzABBRGXGsGHDsHv3bnX873//y9hV+caNG+jYsSM2b96MDz/8EKdPn1ZrCMnGh7J44cGDB9W6QbVr11aLFGbegbnaA0MLUou2YMEC/PHHH9i6data2PCLL75Anz598nydsrbR2LFj1arIssZR9+7d8c0332SsfXTy5En1fv/++696P1kE8YcfflALLN68eVOtxizrIMku1HJ9n3/+OXr27InCwrtIXsmCVXLDl6P20/cfT44HQi9qAUIfJuTPmGDg3nXtuLDp/vNNLbUhDpf0ngkJE/L3ci7yLzDb28qNvparrTpyohVp3i/QVH/ei8fFoGhVmPnH6UB1MEAQkaF/Q5eh1SdNfpblpXBcgoKsLVGvXj189NFHGT0FEhrExIkT8d///hfVq1eHg4OD2vhQbraffPKJ2t9o2bJl6N27t1qcsEqVKrm+z/Tp0zF79mx1s5ab/UsvvaRu5o6Ojo+8RtmGoW/fvihXrpwKNykpKXjjjTfUIoq7du1Sz5H2GjdujO+//15Nkzxx4oRaElrIcyUs/PPPP2rY5Ny5c6qtwsQ7x+MyswIqNtKOzGLDsgYJOUIvAMlxQOBJ7cjMukJ6r0SmIOHiA5g/fPxMiiTtK9mjXiX7bP9Dn7kTlR4aAlSgyBIgaruglwQIbxfWRBBRvklgqDN16xN/33MfdcvTLz2yWJHslyRrE+S0+aEEia5du2acy02+YcOGGecff/wxfv31V/z2228P3Vtp2LBhGDRokPr7p59+iq+//hqHDx9WPQaPIr0L0tMhPSDS0yEkrNStW1fVTzRr1kz1RLz33nvw8fFRX5eeBj35Wv/+/dXu0UICUGFjaCgsNk5A9fbakXmIQ3oeMgcJ+fvda0BcOHD9H+3IYAQ4et6vk9CHCnks0xBHTiSJ169sr473u3urALHpdAA2nw7UAsSpQHUwQBBRWSTd+5nFxMTg//7v/9RQQ2BgoPqtPz4+Xt2YH6ZBgwYZf5ff9mVFRf1yzY9y/vx5FRb0gUHUqVNH7REhX5PQIEMmI0eOxPLly9VQyfPPPw8vLy/13Lfeektt7CjDK/I1CRCZr6cwMDQ86SGOCl7aUbv3/ceT4rReCBUmpGYiPVDEhmqBQo4sQxxWWi9ERq9Eer1EOedHBoiJ3X1w+k6k1utwKlDVSDwYIJ6u744ODBBE9BDy80J+6y+K9zWEB2dBvPvuu9i+fbsasqhRowasrKzw3HPPqe7/hzFLHyrI/PNWhh0MRYLMiy++qMLMn3/+iWnTpmH16tV45plnVJjo1q2b+poEB6nBkJoKqZEoLAwNxYG5NVCpiXZkFhN6f/aG6pWQ4wKQEg8EHNeOzGycM/VK1AN8egJWDtn+QTeoXF4dGQFCQsPprAHC2lyrgZAeCAYIInqQ/Cwp7rVRMjwhMyPyYt++fWqoQW7G+p4Hff1DYaldu7aqpZBD39sgdQmyMZj0OOjJXhFyvPPOO2ooZPHixRnXKa977bXX1DFp0iRVmMnQUFZJz0G5DkD1DvcfS0sF7l7PNBVUP4vjutYzcX23doit9kDrcYDfaznWRmQJED18cOp2pBq+0AeITacC1aEPEE830AIEN+8iopJAZhMcOnRI3fylQPBhxYlSK7B+/XpV/Cg/G6dMmWLQHoOcyJCC1CNIsaOsJSFDIq+//jrat2+vhk9keETqGaTHw9PTE7dv31a1DjIMIWRWRY8ePVSguHfvHnbu3KmCSGFiaChppJbBqYZ21Ol7//GkWG2IQ98rcW2ndr7jI+DgPKDde4DvMMDUPMdm5X+Shh7l1ZE5QEhokFkYmQNE59qu6FXfjQGCiIo1GXIYOnSo+q1dbsBScJibOXPm4JVXXkGrVq3g5OSE999/X+3+WJiMjIywceNG1TPQrl27LFMuhcyWkJ0phwwZguDgYHVdzz77rJqxIaQXRWZQSJiQWgp57Zdfflm418ytsUsp6ZE48wuw8xPgXnoXW/kqQIcPgAYvPLKQUk/+eZzU90CkBwg9BgiisiEhIUHdcOW3XUtLy6K+HDLwf8f83EMZGkq7lCTg+HJg92wgJkh7TFar7PQh4PN0jmtDFCRA2KQHCFkHooO3MwMEUSnC0FA6JDA0aBga8kBmaByeD+z9EkhIXzmyYhOg81TAq2O+m5N/NrICpQSIzaeDGCCISjGGhtIhgaFBw9CQDwmRwP5vgAPfaXtpCM92QOdpQOWs85YNGSB6NXBH+1oMEEQlEUND6ZDA0KBhaCgAmc655wvg34VAavo8ZO9e2rCFrP1QQPoAIcMXEiICIhOyBIgudbQeCAYIopKDoaF0SGBo0DA0PIaIW8DuWcCJVYBOphcZaYWSHSZpK08+hrQ0HU7cjsDmHAJEOQtTdE5fibIdAwRRscbQUDokGCA0GBfkjefOnavmv8qb+vn5qXW2H0YWqpBpIe7u7mojEJlTKjuMZV7xSqaeZD7062xTIZMZFX3nAq8fSp/CqQNOrQG+bQr88R8gOr14sgCMjY3QpIoDPny6Dva+3wnrX2+FEW08UdHeEjGJKdh4IgCjlx9F0xl/4e3Vx7HtbBASimADHCIiKqR1GtasWaPWwp43b54KDLIghSxjKTuBubi4ZHu+LMEpm4LI19atW6e2DpUdwGRt7cxkg46//vrr/oXlYW9zMiDnWsALy7RVJnd8DFzdARz5ETi+EvB7VVskyvrRu7Y9KkDIMblnbRzPqIEIRGBkAjacCFCH9EB0qe2CMR1qwNst5509iYioaOR7eEKCgmyi8e2336pzWTFLlrGUxSlkq9EHSbiQLUMvXLiQbY3uzD0NGzZsUFt+FgSHJwrBjb3AX9OB2+m9SBayuuRYwG8MYGG4rVdlCON4eg3En2e0ACHMTIwwtlNNjOngBTOTAnWIEZGBcHiidEh40sMT0mtw9OhRtfRlRgPGxur8wIEDOb5GthVt2bKlGp5wdXVVe5vL9qEPrgd++fJlVKxYUW3tKUtqPmpnMSpk1doAI7YBg9Zo+1gkRgJ/zwC+bqStMJmSaJC3kR4I36oOmNq7Dva93wm/jGmpehqSU3WYs/0S+n67D2cDIg3yXkRE9HjyFRrCwsLUzV5u/pnJeVBQzmPf165dU8MS8jqpY5D1vGUXrhkzZmTpvViyZAm2bNmC77//XiWhtm3bIjo6Osc2ExMTVTLKfFAhkIWfvLsDr+4B+i8EHDy1/S22vA9801QbupCVJw1ECxCOWDCkKf43sBHKW5vhXGCUCg5ztl1EUkrhrgNPRPQgqd+TYfjcDBs2DP369UNZUej9vjJ8IfUM8+fPh6+vLwYMGIDJkyerYQs92XBD9giXfcClPkLChRRPrl27Nsc2ZftP6UrRH5n3IqdC2tK7/nPAm0eAp78CbN2ByFvAxteB71oC5zbKXEuDvZ0UwvZtVAnb32mPHvXckJKmw9d/X0Hvb/bi1O30hamIiKh4hwbZLEM20JCNMzKTczc3txxfIzMmZLaEvE5PduGSnonc9imXIkl5zZUrV3L8umz/KWMv+kO2FaUnwMQMaDoceOs40PVjbdvtsIvA2iHA/A7AlR0GDQ/Othb4/mVfzH2xCSrYmONicDT6zd2Hz/68wFkWRETFPTTI3uTSW7Bjx44sPQlyLnULOWndurW6+WfeYvTSpUsqTEh7OZF9zK9evaqekxOZtinFGpkPeoLMrIDWbwHjTgLt3wfMywGBJ4AVzwJLewP+D5+Cm1+ymuS2d9qhd8OKSNMB83ZfRa+v9+DozXsGfR8iKj2kd1vq5B7c3rpv375qN0sh9xk5lyF22Tpbivwzz+IriMTERLz11luqh12KDdu0aaO2s9aTLaylbs/Z2RlWVlZqS+7Fixerr8kv0m+++aa698lrq1atqnrWS/TwhEy3XLBgAZYuXYrz589jzJgxiI2NxfDhw9XXZQtP6QnQk6/fvXsX48aNU2Hhjz/+UIWQUhiZefvS3bt3qz3P9+/fj2eeeUb1TAwaNMhQn5MKg6U90PEDLTy0eAMwsQBu7AEWdgVWDdS26DaQCuUs8M2gxvhhsC+cylngamgsnpu3HzM2nUN8EnsdiJ446VVMin3yRx57M2XIW7aV3rlzZ8Zjci+S2jm5aet/Qe3Zs6f6xff48eNqa+nevXs/ViH+hAkT8Msvv6h75LFjx1CjRg017C7vLaSu79y5c/jzzz/VPVTq+KQXX3z99ddq8oAMzcsyBitXrlQ1FcVJvhdDkJqE0NBQTJ06VQ0xNGrUSP1H0BdHyjdbZlToSb3B1q1b8c4776iaBVmnQQKE7FWuJ3uBS0CQ/8CSviSZHTx4UP2dSgAbJ6D7p0DL14FdnwEnVgKX/gQubQHqPw90lNUlqxvkrbrVdYOfpyM++v0c1h+/gx/3Xsdf54Mx+7mGaO5Z8HUkiCifkuOATys++ff9IAAwt3nk0xwcHFS93KpVq9C5c2f1mBTlyw26Y0dtk76GDRuqQ+/jjz/Gr7/+qm7c8ht/fsXGxqoQIIX98t5Cfsnevn07Fi5ciPfee0/dIxs3boymTbW9fjKHAvma9DzIPVBqu6Snobgp0ApK8s3M7Ru6a9eubI/J0IWEgNysXr26IJdBxY19ZaDvt9pCUDs/Ac7+CpxeC5xdDzQZArSbANjlPOSUH+WtzTFnQCM83dAdk9afxo3wOAyYfwBDW1bDhO7esDbnwmBEBNWjMGrUKHz33XdqWFt+cx84cGDGL7bS0yDrBEkPeGBgIFJSUhAfH1/gnoarV68iOTlZDcvryfpEzZs3V70K+t73/v37q16Ip556Ss28aNWqVcZMDFkM0dvbW/V6PP300+o5xQl/upLhOdUEnl8CtH5bW9vhynbg30Xa/hbNRwNt3nms1SX1Ovm4Yts7jvj0j/NY868/luy/gR0XgjGrfwO08tK6+4iokJhZa7/1F8X75pEMNcj6hRIKpF5hz549+PLLL7MMjUsvwH//+181jCA1Bs8991yuRfqGID0QsiqyzBKU95ZeEBmul2to0qSJWnJAhi6ktuKFF15Q6yBJD0lxwaX2qPBUbAS8vA4Y/ifg0QJISQD2fw38ryGwezaQGPPYb2FvZYZZzzXAsleao1J5K/jfjceLCw5h8q+n1f4WRFSI67jIMMGTPuR980iKCZ999lnVw/DTTz+p3+Dlxqy3b98+9du91NHVr19fzQKU2rqC8vLyUgX+0q6e9DxIIWSdOvd3D5ah96FDh2LFihVqDQgp2tSTwn4pA5BhDdm2Qeoj9PUQxQF7GqjwVW0FvLIFuLwd2PEREHxaG7449APQ7l3Adzhg9nhL08pOmVvebqumY648dEsduy6GYuaz9dXXiKjsDlFIN//Zs2fx8ssvZ/ma1A+sX79e9UhIDYEUKT442yI/bGxs1PCD1C44OjqiSpUqmD17NuLi4jBixAj1HKkHlFmIst+SzLTYtGmTWoZAzJkzR82ckJoHGUL5+eefVZB5cK+mosSeBnoy5LeDWk8Br/6jrS4phZFxYcCWicA3vsCx5UDq4/UM2Fqa4ZNn6mPVSD94OFrhTkQ8hiw6jAnrTiIyPtlgH4WISo5OnTqpG7jMRnjxxRezfE1u0lIwKTUFEhxklkPmnoiC+Oyzz1TNwuDBg1VbsuSATAaQ9xHSEyEzDGViQLt27dRMQX1dn62trQoZUiQpwynS6yHDGJknF5S4DauKI25YVQKlJmuzLHbNAqLTx0Ur1AQ6TQZq99VWoXwMsYkp+HzrRVXnINzsLPHps/VUHQQR5Q83rCodEp70hlVEBl1d0neYtrrkU58AVo5A+GXg52HAgg7AnWOP1byNhSn+r09drH21JTydbBAUlYBXlvyL8WtOICKu8IqciIhKM4YGKlpSy9DqTW2BqA6TAHNbIPAksLgHcOrnx25e1m7Y/FZbjGrrCWMjqLUdun75D7aezXmDNSIiyh1DAxUPlnZAh4nAuBNAre7aTIv1I4G/psta5Y/VtJW5CSb3qoN1Y1rBy9kGodGJeHX5UYz96TjuxrLXgYgorxgaqPitLjlwlbbGg9g7B1j9IpCY8zbp+dGkigP+eKstxnTwgomxEX4/GYCuc3bjj1OBj3/dRERlAEMDFT/GJkDX6cCzC7T9LGRJ6h+7AnevP3bTlmYmeL+7D359vRW8XW0RHpuEN1Ydw5gVR1UPBBER5Y6hgYqvBi9oC0OVcwNCzwMLOgHX9xim6crl8fvYNnirc02YGhvhzzNB6Prlbmw4fketIEdE2T3OGgZUOv77ccolFX9RAdoQRcBxwNgU6DELaDbSYM2fDYjEez+fwrnAKHXepbaLWu/B1Y5Ty4j0N5vLly+rNQVkNUNZa0AWQ6KSQW7zsjS2bDaZmpqqFrXKvPZDfu6hDA1UMiTHA7+NBU6nz6ho+grQY7Y2ddMQzaemYd6uq/j678tITtXBztIUU56ug+d8K/OHIxGgbjqyqZOsbkglk7W1tVpxUkJfZgwNVDrJP9W9X2pLUUMHVGsLPL8UsKlgsLe4GBSN99adxKnbkeq8g7czPn2mPiqWtzLYexCVVHK7kJ0g5bdVKlmkl8jU1DTHX4IYGqh0u/gn8MtIICkGKF8VGLQacL2/GczjSklNw4I91/HlX5eQlJKGchammNyrNgY282CvAxGVOlwRkko37x7AyL8Ah2pAxE1gYVfgwmaDNW9qYqymZcqiUI2rlFe7ZU5afxqDFx6G/112zRJR2cXQQCWTS21g1E5tiEJ6HKRQcs8X2hCGgdRwKYd1r7XCh71qw9LMGHuvhKHbV/9g2YEbSEsr8R10RET5xuEJKvkbX8lOmUd+1M7rPQf0/RYwM2wNwvWwWLy/7hQO39D2tffzdMTs5xqgagUbg74PEdGTxuEJKjtk9kSvL4Bec7TpmGfWaftWyDRNA5JNr1aPboHpferC2twEh67fVb0OC/deRyp7HYiojGBPA5UesvDT2iFA/F1tQShZjrqyr8HfRuoa3v/lFPZfDVfnvlUdVK+Dl3M5g78XEVFhY08DlU2ebYFRfwMudYCYIK3H4eQag7+Nh6M1Vo70wyfP1FMzK47evIee/9uDH3ZfZa8DEZVqBQoNc+fORbVq1WBpaQk/Pz8cPnz4oc+PiIjAG2+8oRaVsLCwQK1atbB58+bHapMoR46ewIhtgHdPIDUR+HU0sG0KkGbYeeUy9fIlv6rY+k47tK3phMSUNMz88wKe/X4/boVzhgURlU75Dg1r1qzB+PHjMW3aNBw7dgwNGzZEt27dEBISkusqYl27dsWNGzewbt06XLx4EQsWLEClSpUK3CbRQ1nYAgNWAm3/o53v/xr4aRCQoC0TbUiVylth2SvNMbt/A9hamuKkfwQGzD+Am+GxBn8vIqISV9MgvQDNmjXDt99+m7EmuYeHB8aOHYuJEydme/68efPw+eef48KFCzAzMzNImw9iTQPl6vQ6YOMbQEoC4OQNDPoJqOBVKG8VGBmv1nK4EhKDivaWWD26JapUsC6U9yIiKvY1DdJrcPToUXTp0uV+A8bG6vzAgQM5vua3335Dy5Yt1fCEq6sr6tWrh08//TRjGdKCtJmYmKg+ZOaDKEf1nwOGbwZs3YGwi9pOmdd2FcpbudtbYdUoP3g52yAgMgGDFhzkYlBEVKrkKzSEhYWpm73c/DOT86CgoBxfc+3aNTUsIa+TOoYpU6bgiy++wIwZMwrc5syZM1Uq0h/SK0GUq0q+wOhdQKWmQEIEsPxZ4NB8gy4Epedia4mfRrVAdWcb3ImIx8D5DA5EVHoU+uwJGWpwcXHB/Pnz4evriwEDBmDy5Mlq2KKgJk2apLpR9Ie/v79Br5lKIVs3YNgfQIOBgC4V+PM9YNPbQEqSwd/Kxc4SqyU4ON0PDrfvMTgQURkLDU5OTmqnrODg4CyPy7mbm1uOr5EZEzJbQl6nV7t2bdWLIEMTBWlTZmDIuEvmg+iRzCyBZ+YBXWWXTCPg6BJgeT8gNqxQgsNPo1uoRaH0wUH+JCIqM6FB9uCW3oIdO3Zk6UmQc6lbyEnr1q1x5coV9Ty9S5cuZezpXZA2iQpMdqlsPQ54cS1gYQfc3Acs6AgEnTH4W7lKcBjVAtUqWOP2PQkOBxDA4EBEZWl4QqZGypTJpUuX4vz58xgzZgxiY2MxfPhw9fUhQ4ao4QM9+frdu3cxbtw4FRb++OMPVQgphZF5bZPI4Go9lb5TpicQcQtY+BRwfpPB38bNXutxqFrBGv53tR4HmWVBRFQSmeb3BVKTEBoaiqlTp6ohhkaNGmHLli0ZhYy3bt1Ssx/0pEhx69ateOedd9CgQQO1PoMEiPfffz/PbRIVCmdvbQXJn4cB13cDa14COn4ItHtX65Ew4KwK6XGQwHDrbpz6c83olipQEBGVJNx7gkh2ytw6GTj8g3Ze9xmg73eAuWHXWNBqGw6oHgcZspB1HBgciKioce8JovzulNlzNtD7f9pOmWd/BRZ3ByJvG3z1SOlxqOxghRvhcWodh+CoBIO+BxFRYWJoINLzHQYM+Q2wrgAEngTmdwT8DbsHSmUH6WHQgsP1sFgMmn8QIQwORFRCMDQQZVatNTBqJ+BSF4gNAZb0Ak6sMnhwkB4H6Xm4FhaLgQsOIiSawYGIij+GBqIHOVTVdsr0eRpITQI2jNFqHgy4U6Zsry09DrJHxbVQrcchNDrRYO0TERUGhgainFiUA15YDrSboJ0f+BZY9QKQEGng4NAS7vaWuBoaixcXMDgQUfHG0ECUG5k63Gky8NxiwNQKuPIXsKAzEH7VYG8hu2BKj4ObnSUuh8So4BAWw+BARMUTQwPRo9R7FnhlC2BXCQi/rK0gefVvgzVftYJNtuAQzuBARMUQQwNRXlRspBVIVm6uDVGs6A8c/N5gO2VWc7JRK0e62lngUnAMXvrxEIMDERU7DA1EeWXrCgzbBDR8EdClAVsmAr+NBVIMc3OXza1kVoWLrQUuBEWr4HA31vC7cBIRFRRDA1F+mFoA/b4DnvoEMDIGji8HlvYBYkIN0nx153Kqx8E5U3C4x+BARMUEQwNRfsm+FK3evL9Tpv9Brc4h8JRBmveS4DCqBZzKWeB8YJQKDhFxDA5EVPQYGogKqmZXYOQOwNELiPQHFnUDzm00SNM1XMph9Wg/OJUzxzkGByIqJhgaiB6Hcy1g1A6gekcgOQ5YOwQ4MNcgTddwsVU9DhVszHE2IAovLzyEyLhkg7RNRFQQDA1Ej8vKAXhpHeA3Rjvf+gFwcJ5Bmq7paqtqHCQ4nLmTHhziGRyIqGgwNBAZgokp0H0m0PZd7XzL+8DhBQZpuparLVaNagFHG3OcvhOJIQwORFREGBqIDFkg2elDoPU47Xzzu8C/iw3StLebBAc/OFib4eTtSAxZdBhRCQwORPRkMTQQGTo4dJkOtHxTO9/0NnBsuUGa9nGzw8qRLbTg4B+BIQsPI5rBgYieIIYGosIIDk/NAPxe085lASgDba9dp6IdVoz0Q3lrM5yQ4LCIwYGInhyGBqLCCg7dPwOajQSgAza8DpxcY5Cm61a0x4oRfrC3MsPxWxEYuugwYhJTDNI2EdHDMDQQFWZw6PE54Ds8PTi8BpxeZ5Cm61Wyx8qRWnA4disCwxgciKi4hoa5c+eiWrVqsLS0hJ+fHw4fPpzrc5csWQIjI6Msh7wus2HDhmV7Tvfu3QtyaUTFb3vtXnOAxoO1/SrWjwbO/mqw4CA9DnaWpvj35j0MX3wYsQwORFScQsOaNWswfvx4TJs2DceOHUPDhg3RrVs3hISE5PoaOzs7BAYGZhw3b97M9hwJCZmf89NPP+X/0xAV1+DQ+2ug0UuALhX4ZSRw/neDNF2/sr2qcbC1NMWRGxIcjjA4EFHxCQ1z5szBqFGjMHz4cNSpUwfz5s2DtbU1Fi1alOtrpOfAzc0t43B1dc32HAsLiyzPcXBwyP+nISrOwaHPN0CDAUBaCvDzMODCZoM03aByedXjYGthisM37uKVJUcQl8TgQERFHBqSkpJw9OhRdOnS5X4Dxsbq/MCBA7m+LiYmBlWrVoWHhwf69u2Ls2fPZnvOrl274OLiAm9vb4wZMwbh4eG5tpeYmIioqKgsB1GxZ2wC9PseqNdfCw6y5PSlrQZpuqFHeSwb0VwFh0PXteAQn5RqkLaJiAoUGsLCwpCampqtp0DOg4KCcnyNhADphdi4cSNWrFiBtLQ0tGrVCrdv384yNLFs2TLs2LEDs2bNwu7du9GjRw/1XjmZOXMm7O3tMw4JI0QlJjg8Mx+o0w9ISwbWvAxc+csgTTeu4oClI5qjnIUpDl5jcCAiwzPS6XS6vD45ICAAlSpVwv79+9GyZcuMxydMmKBu9IcOHXpkG8nJyahduzYGDRqEjz/+OMfnXLt2DV5eXvjrr7/QuXPnHHsa5NCTngYJDpGRkap+gqjYS01OH6LYBJhYAC+uAbw6GqTpozfvZUzDbOVVAQuHNoOVuYlB2iai0kfuofILeF7uofnqaXBycoKJiQmCg4OzPC7nUoeQF2ZmZmjcuDGuXLmS63OqV6+u3iu350j9g3ywzAdRiWJiBjy3GPDuCaQmAj8NBK7tNkjTvlUdsPSVZrAxN8H+q+EYtexfJCSzx4GIHl++QoO5uTl8fX3VMIKeDDfIeeaeh4eRIYfTp0/D3d091+fI0IXUNDzsOUQlnqk58PwSoGY3ICVBCw439hmkad+qjlj6SnNYm5tg75UwBgciKprZEzLdcsGCBVi6dCnOnz+vihZjY2PVbAoxZMgQTJo0KeP5H330EbZt26aGHGSK5ssvv6ymXI4cOTKjSPK9997DwYMHcePGDRVApFiyRo0aaionUalmagG8sAyo0QVIjgNWPg/cOmiQpptWc8SS4Vpw2HM5DKOXH2VwIKInGxoGDBiA//73v5g6dSoaNWqEEydOYMuWLRnFkbdu3VLrLOjdu3dPTdGUOoaePXuqsROpiZDpmkKGO06dOoU+ffqgVq1aGDFihOrN2LNnjxqGICr1zCyBASuA6h2B5FhgRX/AP/cF0/KjuacjFg9rBiszE/xzKRSvMjgQ0ZMqhCwNRRxExVZSHPDTAOD6P4CFHTB4A1DZ1yBNH7wWrhZ+ik9ORUdvZ8wb7AsLUxZHEhEKrxCSiAqRuTUwaDVQtTWQGAUsfwYIOG6QpltUr4CFw5rC0swYOy+GYsyKY0hMYY8DEeUPQwNRcWJuA7y4FvBoASRGAsv6AYEnDdJ0Ky8nLBraTAWHvy+E4HUGByLKJ4YGouLGohzw8jqgcnMgIQJY1hcIOmOQplvVcFLrNliYGmPHhRC8sfI4klLSDNI2EZV+DA1ExZGFrRYcKvkC8feAZX2A4HMGabp1puDw1/lgvLHqGIMDEeUJQwNRcWVpD7y8HnBvBMSFa8Eh9KJBmm5T0wkLhjSFuakxtp8LxtifjiE5lcGBiB6OoYGoOLMqDwz+FXBrAMSGAkt7A2GXDdJ0u1rOGcFh69lgjF11nMGBiB6KoYGouLN2BIZsBFzrATHBwJKngfCrBmm6fS1n/DDYF+YmxthyNghvcqiCiB6CoYGoJAUH59pATJAWHO5eM0jTHb1dMoKD9Di8vpKzKogoZwwNRCWFjRMw9DfAyRuIDgCW9Abu3TBI0x19XLBgqDZUIcWRr3HlSCLKAUMDUUlSzgUY+jtQoSYQdVurcYjwN9hQhX4dB1kAintVENGDGBqIShpbVy04OHoBEbeApU8DkXcMNqti8bDmGXtVjFz6L+KTGByISMPQQFQS2blrwcGhmjZEIcEh6v5GcY+jpVeFLNtqv7LkCOKSUgzSNhGVbAwNRCWVfSVg6CagfBWtKFKCQ3SQwXbHXD6iOcpZmOLAtXAMW3QEMYkMDkRlHUMDUUlW3kMLDvYeQPgVYGkfICbEIE37VtWCg62FKQ7fuIuhiw4jOiHZIG0TUcnE0EBU0jlU1YYq7CoBYRe14BAbZpCmG1dxwMpRfrCzNMXRm/cweOFhRMYzOBCVVQwNRKWBo6cWHGzdgdDz6cEh3CBNN6hcHqtGtUB5azOc8I/A4IWHEBnH4EBUFjE0EJUWFby04FDOFQg5CyzvC8TdNUjT9SrZY9XIFnC0Mcep25F48ceDuBebZJC2iajkYGggKk2camrBwcYZCDoNLH8GiI8wSNN1Ktrhp1Et4FTOHGcDojBowUGExyQapG0iKhkYGohKG2dvLThYVwACTwArngUSIg3StLebLVaPbgFnWwtcCIpWwSE0msGBqKxgaCAqjVxqA0N+A6wcgTtHgRX9gYQogzRdw0ULDq52FrgUHKOCQ0hUgkHaJqJSGBrmzp2LatWqwdLSEn5+fjh8+HCuz12yZAmMjIyyHPK6zHQ6HaZOnQp3d3dYWVmhS5cuuHzZMNv/EpVZbvW0Ta4sywO3jwArnwcSYwzStJdzOawZ3RLu9pa4EhKDgfMPIiiSwYGotMt3aFizZg3Gjx+PadOm4dixY2jYsCG6deuGkJDc54bb2dkhMDAw47h582aWr8+ePRtff/015s2bh0OHDsHGxka1mZDAH0JEj8W9QXpwsAf8DwKrXgCSYg3SdDUnGxUcKpW3wrWwWAycfwABEfEGaZuISklomDNnDkaNGoXhw4ejTp066kZvbW2NRYsW5foa6V1wc3PLOFxdXbP0Mnz11Vf48MMP0bdvXzRo0ADLli1DQEAANmzYUPBPRkSaio2Awb8CFnbAzX3AqgFAUpxBmq5SwVoNVXg4WuFGeBwGzD+A2/cM0zYRlfDQkJSUhKNHj6rhg4wGjI3V+YEDB3J9XUxMDKpWrQoPDw8VDM6ePZvxtevXryMoKChLm/b29mrY42FtElE+VPIFXl4PmNsCN/YAqwcByYbpFfBwlODQElUrWMP/bjwG/HAQ/ncZHIhQ1kNDWFgYUlNTs/QUCDmXG39OvL29VS/Exo0bsWLFCqSlpaFVq1a4ffu2+rr+dflpMzExEVFRUVkOInoEj2bAy+sAMxvg2i5gzctAsmGGAGWIQoYqPJ1scCdCgsMB3AgzzDAIEZWh2RMtW7bEkCFD0KhRI7Rv3x7r16+Hs7MzfvjhhwK3OXPmTNUboT+kB4OI8qBKC+ClnwEza+DKX8DaIUCKYaZMutlbYs3oFvBytkFAZIIqjrwWapjCSyIqgaHByckJJiYmCA4OzvK4nEutQl6YmZmhcePGuHLlijrXvy4/bU6aNAmRkZEZh7+/f34+BlHZVq018OJawNQKuLwV+HkYkGKY1R1d7CzVUEVNl3IIitKCg8yuIKIyGBrMzc3h6+uLHTt2ZDwmww1yLj0KeSHDG6dPn1bTK4Wnp6cKB5nblOEGmUWRW5sWFhZqRkbmg4jywbMt8OJqwNQSuLgZWDccSDXMfhKy8JMUR/q42SIkOlHNqrgUHG2QtomohA1PyHTLBQsWYOnSpTh//jzGjBmD2NhYNZtCyFCE9AToffTRR9i2bRuuXbumpmi+/PLLasrlyJEjM2ZWvP3225gxYwZ+++03FSikjYoVK6Jfv36G/KxElFn1DsDAVYCJBXBhE/DLCCA1xSBNVyhnoTa5quNuh7CYJNXjcD6QtUdEJZ1pfl8wYMAAhIaGqsWYpFBRahW2bNmSUch469YtNaNC7969e2qKpjzXwcFB9VTs379fTdfUmzBhggoeo0ePRkREBNq0aaPafHARKCIysBqdgQErgDUvAec2AgnPAc8tAqwdH7tp2dxq1Sg/tZ326TuReHHBQawY6Ye6Fe0NculE9OQZ6WShhBJOhjOkIFLqGzhUQVQAl9JrG5LjgPJVtR4IWVHSACLjkzFk0WGc9I+AvZUZVozwQ/3KDA5EJfEeyr0niAio1Q0YsR1wqAZE3AQWdgVOrzNI0xIUlo9ojiZVyqsAIdtqn/A3zM6bRPRkMTQQkUZ6FkbtBLw6aT0OUuOwbYpB6hzsLM2wbIQfmlVzQHRCCgb/eAhHb94zyGUT0ZPD0EBE90ktw0vrgNZva+f7vwZW9gfi7j520+UsTLFkeHP4eToiOjEFQxYewpEbj98uET05DA1ElJWxCdB1OvDcYm0RKFk9cn4HIOj0YzdtY2GKxcOboZVXBcQmpWLoosM4eC3cIJdNRIWPoYGIclbvWWDkX/frHH40TJ2DtbkpFg1rhrY1nRCXlIphiw9j35Uwg1wyERUuhgYiyp1r3fQ6h85ASnx6ncOHj13nYGlmggVDmqKDtzMSktPwypIj+OdSqMEum4gKB0MDEeWhzuFnoM147Xz/N8CKZx+7zkGCww+DfdGltgsSU9Iwctm/2HkhxDDXTESFgqGBiPJW59BlGvD8Um2XzOu7gfntgcBTj9WshakJvnvJF0/VcUVSShpeXX4Uf53Lug8NERUfDA1ElHd1+6XXOXgCEbeAhU8Bp35+rCbNTY0x96Um6FnfDUmpaRiz8ii2nAky2CUTkeEwNBBR/rjWAUbvBGp00eoc1o8Etk5+rDoHMxNjfD2wMXo3rIjkVB3eXHUMm08HGvSyiejxMTQQUf5ZOWjba+vrHA58q9U5xBZ8+qSpiTG+fKEh+jWqiJQ0Hcb+dBy/nwww3DUT0WNjaCAiA9Y5dAACTz5WcPjihUZ4zrcyUtN0GLf6OH49ftugl01EBcfQQESPX+cwagfgWB2IlDqHbo9V52BibITZ/RtgYDMPpOmA8WtPYt1RBgei4oChgYgen0ttYNTfQI2u9+sctnxQ4DoHY2MjfPpMfbzkVwWyD+97605izZFbBr9sIsofhgYiMmCdwxqg7bva+cG5wPJ+QGxYgYPDjH71MLRlVRUc3v/lNFYeumnYayaifGFoICLD1jl0ngK8sFyrc7ixR6tzCDhRoOaMjIzwf33q4pXWnup88q9nsOzADQNfNBHlFUMDERlenT6Z6hz8gUXdgJNrChwcpjxdG6+2q67Op248i4V7rxv4gokoLxgaiKgQ6xx2AjWfAlISgF9HA1smFajOQYLDxB4+eL2Dlzr/eNM5zP/naiFcNBE9DEMDERUeq/LAoDVAu/e084PfFbjOQYLDe9288Vbnmur8080XMHfnFUNfMRE9BEMDERUuY2Og04danYN5uceqc5DgML5rLbzTpZY6/3zrRXy943IhXDQR5YShgYieXJ3DSKlz8MpU57C6QE2N61JT9TqIOdsvqUMnUyyIqPiFhrlz56JatWqwtLSEn58fDh8+nKfXrV69Wv2m0K9fvyyPDxs2TD2e+ejevXtBLo2IijMXH209h5rd0uscXgX+nAikJue7qTc61sCkHj7q79LbIMtOh8UkFsJFE1GBQ8OaNWswfvx4TJs2DceOHUPDhg3RrVs3hISEPPR1N27cwLvvvou2bdvm+HUJCYGBgRnHTz/9lN9LI6ISU+ewGmg3QTs/9D2wrB8QE5rvpl5t74VpvevA2AjYdCoQXebsVstOs9eBqJiEhjlz5mDUqFEYPnw46tSpg3nz5sHa2hqLFi3K9TWpqal46aWXMH36dFSvrk2bepCFhQXc3NwyDgcHh/xeGhGVqDqHycCAlVqdw8296XUOx/Pd1PDWntj4RhvUdrdDRFwy3llzEsOXHMGdiPhCuXSisixfoSEpKQlHjx5Fly5d7jdgbKzODxw4kOvrPvroI7i4uGDEiBG5PmfXrl3qOd7e3hgzZgzCw3PfLS8xMRFRUVFZDiIqgWo/rQ1XVKgBRN3W9q04kf9exvqV7fHbm61VnYO5iTF2XQzFU3N2q4Wg0mQDCyJ68qEhLCxM9Rq4urpmeVzOg4KCcnzN3r17sXDhQixYsCDXdmVoYtmyZdixYwdmzZqF3bt3o0ePHuq9cjJz5kzY29tnHB4eHvn5GERUnDh7a8GhVncgNRHY8BqweUK+6xzMTIxVncPmcW3RtKoDYpNS1UJQL/xwAFdCYgrt8onKkkKdPREdHY3BgwerwODk5JTr8wYOHIg+ffqgfv36qkhy06ZNOHLkiOp9yMmkSZMQGRmZcfj7+xfipyCiQmdpDwz8CWj/vnZ++AdgWd8C1TnUcCmHta+2xEd968LG3AT/3ryHnv/bo9Z0SE5NM/y1E5Uh+QoNcuM3MTFBcHBwlsflXOoQHnT16lVVANm7d2+YmpqqQ3oUfvvtN/V3+XpOpO5B3uvKlSu51j/Y2dllOYioFNQ5dPwgvc7BFri5D5jfHrhzrABNGWFIy2rYNr49Ong7Iyk1Ta3p0OfbfTh9O7JQLp+oLMhXaDA3N4evr68aRtBLS0tT5y1btsz2fB8fH5w+fRonTpzIOKRHoWPHjurvuQ0r3L59W9U0uLu7F+QzEVGJr3PYAVSoCUTdARZ1B06sKlBTlcpbYfGwZvhyQEM4WJvhfGAU+s7di5mbzyM+KefhTyLKnZEun3OTZMrl0KFD8cMPP6B58+b46quvsHbtWly4cEHVNgwZMgSVKlVSdQc5kTUZIiIisGHDBnUeExOjZlX0799f9VZI78OECRPU0IYEDulVeBQphJTaBhmqYK8DUSmREAmsfxW49Kd23nw00O1TwMSsQM3JGg7Tfz+H308GqPNqFawx89kGaOlVwZBXTVTi5Ocemu+ahgEDBuC///0vpk6dikaNGqkegy1btmQUR966dUuts5BXMtxx6tQp1QNRq1YtNcNCejP27NmTp8BARKW5zmEV0GGSdn54PrC0DxDz8DVhcuNUzgLfDGqMH4c0hZudJW6Ex2HQgoOYtP40ohLyv7gUUVmU756G4og9DUSl3IXNwPrRQFI0YFcJGLAcqORb4OYkJHz25wWsOnRLnbvaWWBGv/roWifrzDCisiAqH/dQhgYiKhlCLwGrXwTCLwMmFsDTXwKNX3qsJg9eC8fEX06pXgfxdAN3/F+fuqpXgqisiCrM4QkioiLhXEtbz8G7p7aew8bXgT/eLdC+FXotqlfAlrfb4dX21WFibJSxFPX6Y1yKmign7GkgopIlLQ3453Ng16faeZVWwAtLgXIuj9WsTMWc8MspNcNCtK/ljE+eqYfKDtaGuGqiYovDE0RU+l38U6tzSIwCbCsC7d4F6j0LWBV83xpZ/Gn+P9fwvx2XkZSSBmtzE7zf3QeDW1RVaz8QlUYMDURUNoRd1uocwi5p5ybmgHcPoOEgoEaXAk/PlGWnpdZBVpMUvlUdMKt/fdRwsTXk1RMVCwwNRFR2JEYDR5cCJ38Cgs/cf9zaCaj/PNBoEODWADDKX0+BbHS18tBNNctC9rGQjbDGdqqB1zp4qX0uiEoLhgYiKpuCTgMnVwOn1gKxmdZzcKkDNBwI1H8BsMvfSrOyxfbkX0+rnTOFj5stZj/XAA0qlzf01RMVCYYGIirbUlOAq38DJ1dpazzIbAthZAxU76gNX/j0AszzVuQoPyY3ngjA9N/P4l5cMqS8YVTb6ni7Sy1YmZsU7mchKmQMDUREevERwNlftR4I/4P3H5dNser2BRq+CFRpqW2Y9Qjh6UtR/5a+FHVVtRR1fbTyyn0XX6LijqGBiCgn4VeBU2u0+ocIbTVIpXwVrfehwQCggtcjm/nrXDA+3HAGQVEJ6nxQcw9M7FEb9lYFK7wkKkoMDUREj1rr4dYBLTyc3aAtT63n4acFiLrPAFblH7oU9aw/L2All6KmEo6hgYgor5LigIubtQAhdRC6NO1xWarap6cWILw6AyamuS5FLZteXQ+LVee9ZCnq3nXhbMulqKlkYGggIiqIqEDg9M9agAg5d/9xG2dt5oXMwHBvkO1lCcmp+Oqvy1iw5xpS03Qob22GKb3q4NkmlWCUz6meRE8aQwMR0eOQH4tBp4ATP2khIi7s/tdc692fvmmbdSjizJ1ITFh3CufSl6JuV8sZn3IpairmGBqIiAxFNsS6skObvilLV6cm3Z++KcMWsniUbKJlZpXrUtQTunljSMtqXIqaiiWGBiKiwhB/DzizXhu+uH3k/uMWdkDdfunTN1uo1SevhmpLUR+5waWoqXhjaCAiKmxhV4BTq7X1HyL97z/uUC1j+mZa+WpYefgWPtt8PstS1K+294K5KZeipuKBoYGI6ElO37y5T+t9OLcRSIq5/zXZtrvhQARU7o7Jm29iZ6alqGf1b4CGHlyKmooeQwMRUVFIigXOb9ICxLVdUlGpPW5qCZ1PLxy07YqxB8sjLD5NLUU9sm11vMOlqKmIMTQQERW1yDvA6bXaDIywixkPp9m4YJdFB8wKbIKLuiqo4miNIS2rqvUd3O21Ykqi4noPLdCg2ty5c1GtWjVYWlrCz88Phw8fztPrVq9ereYs9+vXL8vjklumTp0Kd3d3WFlZoUuXLrh8+XJBLo2IqHiwrwS0eQd44xAwaifQ/FXAyhHGsSHodHcttlpMxFaryega+TN+2vwXWs7cgefn7cfS/TcQEq0tT01U3OS7p2HNmjUYMmQI5s2bpwLDV199hZ9//hkXL16Ei4tLrq+7ceMG2rRpg+rVq8PR0REbNmzI+NqsWbMwc+ZMLF26FJ6enpgyZQpOnz6Nc+fOqWDyKOxpIKISISUJuLJdG764uAVIS874UqjOHgfTauNAWl0c0tWBS9W6eLpRRfSo5w5HG/MivWwq3aIKc3hCgkKzZs3w7bffqvO0tDR4eHhg7NixmDhxYo6vSU1NRbt27fDKK69gz549iIiIyAgN8vYVK1bEf/7zH7z77rvqMblwV1dXLFmyBAMHDjToByYiKhbi7gJnfgHO/wb4HwZSsvYuBOkccCCtDg7r6iDZow2aN2mCbnXdYW/NTbHIsPJzD815MfVcJCUl4ejRo5g0aVLGY8bGxmo44cCBA7m+7qOPPlK9ECNGjFChIbPr168jKChItaEnFy/hRNrMS2ggIipxrB2B5qO0IzkBuPMvcH0PcGMvdP6H4ZZ2D8+Y7MMz2AcELsCdTRWw4/c6iHBugUpNuqKVbxPYWjJA0JOVr9AQFhameg2kFyAzOb9w4UKOr9m7dy8WLlyIEydO5Ph1CQz6Nh5sU/+1ByUmJqojc0oiIiqxzCyBam20Q7qAk+O13ocbe5BweRfMgo6jEsLxrNEeIHwPsP1z+G9zxik7X1jX6gCflj1h5VS1qD8FlQH5Cg35FR0djcGDB2PBggVwcnIyWLtS/zB9+nSDtUdEVKzIktTV26vDstOH2lRO/0O4e2YHEq7shmv0WXgYhcIjegtwVI6JCDWriITKreHaoCvMvdoBdu5F/SmorIcGufGbmJggODg4y+Ny7ubmlu35V69eVQWQvXv3znhMaiDUG5uaquJJ/eukDZk9kbnNRo0a5XgdMjwyfvz4LD0NUldBRFQqmdsAXp3g6NVJneoSonDz5E4EndgOu+CDqJV6Bc7JAcD1n7UDQKytJyxrtodJ9XZAtbZAudwL1YkKJTSYm5vD19cXO3bsyJg2KSFAzt98881sz/fx8VGzIDL78MMPVQ/E//73P3WjNzMzU8FB2tCHBAkBhw4dwpgxY3K8DgsLC3UQEZVFRpZ2qOrXVx1STH72uj/OHtiC1Gt7UD/5FOoa3YRN9HXgmBxL1Gt0Tj4w8pQhkLbaYVOhqD8GlYXhCfkNf+jQoWjatCmaN2+uplzGxsZi+PDh6usyHbNSpUpqCEGmS9arVy/L68uX15ZNzfz422+/jRkzZqBmzZoZUy5lRsWD6zkQEVFWsvZNvepVUK/6aKSljcJx/3uYffQiws7uRO3EU2hpfA51jG/CKOwCIMeRH7UXutQFPCVAtAGqttYKM4kMHRoGDBiA0NBQtRiTFCpK78CWLVsyChlv3bqlZlTkx4QJE1TwGD16tJqOKes5SJt5WaOBiIg0svW2b1VH+FZtidR+LXDkxl2sOhWA/acuo2bCSRUg5PA2vg2EnNWOQ/MkegBu9YBq7dJDRCvAivtiUHZcRpqIqJRLSU3DwWt3selUALacDYJJXBj8jM+rANHW9Dyq4U7WFxgZA24N0nsi2mnbfVvyZ2tpxb0niIgoR8mpadh7JQy/nwzA9rPBiE5MgTMi0ML4HLpYXUJbs/NwTMi01bcwMgEqNtJqISRIeLQALMoV1UcgA2NoICKiR0pITsU/l0Kx6VQg/jofjLikVPW4K+6it/1V9LG/Cp+EEzCPupX1hcamQMUmWoCo0hKo3IzDGSUYQwMREeVLfFIqdl4MUUMYO86HIDFFmx4vWjnFY6j7LbQ0OQ+7wINA5AMhQmoiXOpowxhyePgB5atIleYT/xyUfwwNRERUYLGJKarnQXogdl8MRVLq/QBR290Og2qmoZftFVQIOwLcOgjcu569EduKQBU/bShDgoRrPcCkUNcTpAJiaCAiIoOISkjGtrMSIAKw93IYUtLu3zLqVbJD82oV4OeSDF+ji6hw9ziM/A8BgSeBtJSsDZmXAyo3TQ8RftqQhoXtk/9AlA1DAxERGdy92CRsPRukeiD2Xw1DpvygOJUzR8PK5dG0oiXaWN9EzcQzsAw8ou2jkRiVfYaG9D5ITYS+R8K+0hP9PKRhaCAiokIVFpOoiihP+Eeo43xgFJJTs95OpKTBy7kcGle2RXuHcDTBRbhFHoexhIhsdRGyxXEVLUCouogWgEttwNjkyX2oMiqKoYGIiJ70TIyzAVEZIeKE/z34343P9jxLM2PUr2SPtq5JaGNxFbWSzsIm6AiMgs8Auvu1E4qFHeDR/H5dRCVfwNz6yX2oMiKKoYGIiIpDb8TJjBChHdEJD9Q6AHC2tYBfJXN0tfNHE90FuEefhOmdf4Hk2OxTPWXRqcxDGrbaasRUcAwNRERU7KSl6XAtLDajJ0L+vBAYnaW4Uj+s4e1shR7OYWhtflXVRtiFHoVRdGD2Rh08M031bAE41ZL1tJ/chyoFGBqIiKjEDGucuROpAsRxCRO3InAnIvuwhpWZMTq5JaCb7Q00xEVUjDoBM9mACw/cwqwctHUi5JAeiYqNATPuY/QwDA1ERFRihUYnZumNOOUfqZa7fpCXbQr6Ot1Ba7MrqJF4FnbhJ2GU8kDgMDEH3Btl7Y3gtuBZMDQQEVGpGta4Ghqj9USk90ZcDI5G6gPDGuZGKeheIRRP2V5Hw7QLcI86CdP40OwNVqip9US4+ABO3oBzLW3mRhkd1ohiaCAiotIsLikFZ+5EZfRGSJAIiEx44Fk61DYPQ2/HW2glvREJZ1Au+mrODZpaAU41AWfv+0FC/nSsDpiaozSLYmggIqKyJiQqIUtvxKnbEYhN34RLrzyi0bXcDXSwvY0axnfgnnQL5WJvwjgtOedGZYdPCQ4qTNS6/6ccpWSnT4YGIiIq82T44kpITEZvxPFbEbgUHJ1tJUsTpKKKUQialwtFE+sQeJsEonKqPxxir8Mk5YFpn5nZVb7fI5Hxpzdg44SShKGBiIgol824Tt+JVDM2robG4mpIjKqXCI9NyuHZOrjhLhpYBqtAUdcsCFV1t1Eh/gYsEsNzfxMrxwd6JtJDhYSMYlg3wdBARESUz301JDzIIb0TKlCExsD/bly2nglhjxjUNg1Ec9tQNLAIRnXcgWvSTdjE3UGuzGwApxr3eyT0gcLREzAxQ1FhaCAiIjLQOhI3wmO1IBGiBQn5+7WwGCQkp2VfJhuJ8DIKRFObEDS2DkEt4wBUTPGHXdyt3OsmZKVLR6+sQxyqbqImYG5T6J+RoYGIiKiQp4HeiYhP751IDxXy95CchzpMkaLqJupbBKGpTShqmwahSpo/HONvwDQlLvc3kqmgOdVNWDsa7LMwNBARERXhUMe1sPvDHPpAkfNQhw7uuAsf0wA0swlFPYtgeOpuwyXxJiyS7ub+Jt0/A1qMeeL3UNOCvMHcuXPx+eefIygoCA0bNsQ333yD5s2b5/jc9evX49NPP8WVK1eQnJyMmjVr4j//+Q8GDx6c8Zxhw4Zh6dKlWV7XrVs3bNmypSCXR0REVGQcbMzha+MI36qOOQ51ZB7m0HoqTLAzuQJ2RiLb9NAaRnfgaxOKRpbBqGEcoE0RTQhAjHVlFMWEz3yHhjVr1mD8+PGYN28e/Pz88NVXX6kb/MWLF+Hi4pLt+Y6Ojpg8eTJ8fHxgbm6OTZs2Yfjw4eq58jq97t27Y/HixRnnFhYWj/O5iIiIihVLMxP4uNmp48GhjoDI+Cy9EqpuItQc/8bY4t8YHyDm/vOtkICJ92pi6JP/CPkfnpCg0KxZM3z77bfqPC0tDR4eHhg7diwmTpyYpzaaNGmCXr164eOPP87oaYiIiMCGDRsK8hk4PEFERKVSRFz6rI6QWFxJr5mQ84/71UPbms7Fe3giKSkJR48exaRJkzIeMzY2RpcuXXDgwIFHvl7yyd9//616JWbNmpXla7t27VK9Dw4ODujUqRNmzJiBChVy3lQkMTFRHZk/MBERUWlT3tpcDXM8ONRRVPIVGsLCwpCamgpXV9csj8v5hQuyRWnOJL1UqlRJ3ehNTEzw3XffoWvXrlmGJp599ll4enri6tWr+OCDD9CjRw8VROT5D5o5cyamT5+en0snIiKix1SgQsj8srW1xYkTJxATE4MdO3aomojq1aujQ4cO6usDBw7MeG79+vXRoEEDeHl5qd6Hzp07Z2tPejqkjcw9DTJEQkRERMUkNDg5Oanf/IODg7M8Ludubm65vk6GMGrUqKH+3qhRI5w/f171FuhDw4MkUMh7yYyLnEKDFEmyUJKIiOjJytci2DL7wdfXV/UW6EkhpJy3bNkyz+3IazLXJDzo9u3bCA8Ph7u7e34uj4iIiIrT8IQMCwwdOhRNmzZVazPIlMvY2Fg1jVIMGTJE1S9IT4KQP+W5MtwgQWHz5s1Yvnw5vv/+e/V1GbKQ+oT+/fur3gqpaZgwYYLqmcg8JZOIiIhKWGgYMGAAQkNDMXXqVLW4kww3yCJM+uLIW7duqeEIPQkUr7/+uuo9sLKyUus1rFixQrUjZLjj1KlTanEnmXZZsWJFPPXUU2o6JocgiIiIig8uI01ERFSGRRX2MtLFjT73cL0GIiKi/NHfO/PSh1AqQkN0dLT6k9MuiYiICn4vlR6HUj88IbMxAgIC1HoQRkZGBmtXv/6Dv78/hz2eIH7fnzx+z4sGv+9Fg9/3rCQGSGCQmsLMNYmltqdBPmTlypULrX35R8V/WE8ev+9PHr/nRYPf96LB7/t9j+phKNA6DURERFR2MTQQERFRnjA0PISsEzFt2jSuF/GE8fv+5PF7XjT4fS8a/L4XXKkohCQiIqLCx54GIiIiyhOGBiIiIsoThgYiIiLKE4YGIiIiyhOGhlzMnTsX1apVg6WlJfz8/HD48OGivqRSTbZQb9asmVrV08XFBf369cPFixeL+rLKnM8++0ytqvr2228X9aWUenfu3MHLL7+MChUqqB2A69evj3///beoL6tUS01NxZQpU+Dp6am+515eXmpHZc4HyDuGhhysWbMG48ePV1Nyjh07hoYNG6Jbt24ICQkp6ksrtXbv3o033ngDBw8exPbt25GcnKy2SJet1enJOHLkCH744Qc0aNCgqC+l1Lt37x5at24NMzMz/Pnnnzh37hy++OILODg4FPWllWqzZs3C999/j2+//Rbnz59X57Nnz8Y333xT1JdWYnDKZQ6kZ0F+65V/WPq9LWSd8rFjx2LixIlFfXllQmhoqOpxkDDRrl27or6cUi8mJgZNmjTBd999hxkzZqBRo0b46quvivqySi35ObJv3z7s2bOnqC+lTHn66afh6uqKhQsXZjzWv39/1euwYsWKIr22koI9DQ9ISkrC0aNH0aVLlyx7W8j5gQMHivTayhLZ1104OjoW9aWUCdLL06tXryz/7qnw/Pbbb2jatCmef/55FY4bN26MBQsWFPVllXqtWrXCjh07cOnSJXV+8uRJ7N27Fz169CjqSysxSsWGVYYUFhamxr0kjWYm5xcuXCiy6ypLpGdHxtSl+7ZevXpFfTml3urVq9UwnAxP0JNx7do11U0uw6AffPCB+t6/9dZbMDc3x9ChQ4v68kp1D4/scOnj4wMTExP1s/6TTz7BSy+9VNSXVmIwNFCx/K33zJkz6jcAKlyyNfC4ceNUHYkU/dKTC8bS0/Dpp5+qc+lpkH/z8+bNY2goRGvXrsXKlSuxatUq1K1bFydOnFC/oMiW0Py+5w1DwwOcnJxUAg0ODs7yuJy7ubkV2XWVFW+++SY2bdqEf/75p1C3OyeNDMVJga/UM+jJb1/y/ZeansTERPX/AxmWu7s76tSpk+Wx2rVr45dffimyayoL3nvvPdXbMHDgQHUuM1Zu3rypZm8xNOQNaxoeIN2Dvr6+atwr828Fct6yZcsivbbSTOpxJTD8+uuv+Pvvv9WUKCp8nTt3xunTp9VvXPpDfgOW7lr5OwND4ZChtwenFMs4e9WqVYvsmsqCuLg4VaOWmfwbl5/xlDfsaciBjDNK6pQfns2bN1dV5DL1b/jw4UV9aaV6SEK6DDdu3KjWaggKClKP29vbq8pmKhzyvX6wbsTGxkatHcB6ksLzzjvvqKI8GZ544YUX1Dow8+fPVwcVnt69e6sahipVqqjhiePHj2POnDl45ZVXivrSSg6ZcknZffPNN7oqVarozM3Ndc2bN9cdPHiwqC+pVJN/ijkdixcvLupLK3Pat2+vGzduXFFfRqn3+++/6+rVq6ezsLDQ+fj46ObPn1/Ul1TqRUVFqX/b8rPd0tJSV716dd3kyZN1iYmJRX1pJQbXaSAiIqI8YU0DERER5QlDAxEREeUJQwMRERHlCUMDERER5QlDAxEREeUJQwMRERHlCUMDERER5QlDAxEREeUJQwMRERHlCUMDERER5QlDAxEREeUJQwMREREhL/4frYeCRX8RHCQAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "EPOCHS = 10\n", "BATCH_SIZE = 128\n", "\n", "es = callbacks.EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)\n", "\n", "history = model.fit(X_train, train_y, validation_data=(X_val, val_y), epochs=EPOCHS, batch_size=BATCH_SIZE, callbacks=[es])\n", "\n", "# Evaluate on test set\n", "preds = model.predict(X_test).ravel()\n", "roc = roc_auc_score(test_y, preds)\n", "precision, recall, _ = precision_recall_curve(test_y, preds)\n", "pr_auc = auc(recall, precision)\n", "print(f'Test ROC AUC: {roc:.4f}, PR AUC: {pr_auc:.4f}')\n", "\n", "# Plot training curves\n", "plt.figure(figsize=(6,3))\n", "plt.plot(history.history['loss'], label='train loss')\n", "plt.plot(history.history['val_loss'], label='val loss')\n", "plt.legend()\n", "plt.title('Loss curves')\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "00cbb623", "metadata": {}, "source": [ "## 6. Motif extraction from convolutional filters\n", "\n", "We will extract high-activating k-mers for each filter and build PWMs. The code below finds top activating windows (by scanning each sequence), collects the k-mers, and computes a position frequency matrix." ] }, { "cell_type": "code", "execution_count": 8, "id": "4764fd04", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m200/200\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 1ms/step\n", "Conv output shape (train): (6400, 97, 16)\n", "Filter 0, top kmers (first 10): ['AGCTG', 'AGCTG', 'AGCTG', 'AGCTG', 'AGCTG', 'AGCTG', 'AGCTG', 'AGCTG', 'AGCTG', 'AGCTG']\n", "Filter 1, top kmers (first 10): ['AGGCC', 'AGGCC', 'AGGCC', 'AGGCC', 'AGGCC', 'AGGCC', 'AGGCC', 'AGGCC', 'AGGCC', 'AGGCC']\n", "Filter 2, top kmers (first 10): ['TTAAT', 'TTAAT', 'TTAAT', 'TTAAT', 'TTAAT', 'TTAAT', 'TTAAT', 'TTAAT', 'TTAAT', 'TTAAT']\n", "Filter 3, top kmers (first 10): ['AACGT', 'AACGT', 'AACGT', 'AACGT', 'AACGT', 'AACGT', 'AACGT', 'AACGT', 'AACGT', 'AACGT']\n" ] } ], "source": [ "import heapq\n", "from collections import Counter\n", "\n", "def get_conv_layer_output(model, X, layer_index=1):\n", " # Return activations from conv layer for input X (no pooling)\n", " conv_model = models.Model(inputs=model.input, outputs=model.layers[layer_index].output)\n", " return conv_model.predict(X)\n", "\n", "conv_out_train = get_conv_layer_output(model, X_train, layer_index=1)\n", "print('Conv output shape (train):', conv_out_train.shape)\n", "\n", "# For each filter, find windows with top activations across the dataset\n", "KERNEL = model.layers[1].kernel_size[0]\n", "NUM_TOP = max(50, int(0.01 * X_train.shape[0])) # top 1% or at least 50\n", "\n", "# We'll scan convolution outputs (before pooling) and record the positions\n", "\n", "filter_kmers = {f: [] for f in range(conv_out_train.shape[-1])}\n", "\n", "for i in range(X_train.shape[0]):\n", " # conv_out_train[i] shape: (L_out, num_filters)\n", " for f in range(conv_out_train.shape[-1]):\n", " # find the max activation position for filter f in this sequence\n", " # we'll collect top-N across sequences later\n", " pass\n", "\n", "# More systematic approach: for each filter, keep a heap of top activations with (score, seq_index, pos)\n", "heaps = {f: [] for f in range(conv_out_train.shape[-1])}\n", "\n", "for i in range(X_train.shape[0]):\n", " # conv_out_train[i] has shape (L_out, num_filters)\n", " arr = conv_out_train[i] # numpy array\n", " L_out = arr.shape[0]\n", " for pos in range(L_out):\n", " for f in range(arr.shape[1]):\n", " score = arr[pos, f]\n", " heap = heaps[f]\n", " if len(heap) < NUM_TOP:\n", " heapq.heappush(heap, (score, i, pos))\n", " else:\n", " if score > heap[0][0]:\n", " heapq.heapreplace(heap, (score, i, pos))\n", "\n", "# Extract k-mers\n", "for f, heap in heaps.items():\n", " top = sorted(heap, reverse=True)\n", " kmers = []\n", " for (score, i, pos) in top:\n", " # map pos in conv output to original sequence coordinate\n", " # For 'valid' conv, pos corresponds to start index in original sequence\n", " start = pos\n", " kmer = train_seqs[i][start:start+KERNEL]\n", " kmers.append(kmer)\n", " filter_kmers[f] = kmers\n", "\n", "# Quick check for filter 0\n", "for f in range(min(4, len(filter_kmers))):\n", " print(f'Filter {f}, top kmers (first 10):', filter_kmers[f][:10])\n" ] }, { "cell_type": "markdown", "id": "9b7ddaa2", "metadata": {}, "source": [ "## 7. Build PWMs and plot simple sequence logos\n", "\n", "(You may use logomaker or create simple barplots. Below is a simple PWM builder and a rudimentary logo via matplotlib.)" ] }, { "cell_type": "code", "execution_count": 12, "id": "5c189b3e", "metadata": {}, "outputs": [], "source": [ "def build_pwm(kmers):\n", " k = len(kmers[0])\n", " pfm = np.zeros((k,4), dtype=float)\n", " for s in kmers:\n", " for i,ch in enumerate(s):\n", " pfm[i,_base_to_idx[ch]] += 1\n", " # add pseudocount\n", " pfm += 1e-6\n", " pwm = pfm / pfm.sum(axis=1, keepdims=True)\n", " return pwm" ] }, { "cell_type": "code", "execution_count": 10, "id": "a1afa9e4-2c5d-47d3-9499-39513cde2581", "metadata": {}, "outputs": [], "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "def plot_pwm_heatmap(pwm, title=\"PWM Heatmap\"):\n", " \n", " df = pd.DataFrame(pwm, columns=BASES)\n", "\n", " plt.figure(figsize=(max(6, pwm.shape[0]/2), 3))\n", " \n", " sns.heatmap(\n", " df.T, # transpose for nicer layout\n", " cmap=\"viridis\",\n", " vmin=0,\n", " vmax=1,\n", " cbar=True\n", " )\n", "\n", " plt.xlabel(\"Position\")\n", " plt.ylabel(\"Base\")\n", " plt.title(title)\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 13, "id": "4a7e4bf3-7762-407f-bb48-52337a38dfc2", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfUAAAE8CAYAAADZryhtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAoWElEQVR4nO3dCbyMdf//8c+cg4NEJLuQNbKUnZS6LWWJu01aLJVQtKhfOZItRSk3D+tNibqJUtEdkZTcQsrJdheF3ErWFNmZuf6Pz7f/TGeYw3VOM+bM93o9H4/rcc5cc8013zP3rfd8d5/jOI4AAICElxTvAgAAgOgg1AEAsAShDgCAJQh1AAAsQagDAGAJQh0AAEsQ6gAAWIJQBwDAEoQ6AACWINSB02zbtk18Pp9MnTo1dG7QoEHmHABkZ4Q6PEfDWgM60tG3b1/X93n++edlzpw5cr69//77ctVVV0nu3Lnl0ksvlYEDB8qpU6fO+bolS5aE/a05c+aUyy67TDp16iRbt2411+zZs8c898gjj5zxej2nz+n7nU7vofc7cuSIedylSxdzbf78+eXo0aNnXP/999+HyvHSSy9l8ZMAcLocZ5wBPGLIkCFSrly5sHNXXHGFlClTxgSRhtS5Qv3WW2+V9u3by/ny4Ycfmvdr2rSpjBkzRtavXy9Dhw41YTxhwgRX93j44Yelbt26cvLkSUlLS5NJkybJvHnzzL1KlCghFStWlGXLlp3xus8//1xy5MhhfkZ67sorr5S8efOGzum1GvL//ve/5fbbbw+7fvr06eZLybFjx7L0OQCIjFCHZ914441Sp06diM9p4MSDhlyuXLkkKSlyI9oTTzwhNWrUkI8++siEptLasH7B0Jp0lSpVzvkeTZo0MV9GVNeuXaVSpUom6KdNmyapqaly9dVXy+uvvy6HDh2SfPnymesOHz4sa9euNeGsLQV+v1+Sk5PNczt37jQ1/Xbt2oW9T0pKijRu3FjefPPNM0J9xowZ0rp1a3nnnXey+EkBiITmd8BFn/rp9HkNOg3CYDOyNjkH7dixQ+69914pWrSoCbdq1arJlClTIjaHz5w5U/r37y8lS5Y0Nd2DBw9GfM9vvvnGHA888EAo0NWDDz4outni7Nmzs/T3Xn/99ebnDz/8YH5qqGtor1y5MnTNF198YZr49UuFhv2aNWtCzwVr7vq60915552mdeG3334Lnfvyyy9N87s+ByC6qKnDsw4cOCD79u0LO1e4cGFXr33jjTfk/vvvl3r16pmQVeXLlzc/d+/eLQ0aNDCB3atXL7nkkktMsN13330msB999NGwez377LOmdq6Befz4cfN7JF9//bX5eXrrgjaZlypVKvR8Zm3ZssX8vPjii8PCWZvgmzVrFgpurdFrE7u+lz6uXbt26Ln0r0vv5ptvlh49esi7775rvuQEa+naoqDjAgBEF6EOzwoGVnpa43Xj7rvvNmGlA8309/SefvppU9PVPupgUOq1HTt2NKPou3fvLnny5Alrcv/qq6/CzkWizdyqePHiZzyn537++WdXZf/999/NlxntU9cvAsEBcLfccot5XsO7SJEiYf3qGtzalK4aNWpkntMme6W/az+8vuZ0F154obRp08YEuYZ6IBAwLRM9e/Z0VVYAmUOow7PGjRtnAiya9EuB9hNrH7L+nr4loGXLlibQdHBaMCBV586dzxnoKjiKXJvzI40ByKjZ/nTBGnOQtiRoN0L6FgAt36JFi8yXEw18bYoPjlLX51544QXzuw6E06b4e+65J8P302b22267TXbt2iUbNmwwP2l6B2KDUIdnadN5RgPlsmrv3r2m/1hHlOsRiY5UT+/0EfgZCQa/NtGfTmv7br4YqAEDBpjBcjrQTbsbLr/88rA++mBT+nvvvWcCW2cBaFdF+pq6tgro2APth9e+9khN70GtWrUyNfZZs2aZ++nI+woVKpjXA4guQh2IIm1eVtokrzXwSHT0enpuwzjY7K7N8KVLlw57Ts/plxQ3qlevHrHrIb30/erax1+oUKHQyPpatWqZAX36XPrBdRnRlgXtW9fWAB0lr10QAGKDUAeyKNIKc9qUrbVSbbY+V3Bmloap0v739AGuteaffvopNGAvGnQQWzC4NZQbNmwY+nu1Vq+1be1n11DXvvRzdWNoc7uO/tepenfccUfUygkgHFPagCy64IILwqZqKW3S1gFn2q+u/ceRmuezSqfFaW1Zm/X1S0OQLjqjgRucex4NGtz169c3wa2HNrmnp4+XLl1q+trTjw/IyHXXXWdG+Y8dO1aKFSsWtXICCEdNHcgindL18ccfy8iRI820Mu0b1yAcPny4fPrpp+b3bt26SdWqVWX//v1mgJxer79n1YgRI+Smm26SFi1amBqvfnHQoNTp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v+yyyzJsitcatdbQz9Ykr++tXw50j3p9H/X666+bFgDte69bt24o/LWPXvfYVvfcc4957XPPPRf1zwRAbFBTB2JEa7taw86dO7cJc60Zay09R44cUr9+/dB1F198sVSuXFm+/fZb8/jhhx+WoUOHSuPGjWXgwIGybt26v1QOva+GeTDQVdWqVc0Au+B7Km12Dwa6Kl68uNmXHEDiINSBGLnuuutkzZo1pr/86NGjMm3aNFOrPpf777/fNI9rTVlr2HXq1JExY8bEvLw6iC89LavW3gEkDkIdiBEd5KZT2S699FJTO1eXX365mdb2xRdfhK775ZdfZNOmTab2HKS16h49esi7774rjz/+uEyePDnDJni/33/Wcuh7/vjjj+YI+uabb8xgu/TvCSDxEerAeVSxYkUzaK1bt26ybNkyWbt2rdx9991SsmRJc149+uijpv9d+8DT0tLk008/NcEciTaZHzp0yPR979u3T44cOXLGNTrqXvvn77rrLnO/VatWmdH31157rWkFAGAPQh04z3Tueu3ataVNmzbSsGFDM5BOp6wFm7+15q0j4DXIda57pUqVZPz48RHvpYPttEav/fU6N/3FF1884xptRp87d66ZInfNNdeYkNfBd7NmzYr53wrg/PI5+l8UAACQ8KipAwBgCUIdAABLEOoAAFiCUAcAwBKEOgAAliDUAQCwBKEOAIAlCHUAACxBqAMAYAlCHQAASxDqAACIHf4f6Yjf8Lru2QQAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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v2j3oA7a1f70IG1d1P+udByQ7q2u/4YhftCnns223gPORce1aqBrU/LSpUulXLlysS5S3ND/72lI4X9uueUW002hLRrBQ3cUe/DBB83vBHr8oaYe46338L/Rt1u3bk17/PPPP5t/VHQA2BVXXBHTsmW3JnfdxWnevHlmrrru/KQKFiwoefLkiXXxso3+/fvLbbfdZv7b+fPPP81ntmzZMlm0aFGsi5at6H9DZ47HyJcvn1x22WWM04hThHqMt97DX3Qu8c033xzyZUjpF6Lp06fHsGTZb1EV1bhx45Dzb7/9tnTq1ClGpcp+tElZ96revXu3+cKjc6810Js1axbrogFRxTx1AAAsQZ86AACWINQBALAEoQ4AgCUIdQAALEGoAwBgCUIdAABLEOoAAFiCUAcAwBKEOhBHdKlTn88nBw8ePOd1ZcuWNUsSA/AWQh2IAl2yVcNXj+BuYcOGDZPTp09f0H0bNmyYtvSp0iV0L7nkkrOu0x3JHnvssQt6LwDxh7XfgSi59dZbzZrsujPYggULzGYsOXPmNJuNZJV+QXCzbW+RIkWy/B4A4hc1dSBKkpKSTACXKVNGevToIU2bNpVPPvlE/vjjD7PZSKFChSRv3rxmN7H//Oc/aa/773//K61btzbP645ZVatWNV8Kzmx+1991t79Dhw6ltQoMGTIkbPP7jh07pE2bNpI/f34pUKCA3HfffbJ379605/V1utnQO++8Y16rLQH333+/2eEMQPwg1IGLRLdGPXnypGma113pNOBXrVpl9khv2bKlnDp1ylynNXqt3S9fvtzsdf3SSy+ZMA7XFK/BrSGtTfJ6PP3002H3EddAP3DggHz55ZeyePFi2b59u9lBML1t27bJ3Llz5dNPPzWHXjtq1KgofiIAIo3mdyDKNLSXLFlitv7UWrkG51dffWVCWc2cOVNKly5tzt97772mVn333XdLtWrVzPNXXnllhk3xWqPWGvq5muT1vfXLge5Rr++j/vGPf5gWAO17r1OnTlr4ax+97rGtHn74YfPaF154IeKfCYDooKYORInWdrWGnTt3bhPmWjPWWnqOHDmkXr16addddtllUrlyZfnxxx/N48cff1xGjBghjRo1ksGDB8uGDRsuqBx6Xw3zYKCrKlWqmAF2wfdU2uweDHR1+eWXm33JAcQPQh2IkptvvlnWrVtn+suPHz8uM2bMMLXq83n00UdN87jWlLWGXbt2bXnttdeiXl4dxJeellVr7wDiB6EORIkOctOpbFdccYWpnaurr77aTGv7+uuv0677/fffZcuWLab2HKS16u7du8tHH30kTz31lEybNi3DJni/33/Ocuh77ty50xxBP/zwgxlsl/49AcQ/Qh24iCpWrGgGrXXt2lVWrFgh69evl4ceekhKlixpzqsnn3zS9L9rH3hycrJ88cUXJpjD0SbzI0eOmL7vlJQUOXbs2FnX6Kh77Z9/8MEHzf3WrFljRt/fdNNNphUAgD0IdeAi07nrtWrVkttvv10aNGhgBtLplLVg87fWvHUEvAa5znWvVKmSTJo0Key9dLCd1ui1v17npo8ePfqsa7QZfd68eWaK3I033mhCXgffzZkzJ+p/K4CLy+fovygAACDuUVMHAMAShDoAAJYg1AEAsAShDgCAJQh1AAAsQagDAGAJQh0AAEsQ6gAAWIJQBwDAEoQ6AACWINQBABA7/D94w5BcMh1HoAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfUAAAE8CAYAAADZryhtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAoOklEQVR4nO3dCbTM9f/H8fdcy7VFi30J2YosZadFshQprVLZkqioqH9RshelxLEk2vslWtUp8ZOSn1wpN1uFUD+SNUWRi/l+/+f96cz93bkG37lmzJ3P9/k453vune985zufO6e85rMHXNd1BQAAJL2URBcAAADEBqEOAIAlCHUAACxBqAMAYAlCHQAASxDqAABYglAHAMAShDoAAJYg1AEAsAShDmTz888/SyAQkFdeeSXz3LBhw8w5AMjNCHX4joa1BnSkY+DAgZ7v88QTT8js2bPlVPntt99k7Nixcskll0iJEiXk9NNPlyZNmsisWbOi+rISOvLkySNnn322XHvttbJixQpzTTAYlKJFi8o111xz1OufffZZ87pu3bod9dyQIUPMc+vXrw/7EpSSkiJbtmw56vp9+/ZJwYIFzTV9+/bNwacBIJK8Ec8CPjBixAipXLly2Lnzzz9fKlasKH///bfky5fvhKF+ww03SMeOHeVUSEtLk0cffVTatWsngwcPlrx588q7774rN998s3z//fcyfPhwT/fp3LmzuYcG+A8//CDPPfecfPLJJ7J06VKpV6+e+aKwZMmSo1735ZdfmvfUn5GeK1mypFSvXj3sfGpqqrz55pvy0EMPhZ1/7733ov77AZwYoQ7fuvLKK6VBgwYRnytQoIAkwsGDByV//vymhptdrVq15McffzRfOkLuvvtuadWqlTz55JMmOAsXLnzC97jwwgvltttuy3zcvHlzufrqq024P//883LRRRfJ/PnzTeCfd955YcF90003yYwZM2T79u1SunRpc/7IkSPy1VdfSZs2bY56L/3yECnU9R7t27c3X0oAxA7N74CHPvXs9Pn9+/fLq6++mtmc3b1798znt27dKrfffruUKlXK1FY1kF966aWweyxcuNC8bubMmabmXa5cOSlUqJBpmo5EWxWyBnqoHNpSkJGRIZs2bcrR39uyZUvz86effjI/NdRV1hq53luDXJvK9QtP1ue06V4/i9DrsrrlllvM82vXrs08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HNQu6meeeUZGjRqVXCvKnXHGGaaJAgCAU8r1PgBOa93aR55VpFp6TmnzfMmSJWXatGmmZl6/fn3ZunWraZLXfvmkCXUAABLBdbxfe6ym9kiKFy9uglnHj2Wlj0uXLh3xNTriXfvSsza1n3feeaZmr835+fPnz93N7wAA2DilLX/+/KamvWDBgrCauD7WfvNImjdvLhs2bDDXhaxfv96EvZdAV4Q6AMC/3PhNadOmep2S9uqrr8oPP/xgBobv379fevToYZ7v2rVr2EA6fX7Pnj1y3333mTD/+OOP5YknnjAD57yi+R0A4FtuHJd/7dSpk1kZdciQIaYJvV69ejJ37tzMwXObN282I+JDdLrbvHnzpH///lKnTh0zP10DXke/5/p56vHEPHUAsEO856lXem2M52t/7nr03PLchpo6AMDHAmITQh0A4F+uWIVQBwD4lytWOanR7zpvThecP3LkSOxKBADAqeIGvB+2hvqBAwekZ8+eUqhQIalVq5YZwad0kfoxY7wPOgAAINGLz7geD2tDXefVrVy5UhYuXGj2iA3Rhep1qzkAAJKCa1dNPUd96rNnzzbh3aRJE7OrWojW2jdu3BjL8gEAEDcBy/rUcxTqOpleF53PTlfKyRryAADkaq5YJUfN7w0aNDDL14WEgvyFF1445pq2AADkOi7N72Yt2iuvvFK+//57M/J9woQJ5vclS5bIF198EftSAgAQD65YJUc19YsuukhWrFhhAr127dry73//2zTHp6WlmV1pAADw+4YuSbX4TJUqVczuMwAAJC1XrJKjmnp6erqsXr068/EHH3wgHTt2lEceecQsSAMAQFJw7epTz1Go9+7d2+z1qjZt2mS2l9OFaN5++2156KGHYl1GAADiNqUt4PGwNtQ10HVfWKVBfumll8qMGTPklVdekXfffTfWZQQAID5c+tRFt2B3nH/WzPv000/lqquuytzgfffu3bEtIQAAcRJIkrCOa6jrPPVRo0aZZWF1Cttzzz1nzv/0009SqlSpWJcRAID4cJOjrzyuze/jx483g+X69u0rjz76qFStWtWcf+edd6RZs2axLiMAAPHh0vwuderUCRv9HjJ27FjJkydPLMoFAED8uWKVHM9TjyTrjm0AAOR2AUJdJBgMyrPPPitvvfWW2Us9+9z0PXv2xKp8AADEjytWyVGf+vDhw2XcuHFm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0L73hg0bZoa/9tHrHtuqS5cu5rWPP/54zD8TAPFBTR2IE63tag27QIECJsy1Zqy19Lx580rjxo0zrzvrrLOkRo0a8sMPP5jH9957r4waNUqaN28uQ4cOlVWrVp1UOfS+GuahQFc1a9Y0A+xC76m02T0U6KpMmTJmX3IAyYNQB+LksssukxUrVpj+8r///lteffVVU6s+kTvuuMM0j2tNWWvYDRo0kIkTJ8a9vDqILystq9beASQPQh2IEx3kplPZzj77bFM7V+edd56Z1vbVV19lXvfbb7/JunXrTO05RGvVffr0kffee08eeOABmT59+jGb4IPB4HHLoe+5ZcsWc4R8//33ZrBd1vcEkPwIdeAUqlatmhm01qtXL1m8eLGsXLlSbrvtNilXrpw5r+6//37T/6594Onp6fL555+bYI5Em8z/+usv0/e9e/duOXDgwFHX6Kh77Z+/9dZbzf2WLVtmRt9feumlphUAgD0IdeAU07nr9evXl6uuukqaNm1qBtLplLVQ87fWvHUEvAa5znWvXr26TJkyJeK9dLCd1ui1v17npj/11FNHXaPN6B988IGZInfJJZeYkNfBd7NmzYr73wrg1Aq4+i8KAABIetTUAQCwBKEOAIAlCHUAACxBqAMAYAlCHQAASxDqAABYglAHAMAShDoAAJYg1AEAsAShDgCAJQh1AADEDv8PZz3pEpc0G/AAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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xCqFnqceTu4d2wAAKOp8hLqI3++X559/Xt58802zl/qxc9N37doVqfIBABA9jlilUH3qI0eOlPHjx5v56Xv27JFBgwbJjTfeKAkJCTJixIjIlxIAgGhw7OpTL1Soz5o1yywR+9BDD0mxYsWka9euZoe2YcOGycqVKyNfSgAAosDH4jMi27dvNxu5qDJlypjautL56rm3ZAUAoEgL+NwftoZ61apVZdu2bTkbu+guberLL7+UpKSkyJYQAIAo8VFTF7nhhhtkyZIl5vcBAwbI448/LrVq1ZLu3bvLXXfdFekyAgAQHY5dfeqFGv0+duzYnN91sFz16tUlLS3NBHvHjh0jWT4AAKLGFydhHdWa+u+//57z+y+//CILFiwwzfHlypWLZNkAAIgux66aeoFCXVeRS05OlgoVKsj5558va9askSZNmpg569OnT5errrpK5s2bF73SAgAQSY6HQ133StdR78uXL5crrrjCjHbv0KGDGf3+xx9/mH3WczfNAwBQlPksGyhXoD51Hd2+dOlSs/Z7w4YNTe38H//4h1l0Jjhornnz5tEqKwAAiFSo6/KvlSpVypmffsopp8jpp5+e87z+/ueffxbkLQEAiB1HrFLg0e8+n++EjwEAiBe+gHg71Hv27JmzwMzBgwflvvvuMzV2dejQociXEACAaHHEu6Heo0ePkMd33nlnnmt0ARoAAOKBz8uh/uqrr0avJAAAnGxOdN9+8uTJMm7cOLNnig4wf+GFF6Rp06b5vm7OnDlms7ROnToVaKp4oRafAQDABr4oTmmbO3eu2Zp8+PDhkpGRYUK9Xbt2smPHjhO+7ueff5aHH35YLr300gJ/JqEOAPAuJ3qLz4wfP1569+4tvXr1krp168q0adOkdOnS8sorrxz3NX6/X+644w4ZOXKknHvuuQX+TEIdAOBdjvtDB4NnZ2eHHMcbIH748GFZvXq1tG7dOuecrumij9PT049bnFGjRplVW+++++5C/TmEOgDAs3wFaH4fM2aM2eMk96HnwsnKyjK17ooVK4ac18favx7OihUr5OWXX5YZM2ac3F3aAACwguP+0tTUVNNHnltwivffpQu3devWzQR6+fLlC/0+hDoAwLN8BVh8RgPcbYhrMCcmJkpmZmbIeX0cXJk1tx9//NEMkMu9fXkg8FfhihUrJhs3bpSaNWsW3VA/cOCALFmy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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for f in range(min(4, len(filter_kmers))):\n", " pwm = build_pwm(filter_kmers[f])\n", " plot_pwm_heatmap(pwm, title=f\"Filter {f} PWM\")" ] }, { "cell_type": "markdown", "id": "a4e15e96", "metadata": {}, "source": [ "## Questions \n", "2. Train the model with different kernel sizes (smaller and larger than the motif). Report ROC AUC and PR AUC.\n", "3. Does the model recover the implanted motif? Show the best-matching filter and its sequence logo.\n", "4. Try adding Gaussian noise to negative sequences or implant the motif with probability < 1. How do results change?" ] }, { "cell_type": "markdown", "id": "5505f020-aee2-433c-8564-ca006c734b56", "metadata": {}, "source": [ "# 8 – Advanced Modeling and Biological Extensions (25 pts)\n", "\n", "Multiple Motifs\n", "\n", "Modify dataset:\n", "\n", "- include two different motifs.\n", "\n", "- Allow co-occurrence in some sequences.\n", "\n", "Analyze for Question #5 and #6\n", "\n" ] }, { "cell_type": "markdown", "id": "4d9c6119-2f53-4a58-829d-3834a7cf66c1", "metadata": {}, "source": [ "## Questions \n", "5. Does the CNN learn separate filters?\n", "6. Does it capture motif interactions?" ] } ], "metadata": { "kernelspec": { "display_name": "Python (genomics-cnn)", "language": "python", "name": "genomics-cnn" }, "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.9.25" } }, "nbformat": 4, "nbformat_minor": 5 }