{ "cells": [ { "cell_type": "markdown", "id": "6eed8052", "metadata": {}, "source": [ "# Module 3 — Lab 6: Capstone — Binary Intrusion Detection with CIC-IDS2017\n", "\n", "\n", "**Topics:** end-to-end ML workflow, CIC-IDS2017, binary classification, evaluation, reporting\n", "\n", "> **Solution version:** This notebook contains the complete solution. Run the cells in order and compare the results with your Lab notebook.\n" ] }, { "cell_type": "markdown", "id": "547ff0b9", "metadata": {}, "source": [ "## Mission\n", "\n", "Build one complete and leakage-safe intrusion-detection workflow:\n", "\n", "1. load a network-flow table;\n", "2. clean invalid values and duplicate rows;\n", "3. map all attacks to one `ATTACK` class;\n", "4. create one stratified train-test split;\n", "5. train one Random Forest pipeline;\n", "6. evaluate attack precision, recall, F1, and error counts;\n", "7. export a short analyst report.\n", "\n", "The notebook uses `data/cicids2017_binary_sample.csv` when that file is available. Until the instructor prepares the official subset, it uses the included synthetic dataset and prints a clear warning.\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "18624c37", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset: data/cicids2017_binary_sample.csv\n" ] } ], "source": [ "from pathlib import Path\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.metrics import (\n", " ConfusionMatrixDisplay, accuracy_score, confusion_matrix,\n", " precision_score, recall_score, f1_score\n", ")\n", "\n", "REAL_DATA_PATH = Path(\"data/cicids2017_binary_sample.csv\")\n", "DEMO_DATA_PATH = Path(\"data/synthetic_security_flows.csv\")\n", "OUTPUT_DIR = Path(\"output\")\n", "OUTPUT_DIR.mkdir(exist_ok=True)\n", "RANDOM_STATE = 42\n", "\n", "DATA_PATH = REAL_DATA_PATH if REAL_DATA_PATH.exists() else DEMO_DATA_PATH\n", "USING_REAL_CICIDS = REAL_DATA_PATH.exists()\n", "\n", "print(\"Dataset:\", DATA_PATH)\n", "if not USING_REAL_CICIDS:\n", " print(\"WARNING: Using synthetic classroom data. Add the prepared CIC-IDS2017 file for the real capstone.\")\n" ] }, { "cell_type": "markdown", "id": "0dbd0af0", "metadata": {}, "source": [ "## 1. Load, clean, and define the binary target\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "098e1270", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Raw rows: 50,000\n", "Clean rows: 50,000\n", "Numeric features: 78\n", "Binary class distribution:\n", "Label\n", "BENIGN 40000\n", "ATTACK 10000\n", "Name: count, dtype: int64\n" ] } ], "source": [ "raw_df = pd.read_csv(DATA_PATH, low_memory=False)\n", "raw_df.columns = raw_df.columns.str.strip()\n", "clean_df = raw_df.drop_duplicates().replace([np.inf, -np.inf], np.nan)\n", "\n", "if \"Label\" not in clean_df.columns:\n", " raise KeyError(\"Expected a column named 'Label'. Check data/README.md.\")\n", "\n", "X = clean_df.drop(columns=\"Label\").select_dtypes(include=\"number\")\n", "y = clean_df[\"Label\"].astype(str).str.strip().str.upper().ne(\"BENIGN\").astype(int)\n", "\n", "print(f\"Raw rows: {len(raw_df):,}\")\n", "print(f\"Clean rows: {len(clean_df):,}\")\n", "print(f\"Numeric features: {X.shape[1]}\")\n", "print(\"Binary class distribution:\")\n", "print(y.value_counts().sort_index().rename(index={0: \"BENIGN\", 1: \"ATTACK\"}))\n" ] }, { "cell_type": "markdown", "id": "9eaf64ce", "metadata": {}, "source": [ "## 2. Create one fixed train-test split\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "9b980dfc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training samples: 40000\n", "Test samples: 10000\n", "Training attack rate: 0.2\n", "Test attack rate: 0.2\n" ] } ], "source": [ "X_train, X_test, y_train, y_test = train_test_split(\n", " X,\n", " y,\n", " test_size=0.2,\n", " random_state=RANDOM_STATE,\n", " stratify=y,\n", ")\n", "\n", "print(\"Training samples:\", len(X_train))\n", "print(\"Test samples:\", len(X_test))\n", "print(\"Training attack rate:\", round(y_train.mean(), 3))\n", "print(\"Test attack rate:\", round(y_test.mean(), 3))\n" ] }, { "cell_type": "markdown", "id": "e6a1b316", "metadata": {}, "source": [ "## 3. Build and train the baseline pipeline\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "eb76e956", "metadata": {}, "outputs": [], "source": [ "baseline_pipeline = Pipeline([\n", " (\"imputer\", SimpleImputer(strategy=\"median\")),\n", " (\"model\", RandomForestClassifier(\n", " n_estimators=150,\n", " max_depth=14,\n", " random_state=RANDOM_STATE,\n", " n_jobs=-1,\n", " )),\n", "])\n", "\n", "baseline_pipeline.fit(X_train, y_train)\n", "y_pred = baseline_pipeline.predict(X_test)\n" ] }, { "cell_type": "markdown", "id": "854cfc02", "metadata": {}, "source": [ "## 4. Evaluate the attack class\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "6ea8262a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "accuracy 1.000\n", "attack_precision 1.000\n", "attack_recall 0.998\n", "attack_f1 0.999\n", "false_positives 0.000\n", "false_negatives 5.000\n", "dtype: float64\n", "False positives: 0 | False negatives: 5\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkUAAAHWCAYAAAB5ZP2xAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABnWElEQVR4nO3deVhUZfsH8O+wDfsIKAwoIiriAqa5IFq5siUuWaGh5IJLaSqvmmamom+iWC4VuYaCW5pvamZG7pYBgiSaSlaKisYIKg6LyOb5/cGPk+OAw+gAynw/73Wu651z7vOcZyZwbu7nec6RCIIggIiIiEjPGdR1B4iIiIieBUyKiIiIiMCkiIiIiAgAkyIiIiIiAEyKiIiIiAAwKSIiIiICwKSIiIiICACTIiIiIiIATIqIiIiIADApooecPXsWo0ePhqurK0xNTWFpaYkXX3wRS5cuxZ07d8S4Xr16wcPDQ+38oqIiREVF4aWXXoKNjQ1MTEzQuHFjBAUF4fjx4xqvf+XKFUgkEnz66afivmPHjkEikYibiYkJGjVqhB49emDOnDm4evVqpW2dPHkSr732Gpo2bQqpVAoHBwd4e3tj+vTpYkxZWRmWL18Of39/NGnSBObm5mjTpg0++OAD3L17t9J2v/jiC7Ru3RpSqRSurq5YsGABSkpKVGKuX7+OsLAw9OzZEw0aNIBEIkFMTEyV77eqzd/fX+vPqyoxMTGQSCS4cuWKxthnUbNmzTBq1KgnOnfbtm1YuXKlTvujrafpf014mp+H/fv3Izw8XOd9qqvrED2MSREBANavX49OnTohOTkZ77//PuLi4rB79268+eabWLNmDUJDQx97/q1bt9CjRw9MmzYNHh4eiImJweHDh7Fs2TIYGhqib9++OHPmzBP3LyIiAgkJCTh69Ciio6PRq1cvbNiwAW3atMHWrVtVYn/44Qd0794dubm5WLp0KQ4cOIDPPvsMPXr0wI4dO8S4wsJChIeHw8XFBStXrsT+/fsxbtw4rFu3Dj169EBhYaFKu4sWLcLUqVMxZMgQ/PTTT5g4cSIiIiIwadIklbi///4bW7duhYmJCV599dUq35OjoyMSEhLUtlmzZgEAXnvttSf+vB7Vv39/JCQkwNHRUWdt1qbdu3dj7ty5T3Tus5AUPU3/nzX79+/HggUL6s11iFQIpPfi4+MFQ0NDwd/fX7h//77a8aKiIuG7774TX/fs2VNo166dSkxAQIBgZGQkHD58uNJrJCUlCVevXn1sP9LT0wUAwieffCLuO3r0qABA2Llzp1r87du3hY4dOwpGRkbC2bNnxf2vvPKK0KJFC6GkpETtnLKyMvH/l5aWCrdu3VKL2blzpwBA2Lx5s7jv1q1bgqmpqTB+/HiV2EWLFgkSiUQ4f/58pddITk4WAAgbN2587Ht/WK9evQRzc3NBqVQ+Nq6yz+tZ8+DBA+HevXt12of+/fsLLi4u1YotLS2t9Hegvtm4caMAQEhPT9f63EmTJgm18dVRU9ep659HeraxUkSIiIiARCLBunXrIJVK1Y6bmJhg4MCBVZ6fkpKCH3/8EaGhoejTp0+lMV26dEHTpk111mcAsLW1xdq1a1FaWooVK1aI+2/fvo2GDRvCyMhI7RwDg39/5A0NDWFnZ6cW07VrVwBARkaGuC8uLg7379/H6NGjVWJHjx4NQRCwZ8+eSq+hrUuXLuH48eMICgqCtbV1tc558OABFi1ahKZNm8LU1BSdO3fG4cOHVWIqGy6pGAZNTk7Gyy+/DHNzczRv3hxLlizBgwcPxLj79+9j+vTp6NChA2QyGWxtbeHt7Y3vvvtOrS8SiQTvvfce1qxZgzZt2kAqlSImJgZubm7w8/NTi8/Pz4dMJlOrtj3q0eGnimHVr7/+GnPmzIGTkxOsra3Rr18/XLx4UeU9/vDDD7h69arK0CTw7/Dj0qVL8fHHH8PV1RVSqRRHjx6tcnip4rrHjh0T950+fRqBgYGwt7eHVCqFk5MT+vfvj+vXr1fZfwC4du0aRowYIZ7Xpk0bLFu2TOWzf3iIdPny5XB1dYWlpSW8vb2RmJj42M+sQmJiInr06AFTU1M4OTlh9uzZakO+FXbs2AFvb29YWFjA0tISfn5+OH36tHh81KhR+PLLLwFA5fOs+JwEQcCqVavQoUMHmJmZwcbGBm+88QYuX76sdq24uDj07dsXMplMHLpevHhxta5z//59zJ49G66uruIw/aRJk9SGvZs1a4bAwEDs2rULHTt2hKmpKatP9Fjq3xqkV8rKynDkyBF06tQJzs7OT9TGgQMHAACDBw/WYc+qp0uXLnB0dMTPP/8s7vP29sZXX32FKVOmYPjw4XjxxRdhbGxc7TaPHDkCAGjXrp2479y5cwAAT09PlVhHR0c0bNhQPP60NmzYAEEQMHbs2GqfExUVJQ4BPnjwAEuXLkVAQACOHz8Ob2/vx56rUCgwfPhwTJ8+HfPnz8fu3bsxe/ZsODk54e233wZQPlfszp07mDFjBho3bozi4mIcOnQIQ4YMwcaNG8W4Cnv27MEvv/yCefPmQS6Xw97eHiUlJQgLC8Nff/0FNzc3MXbTpk3Izc3VmBRV5cMPP0SPHj3w1VdfITc3F7NmzcKAAQOQlpYGQ0NDrFq1CuPHj8elS5ewe/fuStv4/PPP0apVK3z66aewtraGm5sbFApFta5fUFAAHx8fuLq64ssvv4SDgwMUCgWOHj2KvLy8Ks/Lzs5G9+7dUVxcjP/+979o1qwZ9u3bhxkzZuDSpUtYtWqVSvyXX36J1q1bi8OAc+fOxauvvor09HTIZLIqr3PhwgX07dsXzZo1Q0xMDMzNzbFq1Sps27ZNLTYiIgIfffQRRo8ejY8++gjFxcX45JNP8PLLLyMpKQlt27bF3LlzUVBQgP/9739ISEgQz60Ylp0wYQJiYmIwZcoUREZG4s6dO1i4cCG6d++OM2fOwMHBAQAQHR2NcePGoWfPnlizZg3s7e3x559/ir9Hj7uOIAgYPHgwDh8+jNmzZ+Pll1/G2bNnMX/+fHEI+uE/7n777TekpaXho48+gqurKywsLKr8vIg4fKbnFAqFAEAYNmxYtc95dPjsnXfeEQAIf/zxx1P1RdvhswpeXl6CmZmZ+PrWrVvCSy+9JAAQAAjGxsZC9+7dhcWLFwt5eXmP7cP169cFBwcHoXPnzirDYOPGjROkUmml57Rq1Urw9fWt9Jg2w2elpaVC48aNhdatW2uMFYR/Py8nJyehsLBQ3J+bmyvY2toK/fr1E/dVNlzSs2dPAYBw8uRJlXbbtm0r+Pn5PbafJSUlQmhoqNCxY0eVYwAEmUwm3LlzR2V/bm6uYGVlJUydOlXtWr1799b4Xl1cXISRI0eKryt+Ll599VWVuG+++UYAICQkJIj7qho+q/j8WrRoIRQXF6scq2p4qeK6R48eFQRBEE6dOiUAEPbs2aNV/z/44INKP/t3331XkEgkwsWLF1X66OnpKZSWlopxSUlJAgDh66+/fux1hw4dKpiZmQkKhULcV1paKrRu3Vrl/V27dk0wMjISJk+erHJ+Xl6eIJfLhaCgIHFfVcNaCQkJAgBh2bJlKvszMjIEMzMzYebMmWKb1tbWwksvvSQ8ePCgyr5XdZ24uDgBgLB06VKV/Tt27BAACOvWrRP3ubi4CIaGhuLnSaQJh8+o1pWWlqpsgiA8VXuPnm9nZ4dffvkFycnJWLJkCQYNGoQ///wTs2fPhqenJ27dulVpO3fu3MGrr74KQRCwY8cOtWGwimGXyjzuWHXFxcXhxo0bGie1P2rIkCEwNTUVX1tZWWHAgAH4+eefUVZW9thz5XK5OFxYoX379mqr+nbu3IkePXrA0tISRkZGMDY2RnR0NNLS0tTa7NOnD2xsbFT2WVlZYfTo0YiJiUFBQQGA8orchQsX8N5772n1fh/26LBu+/btAaDKVYlVtaFNJfFhLVu2hI2NDWbNmoU1a9bgwoUL1TrvyJEjaNu2rdpnP2rUKAiCIFYrK/Tv3x+Ghobi6+q+z6NHj6Jv375ihQYoHzYeOnSoStxPP/2E0tJSvP322yq/m6ampujZs6fKcGFV9u3bB4lEghEjRqi0IZfL8cILL4htxMfHIzc3FxMnTnyi35uKz+bR4cg333wTFhYWakPH7du3R6tWrbS+DuknJkV6rmHDhjA3N0d6evoTt1ExV6i6bRgbG6tssbGxT3xtoHxuhpOTk9r+zp07Y9asWdi5cyf++ecf/Oc//8GVK1ewdOlStdicnBz4+Pjgxo0bOHjwIJo3b65y3M7ODvfv38e9e/fUzr1z5w5sbW2f6j0A5UMKxsbGasNRmsjl8kr3FRcXIz8//7HnVjanSiqVqqy827VrF4KCgtC4cWNs2bIFCQkJSE5OxpgxY3D//n2186ta4TZ58mTk5eWJqwWjoqLQpEkTDBo06LF91Kb/FcMmj64cfJynWZEnk8lw/PhxdOjQAR9++CHatWsHJycnzJ8/v8p5O0D5vLfKrlvxc3z79m2V/U/6Pm/fvl3lz8fDbt68CaB8OPrR388dO3ZU+YfEo20IggAHBwe1NhITE8U2srOzAQBNmjTR2GZV78nIyAiNGjVS2S+RSCCXy9U+u+d1xSXVDc4p0nMVy+V//PFHXL9+/Yn+ofLz88OHH36IPXv2aLy3DgAkJyervHZ1ddX6mhWSkpKgUCg0VleMjY0xf/58rFixQm3+T05ODvr164f09HQcPnxY/Cv8YRVziX7//Xd4eXmJ+xUKBW7dulXpfZu0kZWVhX379mHgwIGwt7fX6tzK5r8oFAqYmJjA0tLyqfoFAFu2bIGrqyt27Nih8pd9UVFRpfFV/fXfsmVLBAQE4Msvv0RAQAD27t2LBQsWqFRA6kJl/a2ovD36HitLDjw9PbF9+3YIgoCzZ88iJiYGCxcuhJmZGT744INKr2lnZ4fMzEy1/f/88w+A8j9WdMHOzq7Kn4+HVVzvf//7H1xcXJ7oWg0bNoREIsEvv/xS6YKNin0VyczDE9G1YWdnh9LSUmRnZ6skRoIgQKFQoEuXLirxuqjikv5gpYgwe/ZsCIKAcePGobi4WO14SUkJvv/++yrPf/HFFxEQEIDo6Gi1sn+FU6dO4dq1awDKKzgPb5VVK6rjzp07eOedd2BsbIz//Oc/4v7KvmwAiEM9D1eVKhKiy5cv48CBA+jYsWOl5/r7+8PU1FTtJowVq5SedpL5pk2bUFJSovXQGVBeyXm4YpOXl4fvv/8eL7/8sk4SjoqbZj785aJQKCpdfabJ1KlTcfbsWYwcORKGhoYYN27cU/dPk0crX9XRrFkzAOU3NH3Y3r17qzxHIpHghRdewIoVK9CgQQP89ttvVcb27dsXFy5cUIvZtGkTJBIJevfurVV/q9K7d28cPnxYrAQB5YsrHr5fF1D+h42RkREuXbqk9vtZsVWoqkoVGBgIQRBw48aNSs+v+MOie/fukMlkWLNmzWOHzqu6Tt++fQGUJ+sP+/bbb1FQUCAeJ3oSrBQRvL29sXr1akycOBGdOnXCu+++i3bt2qGkpASnT5/GunXr4OHhgQEDBlTZxqZNm+Dv74+AgACMGTMGAQEBsLGxQWZmJr7//nt8/fXXSElJeeJl+X/99RcSExPx4MED3L59GydPnkR0dDRyc3OxadMmlZVifn5+aNKkCQYMGIDWrVvjwYMHSE1NxbJly2BpaYmpU6cCKP/HtmLJ8cqVK1FaWqqyzLlRo0Zo0aIFgPLl/x999BHmzp0LW1tb+Pr6Ijk5GeHh4Rg7dizatm2r0t///e9/ACAuRT516pRYtXnjjTfU3l90dDScnZ0rXbauiaGhIXx8fDBt2jQ8ePAAkZGRyM3N1dnS44olzRMnTsQbb7yBjIwM/Pe//4WjoyP++usvrdry8fFB27ZtcfToUXE5ek3z9PTErl27sHr1anTq1AkGBgYqX/KV6dKlC9zd3TFjxgyUlpbCxsYGu3fvxokTJ1Ti9u3bh1WrVmHw4MFo3rw5BEHArl27cPfuXfj4+FTZ/n/+8x9s2rQJ/fv3x8KFC+Hi4oIffvgBq1atwrvvvquzOTAfffQR9u7diz59+mDevHkwNzfHl19+Kc7rqtCsWTMsXLgQc+bMweXLl+Hv7w8bGxvcvHkTSUlJsLCwEH+eKpKbyMhIBAQEwNDQEO3bt0ePHj0wfvx4jB49GqdOncIrr7wCCwsLZGZm4sSJE/D09MS7774LS0tLLFu2DGPHjkW/fv0wbtw4ODg44O+//8aZM2cQFRX12Ov4+PjAz88Ps2bNQm5uLnr06CGuPuvYsSNCQkJ08tmRnqqjCd70DEpNTRVGjhwpNG3aVDAxMREsLCyEjh07CvPmzROysrLEuMpu3igIglBYWCh8/vnngre3t2BtbS0YGRkJTk5OwpAhQ4QffvhB4/Uft/qsYjMyMhLs7OwEb29v4cMPPxSuXLmi1s6OHTuE4OBgwc3NTbC0tBSMjY2Fpk2bCiEhIcKFCxfUrlfV9vBqoQqfffaZ0KpVK8HExERo2rSpMH/+fLWVS4IgPLbdR/36668CAGHevHkaP6PKPq/IyEhhwYIFQpMmTQQTExOhY8eOwk8//aQSW9Xqs8r+O44cOVJttdaSJUuEZs2aCVKpVGjTpo2wfv16Yf78+WrvB4AwadKkx/Y7PDxcACAkJiZW+71Wtfrs0VWJFZ/Jw6v97ty5I7zxxhtCgwYNBIlEIvZZ080v//zzT8HX11ewtrYWGjVqJEyePFn44YcfVFaf/fHHH8Jbb70ltGjRQjAzMxNkMpnQtWtXISYm5rH9FwRBuHr1qhAcHCzY2dkJxsbGgru7u/DJJ5+orHp8XB8BCPPnz9fwyZX/fHXr1k2QSqWCXC4X3n//fWHdunWVrq7bs2eP0Lt3b8Ha2lqQSqWCi4uL8MYbbwiHDh0SY4qKioSxY8cKjRo1Ej/Ph9vZsGGD4OXlJVhYWAhmZmZCixYthLfffls4deqUyrX2798v9OzZU7CwsBDMzc2Ftm3bCpGRkdW6TmFhoTBr1izBxcVFMDY2FhwdHYV3331XyMnJUfvc+/fvr/EzIqogEYSnXPpDRKSFzp07QyKRqM0tIyKqaxw+I6Ial5ubi3PnzmHfvn1ISUmp8kaKRER1iUkREdW43377Db1794adnR3mz59fJ3c/JyLShMNnREREROCSfCIiIqohpaWl4nPnzMzM0Lx5cyxcuFDlwceCICA8PBxOTk4wMzNDr169cP78eZV2ioqKMHnyZDRs2BAWFhYYOHCg2r2ucnJyEBISAplMBplMhpCQELWHBGvCpIiIiIhqRGRkJNasWYOoqCikpaVh6dKl+OSTT/DFF1+IMUuXLsXy5csRFRWF5ORkyOVy+Pj4qDxUOSwsDLt378b27dtx4sQJ5OfnIzAwUOVRRsHBwUhNTUVcXBzi4uKQmpqq9S0aOHxGRERENSIwMBAODg6Ijo4W973++uswNzfH5s2bIQgCnJycEBYWhlmzZgEorwo5ODggMjISEyZMgFKpRKNGjbB582bxuX3//PMPnJ2dsX//fvj5+SEtLQ1t27ZFYmKi+NSBxMREeHt7448//oC7u3u1+suJ1rXswYMH+Oeff2BlZcXbzxMR6SlBEJCXlwcnJye1h0/XhPv371f6xIInJQiC2neYVCpVe8TLSy+9hDVr1uDPP/9Eq1atcObMGZw4cQIrV64EUP7MTIVCAV9fX5V2evbsifj4eEyYMAEpKSkoKSlRiXFycoKHhwfi4+Ph5+eHhIQEyGQylccwdevWDTKZDPHx8UyKnlUV2S0REVFGRsYTPxy3uu7fvw8zKzugVP2B1k/K0tJS7YHT8+fPR3h4uMq+WbNmQalUonXr1jA0NERZWRkWLVqEt956C8C/z+FzcHBQOc/BwQFXr14VY0xMTGBjY6MWU3G+QqGo9A759vb2lT7/rypMimqZlZUVAMCk7UhIDE3quDdEdePasU/rugtEdSovNxctXZ3F74SaVFxcDJTeg7TtSEAX3ztlxci/EIuMjAxYW1uLuyt7EPCOHTuwZcsWbNu2De3atUNqairCwsLg5OSEkSNHinGPVp0qq0Q96tGYyuKr087DmBTVsor/OBJDEyZFpLce/oeUSJ/V6jQKI1OdfO8IkvLhPmtra42/y++//z4++OADDBs2DED5M+2uXr2KxYsXY+TIkZDL5QDKKz2Ojo7ieVlZWWL1SC6Xo7i4GDk5OSrVoqysLHTv3l2MefjBxxWys7PVqlCPw9VnRERE+kACQCLRwVb9S967d09tzpShoaG4JN/V1RVyuRwHDx4UjxcXF+P48eNiwtOpUycYGxurxGRmZuLcuXNijLe3N5RKJZKSksSYkydPQqlUijHVwUoRERER1YgBAwZg0aJFaNq0Kdq1a4fTp09j+fLlGDNmDIDySllYWBgiIiLg5uYGNzc3REREwNzcHMHBwQAAmUyG0NBQTJ8+HXZ2drC1tcWMGTPg6emJfv36AQDatGkDf39/jBs3DmvXrgUAjB8/HoGBgdWeZA0wKSIiItIPEoPyTRftVNMXX3yBuXPnYuLEicjKyoKTkxMmTJiAefPmiTEzZ85EYWEhJk6ciJycHHh5eeHAgQMq861WrFgBIyMjBAUFobCwEH379kVMTAwMDQ3FmK1bt2LKlCniKrWBAwciKipKu7fG+xTVrtzcXMhkMkg9x3FOEemtnGTt/qEiqm9yc3PhYCeDUqms8Tl24vdOx4mQGKpPhtaWUFaEotOraqXvtY1zioiIiIjA4TMiIiL9UAfDZ88bJkVERET6oGL1mC7aqafqb7pHREREpAVWioiIiPSCjobP6nE9hUkRERGRPuDwmUb1N90jIiIi0gIrRURERPqAq880YlJERESkDzh8plH9TfeIiIiItMBKERERkT7g8JlGTIqIiIj0AYfPNKq/6R4RERGRFlgpIiIi0gccPtOISREREZE+kEh0lBRx+IyIiIioXmOliIiISB8YSMo3XbRTTzEpIiIi0gecU6RR/X1nRERERFpgpYiIiEgf8D5FGrFSRERERARWioiIiPQD5xRpxKSIiIhIH3D4TKP6m+4RERERaYGVIiIiIn3A4TONmBQRERHpAw6faVR/0z0iIiIiLbBSREREpA84fKYRkyIiIiJ9wOEzjepvukdERESkBVaKiIiI9IKOhs/qcT2FSREREZE+4PCZRvU33SMiIiLSAitFRERE+kAi0dHqs/pbKWJSREREpA+4JF+j+vvOiIiIiLTAShEREZE+4ERrjVgpIiIi0gcVw2e62KqpWbNmkEgkatukSZMAAIIgIDw8HE5OTjAzM0OvXr1w/vx5lTaKioowefJkNGzYEBYWFhg4cCCuX7+uEpOTk4OQkBDIZDLIZDKEhITg7t27Wn9ETIqIiIioRiQnJyMzM1PcDh48CAB48803AQBLly7F8uXLERUVheTkZMjlcvj4+CAvL09sIywsDLt378b27dtx4sQJ5OfnIzAwEGVlZWJMcHAwUlNTERcXh7i4OKSmpiIkJETr/nL4jIiISB/UwfBZo0aNVF4vWbIELVq0QM+ePSEIAlauXIk5c+ZgyJAhAIDY2Fg4ODhg27ZtmDBhApRKJaKjo7F582b069cPALBlyxY4Ozvj0KFD8PPzQ1paGuLi4pCYmAgvLy8AwPr16+Ht7Y2LFy/C3d292v1lpYiIiEgf1MHw2cOKi4uxZcsWjBkzBhKJBOnp6VAoFPD19RVjpFIpevbsifj4eABASkoKSkpKVGKcnJzg4eEhxiQkJEAmk4kJEQB069YNMplMjKkuVoqIiIhIa7m5uSqvpVIppFJplfF79uzB3bt3MWrUKACAQqEAADg4OKjEOTg44OrVq2KMiYkJbGxs1GIqzlcoFLC3t1e7nr29vRhTXawUERER6YOK4TNdbACcnZ3Fic0ymQyLFy9+7OWjo6MREBAAJyenR7qlOhwnCILavkc9GlNZfHXaeRQrRURERHqgYuWXDhoCAGRkZMDa2lrc/bgq0dWrV3Ho0CHs2rVL3CeXywGUV3ocHR3F/VlZWWL1SC6Xo7i4GDk5OSrVoqysLHTv3l2MuXnzpto1s7Oz1apQmrBSRERERFqztrZW2R6XFG3cuBH29vbo37+/uM/V1RVyuVxckQaUzzs6fvy4mPB06tQJxsbGKjGZmZk4d+6cGOPt7Q2lUomkpCQx5uTJk1AqlWJMdbFSREREpAd0XSmqrgcPHmDjxo0YOXIkjIz+TTskEgnCwsIQEREBNzc3uLm5ISIiAubm5ggODgYAyGQyhIaGYvr06bCzs4OtrS1mzJgBT09PcTVamzZt4O/vj3HjxmHt2rUAgPHjxyMwMFCrlWcAkyIiIiL9IPn/TRftaOHQoUO4du0axowZo3Zs5syZKCwsxMSJE5GTkwMvLy8cOHAAVlZWYsyKFStgZGSEoKAgFBYWom/fvoiJiYGhoaEYs3XrVkyZMkVcpTZw4EBERUVp/9YEQRC0PoueWG5uLmQyGaSe4yAxNKnr7hDViZxk7f+xIqpPcnNz4WAng1KpVJmXU1PXkslkMBv0JSTGZk/dnlBSiMLvJtVK32sbK0VERER6oK6Gz54nTIqIiIj0AJMizbj6jIiIiAisFBEREekFVoo0Y1JERESkB5gUacbhMyIiIiKwUkRERKQf6ug+Rc8TJkVERER6gMNnmnH4jIiIiAisFBEREekFiQQ6qhQ9fRPPKiZFREREekACHQ2f1eOsiMNnRERERGCliIiISC9worVmTIqIiIj0AZfka8ThMyIiIiKwUkRERKQfdDR8JnD4jIiIiJ5nuppTpJsVbM8mDp8RERERgZUiIiIivcBKkWZMioiIiPQBV59pxOEzIiIiIrBSREREpBc4fKYZkyIiIiI9wKRIMw6fEREREYGVIiIiIr3ASpFmTIqIiIj0AJMizTh8RkRERARWioiIiPQD71OkEZMiIiIiPcDhM804fEZEREQEVoqIiIj0AitFmjEpIiIi0gNMijTj8BkRERERWCkiIiLSD1x9phGTIiIiIj3A4TPNOHxGREREBFaK6DlkaGiAD8a9ijf9O8Pezho3b+di275EfBr9EwRBEONmjXsVI1/rgQZWZkg5fxXvL92BPy4rxOMmxkb479TX8LpfJ5hKjfFz8p+YEbkD/2TdFWNkVmaInPEmAl7xBAD8+PPvmPnJTuTmF9ba+yXSpa92/owvthzGzVtKtG7uiIhpr6N7x5Z13S2qBawUaVanlaJRo0aJ/5EkEgns7Ozg7++Ps2fPijEPH3942759OwDg2LFjkEgk8PDwQFlZmUr7DRo0QExMjPi6WbNmWLlypUrM6dOnMXToUDg6OkIqlcLFxQWBgYH4/vvvxS/YK1euQCKRwN7eHnl5eSrnd+jQAeHh4br7UEijsLd9MPr1lzDzk53wCvoY8z/fg8kj+mH80J5izNS3+2FicG/M/OQb9B31CbJu52JX1GRYmkvFmMXTXkf/Xu0ROmcjAsaugIWZCbaveAcGBv/+wn/18Sh4tmqCN6aswhtTVsGzVROsXfh2rb5fIl3ZdSAFHy7/FtNH++H4lg/g3aEFgqauQobiTl13jWqBBJV/n2q9aTmp6MaNGxgxYgTs7Oxgbm6ODh06ICUlRTwuCALCw8Ph5OQEMzMz9OrVC+fPn1dpo6ioCJMnT0bDhg1hYWGBgQMH4vr16yoxOTk5CAkJgUwmg0wmQ0hICO7evatVX+t8+Mzf3x+ZmZnIzMzE4cOHYWRkhMDAQJWYjRs3ijEV2+DBg1ViLl26hE2bNml17e+++w7dunVDfn4+YmNjceHCBezcuRODBw/GRx99BKVSqRKfl5eHTz/99IneJ+lOF09X7D9+Fgd+PY+MzDvYeyQVR0/+gY5tmoox77zVG8s3/oR9R88g7VIm3g3fDHNTY7zh1xkAYG1hihGDvDH3s904nnQRv/95HRPmbULbFk7o1bU1AKBVMwf0694OUz7eiuTf05H8ezqmLtoG/5c90dLFvk7eO9HTWLXtCEYM8sbbg7vD3VWOxdPfQGMHG2z43y913TWqp3JyctCjRw8YGxvjxx9/xIULF7Bs2TI0aNBAjFm6dCmWL1+OqKgoJCcnQy6Xw8fHR6UIERYWht27d2P79u04ceIE8vPzERgYqFIMCQ4ORmpqKuLi4hAXF4fU1FSEhIRo1d86T4qkUinkcjnkcjk6dOiAWbNmISMjA9nZ2WJMgwYNxJiKzdTUVKWdyZMnY/78+bh//361rltQUIDQ0FD0798fP/zwA3x9fdGiRQt07doVY8eOxZkzZyCTydSusXz5cmRlZT39G6cnlnjmEnp2cUeLpuWJiYdbY3R7oTkO/lr+l4VLYzvIG8pwJPEP8ZziklL8+tvf6Nq+OQDghTZNYWJshCOJaWKM4pYSaZf+Qdf2rgDKky9l3j2knL8qxpw6dwXKvHtiO0TPi+KSUqT+kYE+Xm1U9vf2aoOks+l11CuqTTqpEmk5BBcZGQlnZ2ds3LgRXbt2RbNmzdC3b1+0aNECQHmVaOXKlZgzZw6GDBkCDw8PxMbG4t69e9i2bRsAQKlUIjo6GsuWLUO/fv3QsWNHbNmyBb///jsOHToEAEhLS0NcXBy++uoreHt7w9vbG+vXr8e+fftw8eLFave3zpOih+Xn52Pr1q1o2bIl7OzstDo3LCwMpaWliIqKqlb8gQMHcPv2bcycObPKmEf/w7/11lto2bIlFi5cqFXfSLdWxh7EtwdSkLTzI2QlfIbjW2ZhzfZj+PZAeTnWwc4aAJB9R3WoM+tOHuz//5iDnTWKikugzCtUi3F4KCb7Tr7a9bPv5IsxRM+L23fzUVb2AI1srVT2N7KzQtbt3DrqFdUqiQ63atq7dy86d+6MN998E/b29ujYsSPWr18vHk9PT4dCoYCvr6+4TyqVomfPnoiPjwcApKSkoKSkRCXGyckJHh4eYkxCQgJkMhm8vLzEmG7dukEmk4kx1VHnSdG+fftgaWkJS0tLWFlZYe/evdixYwcMDP7t2ltvvSXGVGyXL19Wacfc3Bzz58/H4sWL1Ya9KvPnn38CANzd3cV9ycnJKtfYt2+fyjkSiQRLlizBunXrcOnSpWq9v6KiIuTm5qps9HSG+HRCUEAXjPsoFr1GRGJi+Ga8N7wvhvX3Uol7eNI1AEgkgADVfY+SSCR4+LTK4iUS9baJnheP/pEvCEK9njhLNefR77aioiK1mMuXL2P16tVwc3PDTz/9hHfeeQdTpkwRp7soFOWLXxwcHFTOc3BwEI8pFAqYmJjAxsbmsTH29urTGuzt7cWY6qjzpKh3795ITU1FamoqTp48CV9fXwQEBODq1X+HLFasWCHGVGzOzs5qbYWGhqJhw4aIjIx8or60b99ebL+goAClpaVqMX5+fnjppZcwd+7carW5ePFicdKXTCartN+knYVTB2Nl7EHsOpiCC5f+wY4fk7Hq6yP4zygfAMDN//+r1/6Rak4jGytk384TY6QmxpBZmT0SY4msO7lijP0jf1UDQEMbS2Q9UoUietbZNbCEoaEBsm6r/uzeupOvVj2i+knXw2fOzs4q32+LFy9Wu+aDBw/w4osvIiIiAh07dsSECRMwbtw4rF69Wq1vD6tOsv5oTGXx2ib9dZ4UWVhYoGXLlmjZsiW6du2K6OhoFBQUqJTX5HK5GFOxGRsbq7VlZGSEjz/+GJ999hn++eefx17Xzc0NAFTGGqVSqdj+4yxZsgQ7duzA6dOnNb6/2bNnQ6lUiltGRobGc+jxzKQmePDggcq+Bw8EGEjKf5yv3rgNxS0lenu1Fo8bGxmix4stkXS2vMJ4Ju0aiktKVWIc7KzRpoWTOL8i+fd0yKzM8WJbFzGmUzsXyKzMxXaInhcmxkbo0NoZR0/+obL/WNIf4jw6qt90nRRlZGSofL/Nnj1b7ZqOjo5o27atyr42bdrg2rVrAMq/3wGoVXOysrLE6pFcLkdxcTFycnIeG3Pz5k2162dnZ6tVoR6nzpOiR0kkEhgYGKCw8MnuA/Pmm2+iXbt2WLBgwWPjfH19YWtr+0RVpa5du2LIkCH44IMPNMZKpVJYW1urbPR04k78jmmj/eDbox2cHW3Rv1d7TAzujR+OnRFj1nx9FNNG+6J/r/Zo08IRq+aH4N79Evzvp1MAgNyC+9jyXQI+DhuCV7q0Kl9q/9+RuHDpHxxLKv/S+PPKTRyKP4/P5ryFzh7N0NmjGT6bE4y4X37H31c52Z6ePxOD+2Dzd/HYsjcBF9MV+HD5t7iuuIPRr79c112j59Cj321SqVQtpkePHmoTnf/880+4uJT/senq6gq5XI6DBw+Kx4uLi3H8+HF0794dANCpUycYGxurxGRmZuLcuXNijLe3N5RKJZKSksSYkydPQqlUijHVUec3bywqKhIzxJycHERFRSE/Px8DBgwQY+7evauWRVpZWcHCwqLSNpcsWQI/P7/HXtfS0hJfffUVhg4div79+2PKlClwc3NDfn4+4uLiAACGhoZVnr9o0SK0a9cORkZ1/hHqnVmf7MSH7wTi01lD0dDGEopbSsTs+hVLv/pRjPls0yGYSk3w6ayhaGBljpTzV/D65Cjk3/t3zPvDFd+itOwBNkaEwtTUGD8nX8RbCzbjwYN/5wuNmxuLyBlv4NsvJgEA4n75He8v3Vl7b5ZIh4b4dsIdZQGWfvUjbt7KRZsWjtixciKaOtrWddeoFkgk6nPKnrSd6vrPf/6D7t27IyIiAkFBQUhKSsK6deuwbt26/29LgrCwMERERMDNzQ1ubm6IiIiAubk5goODAQAymQyhoaGYPn067OzsYGtrixkzZsDT0xP9+vUDUF598vf3x7hx47B27VoAwPjx4xEYGKgyd1iTOv9Gj4uLg6OjI4DyRKd169bYuXMnevXqJcaMHj1a7bzFixdXWanp06cP+vTpgwMHDjz22q+99hri4+MRGRmJt99+G3fu3IFMJkPnzp2xfft2tfslPaxVq1YYM2aM+B+Wak/+vSJ8uPxbfLj828fGRa7fj8j1+6s8XlRcilmf7sSsT6tOcu7m3sOEedrd/4roWTb2zVcw9s1X6robVAfKkyJd3NG6+rFdunTB7t27MXv2bCxcuBCurq5YuXIlhg8fLsbMnDkThYWFmDhxInJycuDl5YUDBw7AyurfuW4rVqyAkZERgoKCUFhYiL59+yImJkaleLF161ZMmTJFXKU2cODAaq9IF9+bwGU0tSo3NxcymQxSz3GQGJrUdXeI6kROsnb/UBHVN7m5uXCwk0GpVNb4tIqK753mk/8HA2nlIyzaeFBUgMtfvFErfa9tdV4pIiIiolqgo+EzLZ/y8VxhUkRERKQH+EBYzZ651WdEREREdYGVIiIiIj1QF6vPnjdMioiIiPSAgYEEBgZPn9EIOmjjWcXhMyIiIiKwUkRERKQXOHymGStFRERERGCliIiISC9wSb5mTIqIiIj0AIfPNOPwGRERERFYKSIiItILHD7TjEkRERGRHmBSpBmHz4iIiIjAShEREZFe4ERrzZgUERER6QEJdDR8hvqbFXH4jIiIiAisFBEREekFDp9pxqSIiIhID3D1mWYcPiMiIiICK0VERER6gcNnmjEpIiIi0gMcPtOMw2dEREREYKWIiIhIL3D4TDMmRURERHqAw2eacfiMiIiICKwUERER6QcdDZ/V46d8MCkiIiLSBxw+04zDZ0RERERgpYiIiEgvcPWZZkyKiIiI9ACHzzTj8BkRERERWCkiIiLSCxw+04xJERERkR7g8JlmHD4jIiIiAitFREREeoGVIs2YFBEREekBzinSjMNnRERERGBSREREpBcqhs90sVVXeHi42rlyuVw8LggCwsPD4eTkBDMzM/Tq1Qvnz59XaaOoqAiTJ09Gw4YNYWFhgYEDB+L69esqMTk5OQgJCYFMJoNMJkNISAju3r2r9WfEpIiIiEgPVAyf6WLTRrt27ZCZmSluv//+u3hs6dKlWL58OaKiopCcnAy5XA4fHx/k5eWJMWFhYdi9eze2b9+OEydOID8/H4GBgSgrKxNjgoODkZqairi4OMTFxSE1NRUhISFaf0acU0REREQ1xsjISKU6VEEQBKxcuRJz5szBkCFDAACxsbFwcHDAtm3bMGHCBCiVSkRHR2Pz5s3o168fAGDLli1wdnbGoUOH4Ofnh7S0NMTFxSExMRFeXl4AgPXr18Pb2xsXL16Eu7t7tfvKShEREZEe0PXwWW5urspWVFRU6XX/+usvODk5wdXVFcOGDcPly5cBAOnp6VAoFPD19RVjpVIpevbsifj4eABASkoKSkpKVGKcnJzg4eEhxiQkJEAmk4kJEQB069YNMplMjKkuJkVERER6QAIdDZ/9f3vOzs7iHB6ZTIbFixerXdPLywubNm3CTz/9hPXr10OhUKB79+64ffs2FAoFAMDBwUHlHAcHB/GYQqGAiYkJbGxsHhtjb2+vdm17e3sxpro4fEZERERay8jIgLW1tfhaKpWqxQQEBIj/39PTE97e3mjRogViY2PRrVs3AOr3PRIEQeNk7kdjKouvTjuPYqWIiIhIDxhIJDrbAMDa2lplqywpepSFhQU8PT3x119/ifOMHq3mZGVlidUjuVyO4uJi5OTkPDbm5s2batfKzs5Wq0Jp/Iy0iiYiIqLnUl2tPntYUVER0tLS4OjoCFdXV8jlchw8eFA8XlxcjOPHj6N79+4AgE6dOsHY2FglJjMzE+fOnRNjvL29oVQqkZSUJMacPHkSSqVSjKkuDp8RERFRjZgxYwYGDBiApk2bIisrCx9//DFyc3MxcuRISCQShIWFISIiAm5ubnBzc0NERATMzc0RHBwMAJDJZAgNDcX06dNhZ2cHW1tbzJgxA56enuJqtDZt2sDf3x/jxo3D2rVrAQDjx49HYGCgVivPACZFREREeqEunn12/fp1vPXWW7h16xYaNWqEbt26ITExES4uLgCAmTNnorCwEBMnTkROTg68vLxw4MABWFlZiW2sWLECRkZGCAoKQmFhIfr27YuYmBgYGhqKMVu3bsWUKVPEVWoDBw5EVFSU9u9NEARB67PoieXm5kImk0HqOQ4SQ5O67g5RnchJ1v4fK6L6JDc3Fw52MiiVSpXJyjV1LZlMhn7LDsPIzOKp2ystLMCh6X1rpe+1jXOKiIiIiMDhMyIiIv0g0W7o63Ht1FdMioiIiPTA064ce7id+orDZ0RERERgpYiIiEgvSP7/f7pop75iUkRERKQHDCTlmy7aqa84fEZEREQEVoqIiIj0Ql3cvPF5w6SIiIhID3D1mWbVSoo+//zzajc4ZcqUJ+4MERERUV2pVlK0YsWKajUmkUiYFBERET2DDCQSGOigzKOLNp5V1UqK0tPTa7ofREREVIM4fKbZE68+Ky4uxsWLF1FaWqrL/hARERHVCa2Tonv37iE0NBTm5uZo164drl27BqB8LtGSJUt03kEiIiJ6ehWrz3Sx1VdaJ0WzZ8/GmTNncOzYMZiamor7+/Xrhx07dui0c0RERKQbFcNnutjqK62X5O/Zswc7duxAt27dVLLFtm3b4tKlSzrtHBEREVFt0Topys7Ohr29vdr+goKCel1SIyIiep5x9ZlmWg+fdenSBT/88IP4uiIRWr9+Pby9vXXXMyIiItIZiQ63+krrStHixYvh7++PCxcuoLS0FJ999hnOnz+PhIQEHD9+vCb6SERERFTjtK4Ude/eHb/++ivu3buHFi1a4MCBA3BwcEBCQgI6depUE30kIiKip8TVZ5o90bPPPD09ERsbq+u+EBERUQ0xkJRvuminvnqipKisrAy7d+9GWloaJBIJ2rRpg0GDBsHIiM+XJSIioueT1lnMuXPnMGjQICgUCri7uwMA/vzzTzRq1Ah79+6Fp6enzjtJRERET0dXQ1/1efhM6zlFY8eORbt27XD9+nX89ttv+O2335CRkYH27dtj/PjxNdFHIiIi0gHeuPHxtK4UnTlzBqdOnYKNjY24z8bGBosWLUKXLl102jkiIiKi2qJ1pcjd3R03b95U25+VlYWWLVvqpFNERESkW1x9plm1KkW5ubni/4+IiMCUKVMQHh6Obt26AQASExOxcOFCREZG1kwviYiI6Klw9Zlm1UqKGjRooJIZCoKAoKAgcZ8gCACAAQMGoKysrAa6SURERFSzqpUUHT16tKb7QURERDWIq880q1ZS1LNnz5ruBxEREdUgXT23rP6mRE9480YAuHfvHq5du4bi4mKV/e3bt3/qThERERHVNq2TouzsbIwePRo//vhjpcc5p4iIiOjZYyCRwEAHQ1+6aONZpfWS/LCwMOTk5CAxMRFmZmaIi4tDbGws3NzcsHfv3proIxERET0lXdy4sb7fwFHrStGRI0fw3XffoUuXLjAwMICLiwt8fHxgbW2NxYsXo3///jXRTyIiIqIapXWlqKCgAPb29gAAW1tbZGdnAwA8PT3x22+/6bZ3REREpBO8eaNmT3RH64sXLwIAOnTogLVr1+LGjRtYs2YNHB0ddd5BIiIienocPtNM6+GzsLAwZGZmAgDmz58PPz8/bN26FSYmJoiJidF1/4iIiIhqhdaVouHDh2PUqFEAgI4dO+LKlStITk5GRkYGhg4dquv+ERERkQ5UrD7TxfakFi9eDIlEgrCwMHGfIAgIDw+Hk5MTzMzM0KtXL5w/f17lvKKiIkyePBkNGzaEhYUFBg4ciOvXr6vE5OTkICQkBDKZDDKZDCEhIbh7965W/dM6KXqUubk5XnzxRTRs2PBpmyIiIqJ6Kjk5GevWrVO7n+HSpUuxfPlyREVFITk5GXK5HD4+PsjLyxNjwsLCsHv3bmzfvh0nTpxAfn4+AgMDVW4DFBwcjNTUVMTFxSEuLg6pqakICQnRqo/VGj6bNm1atRtcvny5Vh0gIiKimqer+UBP0kZ+fj6GDx+O9evX4+OPPxb3C4KAlStXYs6cORgyZAgAIDY2Fg4ODti2bRsmTJgApVKJ6OhobN68Gf369QMAbNmyBc7Ozjh06BD8/PyQlpaGuLg4JCYmwsvLCwCwfv16eHt74+LFi3B3d69WP6uVFJ0+fbpajdXnGelERETPs7p89tmkSZPQv39/9OvXTyUpSk9Ph0KhgK+vr7hPKpWiZ8+eiI+Px4QJE5CSkoKSkhKVGCcnJ3h4eCA+Ph5+fn5ISEiATCYTEyIA6NatG2QyGeLj43WbFPGBsLp37dinsLa2rutuENWJ01fu1nUXiOpUQV5uXXfhqeXmqr4HqVQKqVSqFrd9+3b89ttvSE5OVjumUCgAAA4ODir7HRwccPXqVTHGxMQENjY2ajEV5ysUCvF2QQ+zt7cXY6rjqecUERER0bPPQIcbADg7O4uTmmUyGRYvXqx2zYyMDEydOhVbtmyBqalplX17tPokCILGitSjMZXFV6edhz3xA2GJiIjo+aHr4bOMjAyVEY/KqkQpKSnIyspCp06dxH1lZWX4+eefERUVJd73UKFQqNzrMCsrS6weyeVyFBcXIycnR6ValJWVhe7du4sxN2/eVLt+dna2WhXqcVgpIiIiIq1ZW1urbJUlRX379sXvv/+O1NRUcevcuTOGDx+O1NRUNG/eHHK5HAcPHhTPKS4uxvHjx8WEp1OnTjA2NlaJyczMxLlz58QYb29vKJVKJCUliTEnT56EUqkUY6qDlSIiIiI9IJEABrW8+szKygoeHh4q+ywsLGBnZyfuDwsLQ0REBNzc3ODm5oaIiAiYm5sjODgYACCTyRAaGorp06fDzs4Otra2mDFjBjw9PcXVaG3atIG/vz/GjRuHtWvXAgDGjx+PwMDAak+yBpgUERER6QUDHSVFumjjYTNnzkRhYSEmTpyInJwceHl54cCBA7CyshJjVqxYASMjIwQFBaGwsBB9+/ZFTEwMDA0NxZitW7diypQp4iq1gQMHIioqSqu+SARBELR9A5s3b8aaNWuQnp6OhIQEuLi4YOXKlXB1dcWgQYO0bU6v5ObmQiaT4eZtJVefkd7i6jPSdwV5ufB50QVKZc1/F1R870z8OhlSc8unbq/oXj5WvdWlVvpe27SeU7R69WpMmzYNr776Ku7evSveTbJBgwZYuXKlrvtHREREOvC4p95ru9VXWidFX3zxBdavX485c+aolK06d+6M33//XaedIyIiIt2oGD7TxVZfaZ0Upaeno2PHjmr7pVIpCgoKdNIpIiIiotqmdVLk6uqK1NRUtf0//vgj2rZtq4s+ERERkY5VPPtMF1t9pfXqs/fffx+TJk3C/fv3IQgCkpKS8PXXX2Px4sX46quvaqKPRERE9JQMJBIY6CCj0UUbzyqtk6LRo0ejtLQUM2fOxL179xAcHIzGjRvjs88+w7Bhw2qij0REREQ17onuUzRu3DiMGzcOt27dwoMHDyp9CBsRERE9Ox5+btnTtlNfPdXNGxs2bKirfhAREVEN0tV8oHo8eqZ9UuTq6vrYexRcvnz5qTpEREREVBe0TorCwsJUXpeUlOD06dOIi4vD+++/r6t+ERERkQ4ZQEcTrVF/S0VaJ0VTp06tdP+XX36JU6dOPXWHiIiISPc4fKaZzuZLBQQE4Ntvv9VVc0RERES16qkmWj/sf//7H2xtbXXVHBEREemQrh7RUZ8f86F1UtSxY0eVidaCIEChUCA7OxurVq3SaeeIiIhINyQS3dx4sT4Pn2mdFA0ePFjltYGBARo1aoRevXqhdevWuuoXERERUa3SKikqLS1Fs2bN4OfnB7lcXlN9IiIiIh3jRGvNtJpobWRkhHfffRdFRUU11R8iIiKqARVzinSx1Vdarz7z8vLC6dOna6IvRERERHVG6zlFEydOxPTp03H9+nV06tQJFhYWKsfbt2+vs84RERGRbkj+/3+6aKe+qnZSNGbMGKxcuRJDhw4FAEyZMkU8JpFIIAgCJBIJysrKdN9LIiIieipckq9ZtZOi2NhYLFmyBOnp6TXZHyIiIqI6Ue2kSBAEAICLi0uNdYaIiIhqBitFmmk1p0hSn9fhERER1WMSiUQn3+P1ORfQKilq1aqVxg/jzp07T9UhIiIiorqgVVK0YMECyGSymuoLERER1RAOn2mmVVI0bNgw2Nvb11RfiIiIqIbwjtaaVfvmjfV5DJGIiIhI69VnRERE9PwxkEhgoIMChy7aeFZVOyl68OBBTfaDiIiIahDnFGmm9bPPiIiIiOojrZ99RkRERM8hHU20rsePPmNSREREpA8MIIGBDjIaXbTxrOLwGRERERFYKSIiItILvE+RZkyKiIiI9ABXn2nG4TMiIiIisFJERESkF3jzRs1YKSIiItIDFXOKdLFV1+rVq9G+fXtYW1vD2toa3t7e+PHHH8XjgiAgPDwcTk5OMDMzQ69evXD+/HmVNoqKijB58mQ0bNgQFhYWGDhwIK5fv64Sk5OTg5CQEMhkMshkMoSEhODu3btaf0ZMioiIiKhGNGnSBEuWLMGpU6dw6tQp9OnTB4MGDRITn6VLl2L58uWIiopCcnIy5HI5fHx8kJeXJ7YRFhaG3bt3Y/v27Thx4gTy8/MRGBiIsrIyMSY4OBipqamIi4tDXFwcUlNTERISonV/JQIfalarcnNzIZPJcPO2EtbW1nXdHaI6cfrK3bruAlGdKsjLhc+LLlAqa/67oOJ754vD52BmafXU7RXm52FyX48n7rutrS0++eQTjBkzBk5OTggLC8OsWbMAlFeFHBwcEBkZiQkTJkCpVKJRo0bYvHkzhg4dCgD4559/4OzsjP3798PPzw9paWlo27YtEhMT4eXlBQBITEyEt7c3/vjjD7i7u1e7b6wUERER6YG6GD57WFlZGbZv346CggJ4e3sjPT0dCoUCvr6+YoxUKkXPnj0RHx8PAEhJSUFJSYlKjJOTEzw8PMSYhIQEyGQyMSECgG7dukEmk4kx1cWJ1kRERKS13NxclddSqRRSqVQt7vfff4e3tzfu378PS0tL7N69G23bthUTFgcHB5V4BwcHXL16FQCgUChgYmICGxsbtRiFQiHG2Nvbq13X3t5ejKkuVoqIiIj0gIEONwBwdnYWJzbLZDIsXry40uu6u7sjNTUViYmJePfddzFy5EhcuHBBPC55pPQkCILavkc9GlNZfHXaeRQrRURERHpAIpFonSRU1Q4AZGRkqMwpqqxKBAAmJiZo2bIlAKBz585ITk7GZ599Js4jUigUcHR0FOOzsrLE6pFcLkdxcTFycnJUqkVZWVno3r27GHPz5k2162ZnZ6tVoTRhpYiIiIi0VrHMvmKrKil6lCAIKCoqgqurK+RyOQ4ePCgeKy4uxvHjx8WEp1OnTjA2NlaJyczMxLlz58QYb29vKJVKJCUliTEnT56EUqkUY6qLlSIiIiI9IPn/TRftVNeHH36IgIAAODs7Iy8vD9u3b8exY8cQFxcHiUSCsLAwREREwM3NDW5uboiIiIC5uTmCg4MBADKZDKGhoZg+fTrs7Oxga2uLGTNmwNPTE/369QMAtGnTBv7+/hg3bhzWrl0LABg/fjwCAwO1WnkGMCkiIiLSC3VxR+ubN28iJCQEmZmZkMlkaN++PeLi4uDj4wMAmDlzJgoLCzFx4kTk5OTAy8sLBw4cgJXVv7cOWLFiBYyMjBAUFITCwkL07dsXMTExMDQ0FGO2bt2KKVOmiKvUBg4ciKioKK3fG+9TVMt4nyIi3qeIqC7uU7Tu2AWd3adofK+2tdL32sZKERERkZ6ov08t0w0mRURERHrgaW68+Gg79RVXnxERERGBlSIiIiK9oOv7FNVHTIqIiIj0wMN3o37aduqr+vzeiIiIiKqNlSIiIiI9wOEzzZgUERER6YG6uKP184bDZ0RERERgpYiIiEgvcPhMMyZFREREeoCrzzSrz++NiIiIqNpYKSIiItIDHD7TjEkRERGRHuDqM804fEZEREQEVoqIiIj0gkSimyfc1+PRMyZFRERE+sAAEhjoYPBLF208qzh8RkRERARWioiIiPQCh880Y1JERESkByT//z9dtFNfcfiMiIiICKwUERER6QUOn2nGShERERERWCkiIiLSCxIdLcmvz3OKmBQRERHpAQ6facbhMyIiIiKwUkRERKQXWCnSjEkRERGRHuB9ijTj8BkRERERWCkiIiLSCwaS8k0X7dRXTIqIiIj0AIfPNOPwGRERERFYKSIiItILXH2mGZMiIiIiPSCBboa+6nFOxOEzIiIiIoCVIiIiIr3A1WeaMSkivbBk3Q+IXP+jyj57Wytc/GlxHfWI6OmcuZCOHXtP4K/L/+B2Th4Wvh+Ml7q2FY/fuZuP9Vt+wqmzfyO/4D7at2mGyaH90cSxoRhzQ3EbazbF4dwfV1FSWoYuHdwweUwgbBtYijFvTfwUN7Pvqlx72KCXMX6EX42/R9Itrj7TjEkR6Y3WzR2x58vJ4mtDw/r7i0313/2iErRwkcO/94sI//RrlWOCIGDe0q0wNDLAf2cOh7mZFP/b9ytmLNyIjSumwszUBIX3izHz4xi0cHHEsvljAAAbdxzGnCWb8WXEBBgY/Du7YvTQvujft7P42szUpHbeJFEte2bmFMXHx8PQ0BD+/v4AgFGjRkEikTzVFhMTAwAoLCyEjY0NbG1tUVhYWOn1v/32W/Tq1QsymQyWlpZo3749Fi5ciDt37gAAYmJi0KBBA5Vz0tLS0KRJEwwZMgRFRUU19tmQbhgZGsChobW4NbSxqusuET0xr46tEPqWD17xaqd27HrmbVz4KwNh4waidcsmaNq4EaaOHYj794tx5NezAIBzF6/iZtZdzJo0BM1d5GjuIsfMiUNw8dINnD53WaU9MzMpbG2sxM3MTFor75F0q2L1mS626lq8eDG6dOkCKysr2NvbY/Dgwbh48aJKjCAICA8Ph5OTE8zMzNCrVy+cP39eJaaoqAiTJ09Gw4YNYWFhgYEDB+L69esqMTk5OQgJCYFMJoNMJkNISAju3r2r1Wf0zCRFGzZswOTJk3HixAlcu3YNn332GTIzM8UNADZu3Ci+vnr1qsrxoKAg+Pv7q+wbOnQogPKEx8PDA23btsWuXbvUrj1nzhwMHToUXbp0wY8//ohz585h2bJlOHPmDDZv3lxpf5OTk/Hyyy/Dz88PO3fuhFTKfySedZczstEm4EO8MGg+xny4AVeu36rrLhHViJKSUgCAifG/gwGGhgYwMjLEubSr/x9TBkgkMH4oxsTYCAYSCX7/46pKe9v3/IzBoxdh3IwobPn2mNg+PV8kOtyq6/jx45g0aRISExNx8OBBlJaWwtfXFwUFBWLM0qVLsXz5ckRFRSE5ORlyuRw+Pj7Iy8sTY8LCwrB7925s374dJ06cQH5+PgIDA1FWVibGBAcHIzU1FXFxcYiLi0NqaipCQkK0+oyeieGzgoICfPPNN0hOToZCoUBMTAzmzZsHmUymEtegQQPI5fJK2zAzM0NRUVGlx6OjozFixAgIgoDo6GgMHz5cPJaUlISIiAisXLkSU6dOFfc3a9YMPj4+lWaZR44cwaBBg/DOO+/gk08+ecJ3TbWpU7tmWL0gBC2a2iP7dh4+3RAHv9BlSNgxR2X+BFF90LRxIzg0aoCvth3EtPGDYCo1xs59v+LO3Xzcvlv+RdPWzRlmUmOs2/ITxgb7QBCAdVt+wgNBwJ2cf7+MhrzqjVauTrC0NMMff1/HV1sPQJGVgxnvvlZXb4+eI3FxcSqvN27cCHt7e6SkpOCVV16BIAhYuXIl5syZgyFDhgAAYmNj4eDggG3btmHChAlQKpWIjo7G5s2b0a9fPwDAli1b4OzsjEOHDsHPzw9paWmIi4tDYmIivLy8AADr16+Ht7c3Ll68CHd392r195moFO3YsQPu7u5wd3fHiBEjsHHjRgiCoJO2L126hISEBAQFBSEoKAjx8fG4fPnf0vDWrVthaWmJiRMnVnr+o0Nmu3fvRv/+/TFnzpxqJURFRUXIzc1V2aj2+fRoh4F9OqJdy8bo5dUaO1a+CwD4+oeTddwzIt0zMjLEgulv4fo/tzBo9CIEjFiIM+evoGvHVuJcoQYyC8ybPgwJKX+gf8h/MWDkxyi4dx9urk4q84neDOyBF9q5ooWLHP37dsZ/xg/C/iMpUObdq6u3R0/IABIYSHSw/X+t6NHvtupMI1EqlQAAW1tbAEB6ejoUCgV8fX3FGKlUip49eyI+Ph4AkJKSgpKSEpUYJycneHh4iDEJCQmQyWRiQgQA3bp1g0wmE2Oq45moFFVUcgDA398f+fn5OHz4sJgRPo0NGzYgICAANjY2YvsbNmzAxx9/DAD466+/0Lx5cxgbG2tsKz8/H2+++SY+/PBDfPDBB9W6/uLFi7FgwYInfwNUIyzMpGjb0gmXMrLruitENaJVi8ZY/+l7yC+4j9LSMjSQWWDi7DVwb9FYjOnyghu2Rk2HMrcAhoYGsLQww+tjl0Bub1Nlu23cnAEA/yhuQ2ZlXuPvg3RH26Gvx7UDAM7Ozir758+fj/Dw8CrPEwQB06ZNw0svvQQPDw8AgEKhAAA4ODioxDo4OODq1atijImJifg9/nBMxfkKhQL29vZq17S3txdjqqPOK0UXL15EUlIShg0bBgAwMjLC0KFDsWHDhqduu6ysDLGxsWLCBQAjRoxAbGysOA4pCAIk1Zw1ZmZmBh8fH6xfvx5paWnVOmf27NlQKpXilpGRof0bIZ0rKi7Bn1duQm4n0xxM9ByztDBFA5kFrmfewp+XbqB7l9ZqMTJrC1hamOG33y/hbm4BundWj6nw95V/AAC2DbhQQd9lZGSofL/Nnj37sfHvvfcezp49i6+//lrt2KPfw9X5bn40prJ4bb7jgWegUhQdHY3S0lI0bvzvXy+CIMDY2Bg5OTlqmaE2fvrpJ9y4cUOccF2hrKwMBw4cQEBAAFq1aoUTJ06gpKREY7XI0NAQe/bsweuvv47evXvjyJEjaNu27WPPkUqlnIT9DJi7chf8X/ZEE7kNsnPy8Wl0HPIK7mNYoJfmk4meQYWFRbihuCO+zszKwd/pmbCyNINDowY4lnAODazNYd+wAdKv3UTUxh/Qo2sbdHnBTTznx6MpcGlsD5m1OS78mYEvN/6AN/p3R9PGjQAA5y9ew4W/MtCxXXNYmEtx8dINfBmzH907t4ZDowa1/Zbpaem4VGRtbQ1ra+tqnTJ58mTs3bsXP//8M5o0aSLur5gHrFAo4OjoKO7PysoSq0dyuRzFxcVqOUFWVha6d+8uxty8eVPtutnZ2WpVqMep06SotLQUmzZtwrJly1TGCgHg9ddfx9atW/Hee+89cfvR0dEYNmwY5syZo7J/yZIliI6ORkBAAIKDg/H5559j1apVKhOtK9y9e1dlXpFUKsWuXbvwxhtvoHfv3jh8+LBYBqRn142suxj70UbcvluAhjaW6OzRDAc2TEdTR9u67hrRE7l4+Qamhf9bUV8dW35zUr+eHTHrvddxJycPq2P3I+duAWxtLOHbsyNCXu+l0kbGjVv4autB5OUXQm7fAMOH9MIbgd3F48bGRjgW/zs27TyKkpJSODRqgP79OmPYoJdr5T2SbtXFzRsFQcDkyZOxe/duHDt2DK6urirHXV1dIZfLcfDgQXTs2BEAUFxcjOPHjyMyMhIA0KlTJxgbG+PgwYMICgoCAGRmZuLcuXNYunQpAMDb2xtKpRJJSUno2rUrAODkyZNQKpVi4lQddZoU7du3Dzk5OQgNDVVbafbGG28gOjr6iZOi7OxsfP/999i7d69a0jJy5Ej0798f2dnZ8PLywsyZMzF9+nTcuHEDr732GpycnPD3339jzZo1eOmll9SSJRMTE3z77bcICgpCnz59cPjwYXh6ej5RP6l2bIgYU9ddINKpDu2a48jOj6s8PuRVbwx51fuxbYwf4ffYO1O3au6ELyPeeeI+Ek2aNAnbtm3Dd999BysrK3F+j0wmg5mZGSQSCcLCwhAREQE3Nze4ubkhIiIC5ubmCA4OFmNDQ0Mxffp02NnZwdbWFjNmzICnp6c497hNmzbw9/fHuHHjsHbtWgDA+PHjERgYWO2VZ0AdzymKjo5Gv3791BIioLxSlJqait9+++2J2t60aRMsLCzQt29ftWO9e/eGlZWVeA+iyMhIbNu2DSdPnoSfnx/atWuHadOmoX379hg5cmSl7RsbG+Obb77BK6+8gj59+uDs2bNP1E8iIqJaoasbN2pRbFq9ejWUSiV69eoFR0dHcduxY4cYM3PmTISFhWHixIno3Lkzbty4gQMHDsDK6t95aytWrMDgwYMRFBSEHj16wNzcHN9//z0MDQ3FmK1bt8LT0xO+vr7w9fVF+/btq7zXYJUfkaCrte9ULbm5uZDJZLh5W1ntsVii+ub0lbt13QWiOlWQlwufF12gVNb8d0HF986R1GuwtHr6a+Xn5aJPh6a10vfaVuerz4iIiIieBXW++oyIiIhqga5vVFQPMSkiIiLSA3Wx+ux5w+EzIiIiIrBSREREpBfE1WM6aKe+YlJERESkBzilSDMOnxERERGBlSIiIiL9wFKRRkyKiIiI9ABXn2nG4TMiIiIisFJERESkF7j6TDMmRURERHqAU4o04/AZEREREVgpIiIi0g8sFWnEpIiIiEgPcPWZZhw+IyIiIgIrRURERHqBq880Y1JERESkBzilSDMOnxERERGBlSIiIiL9wFKRRkyKiIiI9ABXn2nG4TMiIiIisFJERESkF7j6TDMmRURERHqAU4o04/AZEREREVgpIiIi0g8sFWnEpIiIiEgPcPWZZhw+IyIiIgIrRURERHqBq880Y1JERESkBzilSDMOnxERERGBlSIiIiL9wFKRRkyKiIiI9ABXn2nG4TMiIiIisFJERESkH3S0+qweF4qYFBEREekDTinSjMNnRERERGBSREREpB8kOty08PPPP2PAgAFwcnKCRCLBnj17VI4LgoDw8HA4OTnBzMwMvXr1wvnz51ViioqKMHnyZDRs2BAWFhYYOHAgrl+/rhKTk5ODkJAQyGQyyGQyhISE4O7du1r1lUkRERGRHpDo8H/aKCgowAsvvICoqKhKjy9duhTLly9HVFQUkpOTIZfL4ePjg7y8PDEmLCwMu3fvxvbt23HixAnk5+cjMDAQZWVlYkxwcDBSU1MRFxeHuLg4pKamIiQkRKu+ck4RERER1ZiAgAAEBARUekwQBKxcuRJz5szBkCFDAACxsbFwcHDAtm3bMGHCBCiVSkRHR2Pz5s3o168fAGDLli1wdnbGoUOH4Ofnh7S0NMTFxSExMRFeXl4AgPXr18Pb2xsXL16Eu7t7tfrKShEREZEeqHj2mS42AMjNzVXZioqKtO5Teno6FAoFfH19xX1SqRQ9e/ZEfHw8ACAlJQUlJSUqMU5OTvDw8BBjEhISIJPJxIQIALp16waZTCbGVAeTIiIiIj2g6ylFzs7O4vwdmUyGxYsXa90nhUIBAHBwcFDZ7+DgIB5TKBQwMTGBjY3NY2Ps7e3V2re3txdjqoPDZ0RERKS1jIwMWFtbi6+lUukTtyV55AZKgiCo7XvUozGVxVennYexUkRERKQPdFwqsra2VtmeJCmSy+UAoFbNycrKEqtHcrkcxcXFyMnJeWzMzZs31drPzs5Wq0I9DpMiIiIiPVBXq88ex9XVFXK5HAcPHhT3FRcX4/jx4+jevTsAoFOnTjA2NlaJyczMxLlz58QYb29vKJVKJCUliTEnT56EUqkUY6qDw2dERERUY/Lz8/H333+Lr9PT05GamgpbW1s0bdoUYWFhiIiIgJubG9zc3BAREQFzc3MEBwcDAGQyGUJDQzF9+nTY2dnB1tYWM2bMgKenp7garU2bNvD398e4ceOwdu1aAMD48eMRGBhY7ZVnAJMiIiIivSCBbp59pm0Tp06dQu/evcXX06ZNAwCMHDkSMTExmDlzJgoLCzFx4kTk5OTAy8sLBw4cgJWVlXjOihUrYGRkhKCgIBQWFqJv376IiYmBoaGhGLN161ZMmTJFXKU2cODAKu+NVOV7EwRB0PL90VPIzc2FTCbDzdtKlQlqRPrk9JW7dd0FojpVkJcLnxddoFTW/HdBxffO+fQsWOngWnm5uWjnal8rfa9tnFNEREREBA6fERER6YWHb7z4tO3UV0yKiIiI9MITPM21ynbqJw6fEREREYGVIiIiIr3A4TPNmBQRERHpAQ6eacbhMyIiIiKwUkRERKQXOHymGStFRERERGCliIiISC/o6mGuunwg7LOGSREREZE+4ExrjTh8RkRERARWioiIiPQCC0WaMSkiIiLSA1x9phmHz4iIiIjAShEREZFe4OozzZgUERER6QNOKtKIw2dEREREYKWIiIhIL7BQpBmTIiIiIj3A1WeacfiMiIiICKwUERER6QndrD6rzwNoTIqIiIj0AIfPNOPwGRERERGYFBEREREB4PAZERGRXuDwmWasFBERERGBlSIiIiK9wGefacakiIiISA9w+EwzDp8RERERgZUiIiIivcBnn2nGpIiIiEgfMCvSiMNnRERERGCliIiISC9w9ZlmTIqIiIj0AFefacbhMyIiIiKwUkRERKQXOM9aM1aKiIiI9IFEh5uWVq1aBVdXV5iamqJTp0745Zdfnvbd1AgmRURERFRjduzYgbCwMMyZMwenT5/Gyy+/jICAAFy7dq2uu6aGSREREZEekOjwf9pYvnw5QkNDMXbsWLRp0wYrV66Es7MzVq9eXUPv9MkxKSIiItIDFavPdLFVV3FxMVJSUuDr66uy39fXF/Hx8Tp+h0+PE61rmSAIAIC83Nw67glR3SnI488/6beC/DwA/34n1IZcHX3vVLTzaHtSqRRSqVRl361bt1BWVgYHBweV/Q4ODlAoFDrpjy4xKapleXnlvwgtXZ3ruCdERFTX8vLyIJPJavQaJiYmkMvlcNPh946lpSWcnVXbmz9/PsLDwyuNlzxSXhIEQW3fs4BJUS1zcnJCRkYGrKysnskfCH2Qm5sLZ2dnZGRkwNrauq67Q1Tr+DtQ9wRBQF5eHpycnGr8WqampkhPT0dxcbHO2qwsqXm0SgQADRs2hKGhoVpVKCsrS6169CxgUlTLDAwM0KRJk7ruBgGwtrbmFwLpNf4O1K2arhA9zNTUFKamprV2vQomJibo1KkTDh48iNdee03cf/DgQQwaNKjW+6MJkyIiIiKqMdOmTUNISAg6d+4Mb29vrFu3DteuXcM777xT111Tw6SIiIiIaszQoUNx+/ZtLFy4EJmZmfDw8MD+/fvh4uJS111Tw6SI9I5UKsX8+fMrHf8m0gf8HaDaNnHiREycOLGuu6GRRKjN9YBEREREzyjevJGIiIgITIqIiIiIADApIiIiIgLApIieMaNGjYJEIhE3Ozs7+Pv74+zZs2LMw8cf3rZv3w4AOHbsGCQSCTw8PFBWVqbSfoMGDRATEyO+btasGVauXKkSc/r0aQwdOhSOjo6QSqVwcXFBYGAgvv/+e/GW/FeuXIFEIoG9vb14l/IKHTp0qPKurkTaiI+Ph6GhIfz9/QGo/348yVbx819YWAgbGxvY2tqisLCw0ut/++236NWrF2QyGSwtLdG+fXssXLgQd+7cAQDExMSgQYMGKuekpaWhSZMmGDJkCIqKimrssyGqCUyK6Jnj7++PzMxMZGZm4vDhwzAyMkJgYKBKzMaNG8WYim3w4MEqMZcuXcKmTZu0uvZ3332Hbt26IT8/H7Gxsbhw4QJ27tyJwYMH46OPPoJSqVSJz8vLw6effvpE75NIkw0bNmDy5Mk4ceIErl27hs8++0zlZx5Q/V24evWqyvGgoCCV36fMzEwMHToUQHnC4+HhgbZt22LXrl1q154zZw6GDh2KLl264Mcff8S5c+ewbNkynDlzBps3b660v8nJyXj55Zfh5+eHnTt3cnUbPXe4JJ+eOVKpFHK5HAAgl8sxa9YsvPLKK8jOzkajRo0AlFd8KmKqMnnyZMyfPx9vvfVWte7kWlBQgNDQUPTv31/lS6JFixbo2rUrxo4dq/bwxsmTJ2P58uWYNGkS7O3ttX2rRFUqKCjAN998g+TkZCgUCsTExGDevHlqd0F+3O+CmZkZioqKKj0eHR2NESNGQBAEREdHY/jw4eKxpKQkREREYOXKlZg6daq4v1mzZvDx8cHdu3fV2jty5AgGDRqEd955B5988skTvmuiusVKET3T8vPzsXXrVrRs2RJ2dnZanRsWFobS0lJERUVVK/7AgQO4ffs2Zs6cWWXMo8/6eeutt9CyZUssXLhQq74RabJjxw64u7vD3d0dI0aMwMaNG3X2RPVLly4hISEBQUFBCAoKQnx8PC5fviwe37p1KywtLau8r8yjQ2a7d+9G//79MWfOHCZE9FxjUkTPnH379sHS0hKWlpawsrLC3r17sWPHDhgY/Pvj+tZbb4kxFdvD/6gDgLm5OebPn4/FixerDXtV5s8//wQAuLu7i/uSk5NVrrFv3z6VcyQSCZYsWYJ169bh0qVLT/O2iVRUVHKA8iHl/Px8HD58WCdtb9iwAQEBAeKcIn9/f2zYsEE8/tdff6F58+YwNjbW2FZ+fj7efPNNvP/++/jggw900j+iusKkiJ45vXv3RmpqKlJTU3Hy5En4+voiICAAV69eFWNWrFghxlRszs7Oam2FhoaiYcOGiIyMfKK+tG/fXmy/oKAApaWlajF+fn546aWXMHfu3Ce6BtGjLl68iKSkJAwbNgwAYGRkhKFDh6okLk+qrKwMsbGxYsIFACNGjEBsbKy4MKGyJ6BXxczMDD4+Pli/fj3S0tKeun9EdYlziuiZY2FhgZYtW4qvO3XqBJlMhvXr1+Pjjz8GUD7X6OGYqhgZGeHjjz/GqFGj8N577z021s3NDUD5F1K3bt0AlM9vqs51lixZAm9vb7z//vsaY4k0iY6ORmlpKRo3bizuEwQBxsbGyMnJgY2NzRO3/dNPP+HGjRvihOsKZWVlOHDgAAICAtCqVSucOHECJSUlGqtFhoaG2LNnD15//XX07t0bR44cQdu2bZ+4f0R1iZUieuZJJBIYGBhUuWxYkzfffBPt2rXDggULHhvn6+sLW1vbJ6oqde3aFUOGDOHwAT210tJSbNq0CcuWLVOphJ45cwYuLi7YunXrU7UfHR2NYcOGqVVahw8fjujoaABAcHAw8vPzsWrVqkrbeHSitVQqxa5du9C1a1f07t0b586de6o+EtUVVoromVNUVASFQgEAyMnJQVRUFPLz8zFgwAAx5u7du2JMBSsrK1hYWFTa5pIlS+Dn5/fY61paWuKrr77C0KFD0b9/f0yZMgVubm7Iz89HXFwcgPK/iquyaNEitGvXDkZG/LWiJ7dv3z7k5OQgNDRUbaXZG2+8gejoaI1Vz6pkZ2fj+++/x969e+Hh4aFybOTIkejfvz+ys7Ph5eWFmTNnYvr06bhx4wZee+01ODk54e+//8aaNWvw0ksvqaxKAwATExN8++23CAoKQp8+fXD48GF4eno+UT+J6gorRfTMiYuLg6OjIxwdHeHl5YXk5GTs3LkTvXr1EmNGjx4txlRsX3zxRZVt9unTB3369Kl0TtDDXnvtNcTHx8Pc3Bxvv/023N3d0adPHxw5cgTbt29Xu1/Sw1q1aoUxY8bg/v37Wr9nogrR0dHo16+fWkIEAK+//jpSU1Px22+/PVHbmzZtgoWFBfr27at2rHfv3rCyshLvQRQZGYlt27bh5MmT8PPzQ7t27TBt2jS0b98eI0eOrLR9Y2NjfPPNN3jllVfQp08flZuuEj0PJIKu1ngSERERPcdYKSIiIiICkyIiIiIiAEyKiIiIiAAwKSIiIiICwKSIiIiICACTIiIiIiIATIqIiIiIADApIiIiIgLApIiIqhAeHo4OHTqIr0eNGoXBgwfXej+uXLkCiUSC1NTUKmOaNWuGlStXVrvNmJgYNGjQ4Kn7JpFIsGfPnqduh4ieDUyKiJ4jo0aNgkQigUQigbGxMZo3b44ZM2agoKCgxq/92WefISYmplqx1UlkiIieNXxyJdFzxt/fHxs3bkRJSQl++eUXjB07FgUFBVi9erVabElJCYyNjXVy3cqexUVEVJ+wUkT0nJFKpZDL5XB2dkZwcDCGDx8uDuFUDHlt2LABzZs3h1QqhSAIUCqVGD9+POzt7WFtbY0+ffrgzJkzKu0uWbIEDg4OsLKyQmhoqNqDbR8dPnvw4AEiIyPRsmVLSKVSNG3aFIsWLQIAuLq6AgA6duwIiUSi8jDfjRs3ok2bNjA1NUXr1q2xatUqleskJSWhY8eOMDU1RefOnXH69GmtP6Ply5fD09MTFhYWcHZ2xsSJE5Gfn68Wt2fPHrRq1Qqmpqbw8fFBRkaGyvHvv/8enTp1gqmpKZo3b44FCxZofKgwET2/mBQRPefMzMxQUlIivv7777/xzTff4NtvvxWHr/r37w+FQoH9+/cjJSUFL774Ivr27Ys7d+4AAL755hvMnz8fixYtwqlTp+Do6KiWrDxq9uzZiIyMxNy5c3HhwgVs27YNDg4OAMoTGwA4dOgQMjMzsWvXLgDA+vXrMWfOHCxatAhpaWmIiIjA3LlzERsbCwAoKChAYGAg3N3dkZKSgvDwcMyYMUPrz8TAwACff/45zp07h9jYWBw5cgQzZ85Uibl37x4WLVqE2NhY/Prrr8jNzcWwYcPE4z/99BNGjBiBKVOm4MKFC1i7di1iYmLExI+I6iGBiJ4bI0eOFAYNGiS+PnnypGBnZycEBQUJgiAI8+fPF4yNjYWsrCwx5vDhw4K1tbVw//59lbZatGghrF27VhAEQfD29hbeeecdleNeXl7CCy+8UOm1c3NzBalUKqxfv77SfqanpwsAhNOnT6vsd3Z2FrZt26ay77///a/g7e0tCIIgrF27VrC1tRUKCgrE46tXr660rYe5uLgIK1asqPL4N998I9jZ2YmvN27cKAAQEhMTxX1paWkCAOHkyZOCIAjCyy+/LERERKi0s3nzZsHR0VF8DUDYvXt3ldcloucL5xQRPWf27dsHS0tLlJaWoqSkBIMGDcIXX3whHndxcUGjRo3E1ykpKcjPz4ednZ1KO4WFhbh06RIAIC0tDe+8847KcW9vbxw9erTSPqSlpaGoqAh9+/atdr+zs7ORkZGB0NBQjBs3TtxfWloqzldKS0vDCy+8AHNzc5V+aOvo0aOIiIjAhQsXkJubi9LSUty/fx8FBQWwsLAAABgZGaFz587iOa1bt0aDBg2QlpaGrl27IiUlBcnJySqVobKyMty/fx/37t1T6SMR1Q9MioieM71798bq1athbGwMJycntYnUFV/6FR48eABHR0ccO3ZMra0nXZZuZmam9TkPHjwAUD6E5uXlpXLM0NAQACAIwhP152FXr17Fq6++infeeQf//e9/YWtrixMnTiA0NFRlmBEoX1L/qIp9Dx48wIIFCzBkyBC1GFNT06fuJxE9e5gUET1nLCws0LJly2rHv/jii1AoFDAyMkKzZs0qjWnTpg0SExPx9ttvi/sSExOrbNPNzQ1mZmY4fPgwxo4dq3bcxMQEQHllpYKDgwMaN26My5cvY/jw4ZW227ZtW2zevBmFhYVi4vW4flTm1KlTKC0txbJly2BgUD5t8ptvvlGLKy0txalTp9C1a1cAwMWLF3H37l20bt0aQPnndvHiRa0+ayJ6vjEpIqrn+vXrB29vbwwePBiRkZFwd3fHP//8g/3792Pw4MHo3Lkzpk6dipEjR6Jz58546aWXsHXrVpw/fx7NmzevtE1TU1PMmjULM2fOhImJCXr06IHs7GycP38eoaGhsLe3h5mZGeLi4tCkSROYmppCJpMhPDwcU6ZMgbW1NQICAlBUVIRTp04hJycH06ZNQ3BwMObMmYPQ0FB89NFHuHLlCj799FOt3m+LFi1QWlqKL774AgMGDMCvv/6KNWvWqMUZGxtj8uTJ+Pzzz2FsbIz33nsP3bp1E5OkefPmITAwEM7OznjzzTdhYGCAs2fP4vfff8fHH3+s/X8IInrmcfUZUT0nkUiwf/9+vPLKKxgzZgxatWqFYcOG4cqVK+JqsaFDh2LevHmYNWsWOnXqhKtXr+Ldd999bLtz587F9OnTMW/ePLRp0wZDhw5FVlYWgPL5Op9//jnWrl0LJycnDBo0CAAwduxYfPXVV4iJiYGnpyd69uyJmJgYcQm/paUlvv/+e1y4cAEdO3bEnDlzEBkZqdX77dChA5YvX47IyEh4eHhg69atWLx4sVqcubk5Zs2aheDgYHh7e8PMzAzbt28Xj/v5+WHfvn04ePAgunTpgm7dumH58uVwcXHRqj9E9PyQCLoYxCciIiJ6zrFSRERERAQmRUREREQAmBQRERERAWBSRERERASASRERERERACZFRERERACYFBEREREBYFJEREREBIBJEREREREAJkVEREREAJgUEREREQFgUkREREQEAPg/mm39LBoX+EoAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cm = confusion_matrix(y_test, y_pred)\n", "tn, fp, fn, tp = cm.ravel()\n", "\n", "baseline_metrics = {\n", " \"accuracy\": accuracy_score(y_test, y_pred),\n", " \"attack_precision\": precision_score(y_test, y_pred, zero_division=0),\n", " \"attack_recall\": recall_score(y_test, y_pred, zero_division=0),\n", " \"attack_f1\": f1_score(y_test, y_pred, zero_division=0),\n", " \"false_positives\": int(fp),\n", " \"false_negatives\": int(fn),\n", "}\n", "\n", "print(pd.Series(baseline_metrics).round(3))\n", "print(f\"False positives: {fp} | False negatives: {fn}\")\n", "\n", "display = ConfusionMatrixDisplay(cm, display_labels=[\"BENIGN\", \"ATTACK\"])\n", "display.plot(cmap=\"Blues\")\n", "plt.title(\"CIC-IDS2017 binary intrusion detector\")\n", "plt.tight_layout()\n", "plt.savefig(OUTPUT_DIR / \"capstone_confusion_matrix.png\", dpi=150, bbox_inches=\"tight\")\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "f756354e", "metadata": {}, "source": [ "## 5. Inspect feature importance\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "414b0f9b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Bwd Packet Length Max 0.087949\n", "Packet Length Std 0.078237\n", "Bwd Packet Length Std 0.076631\n", "Avg Bwd Segment Size 0.075204\n", "Packet Length Variance 0.071238\n", "Max Packet Length 0.059495\n", "Bwd Packet Length Mean 0.045845\n", "Total Length of Bwd Packets 0.039864\n", "Average Packet Size 0.038397\n", "Packet Length Mean 0.033550\n", "Name: importance, dtype: float64\n" ] }, { "data": { "image/png": "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uvTu3dtSpkwZi6Ojo6VUqVKWBg0aWMaPH1/gOYj8FZksFoulqJIaERGRe2EymXj55ZeZMWNGUYciN+jVqxdffPEF6enpRR2KiBQhzbEQERERERGbKbEQERERERGbaSiUiIiIiIjYTD0WIiIiIiJiMyUWIiIiIiJiMyUWIiIiIiJiM/1AnsgDLjc3l19++QUPDw/jl39FRERE/gwWi4VLly7x2GOPYWd3+z4JJRYiD7hffvkFf3//og5DREREHmE//fQTZcuWvW0ZJRYiDzgPDw/g+n/QxYoVK+JoRERE5FGSlpaGv7+/8TxyO0osRB5wecOfihUrpsRCREREisTdDMfW5G0REREREbGZEgsREREREbGZEgsREREREbGZEgsREREREbGZEgsREREREbGZEgsREREREbGZEgsREREREbGZfsdC5CFRb+FM7F1dijoMEREReUAc7D2oqEOwoh4LERERERGxmRILERERERGxmRILERERERGxmRILERERERGxmRKLP0BkZCSDBg0qsvbj4uIoXrx4kbX/IEhISMBkMvH7778XdSgiIiIij4RHKrHo1asXJpPJWLy9vYmKimL//v1/ahxxcXFWcfj5+dGpUyeOHz/+p8ZxK3f7UP6gPLzfz0Qu755s377dantWVhbe3t6YTCYSEhLuS1siIiIifyWPVGIBEBUVRWpqKqmpqaxfvx4HBwdat279p8dRrFgxUlNT+eWXX1i0aBFJSUm0bduWnJycPz0Wsebv709sbKzVti+//BKz2VxEEYmIiIg8+B65xMLZ2RlfX198fX2pXbs2I0aM4KeffuLs2bMAdOzYkQEDBhjlBw0ahMlk4uDBgwBkZ2fj4eHBmjVrAMjIyKBnz56YzWb8/PyYPHnyXcVhMpnw9fXFz8+Pxo0bM2bMGL777juOHTvGrl27aN68OSVLlsTT05OIiAj27t1rdfzvv/9Ov3798PHxwcXFhZCQEFauXFlgW+fPn6devXq0bduWzMxMLBYL7733HhUrVsTV1ZVatWrxxRdfAHDixAkaN24MgJeXFyaTiV69et39Bb7B1atXGT58OGXKlMHd3Z0nnnjC6m1/3pCtNWvWEBwcjNlsNhK/PNnZ2QwcOJDixYvj7e3NiBEjiImJoX379sD1XqjExESmTZtm9DacOHHCOH7Pnj3UrVsXNzc3GjRowNGjR+8Y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/fv3Jy0tjeeee47du3fzww8/sHDhQo4ePWpVrnTp0mzYsIEjR47QpUsXsrOzadasGfXr16d9+/asWbOGEydOsG3bNl577TUjgQkICOD48eMkJSVx7tw5srKybhnvlStXSEpKslqOHTtGt27dKFmyJO3atWPz5s0cP36cxMREXnnlFVJSUu7qWlStWpVmzZrRr18/du7cyb59++jXrx+urq7GvI28eNevX8/p06e5cOHC3V7qfF588UXGjRvH1q1bOXnyJNu3b6dnz56UKlXKGNoUEBDA/v37OXr0KOfOnePatWt07doVOzs7+vTpw6FDh/jqq6+YNGlSoeMQEREReZApsXhIlCpViri4OP79739TrVo13nnnnXwPqd7e3mzYsIH09HQiIiIICwvjk08+KbD3wtfXlw0bNnDgwAG6detGbm4uX331FeHh4fTu3ZugoCCee+45Tpw4gY+PDwAdO3YkKiqKxo0bU6pUKRYvXnzLeL///ntCQ0Otlr///e+4ubmxadMmypUrx9NPP01wcDC9e/fmypUr99SDsWDBAnx8fAgPD6dDhw707dsXDw8PXFxcjDKTJ0/mf//7H/7+/oSGht513Tdr1qwZ27dv59lnnyUoKIiOHTvi4uLC+vXr8fb2BqBv375UqVKFunXrUqpUKbZu3YrZbGbFihUcOnSI0NBQRo8ebfWjeiIiIiJ/JSZLYQeCizxAUlJS8Pf3Z926dcZXtP4q0tLS8PT0pMqMidi7utz5ABEREeFg70FFHcJfQt5zyMWLF+/4ElhzLOShlNczU6NGDVJTUxk+fDgBAQGEh4cXdWgiIiIijyQlFvJQunbtGv/85z/58ccf8fDwoEGDBsTHx9/2U7siIiIi8sdRYiEPpRYtWtCiRYuiDkNERERE/o8SC5GHxM4eLxX6E70iIiIifzR9FUpERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGymxEJERERERGzmUNQBiMjdqbdwJvauLkUdhoiISJE6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RB4BSizuk2vXrvHPf/6TH3/8EQ8PDxo0aEB8fHy+Lx79lZ0+fZo33niD06dP4+fnx7PPPsuECROKOiwRERER+RNoKJTIA05DoURE5FGioVAPlnsZCvXIT94WERERERHbaSiUyENiZ4+X7vimQERERKSoqMdCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERspsRCRERERERs5lDUAYjI3am3cCb2ri5FHYaIiDziDvYeVNQhyANKPRYiIiIiImIzJRYiIiIiImIzJRYiIiIiImIzJRYiIiIiImIzJRZ/kF69etG+ffuiDqNIvfnmm9SuXbuowzDonoiIiIj8cR7ZxKJXr16YTCZMJhOOjo5UrFiRoUOHkpGRUdShAXf/UP6gPLybTCaWL19uUx1Lly7F3t6eU6dOFbi/atWqDBw4sND1T5s2jbi4uEIfLyIiIiK39sgmFgBRUVGkpqby448/Mn78eGbOnMnQoUOLOqxHVtu2bfH29mb+/Pn59m3dupWjR4/Sp0+fe643JyeH3NxcPD09KV68+H2IVERERERuVujEYuHChTz55JM89thjnDx5EoCpU6fyn//8574F90dzdnbG19cXf39/unbtSrdu3Yy37p9++il169bFw8MDX19funbtypkzZ6yOP3jwIK1ataJYsWJ4eHjQqFEjkpOTC2xrz549lC5dmgkTJgBw8eJF+vXrR+nSpSlWrBhNmjTh22+/BSAuLo6xY8fy7bffGr0qhX3T/vPPP9O5c2e8vLzw9vamXbt2nDhxwtifNzxo0qRJ+Pn54e3tzcsvv8y1a9eMMqmpqbRq1QpXV1cqVKjAokWLCAgIYOrUqQAEBAQA0KFDB0wmk7GeZ+HChQQEBODp6clzzz3HpUuXCozV0dGRHj16EBcXh8Visdo3b948wsLCqFWrFlOmTKFGjRq4u7vj7+/PSy+9RHp6ulE2Li6O4sWLs3LlSqpVq4azszMnT57MNxRq9erVNGzYkOLFi+Pt7U3r1q2t7t+JEycwmUws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ERERERGRh1Oh5lh4eXlZrV+7do3Lly/j5OSEm5sbv/32230LUORRdy9jG0VERETup3t5DinUL29fuHDBaklPT+fo0aM0bNjwtj/kJiIiIiIif02FSiwKUrlyZd555x1eeeWV+1WliIiIiIg8JO5bYgFgb2/PL7/8cj+rFBERERGRh0ChJm//97//tVq3WCykpqYyY8YMnnzyyfsSmIiIiIiIPDwKlVi0b9/eat1kMlGqVCmaNGnC5MmT70dcIiIiIiLyEClUYpGbm3u/4xARERERkYdYoeZYvPXWW1y+fDnf9itXrvDWW2/ZHJSIiIiIiDxcCvU7Fvb29qSmplK6dGmr7efPn6d06dLk5OTctwBFHnX6HQsREREpKn/471hYLBZMJlO+7d9++y0lSpQoTJUiIiIiIvIQu6c5Fl5eXphMJkwmE0FBQVbJRU5ODunp6bzwwgv3PUgREREREXmw3VNiMXXqVCwWC71792bs2LF4enoa+5ycnAgICKB+/fr3PUgREREREXmw3VNiERMTA0CFChVo0KABjo6Of0hQIiIiIiLycCnU52YjIiKMf1+5coVr165Z7dcEUxERERGRR0uhJm9fvnyZ/v37U7p0acxmM15eXlaLiIiIiIg8WgqVWAwbNowNGzYwc+ZMnJ2dmTNnDmPHjuWxxx5jwYIF9ztGERERERF5wBVqKNSKFStYsGABkZGR9O7dm0aNGhEYGEj58uWJj4+nW7du9ztOERERERF5gBWqx+K3336jQoUKwPX5FL/99hsADRs2ZNOmTfcvOhEREREReSgUqseiYsWKnDhxgvLly1OtWjU+//xz6tWrx4oVKyhevPh9DlFEAOotnIm9q0tRhyEi8kg52HtQUYcg8tAoVI/F888/z7fffgvAqFGjjLkWgwcPZtiwYfc1QBERERERefAVqsdi8ODBxr8bN27MkSNH2L17N5UqVaJWrVr3LTgREREREXk4FCqxuFFmZiblypWjXLly9yMeERERERF5CBVqKFROTg7jxo2jTJkymM1mfvzxRwBef/115s6de18DlIdXXFzcIz/nJiEhAZPJxO+//17UoYiIiIj8oQqVWEyYMIG4uDjee+89nJycjO01atRgzpw59y24v7JevXphMpl44YUX8u176aWXMJlM9OrV6w+NIS4uDpPJZCx+fn506tSJ48eP/6Ht3q27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h5+fH8HBwUyePJm33nqL0aNHG2VMJpPRK9GoUSPg+pApT09PQkNDra5T586deeONNxgxYgRhYWGcPHmSF198sdDnCvD6669Tp04dWrRoQWRkJL6+vrRv3z5fmSFDhvDGG28QHBxM586dbzlPZdCgQYwdO5bo6Gi2bdtGixYtWLlyJf/73/94/PHH+dvf/saUKVMoX768cczN987e3p7z58/Ts2dPgoKC6NSpEy1bttQEbREREflLMVkKO+Be7puUlBT8/f1Zt27dHScVy6MnLS0NT09PqsyYiL3rredxiEjRO9h7UFGHICJyX+U9h1y8ePGOL9IfyKFQf3UbNmwgPT2dGjVqkJqayvDhwwkICCA8PLyoQxMRERERKRQlFkXg2rVr/POf/+THH3/Ew8ODBg0aEB8ff8sfTBMRERERedApsSgCLVq0oEWLFkUdhoiIiIjIfaPEQuQhsbPHS/f0kQARERGRP9MD+VUoERERERF5uCixEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmymxEBERERERmzkUdQAicnfqLZyJvatLUYch8kg72HtQUYcgIvLAUo+FiIiIiIjYTImFiIiIiIjYTImFiIiIiIjYTImFPBROnDiByWQiKSmpqEMhLi6O4sWLF3UYIiIiIg8UJRZ/oG3btmFvb09UVFRRh/KHy3vwz1u8vLwIDw8nMTGxqEMzmEwmli9ffsdyGzdupHHjxpQoUQI3NzcqV65MTEwM2dnZAHTu3Jnvv//+D45WRERE5OGixOIPNG/ePAYMGMCWLVs4derUH9pWTk4Oubm5f2gbd2PdunWkpqaSmJhIsWLFiI6O5vjx40Ud1l07ePAgLVu25PHHH2fTpk0cOHCA6dOn4+joaFxfV1dXSpcuXcSRioiIiDxYlFj8QTIyMvj888958cUXad26NXFxcca++vXrM3LkSKvyZ8+exdHRkY0bNwJw9epVhg8fTpkyZXB3d+eJJ54gISHBKJ83HGflypVUq1YNZ2dnTp48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HT7++OM6+zQ1NYWOjg727duHK1eu4Pbt2wAe/ne0YcMGpKen48SJE/D3969zBqImkyZNQnFxMUaMGIFTp07hwoUL2LBhAzIyMgA8fGrY4sWL8c033yAzMxOpqalYv349vv7666c/OUQvOBYWRET0XPjoo48QHh6OS5cu4YMPPsDQoUPh5+eHnj174saNG5gwYcJT97l+/XpYWlrCzc0NQ4cORUhICExNTaXjMpkMO3fuhJGREfr27QsPDw+0a9cOW7dubcih1UtXVxf79+/HzZs30b17d7zzzjvo378/vvvuu3rfd/jwYVhZWWHo0KGwt7dHcHAw7t69i+bNm0NXVxfnz5/HsGHD0LFjR4SEhGDSpEkYN24cAGDYsGHw8vKCu7s7WrVq1Si/I7JkyRKEhobC2dkZBQUF2LVrlzTj4OTkhG3btmHLli3o3LkzZs+ejS+++AJBQUF19qmuro6VK1fixx9/ROvWraV1GhERESgqKoKjoyMCAgIwZcoUhfw/CWNjY8TGxqK0tBRubm5wdnZGeHi4dPvUmDFjsHbtWkRGRqJLly5wc3NDZGQkZyzolSQTNd28SERERNSA4uLi4O7ujqKiIoUF9ET08uCMBRERERERKY2FBRERERERKY23QhERERERkdI4Y0FEREREREpjYUFEREREREpjYUFEREREREpjYUFEREREREpjYUFEREREREpjYUFEREREREpjYUFEREREREpjYUFEREREREpjYUFEREREREr7Pwv2WYngRLWHAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "feature_importance = pd.Series(\n", " baseline_pipeline.named_steps[\"model\"].feature_importances_,\n", " index=X.columns,\n", " name=\"importance\",\n", ").sort_values(ascending=False)\n", "\n", "print(feature_importance.head(10))\n", "\n", "ax = feature_importance.head(10).sort_values().plot(\n", " kind=\"barh\",\n", " figsize=(8, 5),\n", " color=\"#2a9d8f\",\n", " title=\"Top feature importance\",\n", ")\n", "ax.set_xlabel(\"Random Forest importance\")\n", "ax.set_ylabel(\"Feature\")\n", "plt.tight_layout()\n", "plt.savefig(OUTPUT_DIR / \"capstone_feature_importance.png\", dpi=150, bbox_inches=\"tight\")\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "9154fee8", "metadata": {}, "source": [ "## 6. Export metrics and write an analyst summary\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "dbae63c4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "BINARY INTRUSION DETECTION SUMMARY\n", "==================================\n", "Dataset: official CIC-IDS2017 subset\n", "Clean samples: 50,000\n", "Numeric features: 78\n", "Attack rate: 20.00%\n", "Attack precision: 1.000\n", "Attack recall: 0.998\n", "Attack F1: 0.999\n", "False positives: 0\n", "False negatives: 5\n", "\n", "Recommendation:\n", "- Review false negatives because they represent missed attacks.\n", "- Review false positives before using this model for automated blocking.\n", "- Validate the workflow on a time-based or group-based split before deployment.\n", "\n" ] } ], "source": [ "pd.Series(baseline_metrics, name=\"value\").to_csv(\n", " OUTPUT_DIR / \"capstone_metrics.csv\",\n", " header=True,\n", ")\n", "\n", "dataset_type = \"official CIC-IDS2017 subset\" if USING_REAL_CICIDS else \"synthetic classroom dataset\"\n", "summary = f'''BINARY INTRUSION DETECTION SUMMARY\n", "==================================\n", "Dataset: {dataset_type}\n", "Clean samples: {len(clean_df):,}\n", "Numeric features: {X.shape[1]}\n", "Attack rate: {y.mean():.2%}\n", "Attack precision: {baseline_metrics['attack_precision']:.3f}\n", "Attack recall: {baseline_metrics['attack_recall']:.3f}\n", "Attack F1: {baseline_metrics['attack_f1']:.3f}\n", "False positives: {fp}\n", "False negatives: {fn}\n", "\n", "Recommendation:\n", "- Review false negatives because they represent missed attacks.\n", "- Review false positives before using this model for automated blocking.\n", "- Validate the workflow on a time-based or group-based split before deployment.\n", "'''\n", "\n", "(OUTPUT_DIR / \"capstone_summary.txt\").write_text(summary, encoding=\"utf-8\")\n", "print(summary)\n" ] }, { "cell_type": "markdown", "id": "badbce1a", "metadata": {}, "source": [ "## Self-check\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "70167cf3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✓ Capstone lab completed\n" ] } ], "source": [ "assert isinstance(clean_df, pd.DataFrame)\n", "assert set(y.unique()) == {0, 1}\n", "assert X.shape[1] >= 5\n", "assert abs(y_train.mean() - y_test.mean()) < 0.02\n", "assert cm.shape == (2, 2)\n", "assert len(feature_importance) == X.shape[1]\n", "assert (OUTPUT_DIR / \"capstone_confusion_matrix.png\").exists()\n", "assert (OUTPUT_DIR / \"capstone_feature_importance.png\").exists()\n", "assert (OUTPUT_DIR / \"capstone_metrics.csv\").exists()\n", "assert (OUTPUT_DIR / \"capstone_summary.txt\").exists()\n", "print(\"✓ Capstone lab completed\")\n" ] }, { "cell_type": "markdown", "id": "f01a6d67", "metadata": {}, "source": [ "## Capstone questions\n", "\n", "1. How many attacks did the model miss, and why does that number matter operationally?\n", "2. Which features received the highest importance? Do they make sense for network flows?\n", "3. Why does random row splitting provide an optimistic estimate for some security datasets?\n", "4. What additional validation would you require before deploying this detector?\n", "5. If the notebook used synthetic data, which conclusions must be rechecked on the official CIC-IDS2017 subset?\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.6" } }, "nbformat": 4, "nbformat_minor": 5 }