aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGeorgeFI2023-07-17 15:23:18 +0200
committerGeorgeFI2023-07-17 15:23:18 +0200
commit079d191301156a89f3fa29ca4acaa6c077080bea (patch)
tree3a25da8288614cca06a0d2ce635dd009777b7d46
parenta34af90847425d3d2b7c5114f08bd1337bdeb75a (diff)
downloadsec-certs-079d191301156a89f3fa29ca4acaa6c077080bea.tar.gz
sec-certs-079d191301156a89f3fa29ca4acaa6c077080bea.tar.zst
sec-certs-079d191301156a89f3fa29ca4acaa6c077080bea.zip
chore: Removed EDA analysis, added matplotlib configs
-rw-r--r--notebooks/fips/references.ipynb1674
1 files changed, 45 insertions, 1629 deletions
diff --git a/notebooks/fips/references.ipynb b/notebooks/fips/references.ipynb
index 0d5c6a25..9b93fd85 100644
--- a/notebooks/fips/references.ipynb
+++ b/notebooks/fips/references.ipynb
@@ -1,59 +1,18 @@
{
"cells": [
{
- "cell_type": "code",
- "execution_count": 12,
- "id": "c720132b",
+ "cell_type": "markdown",
+ "id": "3c31b74d",
"metadata": {},
- "outputs": [],
"source": [
- "# import networkx as nx\n",
- "# import networkx.algorithms.community as nx_comm\n",
- "# import matplotlib\n",
- "# import matplotlib.pyplot as plt\n",
- "# import matplotlib.ticker as mtick\n",
- "# \n",
- "# import pandas as pd\n",
- "# import seaborn as sns\n",
- "# import numpy as np\n",
- "# from pysankey import sankey\n",
- "\n",
- "# %matplotlib inline\n",
+ "# FIPS References\n",
"\n",
- "# matplotlib.use(\"pgf\")\n",
- "# sns.set_theme(style='white')\n",
- "# plt.rcParams[\"axes.linewidth\"] = 0.5\n",
- "# plt.rcParams[\"legend.fontsize\"] = 6.5\n",
- "# plt.rcParams[\"xtick.labelsize\"] = 8\n",
- "# plt.rcParams[\"ytick.labelsize\"] = 8\n",
- "# plt.rcParams[\"ytick.left\"] = True\n",
- "# plt.rcParams['ytick.major.size'] = 5\n",
- "# plt.rcParams['ytick.major.width'] = 0.5\n",
- "# plt.rcParams['ytick.major.pad'] = 0\n",
- "# plt.rcParams[\"xtick.bottom\"] = True\n",
- "# plt.rcParams['xtick.major.size'] = 5\n",
- "# plt.rcParams['xtick.major.width'] = 0.5\n",
- "# plt.rcParams['xtick.major.pad'] = 0\n",
- "# plt.rcParams[\"pgf.texsystem\"] = \"pdflatex\"\n",
- "# plt.rcParams[\"font.family\"] = \"serif\"\n",
- "# plt.rcParams[\"text.usetex\"] = True\n",
- "# plt.rcParams[\"pgf.rcfonts\"] = False\n",
- "# plt.rcParams[\"axes.titlesize\"] = 8\n",
- "# plt.rcParams[\"legend.handletextpad\"] = 0.3\n",
- "# plt.rcParams['lines.markersize'] = 4\n",
- "# plt.rcParams['savefig.pad_inches'] = 0.01\n",
- "# \n",
- "\n",
- "#plt.style.use(\"seaborn-whitegrid\")\n",
- "#sns.set_palette(\"deep\")\n",
- "#sns.set_context(\"notebook\") # Set to \"paper\" for use in paper :)\n",
- "\n",
- "#plt.rcParams['figure.figsize'] = (10, 6)"
+ "This notebook provides insights into the references of FIPS certificates."
]
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 116,
"id": "91a0cb1b",
"metadata": {},
"outputs": [],
@@ -62,6 +21,7 @@
"import numpy as np\n",
"import seaborn as sns\n",
"import logging\n",
+ "import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from sec_certs.dataset.fips import FIPSDataset\n",
@@ -72,12 +32,36 @@
"from pandas.core.frame import DataFrame\n",
"from typing import Callable\n",
"\n",
+ "\n",
+ "%matplotlib inline\n",
+ "matplotlib.use(\"pgf\")\n",
+ "sns.set_theme(style='white')\n",
+ "plt.rcParams[\"axes.linewidth\"] = 0.5\n",
+ "plt.rcParams[\"legend.fontsize\"] = 6.5\n",
+ "plt.rcParams[\"xtick.labelsize\"] = 8\n",
+ "plt.rcParams[\"ytick.labelsize\"] = 8\n",
+ "plt.rcParams[\"ytick.left\"] = True\n",
+ "plt.rcParams['ytick.major.size'] = 5\n",
+ "plt.rcParams['ytick.major.width'] = 0.5\n",
+ "plt.rcParams['ytick.major.pad'] = 0\n",
+ "plt.rcParams[\"xtick.bottom\"] = True\n",
+ "plt.rcParams['xtick.major.size'] = 5\n",
+ "plt.rcParams['xtick.major.width'] = 0.5\n",
+ "plt.rcParams['xtick.major.pad'] = 0\n",
+ "plt.rcParams[\"pgf.texsystem\"] = \"pdflatex\"\n",
+ "plt.rcParams[\"font.family\"] = \"serif\"\n",
+ "plt.rcParams[\"text.usetex\"] = True\n",
+ "plt.rcParams[\"pgf.rcfonts\"] = False\n",
+ "plt.rcParams[\"axes.titlesize\"] = 8\n",
+ "plt.rcParams[\"legend.handletextpad\"] = 0.3\n",
+ "plt.rcParams['lines.markersize'] = 4\n",
+ "plt.rcParams['savefig.pad_inches'] = 0.01\n",
"sns.set_palette(\"deep\")"
]
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 117,
"id": "629aec45",
"metadata": {
"scrolled": true
@@ -87,7 +71,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
- "Downloading FIPS Dataset: 100%|█████████████████████████████████████| 57.1M/57.1M [00:14<00:00, 4.11MB/s]\n"
+ "Downloading FIPS Dataset: 100%|█████████████████████████████████████| 57.1M/57.1M [00:14<00:00, 4.22MB/s]\n"
]
}
],
@@ -106,1502 +90,6 @@
]
},
{
- "cell_type": "code",
- "execution_count": 16,
- "id": "160b35a0",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "<div>\n",
- "<style scoped>\n",
- " .dataframe tbody tr th:only-of-type {\n",
- " vertical-align: middle;\n",
- " }\n",
- "\n",
- " .dataframe tbody tr th {\n",
- " vertical-align: top;\n",
- " }\n",
- "\n",
- " .dataframe thead th {\n",
- " text-align: right;\n",
- " }\n",
- "</style>\n",
- "<table border=\"1\" class=\"dataframe\">\n",
- " <thead>\n",
- " <tr style=\"text-align: right;\">\n",
- " <th></th>\n",
- " <th>cert_id</th>\n",
- " <th>name</th>\n",
- " <th>status</th>\n",
- " <th>standard</th>\n",
- " <th>type</th>\n",
- " <th>level</th>\n",
- " <th>embodiment</th>\n",
- " <th>date_validation</th>\n",
- " <th>date_sunset</th>\n",
- " <th>algorithms</th>\n",
- " <th>...</th>\n",
- " <th>related_cves</th>\n",
- " <th>module_directly_referenced_by</th>\n",
- " <th>module_indirectly_referenced_by</th>\n",
- " <th>module_directly_referencing</th>\n",
- " <th>module_indirectly_referencing</th>\n",
- " <th>policy_directly_referenced_by</th>\n",
- " <th>policy_indirectly_referenced_by</th>\n",
- " <th>policy_directly_referencing</th>\n",
- " <th>policy_indirectly_referencing</th>\n",
- " <th>year_from</th>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>dgst</th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " </tr>\n",
- " </thead>\n",
- " <tbody>\n",
- " <tr>\n",
- " <th>803919e93ccac91d</th>\n",
- " <td>4307</td>\n",
- " <td>Cocoon Data Content Crypto Service</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Software</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2022-09-20</td>\n",
- " <td>2024-08-22</td>\n",
- " <td>{ECDSA#C2204, KTS#A2113, SHA-3-Customized#A164...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2022</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>ab86fe44dea15e7a</th>\n",
- " <td>4143</td>\n",
- " <td>Samsung NVMe TCG Opal SSC SEDs PM1733 Series</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>2.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2022-02-03</td>\n",
- " <td>2026-09-21</td>\n",
- " <td>{SHS#C1272, DRBG#C1292, AES#C1271, RSA#C1293}</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2022</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>705249ef258f9318</th>\n",
- " <td>4078</td>\n",
- " <td>Qualcomm® Trusted Execution Environment (TEE) ...</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Software-Hybrid</td>\n",
- " <td>1.0</td>\n",
- " <td>Single Chip</td>\n",
- " <td>2021-11-29</td>\n",
- " <td>2026-09-21</td>\n",
- " <td>{AES#A982, SHS#A984, ECDSA#A982, AES#A984, HMA...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>{3114}</td>\n",
- " <td>{3114}</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>{3114}</td>\n",
- " <td>{3114}</td>\n",
- " <td>2021</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>a2730bca63eff586</th>\n",
- " <td>4195</td>\n",
- " <td>Thales Luna Backup HSM Cryptographic Module</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>3.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2022-04-14</td>\n",
- " <td>2026-09-21</td>\n",
- " <td>{DRBG#C2020, RSA#A675, RSA#C2022, KAS-RSA#A212...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2022</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>c62b377fa3d3a0f4</th>\n",
- " <td>3926</td>\n",
- " <td>DIGISTOR TCG OPAL SSC FIPS SSD Series</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>2.0</td>\n",
- " <td>Multi-Chip Embedded</td>\n",
- " <td>2021-05-11</td>\n",
- " <td>2026-05-10</td>\n",
- " <td>{RSA#C1355, SHS#C1355, RSA#C1356, KTS#C1356, S...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2021</td>\n",
- " </tr>\n",
- " </tbody>\n",
- "</table>\n",
- "<p>5 rows × 23 columns</p>\n",
- "</div>"
- ],
- "text/plain": [
- " cert_id name \\\n",
- "dgst \n",
- "803919e93ccac91d 4307 Cocoon Data Content Crypto Service \n",
- "ab86fe44dea15e7a 4143 Samsung NVMe TCG Opal SSC SEDs PM1733 Series \n",
- "705249ef258f9318 4078 Qualcomm® Trusted Execution Environment (TEE) ... \n",
- "a2730bca63eff586 4195 Thales Luna Backup HSM Cryptographic Module \n",
- "c62b377fa3d3a0f4 3926 DIGISTOR TCG OPAL SSC FIPS SSD Series \n",
- "\n",
- " status standard type level \\\n",
- "dgst \n",
- "803919e93ccac91d active FIPS 140-2 Software 1.0 \n",
- "ab86fe44dea15e7a active FIPS 140-2 Hardware 2.0 \n",
- "705249ef258f9318 active FIPS 140-2 Software-Hybrid 1.0 \n",
- "a2730bca63eff586 active FIPS 140-2 Hardware 3.0 \n",
- "c62b377fa3d3a0f4 active FIPS 140-2 Hardware 2.0 \n",
- "\n",
- " embodiment date_validation date_sunset \\\n",
- "dgst \n",
- "803919e93ccac91d Multi-Chip Stand Alone 2022-09-20 2024-08-22 \n",
- "ab86fe44dea15e7a Multi-Chip Stand Alone 2022-02-03 2026-09-21 \n",
- "705249ef258f9318 Single Chip 2021-11-29 2026-09-21 \n",
- "a2730bca63eff586 Multi-Chip Stand Alone 2022-04-14 2026-09-21 \n",
- "c62b377fa3d3a0f4 Multi-Chip Embedded 2021-05-11 2026-05-10 \n",
- "\n",
- " algorithms ... \\\n",
- "dgst ... \n",
- "803919e93ccac91d {ECDSA#C2204, KTS#A2113, SHA-3-Customized#A164... ... \n",
- "ab86fe44dea15e7a {SHS#C1272, DRBG#C1292, AES#C1271, RSA#C1293} ... \n",
- "705249ef258f9318 {AES#A982, SHS#A984, ECDSA#A982, AES#A984, HMA... ... \n",
- "a2730bca63eff586 {DRBG#C2020, RSA#A675, RSA#C2022, KAS-RSA#A212... ... \n",
- "c62b377fa3d3a0f4 {RSA#C1355, SHS#C1355, RSA#C1356, KTS#C1356, S... ... \n",
- "\n",
- " related_cves module_directly_referenced_by \\\n",
- "dgst \n",
- "803919e93ccac91d NaN NaN \n",
- "ab86fe44dea15e7a NaN NaN \n",
- "705249ef258f9318 NaN NaN \n",
- "a2730bca63eff586 NaN NaN \n",
- "c62b377fa3d3a0f4 NaN NaN \n",
- "\n",
- " module_indirectly_referenced_by module_directly_referencing \\\n",
- "dgst \n",
- "803919e93ccac91d NaN NaN \n",
- "ab86fe44dea15e7a NaN NaN \n",
- "705249ef258f9318 NaN {3114} \n",
- "a2730bca63eff586 NaN NaN \n",
- "c62b377fa3d3a0f4 NaN NaN \n",
- "\n",
- " module_indirectly_referencing policy_directly_referenced_by \\\n",
- "dgst \n",
- "803919e93ccac91d NaN NaN \n",
- "ab86fe44dea15e7a NaN NaN \n",
- "705249ef258f9318 {3114} NaN \n",
- "a2730bca63eff586 NaN NaN \n",
- "c62b377fa3d3a0f4 NaN NaN \n",
- "\n",
- " policy_indirectly_referenced_by policy_directly_referencing \\\n",
- "dgst \n",
- "803919e93ccac91d NaN NaN \n",
- "ab86fe44dea15e7a NaN NaN \n",
- "705249ef258f9318 NaN {3114} \n",
- "a2730bca63eff586 NaN NaN \n",
- "c62b377fa3d3a0f4 NaN NaN \n",
- "\n",
- " policy_indirectly_referencing year_from \n",
- "dgst \n",
- "803919e93ccac91d NaN 2022 \n",
- "ab86fe44dea15e7a NaN 2022 \n",
- "705249ef258f9318 {3114} 2021 \n",
- "a2730bca63eff586 NaN 2022 \n",
- "c62b377fa3d3a0f4 NaN 2021 \n",
- "\n",
- "[5 rows x 23 columns]"
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "e7400f61",
- "metadata": {},
- "source": [
- "## Exploratory Data Analysis"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "id": "14dfcca5",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Dataset contains 4539 rows and 23 columns.\n"
- ]
- }
- ],
- "source": [
- "print(f\"Dataset contains {df.shape[0]} rows and {df.shape[1]} columns.\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "id": "15f14e2d",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Total number of active certs: 946\n",
- "Total number of historical certs: 3569\n",
- "Total number of revoked certs: 24\n"
- ]
- }
- ],
- "source": [
- "total_active_certs: int = df[df[\"status\"] == \"active\"].shape[0]\n",
- "total_historical_certs: int = df[df[\"status\"] == \"historical\"].shape[0]\n",
- "total_revoked_certs: int = df[df[\"status\"] == \"revoked\"].shape[0]\n",
- "\n",
- "print(f\"Total number of active certs: {total_active_certs}\")\n",
- "print(f\"Total number of historical certs: {total_historical_certs}\")\n",
- "print(f\"Total number of revoked certs: {total_revoked_certs}\")"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "de35178a",
- "metadata": {},
- "source": [
- "### Status distribution of certificates"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "id": "b1ade08f",
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "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WBhmzpyJ1atXo379+vj666/5yD0RERFJdBqIvvnmmxLbHBwcirylujiOjo7Yu3dvqX169eqFM2fOlLs+IiIikodqdw8RERER0cvGQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREsqfTQLRu3Tq4ublBrVZDrVbD3d0dv/76q9T+5MkT+Pn5oW7dujA1NYWPjw/S0tK0xkhOToa3tzeMjY1hbW2N2bNnIy8vT6tPdHQ02rVrB5VKBWdnZ4SEhLyMzSMiIqJXhE4DUf369fHJJ58gLi4Op06dQp8+fTB48GBcvHgRADBz5kz88ssv2LZtGw4dOoRbt25h2LBh0ufz8/Ph7e2N3NxcHDt2DN9++y1CQkIwb948qU9SUhK8vb3Ru3dvxMfHY8aMGZg4cSLCw8Nf+vYSERFR9WSgy5UPGjRIa37RokVYt24djh8/jvr16+Obb75BaGgo+vTpAwDYtGkTXFxccPz4cXTu3BkRERG4dOkS9u/fDxsbG7Rp0wYLFy7EnDlzEBgYCKVSifXr18PJyQnLly8HALi4uODIkSNYuXIlNBrNS99mIiIiqn6qzT1E+fn5+OGHH/Dw4UO4u7sjLi4OT58+hYeHh9SnefPmaNCgAWJjYwEAsbGxaNWqFWxsbKQ+Go0GWVlZ0lmm2NhYrTEK+xSOUZycnBxkZWVpTURERFRz6TwQnT9/HqamplCpVJgyZQp27doFV1dXpKamQqlUwtzcXKu/jY0NUlNTAQCpqalaYaiwvbCttD5ZWVl4/PhxsTUtWbIEZmZm0uTg4FAZm0pERETVlM4DUbNmzRAfH48TJ05g6tSp8PX1xaVLl3RaU0BAADIzM6Xp5s2bOq2HiIiIqpZO7yECAKVSCWdnZwBA+/btcfLkSaxevRpvvPEGcnNzcf/+fa2zRGlpabC1tQUA2Nra4rffftMar/AptGf7PP9kWlpaGtRqNYyMjIqtSaVSQaVSVcr2ERERUfWn8zNEzysoKEBOTg7at28PQ0NDREVFSW0JCQlITk6Gu7s7AMDd3R3nz59Henq61CcyMhJqtRqurq5Sn2fHKOxTOAYRERGRTs8QBQQEwMvLCw0aNMCDBw8QGhqK6OhohIeHw8zMDBMmTMCsWbNgYWEBtVqNadOmwd3dHZ07dwYAeHp6wtXVFaNHj8bSpUuRmpqKuXPnws/PTzrDM2XKFHzxxRf44IMPMH78eBw4cAA//vgjwsLCdLnpREREVI3oNBClp6djzJgxSElJgZmZGdzc3BAeHo5+/foBAFauXAk9PT34+PggJycHGo0Ga9eulT6vr6+PPXv2YOrUqXB3d4eJiQl8fX0RFBQk9XFyckJYWBhmzpyJ1atXo379+vj666/5yD0RERFJdBqIvvnmm1Lba9WqheDgYAQHB5fYx9HREXv37i11nF69euHMmTMVqpGIiIhqvmp3DxERERHRy8ZARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLKn00C0ZMkSdOzYEbVr14a1tTWGDBmChIQErT69evWCQqHQmqZMmaLVJzk5Gd7e3jA2Noa1tTVmz56NvLw8rT7R0dFo164dVCoVnJ2dERISUtWbR0RERK8InQaiQ4cOwc/PD8ePH0dkZCSePn0KT09PPHz4UKvfpEmTkJKSIk1Lly6V2vLz8+Ht7Y3c3FwcO3YM3377LUJCQjBv3jypT1JSEry9vdG7d2/Ex8djxowZmDhxIsLDw1/athIREVH1ZaDLle/bt09rPiQkBNbW1oiLi0OPHj2k5cbGxrC1tS12jIiICFy6dAn79++HjY0N2rRpg4ULF2LOnDkIDAyEUqnE+vXr4eTkhOXLlwMAXFxccOTIEaxcuRIajabqNpCIiIheCdXqHqLMzEwAgIWFhdbyLVu2wNLSEi1btkRAQAAePXoktcXGxqJVq1awsbGRlmk0GmRlZeHixYtSHw8PD60xNRoNYmNji60jJycHWVlZWhMRERHVXDo9Q/SsgoICzJgxA127dkXLli2l5W+++SYcHR1hb2+Pc+fOYc6cOUhISMDOnTsBAKmpqVphCIA0n5qaWmqfrKwsPH78GEZGRlptS5YswYIFCyp9G4mIiKh6qjaByM/PDxcuXMCRI0e0lk+ePFn6c6tWrWBnZ4e+ffvi+vXraNy4cZXUEhAQgFmzZknzWVlZcHBwqJJ1ERERke5Vi0tm/v7+2LNnDw4ePIj69euX2rdTp04AgMTERACAra0t0tLStPoUzhfed1RSH7VaXeTsEACoVCqo1WqtiYiIiGounQYiIQT8/f2xa9cuHDhwAE5OTi/8THx8PADAzs4OAODu7o7z588jPT1d6hMZGQm1Wg1XV1epT1RUlNY4kZGRcHd3r6QtISIioleZTgORn58f/ve//yE0NBS1a9dGamoqUlNT8fjxYwDA9evXsXDhQsTFxeHGjRvYvXs3xowZgx49esDNzQ0A4OnpCVdXV4wePRpnz55FeHg45s6dCz8/P6hUKgDAlClT8Pvvv+ODDz7AlStXsHbtWvz444+YOXOmzradiIiIqg+dBqJ169YhMzMTvXr1gp2dnTRt3boVAKBUKrF//354enqiefPmeO+99+Dj44NffvlFGkNfXx979uyBvr4+3N3d8dZbb2HMmDEICgqS+jg5OSEsLAyRkZFo3bo1li9fjq+//pqP3BMREREAHd9ULYQotd3BwQGHDh164TiOjo7Yu3dvqX169eqFM2fOlKs+IiIikodqcVM1ERERkS4xEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQ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4YdS22vVqoXg4GAEBweX2MfR0RF79+6t7NKIiIioBnml7iEiIiIiqgoMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7sgpEwcHBaNiwIWrVqoVOnTrht99+03VJREREVA0Y6LqAl2Xr1q2YNWsW1q9fj06dOmHVqlXQaDRISEiAtbW1rssjInqlXL58WdclUA1jaWmJBg0a6Gz9sglEK1aswKRJkzBu3DgAwPr16xEWFoaNGzfiww8/1HF1RESvhuysOwAUeOutt3RdCtUwRkbGuHLlss5CkSwCUW5uLuLi4hAQECAt09PTg4eHB2JjY3VYGRHRq+XJo2wAAv1GzEZ9x+a6LodqiIzUP/DLt0HIyMhgIKpKGRkZyM/Ph42NjdZyGxsbXLlypUj/nJwc5OTkSPOZmZkAgKysrEqvLTs7GwCQknwVuTmPK318kqeM1D8AALf/ugZDPYWOq6GapPDYynuaw99ZVGme5v79b252dnal/ltbOJYQ4oV9ZRGIymvJkiVYsGBBkeUODg5Vts59339aZWOTfB3c8bmuS6AaiscWVYWePXtWybgPHjyAmZlZqX1kEYgsLS2hr6+PtLQ0reVpaWmwtbUt0j8gIACzZs2S5gsKCnD37l3UrVsXCgX/t60rWVlZcHBwwM2bN6FWq3VdDtUQPK6oqvDY0j0hBB48eAB7e/sX9pVFIFIqlWjfvj2ioqIwZMgQAH+HnKioKPj7+xfpr1KpoFKptJaZm5u/hEqpLNRqNX+5UKXjcUVVhceWbr3ozFAhWQQiAJg1axZ8fX3RoUMH/Otf/8KqVavw8OFD6akzIiIiki/ZBKI33ngDt2/fxrx585Camoo2bdpg3759RW60JiIiIvmRTSACAH9//2IvkdGr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\n",
- "text/plain": [
- "<Figure size 640x480 with 1 Axes>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "sns.histplot(data=df[\"status\"])\n",
- "plt.title(\"Distribution of certificate statuses\")\n",
- "plt.xlabel(\"Certificate status\")\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "ee6a01a9",
- "metadata": {},
- "source": [
- "### Type distribution of certificates"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "id": "49b9727e",
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAIrCAYAAAAOQobVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABoW0lEQVR4nO3dd1RU1/89/D2UoTdDE6XZAcFeiAVQI6KxRFM0FjSWFMRu1F8Sa6Km2GM0JlGwJrHEaOwiYEMTEdQoWFGMAoqKCCj1PH/4MF9HwKAfmUs4+7XWrMXce7jzvkPbnHPuuSohhAARERGRxPSULoCIiIhIaQxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMREQvaPr06VCpVDp5LX9/f/j7+2ueR0VFQaVSYdOmTTp5/cGDB8PNzU0nr/WisrKyMGzYMDg6OkKlUmHMmDFKl1Smq1evQqVSISwsTGv77t270bhxYxgbG0OlUiEjI+M/8d4TVQUMREQAwsLCoFKpNA9jY2M4OTkhMDAQixcvxoMHD17K69y8eRPTp09HfHz8Szney1SZayuP2bNnIywsDB9++CHWrFmDgQMHKl0S1q9fj4ULF5ar7Z07d/D222/DxMQES5cuxZo1a2BmZlaxBQL47rvvSgSzynxcooqi4r3MiB4HoiFDhmDmzJlwd3dHfn4+UlNTERUVhX379sHFxQXbtm2Dj4+P5nMKCgpQUFAAY2Pjcr/OiRMn0KJFC6xatQqDBw8u9+fl5eUBANRqNYDHPUQBAQHYuHEj3nzzzXIf50Vry8/PR1FREYyMjF7Ka1WE1q1bw8DAAIcPH1a6FI3XX38df//9N65evaq1XQiB3NxcGBoaQl9fH8Dj3qGgoCDs27cPnTp10rSt6Pe+YcOGsLW1RVRU1H/iuEQVxUDpAogqk6CgIDRv3lzzfMqUKThw4ABef/119OjRAwkJCTAxMQEAGBgYwMCgYn+EcnJyYGpqqglCSjE0NFT09cvj1q1b8PT0VLoMAEB2dvYze3eKeyGfdOvWLQCAtbW11vb/wntPVCUIIhKrVq0SAMRff/1V6v7Zs2cLAGLFihWabdOmTRNP/wjt3btXtGnTRlhZWQkzMzNRr149MWXKFCGEEJGRkQJAiceqVauEEEL4+fkJLy8vceLECdGuXTthYmIiRo8erdnn5+eneZ3iY/38889iypQpwsHBQZiamoru3buL5ORkrZpcXV1FcHBwiXN68pj/VltwcLBwdXXV+vysrCwxbtw4UbNmTaFWq0W9evXE119/LYqKirTaARAhISHit99+E15eXkKtVgtPT0+xa9euUt/rp6WlpYn33ntP2NvbCyMjI+Hj4yPCwsJKvBdPP5KSkp553DVr1ogWLVoIExMTYW1tLdq1ayf27Nmj1Wbnzp2ibdu2wtTUVJibm4uuXbuKv//+W6tNcHCwMDMzE5cuXRJBQUHC3Nxc9OzZU/j5+ZWoqfg9TEpKKvG1f7pt8destPe+sLBQLFy4UDRs2FAYGRkJW1tbERgYqPX9u3LlShEQECDs7OyEWq0WHh4e4rvvvtM6jqura4nXffL77N69e2L06NGar3Ht2rXF3LlzRWFh4TPf27KOe/nyZQFAzJ8/v8TnHDlyRAAQ69evF0L8389XQkKCeOutt4SFhYWoVq2aGDVqlHj48GGJz1+zZo1o2rSpMDY2FjY2NuKdd94p8bNw4cIF0bt3b+Hg4CCMjIxEjRo1xDvvvCMyMjKeeT4kB/YQEZXDwIED8f/+3//D3r17MXz48FLbnD17Fq+//jp8fHwwc+ZMGBkZ4dKlSzhy5AgAwMPDAzNnzsTUqVMxYsQItGvXDgDw6quvao5x584dBAUFoW/fvhgwYAAcHByeWdcXX3wBlUqFSZMm4datW1i4cCE6deqE+Ph4TU9WeZSnticJIdCjRw9ERkZi6NChaNy4Mfbs2YOJEyfixo0bWLBggVb7w4cPY8uWLfjoo49gYWGBxYsXo0+fPkhOTsYrr7xSZl0PHz6Ev78/Ll26hJEjR8Ld3R0bN27E4MGDkZGRgdGjR8PDwwNr1qzB2LFjUbNmTYwfPx4AYGdnV+ZxZ8yYgenTp+PVV1/FzJkzoVarcfz4cRw4cACdO3cGAKxZswbBwcEIDAzEl19+iZycHCxbtgxt27ZFXFyc1kTngoICBAYGom3btvjmm29gamoKR0dH3L9/H//884/m/TA3Ny+1nk8++QT169fHihUrNMO2tWvXLrP+oUOHIiwsDEFBQRg2bBgKCgpw6NAhHDt2TNPDuWzZMnh5eaFHjx4wMDDA9u3b8dFHH6GoqAghISEAgIULFyI0NBTm5ub45JNPAEDzPZeTkwM/Pz/cuHED77//PlxcXHD06FFMmTIFKSkpz5wbVdZxa9WqhTZt2mDdunUYO3as1uesW7cOFhYW6Nmzp9b2t99+G25ubpgzZw6OHTuGxYsX4969e1i9erWmzRdffIHPPvsMb7/9NoYNG4bbt29jyZIlaN++PeLi4mBtbY28vDwEBgYiNzcXoaGhcHR0xI0bN/DHH38gIyMDVlZWZZ4PSULpREZUGfxbD5EQQlhZWYkmTZponj/dQ7RgwQIBQNy+fbvMY/z1119aPQNPKu4lWL58ean7SushqlGjhsjMzNRs//XXXwUAsWjRIs228vQQ/VttT/dSbN26VQAQn3/+uVa7N998U6hUKnHp0iXNNgBCrVZrbTt16pQAIJYsWVLitZ60cOFCAUCsXbtWsy0vL0/4+voKc3NzrXN3dXUV3bp1e+bxhBDi4sWLQk9PT7zxxhslejqKe7cePHggrK2txfDhw7X2p6amCisrK63twcHBAoCYPHlyidfq1q1bid4dIUr2EAlR9vfg0+/9gQMHBAAxatSoEsd9sncuJyenxP7AwEBRq1YtrW1eXl5a3wfFZs2aJczMzMSFCxe0tk+ePFno6+uX6H15WlnH/f777zU9P8Xy8vKEra2t1vdp8c9Xjx49tD7/o48+EgDEqVOnhBBCXL16Vejr64svvvhCq92ZM2eEgYGBZntcXJwAIDZu3PjMuklevMqMqJzMzc2febVZ8dyP33//HUVFRS/0GkZGRhgyZEi52w8aNAgWFhaa52+++SaqV6+OnTt3vtDrl9fOnTuhr6+PUaNGaW0fP348hBDYtWuX1vZOnTpp9Xj4+PjA0tISV65c+dfXcXR0RL9+/TTbDA0NMWrUKGRlZSE6Ovq5a9+6dSuKioowdepU6Olp/wosXkZh3759yMjIQL9+/ZCenq556Ovro1WrVoiMjCxx3A8//PC5a3kRmzdvhkqlwrRp00rse3IZiCd7CO/fv4/09HT4+fnhypUruH///r++zsaNG9GuXTvY2NhovQedOnVCYWEhDh48+EL1v/322zA2Nsa6des02/bs2YP09HQMGDCgRPvi3qxioaGhAKD5Ht+yZQuKiorw9ttva9Xp6OiIunXrar5WxT1Ae/bsQU5OzgvVTlUbh8yIyikrKwv29vZl7n/nnXfw448/YtiwYZg8eTI6duyI3r1748033yzxh7csNWrUeK4J1HXr1tV6rlKpUKdOnRJXNb1s165dg5OTk1YYAx4PvRXvf5KLi0uJY9jY2ODevXv/+jp169Yt8f6V9TrlcfnyZejp6T1zAvbFixcBAB06dCh1v6WlpdZzAwMD1KxZ87lreRGXL1+Gk5MTqlWr9sx2R44cwbRp0xATE1MiANy/f/9fh4guXryI06dPlzn0WDwJ/HlZW1uje/fuWL9+PWbNmgXg8XBZjRo1Sn2/n/4er127NvT09DTf4xcvXoQQokS7YsWT0t3d3TFu3DjMnz8f69atQ7t27dCjRw8MGDCAw2UEgIGIqFz++ecf3L9/H3Xq1CmzjYmJCQ4ePIjIyEjs2LEDu3fvxi+//IIOHTpg7969msurn+V55v2UV1mLRxYWFparppehrNcRlXTVj+IevjVr1sDR0bHE/qevLjQyMip36NWFy5cvo2PHjmjQoAHmz58PZ2dnqNVq7Ny5EwsWLChXD2ZRURFee+01fPzxx6Xur1ev3gvXN2jQIGzcuBFHjx6Ft7c3tm3bho8++qhc7+HT389FRUVQqVTYtWtXqd9nT87bmjdvHgYPHozff/8de/fuxahRozRzk3QVaKnyYiAiKoc1a9YAAAIDA5/ZTk9PDx07dkTHjh0xf/58zJ49G5988gkiIyPRqVOnl76ydXFPRjEhBC5duqS1XpKNjQ0yMjJKfO61a9dQq1YtzfPnqc3V1RX79+/HgwcPtHqJEhMTNftfBldXV5w+fRpFRUVafyz/l9epXbs2ioqKcO7cOTRu3LjMNgBgb2+vtSbQ86qIlcxr166NPXv24O7du2X2Em3fvh25ubnYtm2bVu9caUN9ZdVYu3ZtZGVlvfD5P+vcu3TpAjs7O6xbtw6tWrVCTk5OmQtpXrx4Ee7u7prnly5dQlFRkWZSe+3atSGEgLu7e7lCmre3N7y9vfHpp5/i6NGjaNOmDZYvX47PP//8+U6QqpzK8y8NUSV14MABzJo1C+7u7ujfv3+Z7e7evVtiW/Ef3NzcXADQrE1TWkB5EatXr9aa17Rp0yakpKQgKChIs6127do4duyYZnFHAPjjjz9w/fp1rWM9T21du3ZFYWEhvv32W63tCxYsgEql0nr9/0XXrl2RmpqKX375RbOtoKAAS5Ysgbm5Ofz8/J77mL169YKenh5mzpxZoqekuMcqMDAQlpaWmD17NvLz80sc4/bt2+V6LTMzs3LN13keffr0gRACM2bMKLGvuP7inpIne+Du37+PVatWlVpjaV/zt99+GzExMdizZ0+JfRkZGSgoKHhmnWUdF3jcw9avXz/8+uuvCAsLg7e3t1aIf9LSpUu1ni9ZsgQANN9jvXv3hr6+PmbMmFGix1EIgTt37gAAMjMzS9Ts7e0NPT09zc8nyY09RERP2LVrFxITE1FQUIC0tDQcOHAA+/btg6urK7Zt2/bMValnzpyJgwcPolu3bnB1dcWtW7fw3XffoWbNmmjbti2Ax+HE2toay5cvh4WFBczMzNCqVSut/4CfR7Vq1dC2bVsMGTIEaWlpWLhwIerUqaO1NMCwYcOwadMmdOnSBW+//TYuX76MtWvXlris+3lq6969OwICAvDJJ5/g6tWraNSoEfbu3Yvff/8dY8aMeeYl489jxIgR+P777zF48GDExsbCzc0NmzZtwpEjR7Bw4cISc5jKo06dOvjkk08wa9YstGvXDr1794aRkRH++usvODk5Yc6cObC0tMSyZcswcOBANG3aFH379oWdnR2Sk5OxY8cOtGnTpkQYLE2zZs3wyy+/YNy4cWjRogXMzc3RvXv3F3krNAICAjBw4EAsXrwYFy9eRJcuXVBUVIRDhw4hICAAI0eOROfOnaFWq9G9e3e8//77yMrKwg8//AB7e3ukpKSUqHHZsmX4/PPPUadOHdjb26NDhw6YOHEitm3bhtdffx2DBw9Gs2bNkJ2djTNnzmDTpk24evUqbG1tn3nupR232KBBg7B48WJERkbiyy+/LPM4SUlJ6NGjB7p06YKYmBisXbsW7777Lho1agTg8fft559/jilTpuDq1avo1asXLCwskJSUhN9++w0jRozAhAkTcODAAYwcORJvvfUW6tWrh4KCAqxZswb6+vro06fP//Q1oSpCoavbiCqV4kueix9qtVo4OjqK1157TSxatEjr8u5iT192HxERIXr27CmcnJyEWq0WTk5Ool+/fiUuW/7999+Fp6enMDAwKHVhxtKUddn9hg0bxJQpU4S9vb0wMTER3bp1E9euXSvx+fPmzRM1atQQRkZGok2bNuLEiRMljvms2kpbHPDBgwdi7NixwsnJSRgaGoq6des+c2HGp5W1HMDT0tLSxJAhQ4Stra1Qq9XC29u71KUBynvZfbGVK1eKJk2aCCMjI2FjYyP8/PzEvn37tNpERkaKwMBAYWVlJYyNjUXt2rXF4MGDxYkTJzRtihdmLE1WVpZ49913hbW19TMXZhSi/JfdCyFEQUGB+Prrr0WDBg2EWq0WdnZ2IigoSMTGxmrabNu2Tfj4+AhjY2Ph5uYmvvzyS7Fy5coSi1ampqaKbt26CQsLixILMz548EBMmTJF1KlTR6jVamFrayteffVV8c0334i8vLxnvr/POm4xLy8voaenJ/75558S+4p/vs6dOyfefPNNYWFhIWxsbMTIkSNLXZhx8+bNom3btsLMzEyYmZmJBg0aiJCQEHH+/HkhhBBXrlwR7733nqhdu7YwNjYW1apVEwEBAWL//v3PPA+SB+9lRkREimjSpAmqVauGiIiIEvumT5+OGTNm4Pbt28/siSJ6WTiHiIiIdO7EiROIj4/HoEGDlC6FCADnEBERkQ79/fffiI2Nxbx581C9enW88847SpdEBIA9REREpEObNm3CkCFDkJ+fjw0bNjzzQgUiXeIcIiIiIpIee4iIiIhIepxDVA5FRUW4efMmLCwsKmTlWSIiInr5hBB48OABnJyc/vXWMAxE5XDz5k04OzsrXQYRERG9gOvXr//r/eoYiMqheDXc69evl7jLNREREVVOmZmZcHZ2Lteq9gxE5VA8TGZpaclARERE9B9TnukunFRNRERE0mMgIiIiIukxEBEREZH0GIiIiIhIegxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSnoHSBRARkJycjPT0dKXLUIytrS1cXFyULoOIJMZARKSw5ORkNGjggYcPc5QuRTEmJqZITExgKCIixTAQESksPT0dDx/moHvwVNg6uipdjs6lp17D9vCZSE9PZyAiIsUwEBFVEraOrnB0qa90GUREUuKkaiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKTHQERERETSYyAiIiIi6TEQERERkfQYiIiIiEh6DEREREQkPQYiIiIikh4DEREREUmPgYiIiIikx0BERERE0mMgIiIiIukxEBEREZH0GIiIiIhIegxEREREJD0GIiIiIpKeooFozpw5aNGiBSwsLGBvb49evXrh/PnzWm38/f2hUqm0Hh988IFWm+TkZHTr1g2mpqawt7fHxIkTUVBQoNUmKioKTZs2hZGREerUqYOwsLCKPj0iIiL6j1A0EEVHRyMkJATHjh3Dvn37kJ+fj86dOyM7O1ur3fDhw5GSkqJ5fPXVV5p9hYWF6NatG/Ly8nD06FGEh4cjLCwMU6dO1bRJSkpCt27dEBAQgPj4eIwZMwbDhg3Dnj17dHauREREVHkZKPniu3fv1noeFhYGe3t7xMbGon379prtpqamcHR0LPUYe/fuxblz57B//344ODigcePGmDVrFiZNmoTp06dDrVZj+fLlcHd3x7x58wAAHh4eOHz4MBYsWIDAwMASx8zNzUVubq7meWZm5ss4XSIiIqqkKtUcovv37wMAqlWrprV93bp1sLW1RcOGDTFlyhTk5ORo9sXExMDb2xsODg6abYGBgcjMzMTZs2c1bTp16qR1zMDAQMTExJRax5w5c2BlZaV5ODs7v5TzIyIiospJ0R6iJxUVFWHMmDFo06YNGjZsqNn+7rvvwtXVFU5OTjh9+jQmTZqE8+fPY8uWLQCA1NRUrTAEQPM8NTX1mW0yMzPx8OFDmJiYaO2bMmUKxo0bp3memZnJUERERFSFVZpAFBISgr///huHDx/W2j5ixAjNx97e3qhevTo6duyIy5cvo3bt2hVSi5GREYyMjCrk2ERERFT5VIohs5EjR+KPP/5AZGQkatas+cy2rVq1AgBcunQJAODo6Ii0tDStNsXPi+cdldXG0tKyRO8QERERyUfRQCSEwMiRI/Hbb7/hwIEDcHd3/9fPiY+PBwBUr14dAODr64szZ87g1q1bmjb79u2DpaUlPD09NW0iIiK0jrNv3z74+vq+pDMhIiKi/zJFA1FISAjWrl2L9evXw8LCAqmpqUhNTcXDhw8BAJcvX8asWbMQGxuLq1evYtu2bRg0aBDat28PHx8fAEDnzp3h6emJgQMH4tSpU9izZw8+/fRThISEaIa9PvjgA1y5cgUff/wxEhMT8d133+HXX3/F2LFjFTt3IiIiqjwUDUTLli3D/fv34e/vj+rVq2sev/zyCwBArVZj//796Ny5Mxo0aIDx48ejT58+2L59u+YY+vr6+OOPP6Cvrw9fX18MGDAAgwYNwsyZMzVt3N3dsWPHDuzbtw+NGjXCvHnz8OOPP5Z6yT0RERHJR9FJ1UKIZ+53dnZGdHT0vx7H1dUVO3fufGYbf39/xMXFPVd9REREJIdKMamaiIiISEkMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKTHQERERETSYyAiIiIi6TEQERERkfQYiIiIiEh6DEREREQkPQYiIiIikh4DEREREUmPgYiIiIikx0BERERE0mMgIiIiIukxEBEREZH0GIiIiIhIegxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKTHQERERETSYyAiIiIi6TEQERERkfQYiIiIiEh6DEREREQkPQYiIiIikh4DEREREUmPgYiIiIikx0BERERE0mMgIiIiIukxEBEREZH0GIiIiIhIegxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKSnaCCaM2cOWrRoAQsLC9jb26NXr144f/68VptHjx4hJCQEr7zyCszNzdGnTx+kpaVptUlOTka3bt1gamoKe3t7TJw4EQUFBVptoqKi0LRpUxgZGaFOnToICwur6NMjIiKi/whFA1F0dDRCQkJw7Ngx7Nu3D/n5+ejcuTOys7M1bcaOHYvt27dj48aNiI6Oxs2bN9G7d2/N/sLCQnTr1g15eXk4evQowsPDERYWhqlTp2raJCUloVu3bggICEB8fDzGjBmDYcOGYc+ePTo9XyIiIqqcDJR88d27d2s9DwsLg729PWJjY9G+fXvcv38fP/30E9avX48OHToAAFatWgUPDw8cO3YMrVu3xt69e3Hu3Dns378fDg4OaNy4MWbNmoVJkyZh+vTpUKvVWL58Odzd3TFv3jwAgIeHBw4fPowFCxYgMDCwRF25ubnIzc3VPM/MzKzAd4GIiIiUVqnmEN2/fx8AUK1aNQBAbGws8vPz0alTJ02bBg0awMXFBTExMQCAmJgYeHt7w8HBQdMmMDAQmZmZOHv2rKbNk8coblN8jKfNmTMHVlZWmoezs/PLO0kiIiKqdCpNICoqKsKYMWPQpk0bNGzYEACQmpoKtVoNa2trrbYODg5ITU3VtHkyDBXvL973rDaZmZl4+PBhiVqmTJmC+/fvax7Xr19/KedIRERElZOiQ2ZPCgkJwd9//43Dhw8rXQqMjIxgZGSkdBlERESkI5Wih2jkyJH4448/EBkZiZo1a2q2Ozo6Ii8vDxkZGVrt09LS4OjoqGnz9FVnxc//rY2lpSVMTExe9ukQERHRf4yigUgIgZEjR+K3337DgQMH4O7urrW/WbNmMDQ0REREhGbb+fPnkZycDF9fXwCAr68vzpw5g1u3bmna7Nu3D5aWlvD09NS0efIYxW2Kj0FERERyU3TILCQkBOvXr8fvv/8OCwsLzZwfKysrmJiYwMrKCkOHDsW4ceNQrVo1WFpaIjQ0FL6+vmjdujUAoHPnzvD09MTAgQPx1VdfITU1FZ9++ilCQkI0w14ffPABvv32W3z88cd47733cODAAfz666/YsWOHYudORERElYeiPUTLli3D/fv34e/vj+rVq2sev/zyi6bNggUL8Prrr6NPnz5o3749HB0dsWXLFs1+fX19/PHHH9DX14evry8GDBiAQYMGYebMmZo27u7u2LFjB/bt24dGjRph3rx5+PHHH0u95J6IiIjko2gPkRDiX9sYGxtj6dKlWLp0aZltXF1dsXPnzmcex9/fH3Fxcc9dIxEREVV9lWJSNREREZGSGIiIiIhIegxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKTHQERERETSYyAiIiIi6TEQERERkfQYiIiIiEh6DEREREQkPQYiIiIikh4DEREREUmPgYiIiIikx0BERERE0mMgIiIiIukxEBEREZH0GIiIiIhIegxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKTHQERERETSYyAiIiIi6TEQERERkfQYiIiIiEh6DEREREQkPQYiIiIikh4DEREREUmPgYiIiIikx0BERERE0nuhQFSrVi3cuXOnxPaMjAzUqlXrfy6KiIiISJdeKBBdvXoVhYWFJbbn5ubixo0b/3NRRERERLpk8DyNt23bpvl4z549sLKy0jwvLCxEREQE3NzcXlpxRERE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IiIi0oXnuuz+008/xZYtW1CvXj2MHDkS9evXBwAkJiZi6dKlKCwsxCeffFIhhRIRERFVlOcKRA4ODjh69Cg+/PBDTJkyBUIIAIBKpUJgYCCWLl0KBweHCimUiIiIqKI898KMrq6u2LlzJ+7du4dLly5BCIG6devCxsamIuojIiIiqnAvtFI1ANjY2KBFixYvsxYiIiIiRbzQvcyIiIiIqhIGIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKTHQERERETSYyAiIiIi6TEQERERkfQYiIiIiEh6DEREREQkPQYiIiIikh4DEREREUmPgYiIiIikx0BERERE0mMgIiIiIukxEBEREZH0GIiIiIhIegxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJTNBAdPHgQ3bt3h5OTE1QqFbZu3aq1XwiBqVOnonr16jAxMUGnTp1w8eJFrTZ3795F//79YWlpCWtrawwdOhRZWVlabU6fPo127drB2NgYzs7O+Oqrryr61IiIiOg/RNFAlJ2djUaNGmHp0qWl7v/qq6+wePFiLF++HMePH4eZmRkCAwPx6NEjTZv+/fvj7Nmz2LdvH/744w8cPHgQI0aM0OzPzMxE586d4erqitjYWHz99deYPn06VqxYUeHnR0RERP8NBkq+eFBQEIKCgkrdJ4TAwoUL8emnn6Jnz54AgNWrV8PBwQFbt25F3759kZCQgN27d+Ovv/5C8+bNAQBLlixB165d8c0338DJyQnr1q1DXl4eVq5cCbVaDS8vL8THx2P+/PlawYmIiIjkVWnnECUlJSE1NRWdOnXSbLOyskKrVq0QExMDAIiJiYG1tbUmDAFAp06doKenh+PHj2vatG/fHmq1WtMmMDAQ58+fx71790p97dzcXGRmZmo9iIiIqOqqtIEoNTUVAODg4KC13cHBQbMvNTUV9vb2WvsNDAxQrVo1rTalHePJ13janDlzYGVlpXk4Ozv/7ydERERElValDURKmjJlCu7fv695XL9+XemSiIiIqAJV2kDk6OgIAEhLS9PanpaWptnn6OiIW7duae0vKCjA3bt3tdqUdownX+NpRkZGsLS01HoQERFR1VVpA5G7uzscHR0RERGh2ZaZmYnjx4/D19cXAODr64uMjAzExsZq2hw4cABFRUVo1aqVps3BgweRn5+vabNv3z7Ur18fNjY2OjobIiIiqswUDURZWVmIj49HfHw8gMcTqePj45GcnAyVSoUxY8bg888/x7Zt23DmzBkMGjQITk5O6NWrFwDAw8MDXbp0wfDhw/Hnn3/iyJEjGDlyJPr27QsnJycAwLvvvgu1Wo2hQ4fi7Nmz+OWXX7Bo0SKMGzdOobMmIiKiykbRy+5PnDiBgIAAzfPikBIcHIywsDB8/PHHyM7OxogRI5CRkYG2bdti9+7dMDY21nzOunXrMHLkSHTs2BF6enro06cPFi9erNlvZWWFvXv3IiQkBM2aNYOtrS2mTp3KS+6JiIhIQ9FA5O/vDyFEmftVKhVmzpyJmTNnltmmWrVqWL9+/TNfx8fHB4cOHXrhOomIiKhqq7RziIiIiIh0hYGIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKTHQERERETSYyAiIiIi6TEQERERkfQYiIiIiEh6DEREREQkPQYiIiIikh4DEREREUmPgYiIiIikx0BERERE0mMgIiIiIukxEBEREZH0GIiIiIhIegxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9BiIiIiISHoMRERERCQ9BiIiIiKSHgMRERERSY+BiIiIiKTHQERERETSYyAiIiIi6TEQERERkfQYiIiIiEh6DEREREQkPQYiIiIikh4DEREREUmPgYiIiIikx0BERERE0mMgIiIiIukxEBEREZH0GIiIiIhIegxEREREJD0GIiIiIpIeAxERERFJj4GIiIiIpMdARERERNJjICIiIiLpMRARERGR9Cp1IJo+fTpUKpXWo0GDBpr9jx49QkhICF555RWYm5ujT58+SEtL0zpGcnIyunXrBlNTU9jb22PixIkoKCjQ9akQERFRJWagdAH/xsvLC/v379c8NzD4v5LHjh2LHTt2YOPGjbCyssLIkSPRu3dvHDlyBABQWFiIbt26wdHREUePHkVKSgoGDRoEQ0NDzJ49W+fnQkRERJVTpQ9EBgYGcHR0LLH9/v37+Omnn7B+/Xp06NABALBq1Sp4eHjg2LFjaN26Nfbu3Ytz585h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\n",
- "text/plain": [
- "<Figure size 640x480 with 1 Axes>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "sns.histplot(data=df[\"type\"])\n",
- "plt.title(\"Distribution of certificate types\")\n",
- "plt.xlabel(\"Certificate type\")\n",
- "plt.xticks(rotation=90) \n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "25e7095e",
- "metadata": {},
- "source": [
- "### Standard distribution of certificates"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "id": "dcd5b8c8",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHHCAYAAABeLEexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKq0lEQVR4nO3deVgW9f7/8dftcgMKN7gAtyQiaam4lnaUSkUlUMmsPKdcUsylNLTUfuahzLWyLHMpl2OLdCxPWqes1FTcK9GjJGlqnjQVOwrkxu0KCvP7o4v5dgtupN7IPB/XNdflzOczn3nP7aAv5v7MfdsMwzAEAABgYWU8XQAAAICnEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYhgOWPGjJHNZrshx4qKilJUVJS5vmbNGtlsNn366ac35Pi9e/dWzZo1b8ixiuvkyZPq16+fnE6nbDabhgwZ4umSLmrfvn2y2WxKSkpy27506VI1adJE3t7estlsOn78+E3x2t/MbDabxowZc0OOdeHPMUonAhFuaklJSbLZbObi7e2tkJAQxcbGatq0aTpx4sQ1Oc7Bgwc1ZswYpaWlXZPxrqWSXNuVeOWVV5SUlKSBAwdq7ty56tmzp6dL0rx58zRlypQr6nvkyBE98sgj8vHx0fTp0zV37lxVrFjx+hYoacaMGYWC2Y1w+vRpjRkzRmvWrLnhxwauKwO4ic2ZM8eQZIwbN86YO3eu8f777xuvvPKKERMTY9hsNiMsLMz44Ycf3PY5d+6ccebMmas6zqZNmwxJxpw5c65qv5ycHCMnJ8dcX716tSHJ+OSTT65qnOLWlpuba5w9e/aaHet6aN68uXHPPfd4ugw3cXFxRlhYWKHt+fn5xpkzZ4zz58+b277++mtDkpGcnOzW93q/9vXr1zdat2593ca/mN9++82QZIwePfqGH/uPbmQNrVu39shrjRurnAezGHDNdOjQQc2aNTPXExMTtWrVKt1///164IEHtHPnTvn4+EiSypUrp3Llru+lf/r0aVWoUEF2u/26Hudyypcv79HjX4msrCxFRER4ugxJ0qlTpy55d6fgLuQfZWVlSZICAgLctt8Mrz1+d7m/d1gDb5mh1Grbtq1efPFF7d+/Xx9++KG5vag5RMnJybr33nsVEBAgX19f1alTR88//7yk3+f93HXXXZKkxx9/3Hx7ruDtiqioKDVo0ECpqalq1aqVKlSoYO57sbkHeXl5ev755+V0OlWxYkU98MADOnDggFufmjVrqnfv3oX2/eOYl6utqHksp06d0rPPPqvQ0FB5eXmpTp06euONN2QYhls/m82mQYMGaeHChWrQoIG8vLxUv359LV26tOgX/AJZWVnq27evgoOD5e3trcaNG+uDDz4w2wvmU+3du1eLFy82a9+3b98lx/3www/1l7/8RRUqVFClSpXUqlUrLV++3K3P119/rZYtW6pixYry8/NTXFyctm/f7tand+/e8vX11Z49e9SxY0f5+fmpR48eioqK0uLFi7V//36zpoLX8MI5RFFRUYqPj5ck3XXXXbLZbObfWVGvfX5+vqZOnaqGDRvK29tbgYGBat++vTZv3mz2mTNnjtq2baugoCB5eXkpIiJCM2fOdBunZs2a2r59u9auXWvW+Mfr7Pjx4xoyZIj5d1y7dm299tprys/Pv+RrK0mbN29WbGysqlatKh8fH4WHh6tPnz7m+QcGBkqSxo4dax67YC7P1q1b1bt3b916663y9vaW0+lUnz59dOTIEbdjFPwM7t69W71791ZAQID8/f31+OOP6/Tp0259c3JyNHToUAUGBsrPz08PPPCAfv3110J179+/X0899ZTq1KkjHx8fValSRX/7298KXU8Fb7OvXbtWTz31lIKCglS9enWzffbs2apVq5Z8fHz0l7/8Rd98802Rr9Nbb72l+vXrm9dhs2bNNG/evMu+vii5uEOEUq1nz556/vnntXz5cvXv37/IPtu3b9f999+vRo0aady4cfLy8tLu3bv13XffSZLq1auncePGadSoUXriiSfUsmVLSdLdd99tjnHkyBF16NBBXbt21WOPPabg4OBL1vXyyy/LZrNpxIgRysrK0pQpUxQdHa20tDTzTtaVuJLa/sgwDD3wwANavXq1+vbtqyZNmmjZsmUaPny4/ve//2ny5Mlu/b/99lt99tlneuqpp+Tn56dp06apS5cuSk9PV5UqVS5a15kzZxQVFaXdu3dr0KBBCg8P1yeffKLevXvr+PHjeuaZZ1SvXj3NnTtXQ4cOVfXq1fXss89KkvkfblHGjh2rMWPG6O6779a4ceNkt9u1ceNGrVq1SjExMZKkuXPnKj4+XrGxsXrttdd0+vRpzZw5U/fee6+2bNniFlLOnz+v2NhY3XvvvXrjjTdUoUIFOZ1OZWdn69dffzVfD19f3yLreeGFF1SnTh3Nnj1b48aNU3h4uGrVqnXR+vv27aukpCR16NBB/fr10/nz5/XNN99ow4YN5h3OmTNnqn79+nrggQdUrlw5ffXVV3rqqaeUn5+vhIQESdKUKVM0ePBg+fr66oUXXpAk85o7ffq0Wrdurf/973968sknVaNGDa1fv16JiYk6dOjQJedGZWVlKSYmRoGBgfr73/+ugIAA7du3T5999pn5dzNz5kwNHDhQDz30kB5++GFJUqNGjST9/ovFL7/8oscff1xOp1Pbt2/X7NmztX37dm3YsKHQLyKPPPKIwsPDNWHCBH3//fd69913FRQUpNdee83s069fP3344Yfq3r277r77bq1atUpxcXGFat+0aZPWr1+vrl27qnr16tq3b59mzpypqKgo7dixQxUqVHDr/9RTTykwMFCjRo3SqVOnJEnvvfeennzySd19990aMmSIfvnlFz3wwAOqXLmyQkNDzX3feecdPf300/rrX/+qZ555RmfPntXWrVu1ceNGde/e/aKvL0o4T79nB/wZBXOINm3adNE+/v7+xh133GGujx492vjjpT958mRDkvHbb79ddIxLzdNp3bq1IcmYNWtWkW1/nHtQMIfolltuMVwul7l9wYIFhiRj6tSp5rawsDAjPj7+smNeqrb4+Hi3uTALFy40JBkvvfSSW7+//vWvhs1mM3bv3m1uk2TY7Xa3bT/88IMhyXjrrbcKHeuPpkyZYkgyPvzwQ3Nbbm6uERkZafj6+rqde1hYmBEXF3fJ8QzDMH7++WejTJkyxkMPPWTk5eW5teXn5xuGYRgnTpwwAgICjP79+7u1Z2RkGP7+/m7b4+PjDUnG3//+90LHutgcor179xZ6rS92DV742q9atcqQZDz99NOFxi2o3zAM4/Tp04XaY2NjjVtvvdVt28XmEI0fP96oWLGi8d///tdt+9///nejbNmyRnp6eqF9Cnz++eeX/Xm61Byiomr/17/+ZUgy1q1bZ24r+Bns06ePW9+HHnrIqFKlirmelpZmSDKeeuopt37du3cvVENRx05JSTEkGf/85z/NbQV/X/fee6/bXLDc3FwjKCjIaNKkidu8v9mzZxuS3F7rzp07G/Xr1y90PNzceMsMpZ6v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SfXq1dOgQYP017/+VZMnT/bI+QIAgJLH44EoISFBcXFxio6Odtuempqqc+fOuW2vW7euatSooZSUFElSSkqKGjZsqODgYLNPbGysXC6Xtm/fbva5cOzY2FhzjKLk5OTI5XK5LQAAoPQq58mDf/zxx/r++++1adOmQm0ZGRmy2+0KCAhw2x4cHKyMjAyzzx/DUEF7Qdul+rhcLp05c0Y+Pj6Fjj1hwgSNHTu22OcFAABuLh67Q3TgwAE988wz+uijj+Tt7e2pMoqUmJio7Oxsczlw4ICnSwIAANeRxwJRamqqsrKydOedd6pcuXIqV66c1q5dq2nTpqlcuXIKDg5Wbm6ujh8/7rZfZmamnE6nJMnpdBZ66qxg/XJ9HA5HkXeHJMnLy0sOh8NtAQAApZfHAlG7du20bds2paWlmUuzZs3Uo0cP88/ly5fXypUrzX127dql9PR0RUZGSpIiIyO1bds2ZWVlmX2Sk5PlcDgUERFh9vnjGAV9CsYAAADw2BwiPz8/NWjQwG1bxYoVVaVKFXN73759NWzYMFWuXFkOh0ODBw9WZGSkWrRoIUmKiYlRRESEevbsqYkTJyojI0MjR45UQkKCvLy8JEkDBgzQ22+/reeee059+vTRqlWrtGDBAi1evPjGnjAAACixPDqp+nImT56sMmXKqEuXLsrJyVFsbKxmzJhhtpctW1aLFi3SwIEDFRkZqYoVKyo+Pl7jxo0z+4SHh2vx4sUaOnSopk6dqurVq+vdd99VbGysJ04JAACUQCUqEK1Zs8Zt3dvbW9OnT9f06dMvuk9YWJiWLFlyyXGjoqK0ZcuWa1EiAAAohTz+OUQAAACeRiACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACWRyACAACW59FANHPmTDVq1EgOh0MOh0ORkZH6+uuvzfaoqCjZbDa3ZcCAAW5jpKenKy4uThUqVFBQUJCGDx+u8+fPu/VZs2aN7rzzTnl5eal27dpKSkq6EacHAABuEuU8efDq1avr1Vdf1W233SbDMPTBBx+oc+fO2rJli+rXry9J6t+/v8aNG2fuU6FCBfPPeXl5iouLk9Pp1Pr163Xo0CH16tVL5cuX1yuvvCJJ2rt3r+Li4jRgwAB99NFHWrlypfr166dq1aopNjb2xp4wAAAokTwaiDp16uS2/vLLL2vmzJnasGGDGYgqVKggp9NZ5P7Lly/Xjh07tGLFCgUHB6tJkyYaP368RowYoTFjxshut2vWrFkKDw/XpEmTJEn16tXTt99+q8mTJxOIAACApBI0hygvL08ff/yxTp06pcjISHP7Rx99pKpVq6pBgwZKTEzU6dOnzbaUlBQ1bNhQwcHB5rbY2Fi5XC5t377d7BMdHe12rNjYWKWkpFy0lpycHLlcLrcFAACUXh69QyRJ27ZtU2RkpM6ePStfX199/vnnioiIkCR1795dYWFhCgkJ0datWzVixAjt2rVLn332mSQpIyPDLQxJMtczMjIu2cflcunMmTPy8fEpVNOECRM0duzYa36uAACgZPJ4IKpTp47S0tKUnZ2tTz/9VPHx8Vq7dq0iIiL0xBNPmP0aNmyoatWqqV27dtqzZ49q1ap13WpKTEzUsGHDzHWXy6XQ0NDrdjwAAOBZHn/LzG63q3bt2mratKkmTJigxo0ba+rUqUX2bd68uSRp9+7dkiSn06nMzEy3PgXrBfOOLtbH4XAUeXdIkry8vMwn3woWAABQenk8EF0oPz9fOTk5RbalpaVJkqpVqyZJioyM1LZt25SVlWX2SU5OlsPhMN92i4yM1MqVK93GSU5OdpunBAAArM2jb5klJiaqQ4cOqlGjhk6cOKF58+ZpzZo1WrZsmfbs2aN58+apY8eOqlKlirZu3aqhQ4eqVatWatSokSQpJiZGERER6tmzpyZOnKiMjAyNHDlSCQkJ8vLykiQNGDBAb7/9tp577jn16dNHq1at0oIFC7R48WJPnjoAAChBPBqIsrKy1KtXLx06dEj+/v5q1KiRli1bpvvuu08HDhzQihUrNGXKFJ06dUqhoaHq0qWLRo4cae5ftmxZLVq0SAMHDlRkZKQqVqyo+Ph4t88tCg8P1+LFizV06FBNnTpV1atX17vvvssj9wAAwOTRQPTee+9dtC00NFRr16697BhhYWFasmTJJftERUVpy5YtV10fAACwhhI3hwgAAOBGIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADL82ggmjlzpho1aiSHwyGHw6HIyEh9/fXXZvvZs2eVkJCgKlWqyNfXV126dFFmZqbbGOnp6YqLi1OFChUUFBSk4cOH6/z582591qxZozvvvFNeXl6qXbu2kpKSbsTpAQCAm4RHA1H16tX16quvKjU1VZs3b1bbtm3VuXNnbd++XZI0dOhQffXVV/rkk0+0du1aHTx4UA8//LC5f15enuLi4pSbm6v169frgw8+UFJSkkaNGmX22bt3r+Li4tSmTRulpaVpyJAh6tevn5YtW3bDzxcAAJRM5Tx58E6dOrmtv/zyy5o5c6Y2bNig6tWr67333tO8efPUtm1bSdKcOXNUr149bdiwQS1atNDy5cu1Y8cOrVixQsHBwWrSpInGjx+vESNGaMyYMbLb7Zo1a5bCw8M1adIkSVK9evX07bffavLkyYqNjb3h5wwAAEqeEjOHKC8vTx9//LFOnTqlyMhIpaam6ty5c4qOjjb71K1bVzVq1FBKSookKSUlRQ0bNlRwcLDZJzY2Vi6Xy7zLlJKS4jZGQZ+CMQAAADx6h0iStm3bpsjISJ09e1a+vr76/PPPFRERobS0NNntdgUEBLj1Dw4OVkZGhiQpIyPDLQwVtBe0XaqPy+XSmTNn5OPjU6imnJwc5eTkmOsul+tPnycAACi5PH6HqE6dOkpLS9PGjRs1cOBAxcfHa8eOHR6tacKECfL39zeX0NBQj9YDAACuL48HIrvdrtq1a6tp06aaMGGCGjdurKlTp8rpdCo3N1fHjx9365+ZmSmn0ylJcjqdhZ46K1i/XB+Hw1Hk3SFJSkxMVHZ2trkcOHDgWpwqAAAooTweiC6Un5+vnJwcNW3aVOXLl9fKlSvNtl27dik9PV2RkZGSpMjISG3btk1ZWVlmn+TkZDkcDkVERJh9/jhGQZ+CMYri5eVlfhRAwQIAAEovj84hSkxMVIcOHVSjRg2dOHFC8+bN05o1a7Rs2TL5+/urb9++GjZsmCpXriyHw6HBgwcrMjJSLVq0kCTFxMQoIiJCPXv21MSJE5WRkaGRI0cqISFBXl5ekqQBAwbo7bff1nPPPac+ffpo1apVWrBggRYvXuzJUwcAACWIRwNRVlaWevXqpUOHDsnf31+NGjXSsmXLdN9990mSJk+erDJlyqhLly7KyclRbGysZsyYYe5ftmxZLVq0SAMHDlRkZKQqVqyo+Ph4jRs3zuwTHh6uxYsXa+jQoZo6daqqV6+ud999l0fuAQCAyaOB6L333rtku7e3t6ZPn67p06dftE9YWJiWLFlyyXGioqK0ZcuWYtUIAABKvxI3hwgAAOBGIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADLIxABAADL82ggmjBhgu666y75+fkpKChIDz74oHbt2uXWJyoqSjabzW0ZMGCAW5/09HTFxcWpQoUKCgoK0vDhw3X+/Hm3PmvWrNGdd94pLy8v1a5dW0lJSdf79AAAwE3Co4Fo7dq1SkhI0IYNG5ScnKxz584pJiZGp06dcuvXv39/HTp0yFwmTpxotuXl5SkuLk65ublav369PvjgAyUlJWnUqFFmn7179youLk5t2rRRWlqahgwZon79+mnZsmU37FwBAEDJVc6TB1+6dKnbelJSkoKCgpSamqpWrVqZ2ytUqCCn01nkGMuXL9eOHTu0YsUKBQcHq0mTJho/frxGjBihMWPGyG63a9asWQoPD9ekSZMkSfXq1dO3336ryZMnKzY29vqdIAAAuCmUqDlE2dnZkqTKlSu7bf/oo49UtWpVNWjQQImJiTp9+rTZlpKSooYNGyo4ONjcFhsbK5fLpe3bt5t9oqOj3caMjY1VSkpKkXXk5OTI5XK5LQAAoPTy6B2iP8rPz9eQIUN0zz33qEGDBub27t27KywsTCEhIdq6datGjBihXbt26bPPPpMkZWRkuIUhSeZ6RkbGJfu4XC6dOXNGPj4+bm0TJkzQ2LFjr/k5AgCAkqnEBKKEhAT9+OOP+vbbb922P/HEE+afGzZsqGrVqqldu3bas2ePatWqdV1qSUxM1LBhw8x1l8ul0NDQ63IsAADgeSXiLbNBgwZp0aJFWr16tapXr37Jvs2bN5ck7d69W5LkdDqVmZnp1qdgvWDe0cX6OByOQneHJMnLy0sOh8NtAQAApZdHA5FhGBo0aJA+//xzrVq1SuHh4ZfdJy0tTZJUrVo1SVJkZKS2bdumrKwss09ycrIcDociIiLMPitXrnQbJzk5WZGRkdfoTAAAwM3Mo4EoISFBH374oebNmyc/Pz9lZGQoIyNDZ86ckSTt2bNH48ePV2pqqvbt26cvv/xSvXr1UqtWrdSoUSNJUkxMjCIiItSzZ0/98MMPWrZsmUaOHKmEhAR5eXlJkgYMGKBffvlFzz33nH766SfNmDFDCxYs0NChQz127gAAoOTwaCCaOXOmsrOzFRUVpWrVqpnL/PnzJUl2u10rVqxQTEyM6tatq2effVZdunTRV199ZY5RtmxZLVq0SGXLllVkZKQee+wx9erVS+PGjTP7hIeHa/HixUpOTlbjxo01adIkvfvuuzxyDwAAJBVzUvWtt96qTZs2qUqVKm7bjx8/rjvvvFO//PLLFY1jGMYl20NDQ7V27drLjhMWFqYlS5Zcsk9UVJS2bNlyRXUBAABrKdYdon379ikvL6/Q9pycHP3vf//700UBAADcSFd1h+jLL780/7xs2TL5+/ub63l5eVq5cqVq1qx5zYoDAAC4Ea4qED344IOSJJvNpvj4eLe28uXLq2bNmubXYwAAANwsrioQ5efnS/p9kvKmTZtUtWrV61IUAADAjVSsSdV79+691nUAAAB4TLG/umPlypVauXKlsrKyzDtHBd5///0/XRgAAMCNUqxANHbsWI0bN07NmjVTtWrVZLPZrnVdAAAAN0yxAtGsWbOUlJSknj17Xut6AAAAbrhifQ5Rbm6u7r777mtdCwAAgEcUKxD169dP8+bNu9a1AAAAeESx3jI7e/asZs+erRUrVqhRo0YqX768W/ubb755TYoDAAC4EYoViLZu3aomTZpIkn788Ue3NiZYAwCAm02xAtHq1auvdR0AAAAeU6w5RAAAAKVJse4QtWnT5pJvja1atarYBQEAANxoxQpEBfOHCpw7d05paWn68ccfC33pKwAAQElXrEA0efLkIrePGTNGJ0+e/FMFAQAA3GjXdA7RY489xveYAQCAm841DUQpKSny9va+lkMCAABcd8V6y+zhhx92WzcMQ4cOHdLmzZv14osvXpPCAAAAbpRiBSJ/f3+39TJlyqhOnToaN26cYmJirklhAAAAN0qxAtGcOXOudR0AAAAeU6xAVCA1NVU7d+6UJNWvX1933HHHNSkKAADgRipWIMrKylLXrl21Zs0aBQQESJKOHz+uNm3a6OOPP1ZgYOC1rBEAAOC6KtZTZoMHD9aJEye0fft2HT16VEePHtWPP/4ol8ulp59++lrXCAAAcF0V6w7R0qVLtWLFCtWrV8/cFhERoenTpzOpGgAA3HSKdYcoPz9f5cuXL7S9fPnyys/P/9NFAQAA3EjFCkRt27bVM888o4MHD5rb/ve//2no0KFq167dNSsOAADgRihWIHr77bflcrlUs2ZN1apVS7Vq1VJ4eLhcLpfeeuuta10jAADAdVWsOUShoaH6/vvvtWLFCv3000+SpHr16ik6OvqaFgcAAHAjXNUdolWrVikiIkIul0s2m0333XefBg8erMGDB+uuu+5S/fr19c0331yvWgEAAK6LqwpEU6ZMUf/+/eVwOAq1+fv768knn9Sbb755xeNNmDBBd911l/z8/BQUFKQHH3xQu3btcutz9uxZJSQkqEqVKvL19VWXLl2UmZnp1ic9PV1xcXGqUKGCgoKCNHz4cJ0/f96tz5o1a3TnnXfKy8tLtWvXVlJS0pWfOAAAKNWuKhD98MMPat++/UXbY2JilJqaesXjrV27VgkJCdqwYYOSk5N17tw5xcTE6NSpU2afoUOH6quvvtInn3yitWvX6uDBg25fLpuXl6e4uDjl5uZq/fr1+uCDD5SUlKRRo0aZffbu3au4uDi1adNGaWlpGjJkiPr166dly5ZdzekDAIBS6qrmEGVmZhb5uL05WLly+u233654vKVLl7qtJyUlKSgoSKmpqWrVqpWys7P13nvvad68eWrbtq2k379HrV69etqwYYNatGih5cuXa8eOHVqxYoWCg4PVpEkTjR8/XiNGjNCYMWNkt9s1a9YshYeHa9KkSZJ+n+/07bffavLkyYqNjb2alwAAAJRCV3WH6JZbbtGPP/540fatW7eqWrVqxS4mOztbklS5cmVJv39X2rlz59wma9etW1c1atRQSkqKJCklJUUNGzZUcHCw2Sc2NlYul0vbt283+1w44Ts2NtYc40I5OTlyuVxuCwAAKL2uKhB17NhRL774os6ePVuo7cyZMxo9erTuv//+YhWSn5+vIUOG6J577lGDBg0kSRkZGbLb7eb3pRUIDg5WRkaG2eePYaigvaDtUn1cLpfOnDlTqJYJEybI39/fXEJDQ4t1TgAA4OZwVW+ZjRw5Up999pluv/12DRo0SHXq1JEk/fTTT5o+fbry8vL0wgsvFKuQhIQE/fjjj/r222+Ltf+1lJiYqGHDhpnrLpeLUAQAQCl2VYEoODhY69ev18CBA5WYmCjDMCRJNptNsbGxmj59eqE7MVdi0KBBWrRokdatW6fq1aub251Op3Jzc3X8+HG3u0SZmZlyOp1mn//85z9u4xU8hfbHPhc+mZaZmSmHwyEfH59C9Xh5ecnLy+uqzwMAANycrvqTqsPCwrRkyRIdPnxYGzdu1IYNG3T48GEtWbJE4eHhVzWWYRgaNGiQPv/8c61atarQ/k2bNlX58uW1cuVKc9uuXbuUnp6uyMhISVJkZKS2bdumrKwss09ycrIcDociIiLMPn8co6BPwRgAAMDaivVJ1ZJUqVIl3XXXXX/q4AkJCZo3b56++OIL+fn5mXN+/P395ePjI39/f/Xt21fDhg1T5cqV5XA4NHjwYEVGRqpFixaSfn/UPyIiQj179tTEiROVkZGhkSNHKiEhwbzLM2DAAL399tt67rnn1KdPH61atUoLFizQ4sWL/1T9AACgdCjWd5ldKzNnzlR2draioqJUrVo1c5k/f77ZZ/Lkybr//vvVpUsXtWrVSk6nU5999pnZXrZsWS1atEhly5ZVZGSkHnvsMfXq1Uvjxo0z+4SHh2vx4sVKTk5W48aNNWnSJL377rs8cg8AACT9iTtE10LBHKRL8fb21vTp0zV9+vSL9il4G+9SoqKitGXLlquuEQAAlH4evUMEAABQEhCIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5Xk0EK1bt06dOnVSSEiIbDabFi5c6Nbeu3dv2Ww2t6V9+/ZufY4ePaoePXrI4XAoICBAffv21cmTJ936bN26VS1btpS3t7dCQ0M1ceLE631qAADgJuLRQHTq1Ck1btxY06dPv2if9u3b69ChQ+byr3/9y629R48e2r59u5KTk7Vo0SKtW7dOTzzxhNnucrkUExOjsLAwpaam6vXXX9eYMWM0e/bs63ZeAADg5lLOkwfv0KGDOnTocMk+Xl5ecjqdRbbt3LlTS5cu1aZNm9SsWTNJ0ltvvaWOHTvqjTfeUEhIiD766CPl5ubq/fffl91uV/369ZWWlqY333zTLTgBAADrKvFziNasWaOgoCDVqVNHAwcO1JEjR8y2lJQUBQQEmGFIkqKjo1WmTBlt3LjR7NOqVSvZ7XazT2xsrHbt2qVjx47duBMBAAAllkfvEF1O+/bt9fDDDys8PFx79uzR888/rw4dOiglJUVly5ZVRkaGgoKC3PYpV66cKleurIyMDElSRkaGwsPD3foEBwebbZUqVSp03JycHOXk5JjrLpfrWp8aAAAoQUp0IOratav554YNG6pRo0aqVauW1qxZo3bt2l23406YMEFjx469buMDAICSpcS/ZfZHt956q6pWrardu3dLkpxOp7Kystz6nD9/XkePHjXnHTmdTmVmZrr1KVi/2NykxMREZWdnm8uBAweu9akAAIAS5KYKRL/++quOHDmiatWqSZIiIyN1/Phxpaammn1WrVql/Px8NW/e3Oyzbt06nTt3zuyTnJysOnXqFPl2mfT7RG6Hw+G2AACA0sujgejkyZNKS0tTWlqaJGnv3r1KS0tTenq6Tp48qeHDh2vDhg3at2+fVq5cqc6dO6t27dqKjY2VJNWrV0/t27dX//799Z///EffffedBg0apK5duyokJESS1L17d9ntdvXt21fbt2/X/PnzNXXqVA0bNsxTpw0AAEoYjwaizZs364477tAdd9whSRo2bJjuuOMOjRo1SmXLltXWrVv1wAMP6Pbbb1ffvn3VtGlTffPNN/Ly8jLH+Oijj1S3bl21a9dOHTt21L333uv2GUP+/v5avny59u7dq6ZNm+rZZ5/VqFGjeOQeAACYPDqpOioqSoZhXLR92bJllx2jcuXKmjdv3iX7NGrUSN98881V1wcAAKzhpppDBAAAcD0QiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOV5NBCtW7dOnTp1UkhIiGw2mxYuXOjWbhiGRo0apWrVqsnHx0fR0dH6+eef3focPXpUPXr0kMPhUEBAgPr27auTJ0+69dm6datatmwpb29vhYaGauLEidf71AAAwE3Eo4Ho1KlTaty4saZPn15k+8SJEzVt2jTNmjVLGzduVMWKFRUbG6uzZ8+afXr06KHt27crOTlZixYt0rp16/TEE0+Y7S6XSzExMQoLC1Nqaqpef/11jRkzRrNnz77u5wcAAG4O5Tx58A4dOqhDhw5FthmGoSlTpmjkyJHq3LmzJOmf//yngoODtXDhQnXt2lU7d+7U0qVLtWnTJjVr1kyS9NZbb6ljx4564403FBISoo8++ki5ubl6//33ZbfbVb9+faWlpenNN990C04AAMC6Suwcor179yojI0PR0dHmNn9/fzVv3lwpKSmSpJSUFAUEBJhhSJKio6NVpkwZbdy40ezTqlUr2e12s09sbKx27dqlY8eOFXnsnJwcuVwutwUAAJReJTYQZWRkSJKCg4PdtgcHB5ttGRkZCgoKcmsvV66cKleu7NanqDH+eIwLTZgwQf7+/uYSGhr6508IAACUWCU2EHlSYmKisrOzzeXAgQOeLgkAAFxHJTYQOZ1OSVJmZqbb9szMTLPN6XQqKyvLrf38+fM6evSoW5+ixvjjMS7k5eUlh8PhtgAAgNKrxAai8PBwOZ1OrVy50tzmcrm0ceNGRUZGSpIiIyN1/Phxpaammn1WrVql/Px8NW/e3Oyzbt06nTt3zuyTnJysOnXqqFKlSjfobAAAQEnm0UB08uRJpaWlKS0tTdLvE6nT0tKUnp4um82mIUOG6KWXXtKXX36pbdu2qVevXgoJCdGDDz4oSapXr57at2+v/v376z//+Y++++47DRo0SF27dlVISIgkqXv37rLb7erbt6+2b9+u+fPna+rUqRo2bJiHzhoAAJQ0Hn3sfvPmzWrTpo25XhBS4uPjlZSUpOeee06nTp3SE088oePHj+vee+/V0qVL5e3tbe7z0UcfadCgQWrXrp3KlCmjLl26aNq0aWa7v7+/li9froSEBDVt2lRVq1bVqFGjeOQeAACYPBqIoqKiZBjGRdttNpvGjRuncePGXbRP5cqVNW/evEsep1GjRvrmm2+KXScAACjdSuwcIgAAgBuFQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyPQAQAACyvRAeiMWPGyGazuS1169Y128+ePauEhARVqVJFvr6+6tKlizIzM93GSE9PV1xcnCpUqKCgoCANHz5c58+fv9GnAgAASrByni7gcurXr68VK1aY6+XK/V/JQ4cO1eLFi/XJJ5/I399fgwYN0sMPP6zvvvtOkpSXl6e4uDg5nU6tX79ehw4dUq9evVS+fHm98sorN/xcAABAyVTiA1G5cuXkdDoLbc/OztZ7772nefPmqW3btpKkOXPmqF69etqwYYNatGih5cuXa8eOHVqxYoWCg4PVpEkTjR8/XiNGjNCYMWNkt9tv9OkAAIASqES/ZSZJP//8s0JCQnTrrbeqR48eSk9PlySlpqbq3Llzio6ONvvWrVtXNWrUUEpKiiQpJSVFDRs2VHBwsNknNjZWLpdL27dvv+gxc3Jy5HK53BYAAFB6lehA1Lx5cyUlJWnp0qWaOXOm9u7dq5YtW+rEiRPKyMiQ3W5XQECA2z7BwcHKyMiQJGVkZLiFoYL2graLmTBhgvz9/c0lNDT02p4YAAAoUUr0W2YdOnQw/9yoUSM1b95cYWFhWrBggXx8fK7bcRMTEzVs2DBz3eVyEYoAACjFSvQdogsFBATo9ttv1+7du+V0OpWbm6vjx4+79cnMzDTnHDmdzkJPnRWsFzUvqYCXl5ccDofbAgAASq+bKhCdPHlSe/bsUbVq1dS0aVOVL19eK1euNNt37dql9PR0RUZGSpIiIyO1bds2ZWVlmX2Sk5PlcDgUERFxw+sHAAAlU4l+y+z//b//p06dOiksLEwHDx7U6NGjVbZsWXXr1k3+/v7q27evhg0bpsqVK8vhcGjw4MGKjIxUixYtJEkxMTGKiIhQz549NXHiRGVkZGjkyJFKSEiQl5eXh88OAACUFCU6EP3666/q1q2bjhw5osDAQN17773asGGDAgMDJUmTJ09WmTJl1KVLF+Xk5Cg2NlYzZsww9y9btqwWLVqkgQMHKjIyUhUrVlR8fLzGjRvnqVMCAAAlUIkORB9//PEl2729vTV9+nRNnz79on3CwsK0ZMmSa10aAAAoRW6qOUQAAADXA4EIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYHoEIAABYXon+YEarSE9P1+HDhz1dBkqRnTt3eroEALipEIg8LD09XXXr1tOZM6c9XQpKoZxzuZ4uAQBuCgQiDzt8+LDOnDmtTvGjVNUZ5ulyUErs3r5B3yx6R+fPn/d0KQBwUyAQlRBVnWFy1qjj6TJQShzO2O/pEgDgpsKkagAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHkEIgAAYHmWCkTTp09XzZo15e3trebNm+s///mPp0sCAAAlgGUC0fz58zVs2DCNHj1a33//vRo3bqzY2FhlZWV5ujQAAOBhlglEb775pvr376/HH39cERERmjVrlipUqKD333/f06UBAAAPK+fpAm6E3NxcpaamKjEx0dxWpkwZRUdHKyUlxYOVAcDNaefOnZ4uAaVM1apVVaNGDY8d3xKB6PDhw8rLy1NwcLDb9uDgYP3000+F+ufk5CgnJ8dcz87OliS5XK5rXtvJkyclSYfS/6vcnDPXfHxY0+GM/ZKk3/73s8qXsXm4GpQmv/7yoyTpscce83AlKG28vX20efMmhYaGXrMxC/7fNgzjsn0tEYiu1oQJEzR27NhC26/lX9KFlv7rtes2Nqxr9b+neboEALgiZ8+eUYMGDa7L2CdOnJC/v/8l+1giEFWtWlVly5ZVZmam2/bMzEw5nc5C/RMTEzVs2DBzPT8/X0ePHlWVKlVks/Hbtqe4XC6FhobqwIEDcjgcni4HpQTXFa4Xri3PMwxDJ06cUEhIyGX7WiIQ2e12NW3aVCtXrtSDDz4o6feQs3LlSg0aNKhQfy8vL3l5ebltCwgIuAGV4ko4HA7+ccE1x3WF64Vry7Mud2eogCUCkSQNGzZM8fHxatasmf7yl79oypQpOnXqlB5//HFPlwYAADzMMoHo0Ucf1W+//aZRo0YpIyNDTZo00dKlSwtNtAYAANZjmUAkSYMGDSryLTLcHLy8vDR69OhCb2cCfwbXFa4Xrq2bi824kmfRAAAASjHLfFI1AADAxRCIAACA5RGIAACA5RGIAACA5RGIcEm9e/eWzWYrtOzevdtsL/iwywv72+121a5dW+PGjdP58+fNPu+8844aN24sX19fBQQE6I477tCECRMuWcfTTz+tpk2bysvLS02aNLlk3927d8vPz6/ID9P85JNPVLduXXl7e6thw4ZasmTJZV+D2bNnKyoqSg6HQzabTcePH7/sPrg8q19bR48e1eDBg1WnTh35+PioRo0aevrpp83vTkTxWP26kqQnn3xStWrVko+PjwIDA9W5c+civ7cT7ghEuKz27dvr0KFDbkt4ePhl+//888969tlnNWbMGL3++uuSpPfff19DhgzR008/rbS0NH333Xd67rnnzC+5vZQ+ffro0UcfvWSfc+fOqVu3bmrZsmWhtvXr16tbt27q27evtmzZogcffFAPPvigfvzxx0uOefr0abVv317PP//8ZWvE1bHytXXw4EEdPHhQb7zxhn788UclJSVp6dKl6tu372XrxaVZ+bqSpKZNm2rOnDnauXOnli1bJsMwFBMTo7y8vMvWbGkGcAnx8fFG586dr7i9qP733Xef0aJFC8MwDKNz585G7969i13P6NGjjcaNG1+0/bnnnjMee+wxY86cOYa/v79b2yOPPGLExcW5bWvevLnx5JNPXtGxV69ebUgyjh07dpVVoyhcW4UtWLDAsNvtxrlz565qP/wfrqvCfvjhB0OSsXv37qvaz2q4Q4TrzsfHR7m5uZIkp9OpDRs2aP/+/df8OKtWrdInn3yi6dOnF9mekpKi6Ohot22xsbFKSUm55rXgxiht11Z2drYcDofKlbPUZ+aWOKXpujp16pTmzJmj8PBwhYaG/ql6SzsCES5r0aJF8vX1NZe//e1vV7SfYRhasWKFli1bprZt20qSRo8erYCAANWsWVN16tRR7969tWDBAuXn5/+pGo8cOaLevXsrKSnpol+imJGRUeirWoKDg5WRkfGnjo3i49r6P4cPH9b48eP1xBNP/Kl6wXUlSTNmzDDP/+uvv1ZycrLsdvufqrm0IxDhstq0aaO0tDRzmTZt2iX7F/xj5O3trQ4dOujRRx/VmDFjJEnVqlVTSkqKtm3bpmeeeUbnz59XfHy82rdv/6f+genfv7+6d++uVq1aFXuMV155xe0f0fT09GKPhSvDtfU7l8uluLg4RUREmOeD4uO6knr06KEtW7Zo7dq1uv322/XII4/o7NmzxT6WFXBfFpdVsWJF1a5d+4r7t2nTRjNnzpTdbldISEiRt/8bNGigBg0a6KmnntKAAQPUsmVLrV27Vm3atClWjatWrdKXX36pN954Q9Lvv+nl5+erXLlymj17tvr06SOn06nMzEy3/TIzM+V0OiVJAwYM0COPPGK2hYSEFKsWXDmuLenEiRNq3769/Pz89Pnnn6t8+fLFqhP/h+tK8vf3l7+/v2677Ta1aNFClSpV0ueff65u3boVq14rIBDhmrvaf4wiIiIk/f5ed3GlpKS4PUHxxRdf6LXXXtP69et1yy23SJIiIyO1cuVKDRkyxOyXnJysyMhISVLlypVVuXLlYteA66+0XVsul0uxsbHy8vLSl19+KW9v72LXieIrbdfVhQzDkGEYysnJKXa9VkAgwg01cOBAhYSEqG3btqpevboOHTqkl156SYGBgeYPeVF2796tkydPKiMjQ2fOnFFaWpqk3/9hstvtqlevnlv/zZs3q0yZMmrQoIG57ZlnnlHr1q01adIkxcXF6eOPP9bmzZs1e/bsS9ackZGhjIwM83NMtm3bJj8/P9WoUYMAVYLcbNeWy+VSTEyMTp8+rQ8//FAul0sul0uSFBgYqLJly/6JVwPXys12Xf3yyy+aP3++YmJiFBgYqF9//VWvvvqqfHx81LFjxz/3YpRyBCLcUNHR0Xr//fc1c+ZMHTlyRFWrVjV/C6pSpcpF9+vXr5/Wrl1rrt9xxx2SpL1796pmzZpXdOy7775b8+bN08iRI/X888/rtttu08KFC93+ASrKrFmzNHbsWHO94D3/OXPmqHfv3ld0bFx/N9u19f3332vjxo2SVOjuxNUcG9fXzXZdeXt765tvvtGUKVN07NgxBQcHq1WrVlq/fr2CgoKu7KQtymYYhuHpIgAAADyJp8wAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAAIDlEYgAoAhRUVFuX5lws4wNoHgIRABuCr1799aDDz7o6TIAlFIEIgC4DgzD0Pnz5z1dBoArRCACUKJ8+umnatiwoXx8fFSlShVFR0dr+PDh+uCDD/TFF1/IZrPJZrNpzZo1kqQRI0bo9ttvV4UKFXTrrbfqxRdf1Llz58zxxowZoyZNmmju3LmqWbOm/P391bVrV504ccLsc+rUKfXq1Uu+vr6qVq2aJk2aVKiuuXPnqlmzZvLz85PT6VT37t2VlZVltq9Zs0Y2m01ff/21mjZtKi8vL3377bdXNDYAzyMQASgxDh06pG7duqlPnz7auXOn1qxZo4cfflijR4/WI488ovbt2+vQoUM6dOiQ7r77bkmSn5+fkpKStGPHDk2dOlXvvPOOJk+e7Dbunj17tHDhQi1atEiLFi3S2rVr9eqrr5rtw4cP19q1a/XFF19o+fLlWrNmjb7//nu3Mc6dO6fx48frhx9+0MKFC7Vv374iv9z373//u1599VXt3LlTjRo1uqKxAZQABgCUEKmpqYYkY9++fYXa4uPjjc6dO192jNdff91o2rSpuT569GijQoUKhsvlMrcNHz7caN68uWEYhnHixAnDbrcbCxYsMNuPHDli+Pj4GM8888xFj7Np0yZDknHixAnDMAxj9erVhiRj4cKFZp/ijg3gxuMOEYASo3HjxmrXrp0aNmyov/3tb3rnnXd07NixS+4zf/583XPPPXI6nfL19dXIkSOVnp7u1qdmzZry8/Mz16tVq2a+3bVnzx7l5uaqefPmZnvlypVVp04dtzFSU1PVqVMn1ahRQ35+fmrdurUkFTpWs2bNzD9f6dgAPI9ABKDEKFu2rJKTk/X1118rIiJCb731lurUqaO9e/cW2T8lJUU9evRQx44dtWjRIm3ZskUvvPCCcnNz3fqVL1/ebd1msyk/P/+K6zp16pRiY2PlcDj00UcfadOmTfr8888lqdCxKlaseMXjAig5CEQAShSbzaZ77rlHY8eO1ZYtW2S32/X555/LbrcrLy/Pre/69esVFhamF154Qc2aNdNtt92m/fv3X9XxatWqpfLly2vjxo3mtmPHjum///2vuf7TTz/pyJEjevXVV9WyZUvVrVvXbUL1nxkbQMlQztMFAECBjRs3auXKlYqJiVFQUJA2btyo3377TfXq1dPZs2e1bNky7dq1S1WqVJG/v79uu+02paen6+OPP9Zdd92lxYsXm3durpSvr6/69u2r4cOHq0qVKgoKCtILL7ygMmX+7/fFGjVqyG6366233tKAAQP0448/avz48ddkbAAlA4EIQInhcDi0bt06TZkyRS6XS2FhYZo0aZI6dOigZs2aac2aNWrWrJlOnjyp1atX64EHHtDQoUM1aNAg5eTkKC4uTi+++KLGjBlzVcd9/fXXdfLkSXXq1El+fn569tlnlZ2dbbYHBgYqKSlJzz//vKZNm6Y777xTb7zxhh544IE/PTaAksFmGIbh6SIAAAA8ifu2AADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8ghEAADA8v4/wPRYZKbd7BcAAAAASUVORK5CYII=\n",
- "text/plain": [
- "<Figure size 640x480 with 1 Axes>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "sns.histplot(data=df[\"standard\"])\n",
- "plt.title(\"Distribution of certificate standards\")\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "f6cbb42f",
- "metadata": {},
- "source": [
- "### Distribution of embodiment in the dataset"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "id": "9a0a7b1c",
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAJXCAYAAAByoktvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABf9ElEQVR4nO3deVwVdf///+cBBUU2N0BcELUQzC23qMw1cSnr0utbLrnlnpppmZdX5laXVu6paV2lmLm0XFZuqbjve7hraiSWIrkA4oIC8/ujH+fTEVRccA7M4367nZvMzPvMvOZwkCfvec/72AzDMAQAAGBhLmYXAAAAYDYCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEXKdESNGyGazPZRj1a9fX/Xr17cvr1u3TjabTd99991DOX7nzp1VtmzZh3Kse5WcnKxu3bopICBANptNb7zxhtkl3dJvv/0mm82myMhIh/XLly9XtWrVVKBAAdlsNiUkJOSK195MkZGRstls2rVrV44f6+afw1t9H4H7QSCCqTL+U814FChQQIGBgYqIiNDHH3+sS5cuPZDjnD59WiNGjFB0dPQD2d+D5My1Zcfo0aMVGRmp3r17a86cOerQoYPZJWnevHmaNGlSttqeP39eL730kgoWLKhp06Zpzpw5KlSoUM4WKOmTTz7hF3oet2zZMo0YMcLsMpBdBmCiWbNmGZKMUaNGGXPmzDFmzpxpjB492mjSpIlhs9mMoKAgY+/evQ7PuXHjhnH16tW7Os7OnTsNScasWbPu6nkpKSlGSkqKfXnt2rWGJOPbb7+9q/3ca23Xr183rl279sCOlRPq1KljPPXUU2aX4aBFixZGUFBQpvXp6enG1atXjdTUVPu6n376yZBkREVFObTN6de+UqVKRr169XJs/zkt42d3586dOX6sevXqObxWWX0fnVGfPn0Mfs3mHvlMzGKAXbNmzVSzZk378pAhQ7RmzRo999xzatmypQ4fPqyCBQtKkvLly6d8+XL2rXvlyhV5eHjIzc0tR49zJ/nz5zf1+NkRHx+vsLAws8uQJF2+fPm2vTsZvZB/Fx8fL0ny9fV1WJ8bXnuryur7CNwvLpnBaTVs2FDvvvuuTp48qa+++sq+PqsxRFFRUXr66afl6+srT09PhYSE6N///rekv8b91KpVS5LUpUsX++W5jMsV9evX12OPPabdu3frmWeekYeHh/25N49dyJCWlqZ///vfCggIUKFChdSyZUudOnXKoU3ZsmXVuXPnTM/9+z7vVFtW41guX76sN998U6VLl5a7u7tCQkI0btw4GYbh0M5ms6lv37764Ycf9Nhjj8nd3V2VKlXS8uXLs37BbxIfH6+uXbvK399fBQoUUNWqVTV79mz79ozxVDExMVq6dKm99t9+++22+/3qq69Uu3ZteXh4qHDhwnrmmWe0cuVKhzY//fST6tatq0KFCsnLy0stWrTQwYMHHdp07txZnp6eOnHihJo3by4vLy+1b99e9evX19KlS3Xy5El7TRmv4c1jT+rXr69OnTpJkmrVqiWbzWb/nmX12qenp2vy5MmqXLmyChQooOLFi6tp06YO42hmzZqlhg0bys/PT+7u7goLC9P06dMd9lO2bFkdPHhQ69evt9f49/dZQkKC3njjDfv3uEKFCvrwww+Vnp5+29f2Xl6/2NhYPffcc/L09FTJkiU1bdo0SdL+/fvVsGFDFSpUSEFBQZo3b16Wx7py5Yp69uypokWLytvbWx07dtTFixcztfvkk09UqVIlubu7KzAwUH369FFCQkKmdp999pnKly+vggULqnbt2tq4cWOmNlmNIXoQ55Od1z3j2OPGjbPX6u7urlq1amnnzp0O9WQc++/DAjIsWLBANWrUkJeXl7y9vVW5cmVNnjw5y9cYDwc9RHBqHTp00L///W+tXLlS3bt3z7LNwYMH9dxzz6lKlSoaNWqU3N3ddfz4cW3evFmSFBoaqlGjRmnYsGHq0aOH6tatK0l68skn7fs4f/68mjVrpjZt2uiVV16Rv7//bev6z3/+I5vNpsGDBys+Pl6TJk1S48aNFR0dbe/Jyo7s1PZ3hmGoZcuWWrt2rbp27apq1appxYoVGjRokP744w9NnDjRof2mTZu0cOFCvfbaa/Ly8tLHH3+s1q1bKzY2VkWLFr1lXVevXlX9+vV1/Phx9e3bV8HBwfr222/VuXNnJSQkqH///goNDdWcOXM0YMAAlSpVSm+++aYkqXjx4rfc78iRIzVixAg9+eSTGjVqlNzc3LR9+3atWbNGTZo0kSTNmTNHnTp1UkREhD788ENduXJF06dP19NPP62ff/7ZIaSkpqYqIiJCTz/9tMaNGycPDw8FBAQoMTFRv//+u/318PT0zLKed955RyEhIfrss880atQoBQcHq3z58resv2vXroqMjFSzZs3UrVs3paamauPGjdq2bZu9h3P69OmqVKmSWrZsqXz58mnx4sV67bXXlJ6erj59+kiSJk2apH79+snT01PvvPOOJNnfc1euXFG9evX0xx9/qGfPnipTpoy2bNmiIUOG6MyZM3ccG3U3r19aWpqaNWumZ555Rh999JHmzp2rvn37qlChQnrnnXfUvn17tWrVSjNmzFDHjh0VHh6u4OBgh+P17dtXvr6+GjFihI4eParp06fr5MmT9sAs/fVHzMiRI9W4cWP17t3b3m7nzp3avHmzvTfuiy++UM+ePfXkk0/qjTfe0K+//qqWLVuqSJEiKl269G3P+37P525f93nz5unSpUvq2bOnbDabPvroI7Vq1Uq//vqr8ufPr549e+r06dOKiorSnDlzHJ4bFRWltm3bqlGjRvrwww8lSYcPH9bmzZvVv3//O54ncojZ1+xgbdkZh+Dj42NUr17dvjx8+HCH6/ITJ040JBl//vnnLfdxu3E69erVMyQZM2bMyHLb38cuZIwhKlmypJGUlGRf/8033xiSjMmTJ9vXBQUFGZ06dbrjPm9XW6dOnRzGwvzwww+GJOP99993aPfPf/7TsNlsxvHjx+3rJBlubm4O6/bu3WtIMqZMmZLpWH83adIkQ5Lx1Vdf2dddv37dCA8PNzw9PR3OPSgoyGjRosVt92cYhnHs2DHDxcXF+Mc//mGkpaU5bEtPTzcMwzAuXbpk+Pr6Gt27d3fYHhcXZ/j4+Dis79SpkyHJ+Ne//pXpWLcaQxQTE5Pptb7Ve/Dm137NmjWGJOP111/PtN+M+g3DMK5cuZJpe0REhFGuXDmHdbcaQ/Tee+8ZhQoVMn755ReH9f/6178MV1dXIzY2NtNzMtzL6zd69Gj7uosXLxoFCxY0bDabsWDBAvv6I0eOGJKM4cOH29dlvG41atQwrl+/bl//0UcfGZKMH3/80TAMw4iPjzfc3NyMJk2aOHzfp06dakgyZs6caRjGX+8vPz8/o1q1ag7j9j777DNDksNrldX38X7PJ7uve8axixYtaly4cMHe7scffzQkGYsXL7avu9UYov79+xve3t5OPwbKarhkBqfn6el527vNMsZ+/Pjjj9m+pHAzd3d3denSJdvtO3bsKC8vL/vyP//5T5UoUULLli27p+Nn17Jly+Tq6qrXX3/dYf2bb74pwzD0008/Oaxv3LixQ49HlSpV5O3trV9//fWOxwkICFDbtm3t6/Lnz6/XX39dycnJWr9+/V3X/sMPPyg9PV3Dhg2Ti4vjfz0ZPQlRUVFKSEhQ27Ztde7cOfvD1dVVderU0dq1azPtt3fv3nddy7343//+J5vNpuHDh2fa9vdLIX/vIUxMTNS5c+dUr149/frrr0pMTLzjcb799lvVrVtXhQsXdngNGjdurLS0NG3YsOGWz72X169bt272r319fRUSEqJChQrppZdesq8PCQmRr69vlu+bHj16OIy36t27t/Lly2f/WVi1apWuX7+uN954w+H73r17d3l7e2vp0qWSpF27dik+Pl69evVyGLvXuXNn+fj43PF1u9/zudvX/eWXX1bhwoXtyxm9u3f62cqo6/Lly4qKisr2eSHncckMTi85OVl+fn633P7yyy/r888/V7du3fSvf/1LjRo1UqtWrfTPf/4z0y/eWylZsuRdDaB+5JFHHJZtNpsqVKhwx/Ez9+vkyZMKDAx0CGPSX5feMrb/XZkyZTLto3DhwlmO8bj5OI888kim1+9Wx8mOEydOyMXF5bYDsI8dOybpr/FjWfH29nZYzpcvn0qVKnXXtdyLEydOKDAwUEWKFLltu82bN2v48OHaunWrrly54rAtMTHxjr/cjx07pn379t3y0mPGIPBbPVfK/uuXMQ7q73x8fFSqVKlM4/R8fHyyfN/c/LPg6empEiVK2H8WMt4rISEhDu3c3NxUrlw5+/aMf2/eX/78+VWuXLksz+dm93M+d/u63/yzlRGO7vSzJUmvvfaavvnmGzVr1kwlS5ZUkyZN9NJLL6lp06Z3fC5yDoEITu33339XYmKiKlSocMs2BQsW1IYNG7R27VotXbpUy5cv19dff62GDRtq5cqVcnV1veNx7mbcT3bdavLItLS0bNX0INzqOMZNA7CdRUYP35w5cxQQEJBp+813F7q7u2c79D4MJ06cUKNGjVSxYkVNmDBBpUuXlpubm5YtW6aJEydmqwczPT1dzz77rN5+++0stz/66KO3fa6U/dfvVu+P3Pa+yXA/53O3r/v9vEZ+fn6Kjo7WihUr9NNPP+mnn37SrFmz1LFjR4cbF/BwEYjg1DIGI0ZERNy2nYuLixo1aqRGjRppwoQJGj16tN555x2tXbtWjRs3fuAzW2f8JZ7BMAwdP35cVapUsa8rXLhwlnfRnDx50uEv3rupLSgoSKtWrdKlS5cceomOHDli3/4gBAUFad++fUpPT3cIHPdznPLlyys9PV2HDh1StWrVbtlG+usXRuPGje++8P9fTsxkXr58ea1YsUIXLly4ZS/R4sWLlZKSokWLFjn0IGR1qepWNZYvX17Jycn3dP4P6vW7G8eOHVODBg3sy8nJyTpz5oyaN28u6f/eK0ePHnV431+/fl0xMTH2OjPaHTt2zKGH68aNG4qJiVHVqlVz9Dzu53W/ldu9D93c3PT888/r+eefV3p6ul577TV9+umnevfdd2/7ByByjvP8aQXcZM2aNXrvvfcUHBys9u3b37LdhQsXMq3L+IWbkpIiSfa5abIKKPfiyy+/dBjX9N133+nMmTNq1qyZfV358uW1bds2Xb9+3b5uyZIlmW7Pv5vamjdvrrS0NE2dOtVh/cSJE2Wz2RyOfz+aN2+uuLg4ff311/Z1qampmjJlijw9PVWvXr273ueLL74oFxcXjRo1KlNPScZf1REREfL29tbo0aN148aNTPv4888/s3WsQoUKZWu8zt1o3bq1DMPQyJEjM23LqD+j1+DvvQSJiYmaNWtWljVm9T1/6aWXtHXrVq1YsSLTtoSEBKWmpt6yxgf1+t2Nzz77zOFY06dPV2pqqv292LhxY7m5uenjjz92eF2++OILJSYmqkWLFpKkmjVrqnjx4poxY4bDz0xkZOQD+7m9nft53W/lVj/b58+fd1h2cXGx/zGV8X8WHj56iOAUfvrpJx05ckSpqak6e/as1qxZo6ioKAUFBWnRokW3nYRt1KhR2rBhg1q0aKGgoCDFx8frk08+UalSpfT0009L+iuc+Pr6asaMGfLy8lKhQoVUp06dTLcQZ1eRIkX09NNPq0uXLjp79qwmTZqkChUqOEwN0K1bN3333Xdq2rSpXnrpJZ04cUJfffVVptu676a2559/Xg0aNNA777yj3377TVWrVtXKlSv1448/6o033rjtLeN3o0ePHvr000/VuXNn7d69W2XLltV3332nzZs3a9KkSZnGMGVHhQoV9M477+i9995T3bp11apVK7m7u2vnzp0KDAzUmDFj5O3trenTp6tDhw56/PHH1aZNGxUvXlyxsbFaunSpnnrqqUxhMCs1atTQ119/rYEDB6pWrVry9PTU888/fy8vhV2DBg3UoUMHffzxxzp27JiaNm2q9PR0bdy4UQ0aNFDfvn3VpEkT+1/+PXv2VHJysv773//Kz89PZ86cyVTj9OnT9f7776tChQry8/NTw4YNNWjQIC1atEjPPfecOnfurBo1aujy5cvav3+/vvvuO/32228qVqxYljU+qNfvbly/fl2NGjXSSy+9pKNHj+qTTz7R008/rZYtW0r6axqGIUOGaOTIkWratKlatmxpb1erVi298sorkv4aK/T++++rZ8+eatiwoV5++WXFxMRo1qxZ2R5DdD/u53W/lRo1akiSXn/9dUVERMjV1VVt2rRRt27ddOHCBTVs2FClSpXSyZMnNWXKFFWrVs0+Tg8mMOnuNsAwjP+7dTfj4ebmZgQEBBjPPvusMXnyZIfbuzPcfNv96tWrjRdeeMEIDAw03NzcjMDAQKNt27aZbp/98ccfjbCwMCNfvnwOt+zWq1fPqFSpUpb13eq2+/nz5xtDhgwx/Pz8jIIFCxotWrQwTp48men548ePN0qWLGm4u7sbTz31lLFr165M+7xdbTff+m0Yf91aPWDAACMwMNDInz+/8cgjjxhjx451uPXbMP667b5Pnz6ZarrVdAA3O3v2rNGlSxejWLFihpubm1G5cuUspwbI7m33GWbOnGlUr17dcHd3NwoXLmzUq1cv08dmrF271oiIiDB8fHyMAgUKGOXLlzc6d+5s7Nq1y96mU6dORqFChbI8RnJystGuXTvD19fXkGR/De/ntnvDMIzU1FRj7NixRsWKFQ03NzejePHiRrNmzYzdu3fb2yxatMioUqWKUaBAAaNs2bLGhx9+aMycOdOQZMTExNjbxcXFGS1atDC8vLwy3VZ+6dIlY8iQIUaFChUMNzc3o1ixYsaTTz5pjBs3zuEW91u5n9fvVj8PN3+fM1639evXGz169DAKFy5seHp6Gu3btzfOnz+f6flTp041KlasaOTPn9/w9/c3evfubVy8eDFTu08++cQIDg423N3djZo1axobNmzI9DNzq9vu7+d8DCN7r3vGsceOHZtpn7rpVv7U1FSjX79+RvHixQ2bzWb/f+u7774zmjRpYvj5+Rlubm5GmTJljJ49expnzpzJtE88PDbDcPJRcgAAADmMMUQAAMDyCEQAAMDyCEQA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unRpffTRRzl9agAAIBcxNRBdvnxZVatW1bRp07Lc/tFHH+njjz/WjBkztH37dhUqVEgRERG6du2avU379u118OBBRUVFacmSJdqwYYN69Ohh356UlKQmTZooKChIu3fv1tixYzVixAh99tlnOX5+AAAgd8hn5sGbNWumZs2aZbnNMAxNmjRJQ4cO1QsvvCBJ+vLLL+Xv768ffvhBbdq00eHDh7V8+XLt3LlTNWvWlCRNmTJFzZs317hx4xQYGKi5c+fq+vXrmjlzptzc3FSpUiVFR0drwoQJDsEJAABYl9OOIYqJiVFcXJwaN25sX+fj46M6depo69atkqStW7fK19fXHoYkqXHjxnJxcdH27dvtbZ555hm5ubnZ20REROjo0aO6ePFilsdOSUlRUlKSwwMAAORdThuI4uLiJEn+/v4O6/39/e3b4uLi5Ofn57A9X758KlKkiEObrPbx92PcbMyYMfLx8bE/Spcuff8nBAAAnJbTBiIzDRkyRImJifbHqVOnzC4JAADkIKcNRAEBAZKks2fPOqw/e/asfVtAQIDi4+MdtqempurChQsObbLax9+PcTN3d3d5e3s7PAAAQN7ltIEoODhYAQEBWr16tX1dUlKStm/frvDwcElSeHi4EhIStHv3bnubNWvWKD09XXXq1LG32bBhg27cuGFvExUVpZCQEBUuXPghnQ0AAHBmpgai5ORkRUdHKzo6WtJfA6mjo6MVGxsrm82mN954Q++//74WLVqk/fv3q2PHjgoMDNSLL74oSQoNDVXTpk3VvXt37dixQ5s3b1bfvn3Vpk0bBQYGSpLatWsnNzc3de3aVQcPHtTXX3+tyZMna+DAgSadNQAAcDam3na/a9cuNWjQwL6cEVI6deqkyMhIvf3227p8+bJ69OihhIQEPf3001q+fLkKFChgf87cuXPVt29fNWrUSC4uLmrdurU+/vhj+3YfHx+tXLlSffr0UY0aNVSsWDENGzaMW+4BAICdqYGofv36MgzjltttNptGjRqlUaNG3bJNkSJFNG/evNsep0qVKtq4ceM91wkAAPI2px1DBAAA8LAQiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAA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Xb58WV26dDG7NAAAYDLLBKKXX35Zf/75p4YNG6a4uDhVq1ZNy5cvl7+/v9mlIZvc3d01fPjwTJczgfvB+wo5hfdW7mIzjOzciwYAAJB3WWIMEQAAwO0QiAAAgOURiAAAgOURiAAAgOURiAAAgOURiABYzsaNG/XKK68oPDxcf/zxhyRpzpw52rRpk8mVIS/YtWuX5syZozlz5mjXrl1ml4Nsssw8RMgdChcunO3Pi7tw4UIOV4O86H//+586dOig9u3b6+eff1ZKSookKTExUaNHj9ayZctMrhC51e+//662bdtq8+bN9o97SkhI0JNPPqkFCxaoVKlS5haI22IeIjiV2bNn278+f/683n//fUVERNg/YmXr1q1asWKF3n33XQ0YMMCsMpGLVa9eXQMGDFDHjh3l5eWlvXv3qly5cvr555/VrFkzxcXFmV0icqmmTZsqISFBs2fPVkhIiCTp6NGj6tKli7y9vbV8+XKTK8TtEIjgtFq3bq0GDRqob9++DuunTp2qVatW6YcffjCnMORqHh4eOnTokMqWLesQiH799VeFhYXp2rVrZpeIXKpgwYLasmWLqlev7rB+9+7dqlu3rq5cuWJSZcgOxhDBaa1YsUJNmzbNtL5p06ZatWqVCRUhLwgICNDx48czrd+0aZPKlStnQkXIK0qXLq0bN25kWp+WlqbAwEATKsLdIBDBaRUtWlQ//vhjpvU//vijihYtakJFyAu6d++u/v37a/v27bLZbDp9+rTmzp2rt956S7179za7PORiY8eOVb9+/RwGUu/atUv9+/fXuHHjTKwM2cElMzityMhIdevWTc2aNVOdOnUkSdu3b9fy5cv13//+V507dza3QORKhmFo9OjRGjNmjP0Shru7u9566y299957JleH3Kxw4cK6cuWKUlNTlS/fX/csZXxdqFAhh7bcFOJ8CERwatu3b9fHH3+sw4cPS5JCQ0P1+uuv2wMScK+uX7+u48ePKzk5WWFhYfL09DS7JORyf78p5E46deqUg5XgXhCIAACA5TEPEZzaiRMnNGvWLP3666+aNGmS/Pz89NNPP6lMmTKqVKmS2eUhF7p8+bI++OADrV69WvHx8UpPT3fY/uuvv5pUGXKjpKQkeXt727++nYx2cE4EIjit9evXq1mzZnrqqae0YcMGvf/++/Lz89PevXv1xRdf6LvvvjO7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\n",
- "text/plain": [
- "<Figure size 640x480 with 1 Axes>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "sns.histplot(data=df[\"embodiment\"])\n",
- "plt.title(\"Distribution of certificate embodiments\")\n",
- "plt.xticks(rotation=90) \n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "2c1f9314",
- "metadata": {},
- "source": [
- "### Twenty most common CPEs in the dataset"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "id": "a960fd10",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Number of certificates with at least one CPE match: 465\n"
- ]
- }
- ],
- "source": [
- "cpe_certs_df: DataFrame = df[df[\"cpe_matches\"].notna()]\n",
- "\n",
- "print(f\"Number of certificates with at least one CPE match: {cpe_certs_df.shape[0]}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "id": "12a2e03f",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[('cpe:2.3:o:redhat:enterprise_linux:8.6:*:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:redhat:enterprise_linux:8.0:*:*:*:-:*:*:*', 19),\n",
- " ('cpe:2.3:o:redhat:linux:8.0:*:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:redhat:enterprise_linux:8.5.0:*:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:redhat:enterprise_linux:8.0:*:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:redhat:enterprise_linux:8.1:*:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:redhat:enterprise_linux:8.4:*:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:oracle:linux:7:0:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:oracle:linux:7:3:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:oracle:linux:7:-:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:oracle:linux:7:1:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:o:oracle:linux:7:2:*:*:*:*:*:*', 19),\n",
- " ('cpe:2.3:h:cisco:catalyst_6509-e:-:*:*:*:*:*:*:*', 15),\n",
- " ('cpe:2.3:h:cisco:catalyst_6506-e:-:*:*:*:*:*:*:*', 15),\n",
- " ('cpe:2.3:a:mcafee:network_security_platform:9.1:*:*:*:*:*:*:*', 12),\n",
- " ('cpe:2.3:h:juniper:mx240:-:*:*:*:*:*:*:*', 11),\n",
- " ('cpe:2.3:h:juniper:mx960:-:*:*:*:*:*:*:*', 11),\n",
- " ('cpe:2.3:h:juniper:mx480:-:*:*:*:*:*:*:*', 11),\n",
- " ('cpe:2.3:o:amazon:linux_2:-:*:*:*:*:*:*:*', 9),\n",
- " ('cpe:2.3:o:redhat:linux:7.1:*:*:*:*:*:*:*', 8)]"
- ]
- },
- "execution_count": 24,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "cpe_counter = Counter()\n",
- "cpe_matches_per_cert: list[int] = []\n",
- "\n",
- "for cpes in cpe_certs_df[\"cpe_matches\"]:\n",
- " cpe_counter.update(cpes)\n",
- " cpe_matches_per_cert.append(len(cpes))\n",
- "\n",
- "cpe_counter.most_common(20)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "f1fb99fe",
- "metadata": {},
- "source": [
- "### CPE matches data extraction"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "id": "f66de442",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Text(0.5, 1.0, 'Boxplot of total cpe matches per certificate')"
- ]
- },
- "execution_count": 25,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGgCAYAAAAKKQXsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA160lEQVR4nO3deXxTVf7/8Xe6pYU2KYXSghRkFRhHUdbKomC1IqBIgcFxYVMUAQfQQaujIF8HRhgFRQF1lCoOX0dwG8aRrSr+1MrmMCMiiMhSLC2bTQrYFNrz+8NvM4S20JTmhpbX8/G4D+g5N/d+etIk79zce2IzxhgBAABYJCTYBQAAgAsL4QMAAFiK8AEAACxF+AAAAJYifAAAAEsRPgAAgKUIHwAAwFKEDwAAYCnCBwAAsBThA9XKZrNp2rRpwS7Dx4YNG3TVVVepbt26stls2rx5c7BLOqPzcQxrg927d8tms+nPf/5zsEvB/xkxYoQuvvhin7ajR4/qrrvuUmJiomw2myZOnOi97zIyMoJSJ6of4aOGyMjIkM1m81kaNmyo3r1768MPPwx2eeds69atmjZtmnbv3l2t2z1x4oSGDBmiI0eOaM6cOVq8eLGaNWsWsBqWLFmiuXPnVvn2ODPGt+bJycnRtGnTKh36Z8yYoYyMDI0dO1aLFy/WHXfcEdgCFbjnH1QsLNgFwD/Tp09X8+bNZYxRXl6eMjIydOONN2r58uXq379/sMursq1bt+qJJ57QNddcU+ad0LnYuXOn9uzZo5dffll33XVXwGtYsmSJtmzZookTJ1bp9jgzxrfmycnJ0RNPPKGLL75YHTp08Ol7+eWXVVJS4tP20UcfqVu3bpo6daq3zRijn3/+WeHh4QGpMVDPP6gY4aOG6du3rzp16uT9efTo0UpISND//u//1ujwESgHDhyQJMXGxga3ECAIjh07prp16wZl3ydPniwTLE5XXpg4cOCA2rdv79Nms9kUGRlZrfUhyAxqhEWLFhlJZsOGDT7tJSUlxuFwmDvvvNOn/ejRo2by5MmmSZMmJiIiwrRp08bMnj3blJSUGGOMOX78uLnkkkvMJZdcYo4fP+693eHDh01iYqJJTk42J0+eNMYYM3z4cFO3bl2zc+dOc/3115s6deqYRo0amSeeeMK7vVKSzNSpU33avvrqK3PDDTeYmJgYU7duXdOnTx+TlZVV5nc7ffn444/POCaZmZmmR48epk6dOsbpdJqbbrrJbN261ds/fPjwMtu8+uqrzzi+Z6rhhRdeMO3btzcRERGmUaNG5r777jM//fSTt//qq68uc/tmzZoZY4zxeDzmscceM1deeaVxOBymTp06pkePHuajjz4qU0t5Y1ien3/+2UydOtW0bt3a2O12k5iYaG655Rbz/fffG2OM2bVrl5FkZs+ebZ555hnTtGlTExkZaXr16mW+/vrrMtv79ttvTVpamqlXr56x2+2mY8eO5v333z9rHafu5/nnnzfNmzc3UVFR5rrrrjN79+41JSUlZvr06eaiiy4ykZGR5qabbjKHDx/22cZ7771nbrzxRtOoUSMTERFhWrRoYaZPn+79Gzzb+Po7Hi+++KJp0aKFiYiIMJ06dTLr16+v0ngUFRWZadOmmVatWhm73W7i4uJM9+7dzapVq844ZqV/b2vXrjVjxowxcXFxJiYmxtxxxx3myJEjZdb/5z//6f1bj46ONjfeeKPZsmWLzzqlj9Pvv//e9O3b10RHR5ubb775jHXs27fPjBo1yjvuF198sbn33nuNx+PxrvPTTz+Z3/3ud97nkpYtW5o//elPpri42LvOqWM7Z84c06JFCxMSEmLmzJlT7uNq0aJF3ppL78OPP/643HV37drl3X7p7U69j4YMGWIaNGhgIiMjTZs2bcwjjzzi7d+9e7cZO3asadOmjYmMjDRxcXFm8ODBZteuXWXuizM99isz/vAPRz5qGJfLpUOHDskYowMHDmjevHk6evSobr/9du86xhjddNNN+vjjjzV69Gh16NBBK1eu1O9//3v9+OOPmjNnjqKiovTaa6+pe/fuevTRR/XMM89IksaNGyeXy6WMjAyFhoZ6t1lcXKwbbrhB3bp106xZs7RixQpNnTpVJ0+e1PTp0yus95tvvlHPnj3lcDg0ZcoUhYeH68UXX9Q111yjtWvXqmvXrurVq5fuv/9+Pffcc3rkkUfUrl07SfL+W541a9aob9++atGihaZNm6aff/5Z8+bNU/fu3fXVV1/p4osv1j333KOLLrpIM2bM0P3336/OnTsrISGh3O2drYZp06bpiSeeUEpKisaOHavt27drwYIF2rBhgz7//HOFh4fr0Ucflcvl0r59+zRnzhxJUnR0tCTJ7XbrL3/5i2699VbdfffdKigo0CuvvKLU1FStX7++zOHosykuLlb//v2VmZmpYcOG6Xe/+50KCgq0evVqbdmyRS1btvSu+/rrr6ugoEDjxo1TYWGhnn32WfXp00dff/21dzy++eYbde/eXRdddJEefvhh1a1bV2+99ZYGDhyot99+W7fccstZa/rrX/+qoqIiTZgwQUeOHNGsWbM0dOhQ9enTR5988okeeughff/995o3b54efPBBvfrqq97bZmRkKDo6WpMnT1Z0dLQ++ugjPf7443K73Zo9e7YknXF8/RmPJUuWqKCgQPfcc49sNptmzZqlQYMG6YcffvC+E6/seEybNk0zZ87UXXfdpS5dusjtdmvjxo366quvdN111511zMaPH6/Y2FhNmzbN+ze1Z88effLJJ7LZbJKkxYsXa/jw4UpNTdVTTz2l48ePa8GCBerRo4f+9a9/+XxMcPLkSaWmpqpHjx7685//rDp16lS475ycHHXp0kX5+fkaM2aM2rZtqx9//FHLli3T8ePHFRERoePHj+vqq6/Wjz/+qHvuuUdNmzbVF198ofT0dO3fv7/M+TeLFi1SYWGhxowZI7vdrltuuUUFBQV6/PHHNWbMGPXs2VOSdNVVV5Wpp127dlq8eLEmTZqkJk2a6IEHHpAkxcfH6+DBg2XW/89//qOePXsqPDxcY8aM0cUXX6ydO3dq+fLl+uMf/yjpl5PNv/jiCw0bNkxNmjTR7t27tWDBAl1zzTXaunWr6tSpc9bHvj/jDz8EO/2gcipK53a73WRkZPis+9577xlJ5sknn/RpHzx4sLHZbN53gsYYk56ebkJCQsynn35qli5daiSZuXPn+tyu9AjChAkTvG0lJSWmX79+JiIiwhw8eNDbrtPetQ8cONBERESYnTt3ettycnJMTEyM6dWrl7etdN9nO9pRqkOHDqZhw4Y+76D//e9/m5CQEJ+jQKXvppYuXXrWbVZUw4EDB0xERIS5/vrrfd7tPf/880aSefXVV71t/fr183k3XurkyZM+7yaN+eUdZUJCghk1apRP++ljWJ5XX33VSDLPPPNMmb7So1Gl7xajoqLMvn37vP3r1q0zksykSZO8bddee6359a9/bQoLC322c9VVV5nWrVufsZbS/cTHx5v8/Hxve3p6upFkLr/8cnPixAlv+6233moiIiJ89nXq0bdS99xzj6lTp47PehWNrz/jUb9+fZ+jC++//76RZJYvX+73eFx++eWmX79+FY5NRUofzx07djRFRUXe9lmzZhlJ3iMsBQUFJjY21tx9990+t8/NzTVOp9OnvfRx+vDDD1eqhjvvvNOEhISUOZpqzH/H7H/+539M3bp1zXfffefT//DDD5vQ0FCzd+9eY8x/x9bhcJgDBw74rLthw4Zyj1qU1nz6/dmsWbMyY1rekY9evXqZmJgYs2fPnnJrN6b8v6usrCwjybz++uvetooe+/6MP/zD1S41zAsvvKDVq1dr9erVeuONN9S7d2/dddddeuedd7zr/POf/1RoaKjuv/9+n9s+8MADMsb4XB0zbdo0/epXv9Lw4cN133336eqrry5zu1Ljx4/3/t9ms2n8+PEqKirSmjVryl2/uLhYq1at0sCBA9WiRQtve6NGjfTb3/5Wn332mdxut99jsH//fm3evFkjRoxQXFyct/2yyy7Tddddp3/+859+b/NM1qxZo6KiIk2cOFEhIf99yNx9991yOBz64IMPzrqN0NBQRURESJJKSkp05MgRnTx5Up06ddJXX33ld01vv/22GjRooAkTJpTpK33HXGrgwIG66KKLvD936dJFXbt29Y7TkSNH9NFHH2no0KEqKCjQoUOHdOjQIR0+fFipqanasWOHfvzxx7PWNGTIEDmdTu/PXbt2lSTdfvvtCgsL82kvKiry2WZUVJT3/6U19OzZU8ePH9e2bdvOum9/xuM3v/mN6tWr5/259N34Dz/8IMm/8YiNjdU333yjHTt2nLXG8owZM8bnvIexY8cqLCzMe9+sXr1a+fn5uvXWW711HDp0SKGhoeratas+/vjjMtscO3bsWfdbUlKi9957TwMGDPA5h6xU6ZgtXbpUPXv2VL169Xz2n5KSouLiYn366ac+t0tLS1N8fLxfY1AVBw8e1KeffqpRo0apadOm5dYu+f5dnThxQocPH1arVq0UGxtbqcddVcYflcPHLjVMly5dfJ4sbr31Vl1xxRUaP368+vfvr4iICO3Zs0eNGzdWTEyMz21LDyPu2bPH2xYREaFXX31VnTt3VmRkpBYtWlTmyVqSQkJCfAKEJLVp00aSKrw87eDBgzp+/LguueSSMn3t2rVTSUmJsrOz9atf/apyv/z/Ka2/ou2uXLmyWk+0q2h/ERERatGihc94nslrr72mp59+Wtu2bdOJEye87c2bN/e7pp07d+qSSy7xeVGvSOvWrcu0tWnTRm+99ZYk6fvvv5cxRo899pgee+yxcrdx4MABnwBTntNfBEqDSFJSUrntP/30k7ftm2++0R/+8Ad99NFHZQKpy+U6434l/8bj9DpLg0hpPf6Mx/Tp03XzzTerTZs2uvTSS3XDDTfojjvu0GWXXXbWOqSy9010dLQaNWrkfUyVhpo+ffqUe3uHw+Hzc1hYmJo0aXLW/R48eFBut1uXXnrpGdfbsWOH/vOf/1QYKEpP6C5Vlb/lqigNimer/+eff9bMmTO1aNEi/fjjjzLGePsq83fl7/ij8ggfNVxISIh69+6tZ599Vjt27PD7hVySVq5cKUkqLCzUjh07LHsCuZC88cYbGjFihAYOHKjf//73atiwoUJDQzVz5kzt3LkzqLWVXpHw4IMPKjU1tdx1WrVqddbtnHqOUGXaS18I8vPzdfXVV8vhcGj69Olq2bKlIiMj9dVXX+mhhx466xUT/jpbPf6MR69evbRz5069//77WrVqlf7yl79ozpw5Wrhw4Vkv7a6M0loWL16sxMTEMv2nhy273e5zdK469n/ddddpypQp5faXvgEpdeqRhvPBhAkTtGjRIk2cOFHJyclyOp2y2WwaNmxYpf6u/B1/VB4jVwucPHlS0i8zA0pSs2bNtGbNGhUUFPgc/Sg9fH3qJFv/+c9/NH36dI0cOVKbN2/WXXfdpa+//trn8Ln0y4Pwhx9+8Hmy+e677ySpwhOu4uPjVadOHW3fvr1M37Zt2xQSEuJ9V1ze0ZaKlNZf0XYbNGhQpaMeFdVw6v5OPfpTVFSkXbt2KSUl5azbWLZsmVq0aKF33nnHZ51T5zLwR8uWLbVu3TqdOHHirHMflPeRwHfffee930p/p/DwcJ/fxSqffPKJDh8+rHfeeUe9evXytu/atavMuhWNrz/jcTb+jkdcXJxGjhypkSNH6ujRo+rVq5emTZtWqfCxY8cO9e7d2/vz0aNHtX//ft14442S5D1RtmHDhtV638THx8vhcGjLli1nXK9ly5Y6evToOe3bn8d2ZZXeR2erf9myZRo+fLiefvppb1thYaHy8/MrVWOgxh/McFrjnThxQqtWrVJERIT3Y5Ubb7xRxcXFev75533WnTNnjmw2m/r27eu97YgRI9S4cWM9++yzysjIUF5eniZNmlTuvk7dnjFGzz//vMLDw3XttdeWu35oaKiuv/56vf/++z4fzeTl5WnJkiXq0aOH97BlaVg4/UmhPI0aNVKHDh302muv+ay/ZcsWrVq1yvvE7a+KakhJSVFERISee+45n8O2r7zyilwul/r16+ezjfIO55a+2z719uvWrVNWVlaVak1LS9OhQ4fK3Men70OS3nvvPZ/zK9avX69169Z5/w4aNmyoa665Ri+++KL2799fZnvlXWlQncobm6KiIs2fP7/MuhWNrz/jcTb+jMfhw4d9+qKjo9WqVSt5PJ5K7eull17y+QhuwYIFOnnypPe+SU1NlcPh0IwZM3zWK68Wf4SEhGjgwIFavny5Nm7cWKa/dMyGDh2qrKws79HRU+Xn53vf+JyJP4/tyoqPj1evXr306quvau/evT59p97foaGhZe7/efPmqbi4uFI1Bmr8wZGPGufDDz/0HsE4cOCAlixZoh07dujhhx/2vpAPGDBAvXv31qOPPqrdu3fr8ssv16pVq/T+++9r4sSJ3jT/5JNPavPmzcrMzFRMTIwuu+wyPf744/rDH/6gwYMH+7yIR0ZGasWKFRo+fLi6du2qDz/8UB988IEeeeSRM55g9uSTT2r16tXq0aOH7rvvPoWFhenFF1+Ux+PRrFmzvOt16NBBoaGheuqpp+RyuWS329WnTx81bNiw3O3Onj1bffv2VXJyskaPHu291NbpdFb5e1HOVEN6erqeeOIJ3XDDDbrpppu0fft2zZ8/X507d/a5zLljx47629/+psmTJ6tz586Kjo7WgAED1L9/f73zzju65ZZb1K9fP+3atUsLFy5U+/btvUes/HHnnXfq9ddf1+TJk7V+/Xr17NlTx44d05o1a3Tffffp5ptv9q7bqlUr9ejRQ2PHjpXH49HcuXNVv359n0PpL7zwgnr06KFf//rXuvvuu9WiRQvl5eUpKytL+/bt07///e8qjWllXHXVVapXr56GDx+u+++/XzabTYsXLy43NFQ0vv6MR2VUdjzat2+va665Rh07dlRcXJw2btyoZcuW+ZycfSZFRUW69tprNXToUO/fVI8ePXTTTTdJ+uWcggULFuiOO+7QlVdeqWHDhik+Pl579+7VBx98oO7du5cbuCpjxowZWrVqla6++mqNGTNG7dq10/79+7V06VJ99tlnio2N1e9//3v9/e9/V//+/TVixAh17NhRx44d09df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ACxF+AAAAJYifAAAAEsRPgAAgKUIHwAAwFKEDwAAYCnCBwAAsBThAwAAWIrwAQAALEX4AAAAliJ8AAAASxE+AACApQgfAADAUoQPAABgKcIHAACwFOEDAABYivABAAAsRfgAAACWInwAAABLET4AAIClCB8AAMBShA8AAGApwgcAALCU3+Hjxx9/1O2336769esrKipKv/71r7Vx40ZvvzFGjz/+uBo1aqSoqCilpKRox44d1Vo0AACoufwKHz/99JO6d++u8PBwffjhh9q6dauefvpp1atXz7vOrFmz9Nxzz2nhwoVat26d6tatq9TUVBUWFlZ78QAAoOaxGWNMZVd++OGH9fnnn+v//b//V26/MUaNGzfWAw88oAcffFCS5HK5lJCQoIyMDA0bNuys+3C73XI6nXK5XHI4HJUtDQAABJE/r99+Hfn4+9//rk6dOmnIkCFq2LChrrjiCr388sve/l27dik3N1cpKSneNqfTqa5duyorK6vcbXo8Hrndbp8FAADUXn6Fjx9++EELFixQ69attXLlSo0dO1b333+/XnvtNUlSbm6uJCkhIcHndgkJCd6+082cOVNOp9O7JCUlVeX3AAAANYRf4aOkpERXXnmlZsyYoSuuuEJjxozR3XffrYULF1a5gPT0dLlcLu+SnZ1d5W0BAIDzn1/ho1GjRmrfvr1PW7t27bR3715JUmJioiQpLy/PZ528vDxv3+nsdrscDofPAgAAai+/wkf37t21fft2n7bvvvtOzZo1kyQ1b95ciYmJyszM9Pa73W6tW7dOycnJ1VAuAACo6cL8WXnSpEm66qqrNGPGDA0dOlTr16/XSy+9pJdeekmSZLPZNHHiRD355JNq3bq1mjdvrscee0yNGzfWwIEDA1E/gBpkxIgROnz4sOrXr6+MjIxglwMgSPwKH507d9a7776r9PR0TZ8+Xc2bN9fcuXN12223edeZMmWKjh07pjFjxig/P189evTQihUrFBkZWe3FA6g5vv32Wx0+fFiSdPjwYX377bdq165dkKsCEAx+zfNhBeb5AGqnm266Sac+3dhsNv39738PYkUAqlPA5vkAgKqYN2+eTn+fY4zRvHnzglQRgGAifAAIqKKiIq1atarcvlWrVqmoqMjiigAEG+EDQEDNnTv3nPoB1D6EDwABNXHixHPqB1D7ED4ABFRERISuv/76cvtSU1MVERFhcUUAgo3wASDgJkyYIJvN5tNms9k0fvz4IFUEIJgIHwAs8dRTT53xZwAXDsIHAEu0a9dO9evXlyTVr1+fCcaAC5hfM5wCwLlgSnUAEkc+AACAxQgfAADAUoQPAABgKcIHAACwFOEDAABYivABAAAsRfgAAACWInwAAABLET4AAIClCB8AAMBShA8AAGApwgcAALAU4QMAAFiK8AEAACxF+AAAAJYifAAAAEsRPgAAgKUIHwAAwFKEDwAAYCnCBwAAsBThA4Bl3njjDd1888164403gl0KgCAifACwhMvl0ltvvaWSkhK99dZbcrlcwS4JQJAQPgBYYsaMGTLGSJKMMZoxY0aQKwIQLIQPAAG3efNmbd261adt69at2rx5c3AKAhBUhA8AAVVSUqJZs2aV2zdr1iyVlJRYXBGAYCN8AAiojRs3qqCgoNy+goICbdy40eKKAASbX+Fj2rRpstlsPkvbtm29/YWFhRo3bpzq16+v6OhopaWlKS8vr9qLBlBzdOrUSTExMeX2ORwOderUyeKKAASb30c+fvWrX2n//v3e5bPPPvP2TZo0ScuXL9fSpUu1du1a5eTkaNCgQdVaMICaJSQkRFOmTCm3b8qUKQoJ4QAscKEJ8/sGYWFKTEws0+5yufTKK69oyZIl6tOnjyRp0aJFateunb788kt169bt3KsFUCN16NBB7du39znptH379rr88suDWBWAYPH7LceOHTvUuHFjtWjRQrfddpv27t0rSdq0aZNOnDihlJQU77pt27ZV06ZNlZWVVeH2PB6P3G63zwKg9nnkkUdks9kk/XI05JFHHglyRQCCxa/w0bVrV2VkZGjFihVasGCBdu3apZ49e6qgoEC5ubmKiIhQbGysz20SEhKUm5tb4TZnzpwpp9PpXZKSkqr0iwA4vzmdTg0dOlQhISEaMmSInE5nsEsCECQ2UzrrTxXk5+erWbNmeuaZZxQVFaWRI0fK4/H4rNOlSxf17t1bTz31VLnb8Hg8Prdxu91KSkqSy+WSw+GoamkAAMBCbrdbTqezUq/f53SmV2xsrNq0aaPvv/9eiYmJKioqUn5+vs86eXl55Z4jUsput8vhcPgsAACg9jqn8HH06FHt3LlTjRo1UseOHRUeHq7MzExv//bt27V3714lJyefc6EAAKB28OtqlwcffFADBgxQs2bN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\n",
- "text/plain": [
- "<Figure size 640x480 with 1 Axes>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# Boxplot\n",
- "sns.boxplot(y=cpe_matches_per_cert)\n",
- "plt.title(\"Boxplot of total cpe matches per certificate\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "id": "a0ad02e1",
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Maximum cpe_matches: 74\n",
- "Minimum cpe_matches: 1\n",
- "Mean cpe_matches: 4.93\n",
- "Median cpe_matches: 2.0\n",
- "First quartile: 1.0\n",
- "Third quartile: 5.0\n",
- "IQR: 4.0\n"
- ]
- }
- ],
- "source": [
- "# NOTE: We are calculating over \"cpe_matches\", since every cert has \"verified_cpe_matches\" equal to NaN\n",
- "maximum_cpe_matches: int = max(cpe_matches_per_cert)\n",
- "minimum_cpe_matches: int = min(cpe_matches_per_cert)\n",
- "mean_cpe_matches: int = np.mean(cpe_matches_per_cert)\n",
- "median_cpe_matches: int = np.median(cpe_matches_per_cert)\n",
- "quantile_25 = np.percentile(cpe_matches_per_cert, 25)\n",
- "quantile_75 = np.percentile(cpe_matches_per_cert, 75)\n",
- "iqr = quantile_75 - quantile_25\n",
- "\n",
- "print(f\"Maximum cpe_matches: {maximum_cpe_matches}\")\n",
- "print(f\"Minimum cpe_matches: {minimum_cpe_matches}\")\n",
- "print(f\"Mean cpe_matches: {round(mean_cpe_matches, 2)}\")\n",
- "print(f\"Median cpe_matches: {median_cpe_matches}\")\n",
- "print(f\"First quartile: {quantile_25}\")\n",
- "print(f\"Third quartile: {quantile_75}\")\n",
- "print(f\"IQR: {iqr}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "id": "a92548f0",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<div>\n",
- "<style scoped>\n",
- " .dataframe tbody tr th:only-of-type {\n",
- " vertical-align: middle;\n",
- " }\n",
- "\n",
- " .dataframe tbody tr th {\n",
- " vertical-align: top;\n",
- " }\n",
- "\n",
- " .dataframe thead th {\n",
- " text-align: right;\n",
- " }\n",
- "</style>\n",
- "<table border=\"1\" class=\"dataframe\">\n",
- " <thead>\n",
- " <tr style=\"text-align: right;\">\n",
- " <th></th>\n",
- " <th>cert_id</th>\n",
- " <th>name</th>\n",
- " <th>status</th>\n",
- " <th>standard</th>\n",
- " <th>type</th>\n",
- " <th>level</th>\n",
- " <th>embodiment</th>\n",
- " <th>date_validation</th>\n",
- " <th>date_sunset</th>\n",
- " <th>algorithms</th>\n",
- " <th>...</th>\n",
- " <th>related_cves</th>\n",
- " <th>module_directly_referenced_by</th>\n",
- " <th>module_indirectly_referenced_by</th>\n",
- " <th>module_directly_referencing</th>\n",
- " <th>module_indirectly_referencing</th>\n",
- " <th>policy_directly_referenced_by</th>\n",
- " <th>policy_indirectly_referenced_by</th>\n",
- " <th>policy_directly_referencing</th>\n",
- " <th>policy_indirectly_referencing</th>\n",
- " <th>year_from</th>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>dgst</th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " </tr>\n",
- " </thead>\n",
- " <tbody>\n",
- " <tr>\n",
- " <th>926a7fc32c08e491</th>\n",
- " <td>989</td>\n",
- " <td>Windows XP Enhanced Cryptographic Provider (RS...</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Software</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2008-07-24</td>\n",
- " <td>NaT</td>\n",
- " <td>{AES#781, Triple-DES MAC#675, HMAC#428, RNG#44...</td>\n",
- " <td>...</td>\n",
- " <td>{CVE-2011-2014, CVE-2008-1453, CVE-2010-0020, ...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>{2009}</td>\n",
- " <td>{2009}</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2008</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>fe50b64954720ccb</th>\n",
- " <td>990</td>\n",
- " <td>Windows XP Enhanced DSS and Diffie-Hellman Cry...</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Software</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2008-07-24</td>\n",
- " <td>NaT</td>\n",
- " <td>{Triple-DES#676, RNG#448, SHS#784, DSA#292, Tr...</td>\n",
- " <td>...</td>\n",
- " <td>{CVE-2011-2014, CVE-2008-1453, CVE-2010-0020, ...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2008</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>749fc650cacb0f06</th>\n",
- " <td>241</td>\n",
- " <td>Kernel Mode Cryptographic Module for Windows XP</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-1</td>\n",
- " <td>Software</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2002-08-01</td>\n",
- " <td>NaT</td>\n",
- " <td>{HMAC-SHA-1#35, Triple-DES#16, DSA/SHA-1#35}</td>\n",
- " <td>...</td>\n",
- " <td>{CVE-2011-2014, CVE-2008-1453, CVE-2010-0020, ...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>{106}</td>\n",
- " <td>{106}</td>\n",
- " <td>2002</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>6af1f692e9496c6d</th>\n",
- " <td>240</td>\n",
- " <td>DSS/Diffie-Hellman Enhanced Cryptographic Prov...</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-1</td>\n",
- " <td>Software</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2002-08-01</td>\n",
- " <td>NaT</td>\n",
- " <td>{Triple-DES#16, DSA/SHA-1#29}</td>\n",
- " <td>...</td>\n",
- " <td>{CVE-2011-2014, CVE-2008-1453, CVE-2010-0020, ...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>{433}</td>\n",
- " <td>{433}</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2002</td>\n",
- " </tr>\n",
- " </tbody>\n",
- "</table>\n",
- "<p>4 rows × 23 columns</p>\n",
- "</div>"
- ],
- "text/plain": [
- " cert_id name \\\n",
- "dgst \n",
- "926a7fc32c08e491 989 Windows XP Enhanced Cryptographic Provider (RS... \n",
- "fe50b64954720ccb 990 Windows XP Enhanced DSS and Diffie-Hellman Cry... \n",
- "749fc650cacb0f06 241 Kernel Mode Cryptographic Module for Windows XP \n",
- "6af1f692e9496c6d 240 DSS/Diffie-Hellman Enhanced Cryptographic Prov... \n",
- "\n",
- " status standard type level \\\n",
- "dgst \n",
- "926a7fc32c08e491 historical FIPS 140-2 Software 1.0 \n",
- "fe50b64954720ccb historical FIPS 140-2 Software 1.0 \n",
- "749fc650cacb0f06 historical FIPS 140-1 Software 1.0 \n",
- "6af1f692e9496c6d historical FIPS 140-1 Software 1.0 \n",
- "\n",
- " embodiment date_validation date_sunset \\\n",
- "dgst \n",
- "926a7fc32c08e491 Multi-Chip Stand Alone 2008-07-24 NaT \n",
- "fe50b64954720ccb Multi-Chip Stand Alone 2008-07-24 NaT \n",
- "749fc650cacb0f06 Multi-Chip Stand Alone 2002-08-01 NaT \n",
- "6af1f692e9496c6d Multi-Chip Stand Alone 2002-08-01 NaT \n",
- "\n",
- " algorithms ... \\\n",
- "dgst ... \n",
- "926a7fc32c08e491 {AES#781, Triple-DES MAC#675, HMAC#428, RNG#44... ... \n",
- "fe50b64954720ccb {Triple-DES#676, RNG#448, SHS#784, DSA#292, Tr... ... \n",
- "749fc650cacb0f06 {HMAC-SHA-1#35, Triple-DES#16, DSA/SHA-1#35} ... \n",
- "6af1f692e9496c6d {Triple-DES#16, DSA/SHA-1#29} ... \n",
- "\n",
- " related_cves \\\n",
- "dgst \n",
- "926a7fc32c08e491 {CVE-2011-2014, CVE-2008-1453, CVE-2010-0020, ... \n",
- "fe50b64954720ccb {CVE-2011-2014, CVE-2008-1453, CVE-2010-0020, ... \n",
- "749fc650cacb0f06 {CVE-2011-2014, CVE-2008-1453, CVE-2010-0020, ... \n",
- "6af1f692e9496c6d {CVE-2011-2014, CVE-2008-1453, CVE-2010-0020, ... \n",
- "\n",
- " module_directly_referenced_by \\\n",
- "dgst \n",
- "926a7fc32c08e491 NaN \n",
- "fe50b64954720ccb NaN \n",
- "749fc650cacb0f06 NaN \n",
- "6af1f692e9496c6d NaN \n",
- "\n",
- " module_indirectly_referenced_by module_directly_referencing \\\n",
- "dgst \n",
- "926a7fc32c08e491 NaN NaN \n",
- "fe50b64954720ccb NaN NaN \n",
- "749fc650cacb0f06 NaN NaN \n",
- "6af1f692e9496c6d NaN NaN \n",
- "\n",
- " module_indirectly_referencing policy_directly_referenced_by \\\n",
- "dgst \n",
- "926a7fc32c08e491 NaN {2009} \n",
- "fe50b64954720ccb NaN NaN \n",
- "749fc650cacb0f06 NaN NaN \n",
- "6af1f692e9496c6d NaN {433} \n",
- "\n",
- " policy_indirectly_referenced_by policy_directly_referencing \\\n",
- "dgst \n",
- "926a7fc32c08e491 {2009} NaN \n",
- "fe50b64954720ccb NaN NaN \n",
- "749fc650cacb0f06 NaN {106} \n",
- "6af1f692e9496c6d {433} NaN \n",
- "\n",
- " policy_indirectly_referencing year_from \n",
- "dgst \n",
- "926a7fc32c08e491 NaN 2008 \n",
- "fe50b64954720ccb NaN 2008 \n",
- "749fc650cacb0f06 {106} 2002 \n",
- "6af1f692e9496c6d NaN 2002 \n",
- "\n",
- "[4 rows x 23 columns]"
- ]
- },
- "execution_count": 27,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "max_cpe_matches_df: DataFrame = cpe_certs_df[cpe_certs_df[\"cpe_matches\"].apply(lambda x: len(x) == maximum_cpe_matches)]\n",
- "max_cpe_matches_df"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "id": "2b216157",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "<div>\n",
- "<style scoped>\n",
- " .dataframe tbody tr th:only-of-type {\n",
- " vertical-align: middle;\n",
- " }\n",
- "\n",
- " .dataframe tbody tr th {\n",
- " vertical-align: top;\n",
- " }\n",
- "\n",
- " .dataframe thead th {\n",
- " text-align: right;\n",
- " }\n",
- "</style>\n",
- "<table border=\"1\" class=\"dataframe\">\n",
- " <thead>\n",
- " <tr style=\"text-align: right;\">\n",
- " <th></th>\n",
- " <th>cert_id</th>\n",
- " <th>name</th>\n",
- " <th>status</th>\n",
- " <th>standard</th>\n",
- " <th>type</th>\n",
- " <th>level</th>\n",
- " <th>embodiment</th>\n",
- " <th>date_validation</th>\n",
- " <th>date_sunset</th>\n",
- " <th>algorithms</th>\n",
- " <th>...</th>\n",
- " <th>related_cves</th>\n",
- " <th>module_directly_referenced_by</th>\n",
- " <th>module_indirectly_referenced_by</th>\n",
- " <th>module_directly_referencing</th>\n",
- " <th>module_indirectly_referencing</th>\n",
- " <th>policy_directly_referenced_by</th>\n",
- " <th>policy_indirectly_referenced_by</th>\n",
- " <th>policy_directly_referencing</th>\n",
- " <th>policy_indirectly_referencing</th>\n",
- " <th>year_from</th>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>dgst</th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " <th></th>\n",
- " </tr>\n",
- " </thead>\n",
- " <tbody>\n",
- " <tr>\n",
- " <th>71cadd0c63e57249</th>\n",
- " <td>4472</td>\n",
- " <td>Amazon Linux 2 GnuTLS Cryptographic Module</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Software</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2023-04-14</td>\n",
- " <td>2025-04-19</td>\n",
- " <td>{HMAC#C792, CVL#C792, DRBG#C792, AES#C791, SHS...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2023</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>9931f287c490c562</th>\n",
- " <td>3618</td>\n",
- " <td>Amazon Linux 2 Libgcrypt Cryptographic Module</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Software</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2020-02-19</td>\n",
- " <td>2025-02-18</td>\n",
- " <td>{SHS#C693, Triple-DES#C693, DRBG#C693, DSA#C69...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2020</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>03f65a290e11d786</th>\n",
- " <td>3908</td>\n",
- " <td>Juniper Networks NFX250 Network Services Platform</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2021-04-23</td>\n",
- " <td>2026-04-22</td>\n",
- " <td>{AES#C2042, HMAC#C1979, CVL#C1978, HMAC#C2042,...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2021</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>7119d5d9637ddeeb</th>\n",
- " <td>3717</td>\n",
- " <td>Juniper Networks NFX150 Network Services Platform</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2020-09-28</td>\n",
- " <td>2025-09-27</td>\n",
- " <td>{RSA#C970, DRBG#C970, DRBG#C947, HMAC#C970, AE...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2020</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>f36e412aea00d7c6</th>\n",
- " <td>4519</td>\n",
- " <td>Cisco Catalyst 9400 Series Switches</td>\n",
- " <td>active</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2023-05-11</td>\n",
- " <td>2026-03-02</td>\n",
- " <td>{KAS#C431, KBKDF#A1462, RSA#C431, RSA#A1462, D...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>{3637}</td>\n",
- " <td>{3637}</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>{3637}</td>\n",
- " <td>{3637}</td>\n",
- " <td>2023</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>...</th>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>9cbfc3c153a29e5c</th>\n",
- " <td>2593</td>\n",
- " <td>Network Security Platform Sensor NS-9300 S</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>2.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2016-03-29</td>\n",
- " <td>NaT</td>\n",
- " <td>{CVL#599, DRBG#649, SHS#2612, SHS#2923, CVL#40...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2016</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>1625f9db144171f7</th>\n",
- " <td>1750</td>\n",
- " <td>IDProtect Key with LASER PKI</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>3.0</td>\n",
- " <td>Single Chip</td>\n",
- " <td>2012-07-17</td>\n",
- " <td>NaT</td>\n",
- " <td>{ECDSA#214, SHS#1465, CVL#2, RSA#824, DRBG#98,...</td>\n",
- " <td>...</td>\n",
- " <td>{CVE-2019-15809}</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2012</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>15bb14fd69723b98</th>\n",
- " <td>3580</td>\n",
- " <td>Network Security Platform Sensor NS9100 and NS...</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>2.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2019-12-09</td>\n",
- " <td>NaT</td>\n",
- " <td>{RSA#C409, SHS#3960, SHS#C409, AES#C409, KTS#C...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2019</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>586540138f7cd7fd</th>\n",
- " <td>3026</td>\n",
- " <td>Aruba 7200 Series Controllers with ArubaOS FIP...</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Hardware</td>\n",
- " <td>2.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2017-09-22</td>\n",
- " <td>NaT</td>\n",
- " <td>{SHS#2246, HMAC#1663, RSA#1379, AES#2677, AES#...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2017</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>6678394ac11e55af</th>\n",
- " <td>3643</td>\n",
- " <td>Amazon Linux 2 GnuTLS Cryptographic Module</td>\n",
- " <td>historical</td>\n",
- " <td>FIPS 140-2</td>\n",
- " <td>Software</td>\n",
- " <td>1.0</td>\n",
- " <td>Multi-Chip Stand Alone</td>\n",
- " <td>2020-04-20</td>\n",
- " <td>NaT</td>\n",
- " <td>{HMAC#C792, CVL#C792, DRBG#C792, AES#C791, SHS...</td>\n",
- " <td>...</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>NaN</td>\n",
- " <td>2020</td>\n",
- " </tr>\n",
- " </tbody>\n",
- "</table>\n",
- "<p>159 rows × 23 columns</p>\n",
- "</div>"
- ],
- "text/plain": [
- " cert_id name \\\n",
- "dgst \n",
- "71cadd0c63e57249 4472 Amazon Linux 2 GnuTLS Cryptographic Module \n",
- "9931f287c490c562 3618 Amazon Linux 2 Libgcrypt Cryptographic Module \n",
- "03f65a290e11d786 3908 Juniper Networks NFX250 Network Services Platform \n",
- "7119d5d9637ddeeb 3717 Juniper Networks NFX150 Network Services Platform \n",
- "f36e412aea00d7c6 4519 Cisco Catalyst 9400 Series Switches \n",
- "... ... ... \n",
- "9cbfc3c153a29e5c 2593 Network Security Platform Sensor NS-9300 S \n",
- "1625f9db144171f7 1750 IDProtect Key with LASER PKI \n",
- "15bb14fd69723b98 3580 Network Security Platform Sensor NS9100 and NS... \n",
- "586540138f7cd7fd 3026 Aruba 7200 Series Controllers with ArubaOS FIP... \n",
- "6678394ac11e55af 3643 Amazon Linux 2 GnuTLS Cryptographic Module \n",
- "\n",
- " status standard type level \\\n",
- "dgst \n",
- "71cadd0c63e57249 active FIPS 140-2 Software 1.0 \n",
- "9931f287c490c562 active FIPS 140-2 Software 1.0 \n",
- "03f65a290e11d786 active FIPS 140-2 Hardware 1.0 \n",
- "7119d5d9637ddeeb active FIPS 140-2 Hardware 1.0 \n",
- "f36e412aea00d7c6 active FIPS 140-2 Hardware 1.0 \n",
- "... ... ... ... ... \n",
- "9cbfc3c153a29e5c historical FIPS 140-2 Hardware 2.0 \n",
- "1625f9db144171f7 historical FIPS 140-2 Hardware 3.0 \n",
- "15bb14fd69723b98 historical FIPS 140-2 Hardware 2.0 \n",
- "586540138f7cd7fd historical FIPS 140-2 Hardware 2.0 \n",
- "6678394ac11e55af historical FIPS 140-2 Software 1.0 \n",
- "\n",
- " embodiment date_validation date_sunset \\\n",
- "dgst \n",
- "71cadd0c63e57249 Multi-Chip Stand Alone 2023-04-14 2025-04-19 \n",
- "9931f287c490c562 Multi-Chip Stand Alone 2020-02-19 2025-02-18 \n",
- "03f65a290e11d786 Multi-Chip Stand Alone 2021-04-23 2026-04-22 \n",
- "7119d5d9637ddeeb Multi-Chip Stand Alone 2020-09-28 2025-09-27 \n",
- "f36e412aea00d7c6 Multi-Chip Stand Alone 2023-05-11 2026-03-02 \n",
- "... ... ... ... \n",
- "9cbfc3c153a29e5c Multi-Chip Stand Alone 2016-03-29 NaT \n",
- "1625f9db144171f7 Single Chip 2012-07-17 NaT \n",
- "15bb14fd69723b98 Multi-Chip Stand Alone 2019-12-09 NaT \n",
- "586540138f7cd7fd Multi-Chip Stand Alone 2017-09-22 NaT \n",
- "6678394ac11e55af Multi-Chip Stand Alone 2020-04-20 NaT \n",
- "\n",
- " algorithms ... \\\n",
- "dgst ... \n",
- "71cadd0c63e57249 {HMAC#C792, CVL#C792, DRBG#C792, AES#C791, SHS... ... \n",
- "9931f287c490c562 {SHS#C693, Triple-DES#C693, DRBG#C693, DSA#C69... ... \n",
- "03f65a290e11d786 {AES#C2042, HMAC#C1979, CVL#C1978, HMAC#C2042,... ... \n",
- "7119d5d9637ddeeb {RSA#C970, DRBG#C970, DRBG#C947, HMAC#C970, AE... ... \n",
- "f36e412aea00d7c6 {KAS#C431, KBKDF#A1462, RSA#C431, RSA#A1462, D... ... \n",
- "... ... ... \n",
- "9cbfc3c153a29e5c {CVL#599, DRBG#649, SHS#2612, SHS#2923, CVL#40... ... \n",
- "1625f9db144171f7 {ECDSA#214, SHS#1465, CVL#2, RSA#824, DRBG#98,... ... \n",
- "15bb14fd69723b98 {RSA#C409, SHS#3960, SHS#C409, AES#C409, KTS#C... ... \n",
- "586540138f7cd7fd {SHS#2246, HMAC#1663, RSA#1379, AES#2677, AES#... ... \n",
- "6678394ac11e55af {HMAC#C792, CVL#C792, DRBG#C792, AES#C791, SHS... ... \n",
- "\n",
- " related_cves module_directly_referenced_by \\\n",
- "dgst \n",
- "71cadd0c63e57249 NaN NaN \n",
- "9931f287c490c562 NaN NaN \n",
- "03f65a290e11d786 NaN NaN \n",
- "7119d5d9637ddeeb NaN NaN \n",
- "f36e412aea00d7c6 NaN NaN \n",
- "... ... ... \n",
- "9cbfc3c153a29e5c NaN NaN \n",
- "1625f9db144171f7 {CVE-2019-15809} NaN \n",
- "15bb14fd69723b98 NaN NaN \n",
- "586540138f7cd7fd NaN NaN \n",
- "6678394ac11e55af NaN NaN \n",
- "\n",
- " module_indirectly_referenced_by module_directly_referencing \\\n",
- "dgst \n",
- "71cadd0c63e57249 NaN NaN \n",
- "9931f287c490c562 NaN NaN \n",
- "03f65a290e11d786 NaN NaN \n",
- "7119d5d9637ddeeb NaN NaN \n",
- "f36e412aea00d7c6 NaN {3637} \n",
- "... ... ... \n",
- "9cbfc3c153a29e5c NaN NaN \n",
- "1625f9db144171f7 NaN NaN \n",
- "15bb14fd69723b98 NaN NaN \n",
- "586540138f7cd7fd NaN NaN \n",
- "6678394ac11e55af NaN NaN \n",
- "\n",
- " module_indirectly_referencing policy_directly_referenced_by \\\n",
- "dgst \n",
- "71cadd0c63e57249 NaN NaN \n",
- "9931f287c490c562 NaN NaN \n",
- "03f65a290e11d786 NaN NaN \n",
- "7119d5d9637ddeeb NaN NaN \n",
- "f36e412aea00d7c6 {3637} NaN \n",
- "... ... ... \n",
- "9cbfc3c153a29e5c NaN NaN \n",
- "1625f9db144171f7 NaN NaN \n",
- "15bb14fd69723b98 NaN NaN \n",
- "586540138f7cd7fd NaN NaN \n",
- "6678394ac11e55af NaN NaN \n",
- "\n",
- " policy_indirectly_referenced_by policy_directly_referencing \\\n",
- "dgst \n",
- "71cadd0c63e57249 NaN NaN \n",
- "9931f287c490c562 NaN NaN \n",
- "03f65a290e11d786 NaN NaN \n",
- "7119d5d9637ddeeb NaN NaN \n",
- "f36e412aea00d7c6 NaN {3637} \n",
- "... ... ... \n",
- "9cbfc3c153a29e5c NaN NaN \n",
- "1625f9db144171f7 NaN NaN \n",
- "15bb14fd69723b98 NaN NaN \n",
- "586540138f7cd7fd NaN NaN \n",
- "6678394ac11e55af NaN NaN \n",
- "\n",
- " policy_indirectly_referencing year_from \n",
- "dgst \n",
- "71cadd0c63e57249 NaN 2023 \n",
- "9931f287c490c562 NaN 2020 \n",
- "03f65a290e11d786 NaN 2021 \n",
- "7119d5d9637ddeeb NaN 2020 \n",
- "f36e412aea00d7c6 {3637} 2023 \n",
- "... ... ... \n",
- "9cbfc3c153a29e5c NaN 2016 \n",
- "1625f9db144171f7 NaN 2012 \n",
- "15bb14fd69723b98 NaN 2019 \n",
- "586540138f7cd7fd NaN 2017 \n",
- "6678394ac11e55af NaN 2020 \n",
- "\n",
- "[159 rows x 23 columns]"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "min_cpe_matches_df: DataFrame = cpe_certs_df[cpe_certs_df[\"cpe_matches\"].apply(lambda x: len(x) == minimum_cpe_matches)]\n",
- "min_cpe_matches_df"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "9f11c4d5",
- "metadata": {},
- "source": [
- "### Ten most common CVEs in the dataset"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "id": "0ecd1b1c",
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Number of certificates with at least one CVE: 220\n"
- ]
- }
- ],
- "source": [
- "cve_certs_df: DataFrame = df[df[\"related_cves\"].notna()]\n",
- "\n",
- "print(f\"Number of certificates with at least one CVE: {cve_certs_df.shape[0]}\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "id": "dbac8629",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[('CVE-2016-7091', 49),\n",
- " ('CVE-2001-0889', 45),\n",
- " ('CVE-1999-0297', 45),\n",
- " ('CVE-1999-0037', 45),\n",
- " ('CVE-2000-1207', 45),\n",
- " ('CVE-1999-0894', 45),\n",
- " ('CVE-1999-0798', 45),\n",
- " ('CVE-2001-0690', 45),\n",
- " ('CVE-2000-0017', 45),\n",
- " ('CVE-2007-3103', 45)]"
- ]
- },
- "execution_count": 30,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "cve_counter = Counter()\n",
- "\n",
- "for cves in cve_certs_df[\"related_cves\"]:\n",
- " cve_counter.update(cves)\n",
- "\n",
- "cve_counter.most_common(10)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "5be2561b",
- "metadata": {},
- "source": [
- "### Ten most common crypto algorithms used"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "id": "02306c40",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[('RSA#1', 180),\n",
- " ('Triple-DES#34', 45),\n",
- " ('Triple-DES#1420', 35),\n",
- " ('HMAC#1391', 35),\n",
- " ('ECDSA#368', 35),\n",
- " ('RSA#1166', 35),\n",
- " ('DRBG#281', 35),\n",
- " ('SHS#1954', 35),\n",
- " ('AES#2273', 35),\n",
- " ('DSA#709', 35)]"
- ]
- },
- "execution_count": 31,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "crypto_algo_counter = Counter()\n",
- "\n",
- "for algorithms in df[\"algorithms\"]:\n",
- " crypto_algo_counter.update(algorithms)\n",
- "\n",
- "crypto_algo_counter.most_common(10)"
- ]
- },
- {
"cell_type": "markdown",
"id": "eff29c58",
"metadata": {},
@@ -1617,7 +105,7 @@
"outputs": [],
"source": [
"refs_columns: list[str] = [\n",
- " \"cert_id\", \n",
+ " \"cert_id\",\n",
" \"status\",\n",
" \"standard\",\n",
" \"type\",\n",
@@ -2108,7 +596,7 @@
{
"cell_type": "code",
"execution_count": 51,
- "id": "ff91baf7",
+ "id": "42dff8b4",
"metadata": {},
"outputs": [
{
@@ -2140,7 +628,7 @@
},
{
"cell_type": "markdown",
- "id": "0117c3df",
+ "id": "48874e7c",
"metadata": {},
"source": [
"### Cross-references among certificates\n",
@@ -2151,8 +639,8 @@
},
{
"cell_type": "code",
- "execution_count": 97,
- "id": "b9971737",
+ "execution_count": 111,
+ "id": "cb1cfb62",
"metadata": {
"scrolled": false
},
@@ -2161,7 +649,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[(3384, 3382), (3382, 3384), (3382, 3383), (3383, 3382), (80, 63), (63, 80)]\n"
+ "[(3384, 3382), (3382, 3383), (80, 63)]\n"
]
}
],
@@ -2177,87 +665,15 @@
" \n",
" intersection: set[str] = referenced_by & referencing\n",
" \n",
- " if intersectio\n",
- " for another_cert_id in intersection:\n",
+ " \n",
+ " for another_cert_id in intersection:\n",
+ " another_cert_id_int = int(another_cert_id)\n",
+ " \n",
+ " if not (another_cert_id_int, cert_id) in result:\n",
" result.append((cert_id, int(another_cert_id)))\n",
"\n",
- "print(result)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 101,
- "id": "0d3a9c73",
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "dgst\n",
- "6ef02a389c6415e7 {3382}\n",
- "Name: module_directly_referencing, dtype: object"
- ]
- },
- "execution_count": 101,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df[df[\"cert_id\"] == 3382][\"module_directly_referencing\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 100,
- "id": "906daf3e",
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "dgst\n",
- "a080dde530fce451 {3384, 3383}\n",
- "Name: module_directly_referencing, dtype: object"
- ]
- },
- "execution_count": 100,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df[df[\"cert_id\"] == 3382][\"module_directly_referencing\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 105,
- "id": "88f3ea9a",
- "metadata": {},
- "outputs": [
- {
- "ename": "TypeError",
- "evalue": "unhashable type: 'set'",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[105], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mset\u001b[39m()\n\u001b[0;32m----> 3\u001b[0m \u001b[43mresult\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mset\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(result)\n",
- "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'set'"
- ]
- }
- ],
- "source": [
- "result = set()\n",
- "\n",
- "result.add(set([1, 2]))\n",
- "\n",
- "print(result)"
+ "print(result)\n",
+ "# TODO - Investigate how are 3382, 3383, 3384 related"
]
}
],