diff --git a/FrevaZarrStreaming/LoadData.ipynb b/FrevaZarrStreaming/LoadData.ipynb new file mode 100644 index 0000000..33f69c8 --- /dev/null +++ b/FrevaZarrStreaming/LoadData.ipynb @@ -0,0 +1,1115 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1d9f2de7-6f15-4680-b81e-6b8942ad96d1", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "## Loading Data via Zarr Endpoints\n", + "\n", + "* Zarr Format Benefits:\n", + "\n", + " * Scalable, flexible\n", + " * Easy to access via HTTP/HTTPS in cloud storage\n", + "\n", + "* But:\n", + "\n", + " * Majority of datasets in HDF5 (netCDF4)\n", + " * HDF5/netCDF4 hard to access via HTTP/HTTPS in cloud storage\n", + "\n", + "* Freva Solution:\n", + "\n", + " * REST API streams any file format as Zarr\n", + " * Zarr protocol endpoints accessible via any Zarr library" + ] + }, + { + "cell_type": "markdown", + "id": "2ce5bf92-7e9f-4367-9a90-074be43a9076", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Workflow\n", + "* Search netCDF4 datasets using Freva-REST API\n", + "* Access data through Zarr endpoints" + ] + }, + { + "cell_type": "markdown", + "id": "46d025b3-1b9d-4dbe-bdeb-64007d1be311", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "fragment" + }, + "tags": [] + }, + "source": [ + "Let's define the search parameters for the Freva-REST API and import what we need" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "de5c74e7-c522-4e1d-87c0-71dbca2f5be5", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "search_params = {\"file\": \"/home/*\", \"project\": \"cmip6\"} # Define our search parameters\n", + "url = \"http://localhost:7777\" # URL of our test server.\n", + "from getpass import getpass\n", + "import requests\n", + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "id": "b790579c-a16b-4dfe-8b05-0e911a22c34b", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "If we normally search for data we will get the locations of the netCDF files on the hard-drive:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "8ae9d0dc-5a4c-4a48-9f4d-063bf6911ad2", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['/home/wilfred/workspace/databrowser/freva-rest/src/databrowser_api/tests/mock/data/model/global/cmip6/CMIP6/CMIP/MPI-M/MPI-ESM1-2-LR/amip/r2i1p1f1/Amon/ua/gn/v20190815/ua_mon_MPI-ESM1-2-LR_amip_r2i1p1f1_gn_197901-199812.nc',\n", + " '/home/wilfred/workspace/databrowser/freva-rest/src/databrowser_api/tests/mock/data/model/global/cmip6/CMIP6/CMIP/CSIRO-ARCCSS/ACCESS-CM2/amip/r1i1p1f1/Amon/ua/gn/v20201108/ua_Amon_ACCESS-CM2_amip_r1i1p1f1_gn_197901-201412.nc']" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(requests.get(\n", + " f\"{url}/api/databrowser/data_search/freva/file\", \n", + " params=search_params, \n", + " stream=True\n", + ").iter_lines(decode_unicode=True))" + ] + }, + { + "cell_type": "markdown", + "id": "e8b3b970-8e41-47a1-8ddc-b62d1bb25edb", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "What if the data location is not directly accessible, because it's stored somewhere else, like on tape? \n", + " * We can use the `load` endpoint to stream stream the data as Zarr data.\n", + "\n", + "Caveat: Because the data can be accessed from anywhere once it is made available via zarr we need to create an *access token*:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "722d3bec-4cf2-44b2-9f3e-4f8bd81b9287", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Password: ········\n" + ] + } + ], + "source": [ + "auth = requests.post(\n", + " f\"{url}/api/auth/v2/token\",\n", + " data={\"username\": \"janedoe\", \"password\":getpass(\"Password:\")}\n", + ").json()" + ] + }, + { + "cell_type": "markdown", + "id": "97bf7e88-a370-4e62-ae44-a2cb4ff7f40a", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "With this access token we can generate zarr enpoints to stream the data from anywhere, to do so we simply search for the datasets again:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "b2fe0507-014a-4f0a-ac6f-5881d16af761", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "res = requests.get(\n", + " f\"{url}/api/databrowser/load/freva\", \n", + " params=search_params, \n", + " headers={\n", + " \"Authorization\": f\"Bearer {auth['access_token']\n", + " }\"},\n", + " stream=True\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d4f612b3-8f3e-4584-87ce-70d8b64ba1da", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "This will search for data and for every found entry create a zarr endpoint that can be loaded:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "d10716a7-a784-4418-82b3-469070a4d5b6", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['http://localhost:7777/api/freva-data-portal/zarr/16ac2b17-6a0d-551e-9b1c-abcbfc41f4dd.zarr',\n", + " 'http://localhost:7777/api/freva-data-portal/zarr/e39716b7-abde-56f7-8cde-4e9d9f2e4ea8.zarr']" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "zarr_files = list(res.iter_lines(decode_unicode=True))\n", + "zarr_files" + ] + }, + { + "cell_type": "markdown", + "id": "4e93bf73-ff4d-4723-9674-e41295b00e65", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "Let's load the data with xarray and zarr:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "a2273537-3666-4abf-880a-ab5fd9594bed", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:    (lat: 27, bnds: 2, lon: 43, plev: 19, time: 11)\n",
+       "Coordinates:\n",
+       "  * lat        (lat) float64 0.9326 2.798 4.663 6.528 ... 43.83 45.7 47.56 49.43\n",
+       "  * lon        (lon) float64 101.2 103.1 105.0 106.9 ... 174.4 176.2 178.1 180.0\n",
+       "  * plev       (plev) float64 1e+05 9.25e+04 8.5e+04 7e+04 ... 1e+03 500.0 100.0\n",
+       "  * time       (time) datetime64[ns] 1979-01-16T12:00:00 ... 1979-11-16\n",
+       "Dimensions without coordinates: bnds\n",
+       "Data variables:\n",
+       "    lat_bnds   (lat, bnds) float64 dask.array<chunksize=(27, 2), meta=np.ndarray>\n",
+       "    lon_bnds   (lon, bnds) float64 dask.array<chunksize=(43, 2), meta=np.ndarray>\n",
+       "    time_bnds  (time, bnds) datetime64[ns] dask.array<chunksize=(11, 2), meta=np.ndarray>\n",
+       "    ua         (time, plev, lat, lon) float32 dask.array<chunksize=(11, 19, 27, 43), meta=np.ndarray>\n",
+       "Attributes: (12/47)\n",
+       "    CDI:                   Climate Data Interface version 2.0.6 (https://mpim...\n",
+       "    source:                MPI-ESM1.2-LR (2017): \\naerosol: none, prescribed ...\n",
+       "    institution:           Max Planck Institute for Meteorology, Hamburg 2014...\n",
+       "    Conventions:           CF-1.7 CMIP-6.2\n",
+       "    activity_id:           CMIP\n",
+       "    branch_method:         no parent\n",
+       "    ...                    ...\n",
+       "    variable_id:           ua\n",
+       "    variant_label:         r2i1p1f1\n",
+       "    license:               CMIP6 model data produced by MPI-M is licensed und...\n",
+       "    cmor_version:          3.5.0\n",
+       "    tracking_id:           hdl:21.14100/0898c2ad-5382-4d0c-8adb-2ca96387fb54\n",
+       "    CDO:                   Climate Data Operators version 2.0.6 (https://mpim...
" + ], + "text/plain": [ + "\n", + "Dimensions: (lat: 27, bnds: 2, lon: 43, plev: 19, time: 11)\n", + "Coordinates:\n", + " * lat (lat) float64 0.9326 2.798 4.663 6.528 ... 43.83 45.7 47.56 49.43\n", + " * lon (lon) float64 101.2 103.1 105.0 106.9 ... 174.4 176.2 178.1 180.0\n", + " * plev (plev) float64 1e+05 9.25e+04 8.5e+04 7e+04 ... 1e+03 500.0 100.0\n", + " * time (time) datetime64[ns] 1979-01-16T12:00:00 ... 1979-11-16\n", + "Dimensions without coordinates: bnds\n", + "Data variables:\n", + " lat_bnds (lat, bnds) float64 dask.array\n", + " lon_bnds (lon, bnds) float64 dask.array\n", + " time_bnds (time, bnds) datetime64[ns] dask.array\n", + " ua (time, plev, lat, lon) float32 dask.array\n", + "Attributes: (12/47)\n", + " CDI: Climate Data Interface version 2.0.6 (https://mpim...\n", + " source: MPI-ESM1.2-LR (2017): \\naerosol: none, prescribed ...\n", + " institution: Max Planck Institute for Meteorology, Hamburg 2014...\n", + " Conventions: CF-1.7 CMIP-6.2\n", + " activity_id: CMIP\n", + " branch_method: no parent\n", + " ... ...\n", + " variable_id: ua\n", + " variant_label: r2i1p1f1\n", + " license: CMIP6 model data produced by MPI-M is licensed und...\n", + " cmor_version: 3.5.0\n", + " tracking_id: hdl:21.14100/0898c2ad-5382-4d0c-8adb-2ca96387fb54\n", + " CDO: Climate Data Operators version 2.0.6 (https://mpim..." + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dset = xr.open_dataset(\n", + " zarr_files[0],\n", + " engine=\"zarr\",\n", + " chunks=\"auto\", \n", + " storage_options={\"headers\": {\"Authorization\": f\"Bearer {auth['access_token']}\"}}\n", + ")\n", + "dset" + ] + }, + { + "cell_type": "markdown", + "id": "bbb5b7d1-a330-43dc-877c-639a420de085", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "We do have a xarray dataset, meaning we can just proceed with our analysis:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "d30bf8f0-f368-4acc-98d1-5ae9a07bf446", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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unTB22+/jeDgYCxdulSld3ljL7/8Mr766iu899570Ol0WLlyJWbOnImgoCB88MEHDTqmxQPfO3XqhL/97W/Yu3cvwsPD4eXlpdielJTUoECIiIjIThp54HtVVRWys7Px6quvKtbHxMRg79691sXRQF988QU++OAD9O3bF2PGjMH999+PTp06oW3bttiwYQNGjhxp8TEtTrJWrlyJZs2aITs7G9nZ2YptkiQxySIiInJidccv6XQ66HQ6xbrffvsNRqMRgYGBivWBgYEoLCxUPcb6XLx4Ee3btwcA+Pr64uLFiwCA++67D3/+858bdEyLk6y8vLwGnYiIiIgc07XJSK27O7B2/+DgYMX6GTNmICUlpd596k5iLoSw28TmHTp0wKlTp9C2bVuEhobi448/xr333osvvvgCzZo1a9AxLU6yiIiI6NYixLXF2mMAQH5+Pnx9feX1datYAODv7w+tVmtWtSoqKjKrbjWWZ555BocPH0afPn0wbdo0DB48GIsXL0ZNTQ0WLlzYoGNanGSNGTPmhttXr17doECIiIio6fP19VUkWfVxc3NDeHg4du7ciUcffVRev3PnTjzyyCNqh1ivl156Sf53v3798MMPP+Dbb79Fx44dcddddzXomBYnWcXFxYrX1dXVyM3NxaVLl/Dggw82KAgiIiKyH5MQMFlZyrJ0/0mTJiE+Ph4RERGIiorC8uXLcebMGbzwwgtWxdFQs2bNqnd9bm4u/vGPf+D111+3+JgWJ1n1zZNlMpmQmJiIDh06WBwAERER2Zf472LtMSzx5JNP4sKFC5g1axYKCgoQFhaG7du3o23btlZG0jB185vq6mrk5eXBxcUFHTt2bJwkqz4ajQYvvfQS+vbti6lTp9rikERERHSLS0xMRGJior3DAAAcOnTIbF1paSkSEhIUXZqWsNnTHH/++WfU1NTY6nBERETUSEzCNsutxtfXF7NmzcJrr73WoP0trmRNmjRJ8VoIgYKCAmzbtg2jR49uUBBERERkP0IICCvHZFm7v6O6dOkSSkpKGrSvxUlW3XKaRqNBy5YtsWDBgj+885CIiIjIEb377ruK17VFpPXr12PQoEENOqbFSdbXX3/doBMRERGRY7JFd19T7y5ctGiR4nVtEWn06NGYNm1ag45pcZJVUVEBIQQ8PT0BAKdPn8aWLVsQGhqKmJiYBgVBRERE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a49nee655xAQEABfX188+OCDOHz4sHyMlJQU3H333Vi2bBmCg4Ph6emJJ554osFVpPHjx8PNzQ0ZGRno06cP2rRpg4ceegj/+te/8Ouvv2L69OkAgMrKSkydOhXBwcHQ6XTo3LkzVq1ahVOnTqFfv34AAD8/P6uru9HR0TAYDEhNTf3dNps3b8add94JnU6Hdu3aYcGCBfK2adOmoWfPnmb7dOvWDTNmzLA4ntrv5ttuuw09evTAX/7yF/zjH//Ajh075M/UH/3MAODzzz9HREQE3N3d4e/vj+HDh1scC6mLSZaT+ec//4mnn34aSUlJOHbsGJYtW4a1a9dizpw5inavvfaa/Nfx008/jT/96U84fvy4xed75plnsGbNGvn16tWrMWbMGEWbsrIyTJo0CQcPHsSuXbug0Wjw6KOPmlWHXnnlFSQlJeH48eMYOHCgxbHU2rRpE0JCQhASEoKnn34aa9asMXvK/csvv4z58+fj4MGDCAgIwNChQxXVs/LycqSmpmLlypU4evQoAgICLI7DFtfm2WefxcaNG1FZWSnvs2HDBgQFBcm/pBrLzJkzMWLECHz//fd4+OGHMXLkSLtVUtRyM5+dG9mwYQPmzJmDefPmITs7G23atMHSpUutisnb2xve3t7YunWr4nNQSwiBwYMHo7CwENu3b0d2djZ69OiB/v37K34+J0+exMcff4wvvvgC6enpyMnJwfjx4y2O5+LFi/jnP/+JxMREeHh4KLYZDAaMHDkSmzZtghACo0aNQlpaGt59910cP34c77//Pry9vREcHIzNmzcDAE6cOIGCggK88847FsdSS6vVYu7cuVi8eDF++eUXs+3Z2dkYMWIEnnrqKRw5cgQpKSl47bXX5IRn5MiR2L9/v+IPnKNHj+LIkSMYOXJkg+O63oMPPoi77roLn3322U39zLZt24bhw4dj8ODBOHToEHbt2oWIiAibxEI2JOiWNHr0aKHVaoWXl5e8PP744+L+++8Xc+fOVbRdv369aNWqlfwagHjhhRcUbSIjI8Wf//xni87/yCOPiPPnzwudTify8vLEqVOnhLu7uzh//rx45JFHxOjRo+vdt6ioSAAQR44cEUIIkZeXJwCIt99++6bPfyO9evWSj1VdXS38/f3Fzp07hRBCfP311wKASEtLk9tfuHBBeHh4iE2bNgkhhFizZo0AIHJy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u3dDkiRcunTJ3qEQ3bRvvvkGQ4YMQVBQECRJwtatWxXbz507h4SEBAQFBcHT0xODBg3CTz/9JG8/deoUJEmqd/nkk0/kdt999x0GDBiAZs2aoUWLFnjuuedw5cqVxnqbpDImWURkU3379kVycrL8ulevXigoKDB75h+RIysrK8Ndd91V79MFhBAYNmwY/vOf/+Af//gHDh06hLZt2yI6OhplZWUAgODgYBQUFCiWmTNnwsvLCw899BAA4OzZs4iOjkanTp2wf/9+pKen4+jRo0hISGjMt0oq4mSkRKQqNze3Bj1kmMieHnroITkZquunn35CVlYWcnNzceeddwIA3nvvPQQEBOCjjz7Cs88+C61Wa/a537JlC5588kn5QddffvklXF1d8fe//x0azbWax9///nd0794dJ0+eRKdOnVR8h9QYWMkiIptJSEjAnj178M4778hdI2vXrlV0F65duxbNmjXDl19+iZCQEHh6euLxxx9HWVkZ1q1bh3bt2sHPzw8TJ06E0WiUj11VVYWpU6fitttug5eXFyIjI7F79277vFFyapWVlQAAd3d3eZ1Wq4WbmxsyMzPr3Sc7Oxs5OTkYO3as4jhubm5yggUAHh4eAPC7x6GmhUkWEdnMO++8g6ioKIwbN07uIgkODjZrV15ejnfffRdpaWlIT0/H7t27MXz4cGzfvh3bt2/H+vXrsXz5csWjgp555hn8+9//RlpaGr7//ns88cQTZuNgiBrDHXfcgbZt22LatGkoLi5GVVUV3njjDRQWFqKgoKDefVatWoUuXbqgV69e8roHH3wQhYWFeOutt1BVVYXi4mL85S9/AYDfPQ41LUyyiMhm9Ho93Nzc4OnpCYPBAIPBAK1Wa9auuroaS5cuRffu3fHAAw/g8ccfR2ZmJlatWoXQ0FDExsaiX79++PrrrwEAP//8Mz766CN88sknuP/++9GxY0dMmTIF9913H9asWdPYb5OcnKurKzZv3owff/wRzZs3h6enJ3bv3o2HHnqo3s97RUUFNm7cqKhiAcCdd96JdevWYcGCBfL/mQ4dOiAwMLDe41DTwzFZRNToPD090bFjR/l1YGAg2rVrJ49VqV1XVFQE4NodWEII3H777YrjVFZWokWLFo0TNNF1wsPDkZOTg5KSElRVVaFly5aIjIxERESEWdtPP/0U5eXlGDVqlNm2uLg4xMXF4dy5c/Dy8oIkSVi4cCHat2/fGG+DVMYki4ganaurq+K1JEn1rjOZTAAAk8kErVaL7Oxss7/wr0/MiBpb7V2zP/30E7799lv87W9/M2uzatUqDB06FC1btvzd4wQGBgIAVq9eDXd3dwwYMECdgKlRMckiIptyc3NTDFi3he7du8NoNKKoqAj333+/TY9NVJ8rV67g5MmT8uu8vDzk5OSgefPmaNOmDT755BO0bNkSbdq0wZEjR/Diiy9i2LBhiImJURzn5MmT+Oabb7B9+/Z6z7NkyRL06tUL3t7e2LlzJ15++WW88cYbaNasmZpvjxoJkywisql27dph//79OHXqFLy9veVqlDVuv/12jBw5EqNGjcKCBQvQvXt3/Pbbb/jqq6/QtWtXPPzwwzaInOh/vv32W/Tr109+PWnSJADA6NGjsXbtWhQUFGDSpEk4d+4cWrVqhVGjRuG1114zO87q1atx2223mSVftQ4cOIAZM2bgypUruOOOO7Bs2TLEx8er86ao0THJIiKbmjJlCkaPHo3Q0FBUVFTYbGD6mjVrMHv2bEyePBm//vorWrRogaioKCZYpIq+fftCCPG725OSkpCUlPSHx5k7dy7mzp37u9s/+OCDBsVHTYMkbvQpIiIiIqIG4RQORERERCpgkkVERESkAiZZRERERCpgkkVERESkAiZZRERERCpgkkVERESkAiZZRERERCpgkkVERESkAiZZRERERCpgkkVERESkAiZZRERERCpgkkVERESkgv8HhKGb44WFurEAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dset[\"ua\"].mean(dim=(\"lon\", \"lat\")).plot(x=\"time\", yincrease=False)" + ] + }, + { + "cell_type": "markdown", + "id": "43e6475e-e1ad-4aff-a3e9-4d165bc47bfb", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "## What's next?\n", + "- Add json payload to `load` endpoint that allows the users to pre-precess data. For example select a region by uploading a geojson shape file.\n", + "- Implement a backend handle to open tape archives" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/FrevaZarrStreaming/index.slides.html b/FrevaZarrStreaming/index.slides.html new file mode 100644 index 0000000..7c098e2 --- /dev/null +++ b/FrevaZarrStreaming/index.slides.html @@ -0,0 +1,8481 @@ + + + + + + + +LoadData slides + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ + + diff --git a/index.html b/index.html index 040f0a6..cebb818 100644 --- a/index.html +++ b/index.html @@ -12,10 +12,11 @@

Select a presentation: