diff --git a/.github/workflows/deploy-with-password.yml b/.github/workflows/deploy-with-password.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/quarto-publish.yml b/.github/workflows/quarto-publish.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/AWS/AWS_SSO_Remote_Server.qmd b/AWS/AWS_SSO_Remote_Server.qmd old mode 100644 new mode 100755 diff --git a/AWS/AWS_SSO_Setup_Guide.qmd b/AWS/AWS_SSO_Setup_Guide.qmd old mode 100644 new mode 100755 diff --git a/AWS/aws-mfa-setup.qmd b/AWS/aws-mfa-setup.qmd old mode 100644 new mode 100755 diff --git a/AWS/aws-s3-commands-guide.qmd b/AWS/aws-s3-commands-guide.qmd old mode 100644 new mode 100755 diff --git a/DataIngestion/stac-collection.ipynb b/DataIngestion/stac-collection.ipynb old mode 100644 new mode 100755 diff --git a/GitHub/commands.qmd b/GitHub/commands.qmd old mode 100644 new mode 100755 diff --git a/GitHub/resources.qmd b/GitHub/resources.qmd old mode 100644 new mode 100755 diff --git a/GitHub/setup.qmd b/GitHub/setup.qmd old mode 100644 new mode 100755 diff --git a/GitHub/veda-preview.qmd b/GitHub/veda-preview.qmd old mode 100644 new mode 100755 diff --git a/Jupyterhub/clone_conversion_repo.ipynb b/Jupyterhub/clone_conversion_repo.ipynb old mode 100644 new mode 100755 index b8b3bd2..0d87e6e --- a/Jupyterhub/clone_conversion_repo.ipynb +++ b/Jupyterhub/clone_conversion_repo.ipynb @@ -48,9 +48,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cloning disasters-aws-conversion repository...\n", + "Successfully cloned disasters-aws-conversion\n" + ] + } + ], "source": [ "import os\n", "import subprocess\n", @@ -74,6 +83,13 @@ "else:\n", " print(f\"{repo_name} repository already exists\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/Jupyterhub/extract_eventname_metadata.ipynb b/Jupyterhub/extract_eventname_metadata.ipynb index 50afc26..f860267 100644 --- a/Jupyterhub/extract_eventname_metadata.ipynb +++ b/Jupyterhub/extract_eventname_metadata.ipynb @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -59,6 +59,23 @@ "DELETE_AFTER_MOVE = False # Set to True to delete original files after successful processing" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Metadata options" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "HAZARD = None\n", + "LOCATION = None" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -103,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -143,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -152,8 +169,8 @@ "text": [ "Current AWS Identity:\n", " Account: 515966502221\n", - " ARN: arn:aws:sts::515966502221:assumed-role/disasters-prod/botocore-session-1773693036\n", - " User ID: AROAXQIQAAVGWA2LHXCPW:botocore-session-1773693036\n", + " ARN: arn:aws:sts::515966502221:assumed-role/disasters-prod/botocore-session-1773760456\n", + " User ID: AROAXQIQAAVGWA2LHXCPW:botocore-session-1773760456\n", "\n", "S3 client created successfully\n" ] @@ -187,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -329,7 +346,7 @@ " return False, {'is_cog': False, 'errors': [str(e)], 'warnings': []}\n", "\n", "\n", - "def add_metadata_and_create_cog(file_bytes: bytes, event_metadata: Dict[str, str]) -> bytes:\n", + "def add_metadata_and_create_cog(file_bytes: bytes, event_metadata: Dict[str, str], HAZARD: List[str], LOCATION: List[str], ) -> bytes:\n", " \"\"\"\n", " Rebuild GeoTIFF as a valid COG with metadata using rio-cogeo library.\n", " \n", @@ -374,11 +391,13 @@ " tags = {\n", " 'ACTIVATION_EVENT': f\"{event_metadata['year_month']}_{event_metadata['hazard']}_{event_metadata['location']}\",\n", " 'YEAR_MONTH': event_metadata['year_month'],\n", - " 'HAZARD': event_metadata['hazard'],\n", - " 'LOCATION': event_metadata['location'],\n", + " 'HAZARD': HAZARD if HAZARD is not None else event_metadata['hazard'],\n", + " 'LOCATION': LOCATION if LOCATION is not None else event_metadata['location'],\n", " 'PROCESSING_DATE': datetime.utcnow().isoformat(),\n", " 'PROCESSOR': 'S3 GeoTIFF COG Processor v1.0'\n", " }\n", + " print(f'Hazard tag {HAZARD}')\n", + " print(f'Location tag {LOCATION}')\n", " \n", " # Create COG profile using original compression settings\n", " cog_profile = {\n", @@ -408,7 +427,7 @@ " dst_path=output_path,\n", " dst_kwargs=cog_profile,\n", " add_mask=False,\n", - " overview_level=4,\n", + " overview_level=5,\n", " overview_resampling='average',\n", " web_optimized=True,\n", " additional_cog_metadata=tags,\n", @@ -514,7 +533,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -523,6 +542,7 @@ "text": [ "Testing pattern detection:\n", "\n", + "Remainder = Turkey_UNW_2022-04-06_to_2023-02-08_day\n", "✓ 202302_Earthquake_Turkiye_Turkey_UNW_2022-04-06_to_2023-02-08_day.tif\n", " Year/Month: 202302\n", " Location: Turkiye\n", @@ -541,6 +561,7 @@ "print(\"Testing pattern detection:\\n\")\n", "for filename in test_filenames:\n", " result = detect_activation_event(filename)\n", + " print(f'Remainder = {result[\"remainder\"]}')\n", " if result:\n", " print(f\"✓ {filename}\")\n", " print(f\" Year/Month: {result['year_month']}\")\n", @@ -561,7 +582,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -603,7 +624,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -633,7 +654,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_1272/2684847193.py:178: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).\n", + "/tmp/ipykernel_205/1171966028.py:178: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).\n", " 'PROCESSING_DATE': datetime.utcnow().isoformat(),\n", "Reading input: /vsimem/input.tif\n", "\n" @@ -645,7 +666,9 @@ "text": [ " Reading original file settings...\n", " Original settings: compress=zstd, predictor=None, level=None\n", - " Rebuilding as COG (preserving original compression settings)...\n" + " Rebuilding as COG (preserving original compression settings)...\n", + "Hazard tag None\n", + "Location tag None\n" ] }, { @@ -662,15 +685,15 @@ "output_type": "stream", "text": [ " COG creation complete with embedded metadata\n", - " Output size: 150,638,215 bytes\n", - " Output size: 150,638,215 bytes\n", - " Size change: -4.8%\n", + " Output size: 150,769,442 bytes\n", + " Output size: 150,769,442 bytes\n", + " Size change: -4.7%\n", " Validating output COG structure...\n", " ✓ Output is valid COG\n", " Compression: ZSTD\n", " Tile size: [512, 512]\n", - " Overviews: 4 levels\n", - " Uploading to s3://nasa-disasters-dev/ProgramData/Landsat/burnRatio/202501_Fire_CA_LC09_NBR_182831_041036_2025-01-14_day.tif...\n", + " Overviews: 5 levels\n", + " Uploading to s3://nasa-disasters-dev/ProgramData/Landsat/burnRatio/LC09_NBR_182831_041036_2025-01-14_day.tif...\n", " ✓ Upload successful\n", "\n", "================================================================================\n", @@ -697,6 +720,7 @@ " \n", " # Step 1: Detect activation event pattern\n", " event_metadata = detect_activation_event(filename)\n", + " final_filename = f'{event_metadata[\"remainder\"]}.tif'\n", " \n", " if not event_metadata:\n", " result['message'] = 'No activation event pattern detected - skipping'\n", @@ -730,7 +754,7 @@ " \n", " # Step 3: Add metadata and create/optimize COG\n", " print(\" Creating COG with metadata and ZSTD compression...\")\n", - " modified_bytes = add_metadata_and_create_cog(file_bytes, event_metadata)\n", + " modified_bytes = add_metadata_and_create_cog(file_bytes, event_metadata, HAZARD, LOCATION)\n", " print(f\" Output size: {len(modified_bytes):,} bytes\")\n", " \n", " size_change = ((len(modified_bytes) - len(file_bytes)) / len(file_bytes)) * 100\n", @@ -754,7 +778,7 @@ " result['cog_valid'] = False\n", " \n", " # Step 4: Upload to destination\n", - " dest_key = DESTINATION_PREFIX + filename\n", + " dest_key = DESTINATION_PREFIX + final_filename\n", " print(f\" Uploading to s3://{DESTINATION_BUCKET}/{dest_key}...\")\n", " \n", " if upload_to_s3(modified_bytes, DESTINATION_BUCKET, dest_key):\n", diff --git a/Jupyterhub/jupyterhub-training-guide.qmd b/Jupyterhub/jupyterhub-training-guide.qmd old mode 100644 new mode 100755 diff --git a/Jupyterhub/sentinel2_workflow-testUpdates.ipynb b/Jupyterhub/sentinel2_workflow-testUpdates.ipynb index eeeb719..d0d991f 100644 --- a/Jupyterhub/sentinel2_workflow-testUpdates.ipynb +++ b/Jupyterhub/sentinel2_workflow-testUpdates.ipynb @@ -95,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -103,7 +103,7 @@ "output_type": "stream", "text": [ "Configuration Updated:\n", - " Output Directory: /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2\n", + " Output Directory: /home/jovyan/disasters-docs/Jupyterhub/process_sentinel2/202601_WinterWx_US_s2\n", " Search Range: 20251230 to 20251230\n", " Processing Level: L2A\n", " Products: true, swir\n", @@ -124,8 +124,8 @@ "COP_PASS = \"^d8#KhU_SDj~V5_\" # Update with your account password\n", "\n", "# --- UPDATED: Download parameters (Using a range to find data) ---\n", - "#TILE_ID = \"T17RLN\" # Sentinel-2 tile ID\n", - "POLYGON = os.path.expanduser(f\"~/shared-readwrite/process_sentinel2/AOI/Jan2026_WinterStorm_LS_S2_AOI.shp\")\n", + "TILE_ID = \"T17RLN\" # Sentinel-2 tile ID\n", + "# POLYGON = os.path.expanduser(f\"~/shared-readwrite/process_sentinel2/AOI/Jan2026_WinterStorm_LS_S2_AOI.shp\")\n", "# Using a window to catch the Nov 13th overpass\n", "DOWNLOAD_DATE = [\"20251230\"]#, \"20260101\", \"20260118\"] \n", "PROCESSING_LEVEL = \"2\" # 1 = L1C, 2 = L2A\n", @@ -148,7 +148,7 @@ "DST_CRS = 'EPSG:4326'\n", "\n", "# Output directory for downloaded and processed data\n", - "OUTPUT_DIR = os.path.expanduser(f\"~/shared-readwrite/process_sentinel2/{EVENT_NAME}_s2\")\n", + "OUTPUT_DIR = os.path.expanduser(f\"/home/jovyan/disasters-docs/Jupyterhub/process_sentinel2/{EVENT_NAME}_s2\")\n", "\n", "# Create output directory\n", "os.makedirs(OUTPUT_DIR, exist_ok=True)\n", @@ -178,5785 +178,27 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "--- DOWNLOADING DATA ---\n", - "Credentials received via arguments.\n", - "\n", - "Output directory: /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2\n", - "Level: L2A\n", - "Date: 2025-12-30\n", - "Polygon: Jan2026_WinterStorm_LS_S2_AOI.shp\n", - "\n", - "Number of products to download: 5\n", - "Confirmation skipped (-y provided).\n", - "\n", - "\n", - "\n", - "Downloading files: 0%| | 0/5 [00:00 \u001b[39m\u001b[32m18\u001b[39m process = \u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mPopen\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 19\u001b[39m \u001b[43m \u001b[49m\u001b[43mdownload_cmd\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 20\u001b[39m \u001b[43m \u001b[49m\u001b[43mstdout\u001b[49m\u001b[43m=\u001b[49m\u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mPIPE\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 21\u001b[39m \u001b[43m \u001b[49m\u001b[43mstderr\u001b[49m\u001b[43m=\u001b[49m\u001b[43msubprocess\u001b[49m\u001b[43m.\u001b[49m\u001b[43mSTDOUT\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 22\u001b[39m \u001b[43m \u001b[49m\u001b[43muniversal_newlines\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[32m 23\u001b[39m \u001b[43m \u001b[49m\u001b[43mbufsize\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m1\u001b[39;49m\n\u001b[32m 24\u001b[39m \u001b[43m)\u001b[49m\n\u001b[32m 26\u001b[39m \u001b[38;5;66;03m# Print output in real-time\u001b[39;00m\n\u001b[32m 27\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m line \u001b[38;5;129;01min\u001b[39;00m process.stdout:\n", + "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.12/subprocess.py:1026\u001b[39m, in \u001b[36mPopen.__init__\u001b[39m\u001b[34m(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, user, group, extra_groups, encoding, errors, text, umask, pipesize, process_group)\u001b[39m\n\u001b[32m 1022\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.text_mode:\n\u001b[32m 1023\u001b[39m \u001b[38;5;28mself\u001b[39m.stderr = io.TextIOWrapper(\u001b[38;5;28mself\u001b[39m.stderr,\n\u001b[32m 1024\u001b[39m encoding=encoding, errors=errors)\n\u001b[32m-> \u001b[39m\u001b[32m1026\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_execute_child\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexecutable\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpreexec_fn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclose_fds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1027\u001b[39m \u001b[43m \u001b[49m\u001b[43mpass_fds\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcwd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43menv\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1028\u001b[39m \u001b[43m \u001b[49m\u001b[43mstartupinfo\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreationflags\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshell\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1029\u001b[39m \u001b[43m \u001b[49m\u001b[43mp2cread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mp2cwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1030\u001b[39m \u001b[43m \u001b[49m\u001b[43mc2pread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mc2pwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1031\u001b[39m \u001b[43m \u001b[49m\u001b[43merrread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrwrite\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1032\u001b[39m \u001b[43m \u001b[49m\u001b[43mrestore_signals\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1033\u001b[39m \u001b[43m \u001b[49m\u001b[43mgid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgids\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mumask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 1034\u001b[39m \u001b[43m \u001b[49m\u001b[43mstart_new_session\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprocess_group\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1035\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[32m 1036\u001b[39m \u001b[38;5;66;03m# Cleanup if the child failed starting.\u001b[39;00m\n\u001b[32m 1037\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m f \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mfilter\u001b[39m(\u001b[38;5;28;01mNone\u001b[39;00m, (\u001b[38;5;28mself\u001b[39m.stdin, \u001b[38;5;28mself\u001b[39m.stdout, \u001b[38;5;28mself\u001b[39m.stderr)):\n", + "\u001b[36mFile \u001b[39m\u001b[32m/srv/conda/envs/notebook/lib/python3.12/subprocess.py:1955\u001b[39m, in \u001b[36mPopen._execute_child\u001b[39m\u001b[34m(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, gid, gids, uid, umask, start_new_session, process_group)\u001b[39m\n\u001b[32m 1953\u001b[39m err_msg = os.strerror(errno_num)\n\u001b[32m 1954\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m err_filename \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1955\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m child_exception_type(errno_num, err_msg, err_filename)\n\u001b[32m 1956\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1957\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m child_exception_type(errno_num, err_msg)\n", + "\u001b[31mFileNotFoundError\u001b[39m: [Errno 2] No such file or directory: 'download_sentinel2'" ] } ], @@ -5966,8 +208,8 @@ "download_cmd = [\n", " \"download_sentinel2\",\n", " OUTPUT_DIR,\n", - " #\"-tile\", TILE_ID,\n", - " \"-polygon\", POLYGON,\n", + " \"-tile\", TILE_ID,\n", + " # \"-polygon\", POLYGON,\n", " \"-date\", *DOWNLOAD_DATE, \n", " \"-level\", PROCESSING_LEVEL,\n", " \"-u\", COP_USER, \n", @@ -6019,60 +261,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "--- HELPER FLAG ARGUMENTS ---\n", - "usage: process_sentinel2.py input [-h] [-p [P ...]] [-we_nstd [WE_NSTD ...]] [-date [DATE ...]] [-tile [TILE ...]] [-merge] [-mask] [-force] [-unzip_only] [-tif_only] [-nodata NODATA] [-compression COMPRESSION] [-compression_level LEVEL] [-event EVENT]\n", - "\n", - "This script unzips and processes Sentinel-2 L2A data and produces true color,\n", - "natural color, color infrared NDWI, MNDWI, NDVI, NBR, or Water Extent.\n", - "\n", - "positional arguments:\n", - " input Path to directory containing the .zip files (e.g. /dat\n", - " a/esops/eventData/2023/TurkeyEarthquake/sentinel2).\n", - "\n", - "options:\n", - " -h, --help show this help message and exit\n", - " -p [P ...] List of products to produce (all = everything, true =\n", - " true color, nat = natural, colorIR = color infrared,\n", - " swir = shortwave infrared, ndwi = NDWI, mndwi = MNDWI,\n", - " ndvi = NDVI, nbr = NBR, we = water extent\n", - " -we_nstd [WE_NSTD ...]\n", - " Produce water extents with given number(s) of standard\n", - " deviations (default is 1). More standard deviations =\n", - " higher NIR threshold = more pixels classified as\n", - " water.\n", - " -date [DATE ...] Date(s) (e.g. 20230116). If no date(s) or tile(s) is\n", - " entered, all dates found will be processed.\n", - " -tile [TILE ...] Identifier (e.g. T36SYD) for specific tile(s), If no\n", - " tile(s) or date(s) is entered, all tiles found will be\n", - " processed.\n", - " -merge Merge all images by date and product.\n", - " -mask Generate cloud mask and mask all images (non-masked\n", - " version preserved as well).\n", - " -force Force overwrite existing products.\n", - " -unzip_only Just unzip all .zip files. Do not process.\n", - " -tif_only Skip COG conversion and keep regular GeoTIFF format\n", - " (COG is default).\n", - " -nodata NODATA No-data value for COG outputs (auto-detected if not\n", - " specified).\n", - " -compression COMPRESSION\n", - " Compression type for COG (default: ZSTD).\n", - " -compression_level COMPRESSION_LEVEL\n", - " Compression level for COG (default: 22 for ZSTD).\n", - " -dst_crs DST_CRS Target CRS for COG output (default: EPSG:4326, use\n", - " \"native\" to preserve original CRS).\n", - " -event EVENT Event name for filename prefix (e.g.,\n", - " 202512_Flood_WA). Adds formatted date suffix.\n", - "CompletedProcess(args=['process_sentinel2', '-h'], returncode=0)\n" - ] - } - ], + "outputs": [], "source": [ "print(\"--- HELPER FLAG ARGUMENTS ---\")\n", "# Build processing command\n", @@ -6090,123 +281,7 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing Sentinel-2 data...\n", - "Command: process_sentinel2 /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2 -p true swir -event 202601_WinterWx_US -compression ZSTD -compression_level 22 -dst_crs EPSG:4326 -event 202601_WinterWx_US -date 20251230 -merge -force -nodata 0\n", - "\n", - "\n", - "Input: /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2\n", - "Product(s) to produce: ['true', 'swir']\n", - "Processing date(s): ['20251230']\n", - "Processing all tiles\n", - "\n", - "Number of .zip files: 10\n", - "\tS2B_MSIL2A_20251230T164619_N0511_R126_T16SCC_20251230T215228.SAFE.zip already unzipped.\n", - "\tS2B_MSIL2A_20251230T164619_N0511_R126_T16SCD_20251230T215228.SAFE.zip already unzipped.\n", - "\tS2B_MSIL2A_20251230T164619_N0511_R126_T15SXS_20251230T215228.SAFE.zip already unzipped.\n", - "\tS2B_MSIL2A_20251230T164619_N0511_R126_T15SYR_20251230T215228.SAFE.zip already unzipped.\n", - "\tS2A_MSIL2A_20251230T165741_N0511_R026_T15SXS_20251230T202215.SAFE.zip already unzipped.\n", - "\n", - "Unzipping: S2B_MSIL2A_20251230T164619_N0511_R126_T16SDE_20251230T215228.SAFE.zip\n", - "\n", - "7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21\n", - "p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs x64)\n", - "\n", - "Scanning the drive for archives:\n", - "1 file, 77683387 bytes (75 MiB)\n", - "\n", - "Extracting archive: /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2/S2B_MSIL2A_20251230T164619_N0511_R126_T16SDE_20251230T215228.SAFE.zip\n", - "--\n", - "Path = /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2/S2B_MSIL2A_20251230T164619_N0511_R126_T16SDE_20251230T215228.SAFE.zip\n", - "Type = zip\n", - "Physical Size = 77683387\n", - "\n", - "Everything is Ok\n", - "\n", - "Files: 95\n", - "Size: 77648401\n", - "Compressed: 77683387\n", - "\n", - "Unzipping: S2B_MSIL2A_20251230T164619_N0511_R126_T15SYS_20251230T215228.SAFE.zip\n", - "\n", - "7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21\n", - "p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs x64)\n", - "\n", - "Scanning the drive for archives:\n", - "1 file, 1180481421 bytes (1126 MiB)\n", - "\n", - "Extracting archive: /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2/S2B_MSIL2A_20251230T164619_N0511_R126_T15SYS_20251230T215228.SAFE.zip\n", - "--\n", - "Path = /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2/S2B_MSIL2A_20251230T164619_N0511_R126_T15SYS_20251230T215228.SAFE.zip\n", - "Type = zip\n", - "Physical Size = 1180481421\n", - "\n", - "Everything is Ok\n", - "\n", - "Files: 95\n", - "Size: 1180446435\n", - "Compressed: 1180481421\n", - "\tS2B_MSIL2A_20251230T164619_N0511_R126_T16SCB_20251230T215228.SAFE.zip already unzipped.\n", - "\n", - "Unzipping: S2B_MSIL2A_20251230T164619_N0511_R126_T15SWS_20251230T215228.SAFE.zip\n", - "\n", - "7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21\n", - "p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs x64)\n", - "\n", - "Scanning the drive for archives:\n", - "1 file, 366261395 bytes (350 MiB)\n", - "\n", - "Extracting archive: /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2/S2B_MSIL2A_20251230T164619_N0511_R126_T15SWS_20251230T215228.SAFE.zip\n", - "--\n", - "Path = /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2/S2B_MSIL2A_20251230T164619_N0511_R126_T15SWS_20251230T215228.SAFE.zip\n", - "Type = zip\n", - "Physical Size = 366261395\n", - "\n", - "Everything is Ok\n", - "\n", - "Files: 95\n", - "Size: 366226409\n", - "Compressed: 366261395\n", - "\n", - "Unzipping: S2B_MSIL2A_20251230T164619_N0511_R126_T16SDF_20251230T215228.SAFE.zip\n", - "\n", - "7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21\n", - "p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs x64)\n", - "\n", - "Scanning the drive for archives:\n", - "1 file, 346562999 bytes (331 MiB)\n", - "\n", - "Extracting archive: /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2/S2B_MSIL2A_20251230T164619_N0511_R126_T16SDF_20251230T215228.SAFE.zip\n", - "--\n", - "Path = /home/jovyan/shared-readwrite/process_sentinel2/202601_WinterWx_US_s2/S2B_MSIL2A_20251230T164619_N0511_R126_T16SDF_20251230T215228.SAFE.zip\n", - "Type = zip\n", - "Physical Size = 346562999\n", - "\n", - "Everything is Ok\n", - "\n", - "Files: 95\n", - "Size: 346528013\n", - "Compressed: 346562999\n", - "\n", - "Number of directories to process: 10\n", - "\n", - "Processing scenes: 0%| | 0/10 [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "File Details:\n", - "==================================================\n", - "\n", - "shortwaveInfrared:\n", - " - S2A_MSIL2A_shortwaveInfrared_20251230_165741_T15SXS.tif (86.3 MB)\n", - " - S2B_MSIL2A_shortwaveInfrared_20251230_164619_T15SWS.tif (86.3 MB)\n", - " - S2B_MSIL2A_shortwaveInfrared_20251230_164619_T15SXS.tif (86.3 MB)\n", - " - S2B_MSIL2A_shortwaveInfrared_20251230_164619_T15SYR.tif (86.3 MB)\n", - " - S2B_MSIL2A_shortwaveInfrared_20251230_164619_T15SYS.tif (86.3 MB)\n", - " - S2B_MSIL2A_shortwaveInfrared_20251230_164619_T16SCC.tif (86.3 MB)\n", - " - S2B_MSIL2A_shortwaveInfrared_20251230_164619_T16SCD.tif (86.3 MB)\n", - " - S2B_MSIL2A_shortwaveInfrared_20251230_164619_T16SDE.tif (86.3 MB)\n", - " - S2B_MSIL2A_shortwaveInfrared_20251230_164619_T16SDF.tif (86.3 MB)\n", - "\n", - "trueColor:\n", - " - S2A_MSIL2A_trueColor_20251230_165741_T15SXS.tif (384.2 MB)\n", - " - S2A_trueColor_20251230_merged.tif (10006.3 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T15SWS.tif (384.2 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T15SXS.tif (384.2 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T15SYR.tif (383.3 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T15SYS.tif (384.2 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T16SCB.tif (345.0 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T16SCC.tif (345.0 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T16SCD.tif (345.0 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T16SDE.tif (345.0 MB)\n", - " - S2B_MSIL2A_trueColor_20251230_164619_T16SDF.tif (345.0 MB)\n", - " - tmp6cgf6udj.tif (2347.0 MB)\n" - ] - } - ], + "outputs": [], "source": [ "import glob\n", "import os\n", @@ -6464,7 +483,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.11" + "version": "3.12.12" } }, "nbformat": 4, diff --git a/Jupyterhub/simple_disaster_template.ipynb b/Jupyterhub/simple_disaster_template.ipynb new file mode 100755 index 0000000..d28558b --- /dev/null +++ b/Jupyterhub/simple_disaster_template.ipynb @@ -0,0 +1,714 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 🌍 Simple Disaster COG Processing\n", + "\n", + "This simplified notebook converts disaster satellite imagery to Cloud Optimized GeoTIFFs (COGs) with just a few cells.\n", + "\n", + "## ✨ Features\n", + "- **See files first** - List S3 files before configuring\n", + "- **Smart configuration** - Define filename functions after seeing actual files\n", + "- **Auto-discovery** - Automatically categorizes your files\n", + "- **Simple processing** - Just run the cells in order\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

🚀 Launch in Disasters-Hub JupyterHub (requires access)

\n", + "\n", + "

To obtain credentials to VEDA Hub, follow this link for more information.

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "Disclaimer: it is highly recommended to run a tutorial within NASA VEDA JupyterHub, which already includes functions for processing and visualizing data specific to VEDA stories. Running the tutorial outside of the VEDA JupyterHub may lead to errors, specifically related to EarthData authentication. Additionally, it is recommended to use the Pangeo workspace within the VEDA JupyterHub, since certain packages relevant to this tutorial are already installed.
\n", + "\n", + "

If you do not have a VEDA Jupyterhub Account you can launch this notebook on your local environment using MyBinder by clicking the icon below.

\n", + "
\n", + "\n", + "\"Binder\" " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 🔧 Step 0: Setup - Clone Required Repository\n", + "\n", + "**Run this cell first!** This notebook requires the `disasters-aws-conversion` repository for processing functions." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "📥 Cloning disasters-aws-conversion repository...\n", + "✅ Successfully cloned disasters-aws-conversion\n" + ] + } + ], + "source": [ + "import os\n", + "import subprocess\n", + "\n", + "# Check if disasters-aws-conversion exists, if not clone it\n", + "repo_name = \"disasters-aws-conversion\"\n", + "repo_url = \"https://github.com/Disasters-Learning-Portal/disasters-aws-conversion.git\"\n", + "\n", + "if not os.path.exists(repo_name):\n", + " print(f\"📥 Cloning {repo_name} repository...\")\n", + " try:\n", + " result = subprocess.run(\n", + " [\"git\", \"clone\", repo_url, f\"{repo_name}\"],\n", + " capture_output=True,\n", + " text=True,\n", + " check=True\n", + " )\n", + " print(f\"✅ Successfully cloned {repo_name}\")\n", + " except subprocess.CalledProcessError as e:\n", + " print(f\"❌ Error cloning repository: {e.stderr}\")\n", + "else:\n", + " print(f\"✅ {repo_name} repository already exists\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 📋 Step 1: Basic Configuration\n", + "\n", + "Set your event details and S3 paths:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Event: drcs_activations\n", + "Source: s3://nasa-disasters/drcs_activations/202510_Flood_AK/aria\n", + "Destination: s3://nasa-disasters/drcs_activations_new/\n" + ] + } + ], + "source": [ + "# ========================================\n", + "# INPUTS\n", + "# ========================================\n", + "\n", + "# S3 Paths\n", + "BUCKET = 'nasa-disasters' # S3 bucket (DO NOT CHANGE)\n", + "DESTINATION_BASE = 'drcs_activations_new' # Where to save COGs in S3 bucket (DO NOT CHANGE)\n", + "GEOTIFF_DIR = 'drcs_activations' # This is where all non-converted files should be placed\n", + "\n", + "\n", + "# Event Details\n", + "EVENT_NAME = '202510_Flood_AK' # Your sensor or product name (e.g, Sentinel-1, Planet, Landsat)\n", + "SUB_PRODUCT_NAME = 'aria' # Sub-directories within PRODUCT_NAME (RGB, trueColor, SWIR, etc.). Can leave blank and it will read from PRODUCT_NAME.\n", + "SOURCE_PATH = f'{GEOTIFF_DIR}/{EVENT_NAME}/{SUB_PRODUCT_NAME}' # Where your files are\n", + "\n", + "\n", + "# Processing Options\n", + "OVERWRITE = False # Set to True to replace existing files\n", + "VERIFY = True # Set to True to verify results after processing\n", + "SAVE_RESULTS = True # Set to False to skip saving results CSV to /output directory\n", + "\n", + "print(f\"Event: {GEOTIFF_DIR}\")\n", + "print(f\"Source: s3://{BUCKET}/{SOURCE_PATH}\")\n", + "print(f\"Destination: s3://{BUCKET}/{DESTINATION_BASE}/\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 🔍 Step 2: Connect to S3 and List Files\n", + "\n", + "Let's see what files are available before configuring filename transformations:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🌐 Connecting to S3...\n", + "✅ Connected to S3\n", + "\n", + "📂 Files in s3://nasa-disasters/drcs_activations/202510_Flood_AK/aria:\n", + "============================================================\n", + "Found 6 .tif files:\n", + "\n", + " 1. OPERA_L3_DSWX-S1_V1_WTR_2025-10-08_mosaic.tif (0.01 GB)\n", + " 2. OPERA_L3_DSWX-S1_V1_WTR_2025-10-10_mosaic.tif (0.03 GB)\n", + " 3. OPERA_L3_DSWX-S1_V1_WTR_2025-10-12_mosaic.tif (0.03 GB)\n", + " 4. OPERA_L3_DSWX-S1_V1_WTR_2025-10-15_mosaic.tif (0.02 GB)\n", + " 5. OPERA_L3_DSWX-HLS_V1_WTR_2025-10-08_mosaic.tif (0.01 GB)\n", + " 6. OPERA_L3_DSWX-HLS_V1_WTR_2025-10-13_mosaic.tif (0.01 GB)\n", + "\n", + "============================================================\n", + "\n", + "💡 Use this information to create filename functions in Step 3\n" + ] + } + ], + "source": [ + "# Import necessary modules\n", + "import sys\n", + "import os\n", + "from pathlib import Path\n", + "\n", + "# Add parent directory to path for importing functions\n", + "sys.path.insert(0, str(Path('../disasters-aws-conversion').resolve()))\n", + "\n", + "# Import S3 operations\n", + "from core.s3_operations import (\n", + " initialize_s3_client,\n", + " list_s3_files,\n", + " get_file_size_from_s3\n", + ")\n", + "\n", + "# Initialize S3 client\n", + "print(\"🌐 Connecting to S3...\")\n", + "s3_client, _ = initialize_s3_client(bucket_name=BUCKET, verbose=False)\n", + "\n", + "if s3_client:\n", + " print(\"✅ Connected to S3\\n\")\n", + " \n", + " # List all TIF files\n", + " print(f\"📂 Files in s3://{BUCKET}/{SOURCE_PATH}:\")\n", + " print(\"=\"*60)\n", + " \n", + " files = list_s3_files(s3_client, BUCKET, SOURCE_PATH, suffix='.tif')\n", + " \n", + " if files:\n", + " print(f\"Found {len(files)} .tif files:\\n\")\n", + " for i, file_path in enumerate(files[:10], 1): # Show first 10\n", + " filename = os.path.basename(file_path)\n", + " try:\n", + " size_gb = get_file_size_from_s3(s3_client, BUCKET, file_path)\n", + " print(f\"{i:2}. {filename:<60} ({size_gb:.2f} GB)\")\n", + " except:\n", + " print(f\"{i:2}. {filename}\")\n", + " \n", + " if len(files) > 10:\n", + " print(f\"\\n... and {len(files) - 10} more files\")\n", + " \n", + " print(\"\\n\" + \"=\"*60)\n", + " print(\"\\n💡 Use this information to create filename functions in Step 3\")\n", + " else:\n", + " print(\"⚠️ No .tif files found in the specified path.\")\n", + " print(\" Check your SOURCE_PATH configuration.\")\n", + "else:\n", + " print(\"❌ Could not connect to S3. Check your AWS credentials.\")\n", + " files = []" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/home/jovyan/disasters-docs/Jupyterhub'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.getcwd()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 🏷️ Step 3a: Define Categorization and Filename Transformations\n", + "\n", + "Based on the files you see above, configure:\n", + "1. **Categorization patterns** - Regex patterns to identify file types\n", + "2. **Filename functions** - How to transform filenames\n", + "3. **Output directories** - Where each category should be saved" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# ========================================\n", + "# CATEGORIZATION AND OUTPUT CONFIGURATION\n", + "# ========================================\n", + "\n", + "import re\n", + "\n", + "# STEP 1: Define how to extract dates from filenames\n", + "def extract_date_from_filename(filename):\n", + " \"\"\"Extract date from filename in YYYYMMDD format.\"\"\"\n", + " dates = re.findall(r'\\d{8}', filename)\n", + " if dates:\n", + " date_str = dates[0]\n", + " return f\"{date_str[0:4]}-{date_str[4:6]}-{date_str[6:8]}\"\n", + " return None\n", + "\n", + "# STEP 2: Define filename transformation functions for each category\n", + "def create_truecolor_filename(original_path, event_name):\n", + " \"\"\"Create filename for trueColor products.\"\"\"\n", + " filename = os.path.basename(original_path)\n", + " stem = os.path.splitext(filename)[0]\n", + " date = extract_date_from_filename(stem)\n", + " \n", + " if date:\n", + " stem_clean = re.sub(r'_\\d{8}', '', stem)\n", + " return f\"{event_name}_{stem_clean}_{date}_day.tif\"\n", + " return f\"{event_name}_{stem}_day.tif\"\n", + "\n", + "def create_colorinfrared_filename(original_path, event_name):\n", + " \"\"\"Create filename for colorInfrared products.\"\"\"\n", + " filename = os.path.basename(original_path)\n", + " stem = os.path.splitext(filename)[0]\n", + " date = extract_date_from_filename(stem)\n", + " \n", + " if date:\n", + " stem_clean = re.sub(r'_\\d{8}', '', stem)\n", + " return f\"{event_name}_{stem_clean}_{date}_day.tif\"\n", + " return f\"{event_name}_{stem}_day.tif\"\n", + "\n", + "def create_naturalcolor_filename(original_path, event_name):\n", + " \"\"\"Create filename for naturalColor products.\"\"\"\n", + " filename = os.path.basename(original_path)\n", + " stem = os.path.splitext(filename)[0]\n", + " date = extract_date_from_filename(stem)\n", + " \n", + " if date:\n", + " stem_clean = re.sub(r'_\\d{8}', '', stem)\n", + " return f\"{event_name}_{stem_clean}_{date}_day.tif\"\n", + " return f\"{event_name}_{stem}_day.tif\"\n", + "\n", + "# STEP 3: Configure categorization patterns (REQUIRED)\n", + "# These regex patterns determine which files belong to which category\n", + "CATEGORIZATION_PATTERNS = {\n", + " 'trueColor': r'trueColor|truecolor|true_color',\n", + " 'colorInfrared': r'colorInfrared|colorIR|color_infrared',\n", + " 'naturalColor': r'naturalColor|natural_color',\n", + " # Add patterns for ALL file types you want to process\n", + " # Files not matching any pattern will be skipped with a warning\n", + "}\n", + "\n", + "# STEP 4: Map categories to filename transformation functions\n", + "FILENAME_CREATORS = {\n", + " 'trueColor': create_truecolor_filename,\n", + " 'colorInfrared': create_colorinfrared_filename,\n", + " 'naturalColor': create_naturalcolor_filename,\n", + " # Must have an entry for each category in CATEGORIZATION_PATTERNS\n", + "}\n", + "\n", + "# STEP 5: Specify output directories for each category\n", + "OUTPUT_DIRS = {\n", + " 'trueColor': 'Landsat/trueColor',\n", + " 'colorInfrared': 'Landsat/colorIR',\n", + " 'naturalColor': 'Landsat/naturalColor',\n", + " # Must have an entry for each category in CATEGORIZATION_PATTERNS\n", + "}\n", + "\n", + "# OPTIONAL: Specify no-data values (None = auto-detect)\n", + "NODATA_VALUES = {\n", + " 'trueColor': 0,\n", + " 'colorInfrared': 0,\n", + " 'naturalColor': 0\n", + " # Leave empty or set to None for auto-detection\n", + "}\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 🏷️ Step 3b: Test the new functions to verify what the inputs and outputs will be. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✅ Configuration defined\n", + "\n", + "📂 Categories and output paths:\n", + " • trueColor:\n", + " Pattern: trueColor|truecolor|true_color\n", + " Output: drcs_activations_new/Landsat/trueColor\n", + " • colorInfrared:\n", + " Pattern: colorInfrared|colorIR|color_infrared\n", + " Output: drcs_activations_new/Landsat/colorIR\n", + " • naturalColor:\n", + " Pattern: naturalColor|natural_color\n", + " Output: drcs_activations_new/Landsat/naturalColor\n" + ] + } + ], + "source": [ + "print(\"✅ Configuration defined\")\n", + "print(f\"\\n📂 Categories and output paths:\")\n", + "for category, path in OUTPUT_DIRS.items():\n", + " pattern = CATEGORIZATION_PATTERNS.get(category, 'No pattern defined')\n", + " print(f\" • {category}:\")\n", + " print(f\" Pattern: {pattern}\")\n", + " print(f\" Output: {DESTINATION_BASE}/{path}\")\n", + "\n", + "# Test with sample filename if files exist\n", + "if files:\n", + " sample_file = files[0]\n", + " sample_name = os.path.basename(sample_file)\n", + " \n", + " # Check which category it would match\n", + " matched_category = None\n", + " for cat, pattern in CATEGORIZATION_PATTERNS.items():\n", + " if re.search(pattern, sample_name, re.IGNORECASE):\n", + " matched_category = cat\n", + " break\n", + " \n", + " if matched_category:\n", + " new_name = FILENAME_CREATORS[matched_category](sample_file, EVENT_NAME)\n", + " print(f\"\\n📝 Example transformation:\")\n", + " print(f\" Original: {sample_name}\")\n", + " print(f\" Category: {matched_category}\")\n", + " print(f\" → New: {new_name}\")\n", + " print(f\" → Output: {DESTINATION_BASE}/{OUTPUT_DIRS[matched_category]}/{new_name}\")\n", + " else:\n", + " print(f\"\\n⚠️ Warning: Sample file doesn't match any category pattern:\")\n", + " print(f\" File: {sample_name}\")\n", + " print(f\" Add a pattern to CATEGORIZATION_PATTERNS to process this file type\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 🚀 Step 4: Initialize Processor and Preview\n", + "\n", + "Now let's set up the processor and preview all transformations:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✅ All modules loaded successfully\n", + "\n", + "🌐 Connecting to S3...\n", + "✅ Connected to S3 successfully\n", + "✅ Processor ready\n", + "\n", + "\n", + "🔍 Searching for files in: geotiffs_to_convert/202408_TropicalStorm_Debby/landsat8\n", + "⚠️ No .tif files found\n", + "⚠️ No files found to process.\n" + ] + } + ], + "source": [ + "# Import our simplified helper\n", + "from notebooks.notebook_helpers import SimpleProcessor\n", + "\n", + "# Create full configuration with categorization patterns\n", + "config = {\n", + " 'event_name': EVENT_NAME,\n", + " 'bucket': BUCKET,\n", + " 'source_path': SOURCE_PATH,\n", + " 'destination_base': DESTINATION_BASE,\n", + " 'overwrite': OVERWRITE,\n", + " 'verify': VERIFY,\n", + " 'save_results': SAVE_RESULTS, # Add save results flag\n", + " 'categorization_patterns': CATEGORIZATION_PATTERNS, # IMPORTANT: Include patterns\n", + " 'filename_creators': FILENAME_CREATORS,\n", + " 'output_dirs': OUTPUT_DIRS,\n", + " 'nodata_values': NODATA_VALUES\n", + "}\n", + "\n", + "# Initialize processor\n", + "processor = SimpleProcessor(config)\n", + "\n", + "# Connect to S3 (already connected, but needed for processor)\n", + "if processor.connect_to_s3():\n", + " print(\"✅ Processor ready\\n\")\n", + " \n", + " # Discover and categorize files\n", + " num_files = processor.discover_files()\n", + " \n", + " if num_files > 0:\n", + " # Show preview of transformations\n", + " processor.preview_processing()\n", + " \n", + " print(\"\\n📌 Review the transformations above.\")\n", + " print(\" • Files will be saved to the directories specified in OUTPUT_DIRS\")\n", + " print(\" • If files appear as 'uncategorized', add patterns to CATEGORIZATION_PATTERNS\")\n", + " print(\" • When ready, proceed to Step 5 to process the files.\")\n", + " else:\n", + " print(\"⚠️ No files found to process.\")\n", + "else:\n", + " print(\"❌ Could not initialize processor.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ⚙️ Step 5: Process Files\n", + "\n", + "Run this cell to start processing all files:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🚀 Starting processing...\n", + "This may take several minutes depending on file sizes.\n", + "\n", + "\n", + "🚀 Starting processing...\n", + "\n", + "📦 Processing colorInfrared (3 files)\n", + " ⏭️ Skipped: LC08_colorInfrared_20240715_155319_016036.tif (exists)\n", + " ⏭️ Skipped: LC08_colorInfrared_20240715_155343_016037.tif (exists)\n", + " ⏭️ Skipped: LC08_colorInfrared_20240715_15547_016038.tif (exists)\n", + "\n", + "📦 Processing naturalColor (3 files)\n", + " ⏭️ Skipped: LC08_naturalColor_20240715_155319_016036.tif (exists)\n", + " ⏭️ Skipped: LC08_naturalColor_20240715_155343_016037.tif (exists)\n", + " ⏭️ Skipped: LC08_naturalColor_20240715_15547_016038.tif (exists)\n", + "\n", + "📦 Processing trueColor (3 files)\n", + " ⏭️ Skipped: LC08_trueColor_20240715_155319_016036.tif (exists)\n", + " ⏭️ Skipped: LC08_trueColor_20240715_155343_016037.tif (exists)\n", + " ⏭️ Skipped: LC08_trueColor_20240715_15547_016038.tif (exists)\n", + "\n", + "============================================================\n", + "✅ PROCESSING COMPLETE\n", + "============================================================\n", + "\n", + "Results:\n", + " ⏭️ Skipped: 9\n", + "\n", + "Processing time: 0.0 minutes\n", + "\n", + "📁 Results saved to: output/202408_TropicalStorm_Debby/results_20250929_191143.csv\n", + "============================================================\n", + "\n", + "📊 Processing Complete!\n", + " source_file category status \\\n", + "0 LC08_colorInfrared_20240715_155319_016036.tif colorInfrared skipped \n", + "1 LC08_colorInfrared_20240715_155343_016037.tif colorInfrared skipped \n", + "2 LC08_colorInfrared_20240715_15547_016038.tif colorInfrared skipped \n", + "3 LC08_naturalColor_20240715_155319_016036.tif naturalColor skipped \n", + "4 LC08_naturalColor_20240715_155343_016037.tif naturalColor skipped \n", + "5 LC08_naturalColor_20240715_15547_016038.tif naturalColor skipped \n", + "6 LC08_trueColor_20240715_155319_016036.tif trueColor skipped \n", + "7 LC08_trueColor_20240715_155343_016037.tif trueColor skipped \n", + "8 LC08_trueColor_20240715_15547_016038.tif trueColor skipped \n", + "\n", + " reason output_path \\\n", + "0 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "1 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "2 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "3 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "4 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "5 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "6 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "7 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "8 already exists s3://nasa-disasters/drcs_activations_new/Lands... \n", + "\n", + " time_seconds \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "5 0 \n", + "6 0 \n", + "7 0 \n", + "8 0 \n" + ] + } + ], + "source": [ + "# Process all files\n", + "if 'num_files' in locals() and num_files > 0:\n", + " print(\"🚀 Starting processing...\")\n", + " print(\"This may take several minutes depending on file sizes.\\n\")\n", + " \n", + " # Process everything\n", + " results = processor.process_all()\n", + " \n", + " # Display results\n", + " if not results.empty:\n", + " print(\"\\n📊 Processing Complete!\")\n", + " display(results) if 'display' in dir() else print(results)\n", + "else:\n", + " print(\"⚠️ No files to process. Complete Steps 1-4 first.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Analyze results\n", + "if 'results' in locals() and not results.empty:\n", + " print(\"📊 PROCESSING STATISTICS\")\n", + " print(\"=\"*40)\n", + " \n", + " # Success rate\n", + " total = len(results)\n", + " success = len(results[results['status'] == 'success'])\n", + " failed = len(results[results['status'] == 'failed'])\n", + " skipped = len(results[results['status'] == 'skipped'])\n", + " \n", + " print(f\"Total files: {total}\")\n", + " print(f\"✅ Success: {success}\")\n", + " print(f\"❌ Failed: {failed}\")\n", + " print(f\"⏭️ Skipped: {skipped}\")\n", + " print(f\"\\nSuccess rate: {(success/total*100):.1f}%\")\n", + " \n", + " # Failed files\n", + " if failed > 0:\n", + " print(\"\\n❌ Failed files:\")\n", + " failed_df = results[results['status'] == 'failed']\n", + " for idx, row in failed_df.iterrows():\n", + " print(f\" - {row['source_file']}: {row.get('error', 'Unknown error')}\")\n", + " \n", + " # Processing times\n", + " if 'time_seconds' in results.columns:\n", + " success_df = results[results['status'] == 'success']\n", + " if not success_df.empty:\n", + " avg_time = success_df['time_seconds'].mean()\n", + " max_time = success_df['time_seconds'].max()\n", + " print(f\"\\n⏱️ Timing:\")\n", + " print(f\"Average: {avg_time:.1f} seconds per file\")\n", + " print(f\"Slowest: {max_time:.1f} seconds\")\n", + "else:\n", + " print(\"No results to analyze. Run Step 5 first.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 💡 Tips & Troubleshooting\n", + "\n", + "### Workflow Summary:\n", + "1. **Setup** - Clone disasters-aws-conversion repository (Step 0)\n", + "2. **Configure** basic settings (Step 1)\n", + "3. **List files** from S3 to see naming patterns (Step 2)\n", + "4. **Define functions** to transform filenames (Step 3)\n", + "5. **Preview** transformations (Step 4)\n", + "6. **Process** all files (Step 5)\n", + "7. **Review** results (Step 6)\n", + "\n", + "### Common Issues:\n", + "\n", + "1. **\"ModuleNotFoundError: No module named 'core'\" or import errors**\n", + " - Run Step 0 first to clone the disasters-aws-conversion repository\n", + " - Restart kernel and run all cells from the beginning\n", + "\n", + "2. **\"No files found\"**\n", + " - Check `SOURCE_PATH` in Step 1\n", + " - Verify bucket permissions\n", + " - Ensure files have `.tif` extension\n", + "\n", + "3. **Wrong filename transformations**\n", + " - Review actual filenames in Step 2\n", + " - Adjust functions in Step 3\n", + " - Re-run Step 4 to preview\n", + "\n", + "4. **Files being skipped**\n", + " - Files already exist in destination\n", + " - Set `OVERWRITE = True` in Step 1\n", + "\n", + "5. **Processing errors**\n", + " - Check AWS credentials\n", + " - Verify S3 write permissions\n", + " - Check available disk space for temp files\n", + "\n", + "### Need More Control?\n", + "\n", + "Use the full template at `disaster_processing_template.ipynb` for:\n", + "- Manual chunk configuration\n", + "- Custom compression settings\n", + "- Detailed memory management\n", + "- Advanced processing options" + ] + } + ], + "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.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Presentations/aws-cost-management.qmd b/Presentations/aws-cost-management.qmd old mode 100644 new mode 100755 diff --git a/Presentations/aws-grafana-tutorial.qmd b/Presentations/aws-grafana-tutorial.qmd old mode 100644 new mode 100755 diff --git a/Presentations/disasters-powerpoint-template.qmd b/Presentations/disasters-powerpoint-template.qmd old mode 100644 new mode 100755 diff --git a/Presentations/jupyterhub-data-conversions-tutorial.qmd b/Presentations/jupyterhub-data-conversions-tutorial.qmd old mode 100644 new mode 100755 diff --git a/Presentations/stac-airflow-tutorial.qmd b/Presentations/stac-airflow-tutorial.qmd old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/SIMPLE_PASSWORD_SETUP.md b/SIMPLE_PASSWORD_SETUP.md old mode 100644 new mode 100755 diff --git a/_quarto.yml b/_quarto.yml old mode 100644 new mode 100755 diff --git a/advanceduser.qmd b/advanceduser.qmd old mode 100644 new mode 100755 diff --git a/auth-check.js b/auth-check.js old mode 100644 new mode 100755 diff --git a/aws.qmd b/aws.qmd old mode 100644 new mode 100755 diff --git a/cog_transformation/__pycache__/date.cpython-39.pyc b/cog_transformation/__pycache__/date.cpython-39.pyc old mode 100644 new mode 100755 diff --git a/cog_transformation/casagfed-carbonflux-monthgrid-v3.ipynb b/cog_transformation/casagfed-carbonflux-monthgrid-v3.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/cmip6-transformation.py b/cog_transformation/cmip6-transformation.py old mode 100644 new mode 100755 diff --git a/cog_transformation/ct-ch4-monthgrid-v2023.ipynb b/cog_transformation/ct-ch4-monthgrid-v2023.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/eccodarwin-co2flux-monthgrid-v5.ipynb b/cog_transformation/eccodarwin-co2flux-monthgrid-v5.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/emit-ch4plume-v1.ipynb b/cog_transformation/emit-ch4plume-v1.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/epa-ch4emission-grid-v2express.ipynb b/cog_transformation/epa-ch4emission-grid-v2express.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/epa-ch4emission-grid-v2express_layers_update.ipynb b/cog_transformation/epa-ch4emission-grid-v2express_layers_update.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/epa-ch4emission-monthgrid-v2.ipynb b/cog_transformation/epa-ch4emission-monthgrid-v2.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/goes-ch4plume-v1.ipynb b/cog_transformation/goes-ch4plume-v1.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/gosat-based-ch4budget-yeargrid-v1.ipynb b/cog_transformation/gosat-based-ch4budget-yeargrid-v1.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/gra2pes-ghg-monthgrid-v1.ipynb b/cog_transformation/gra2pes-ghg-monthgrid-v1.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/influx-testbed-ghg-concentrations.ipynb b/cog_transformation/influx-testbed-ghg-concentrations.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/lam-testbed-ghg-concentrations.ipynb b/cog_transformation/lam-testbed-ghg-concentrations.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/lpjwsl-wetlandch4-daygrid-v1.ipynb b/cog_transformation/lpjwsl-wetlandch4-daygrid-v1.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/lpjwsl-wetlandch4-monthgrid-v1.ipynb b/cog_transformation/lpjwsl-wetlandch4-monthgrid-v1.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/nec-testbed-ghg-concentrations.ipynb b/cog_transformation/nec-testbed-ghg-concentrations.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/noaa-gggrn-concentrations.ipynb b/cog_transformation/noaa-gggrn-concentrations.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/oco2-mip-co2budget-yeargrid-v1.ipynb b/cog_transformation/oco2-mip-co2budget-yeargrid-v1.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/oco2geos-co2-daygrid-v10r.ipynb b/cog_transformation/oco2geos-co2-daygrid-v10r.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/odiac-ffco2-monthgrid-v2022.ipynb b/cog_transformation/odiac-ffco2-monthgrid-v2022.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/odiac-ffco2-monthgrid-v2023.ipynb b/cog_transformation/odiac-ffco2-monthgrid-v2023.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/odiac-ffco2-monthgrid-v2024.ipynb b/cog_transformation/odiac-ffco2-monthgrid-v2024.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/sedac-popdensity-yeargrid5yr-v4.11.ipynb b/cog_transformation/sedac-popdensity-yeargrid5yr-v4.11.ipynb old mode 100644 new mode 100755 diff --git a/cog_transformation/vulcan-ffco2-yeargrid-v4.ipynb b/cog_transformation/vulcan-ffco2-yeargrid-v4.ipynb old mode 100644 new mode 100755 diff --git a/contentcuration.qmd b/contentcuration.qmd old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/README.md b/data_transformation_plugins/README.md old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/__init__.py b/data_transformation_plugins/__init__.py old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/ecco_darwin_transformation.py b/data_transformation_plugins/ecco_darwin_transformation.py old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/geos_oco2_transformation.py b/data_transformation_plugins/geos_oco2_transformation.py old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/gosat_ch4_transformation.py b/data_transformation_plugins/gosat_ch4_transformation.py old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/gpw_transformation.py b/data_transformation_plugins/gpw_transformation.py old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/push_to_s3.py b/data_transformation_plugins/push_to_s3.py old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/sample_transformation.ipynb b/data_transformation_plugins/sample_transformation.ipynb old mode 100644 new mode 100755 diff --git a/data_transformation_plugins/tm5_4dvar_update_noaa_transformation.py b/data_transformation_plugins/tm5_4dvar_update_noaa_transformation.py old mode 100644 new mode 100755 diff --git a/data_workflow/ct-ch4-monthgrid-v2023_Data_Flow.qmd b/data_workflow/ct-ch4-monthgrid-v2023_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/eccodarwin-co2flux-monthgrid-v5_Data_Flow.qmd b/data_workflow/eccodarwin-co2flux-monthgrid-v5_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/emit-ch4plume-v1_Data_Flow.qmd b/data_workflow/emit-ch4plume-v1_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/epa-ch4emission-grid-v2express_Data_Flow.qmd b/data_workflow/epa-ch4emission-grid-v2express_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/goes-ch4plume-v1_Data_Flow.qmd b/data_workflow/goes-ch4plume-v1_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/gosat-based-ch4budget-yeargrid-v1_Data_Flow.qmd b/data_workflow/gosat-based-ch4budget-yeargrid-v1_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/gra2pes-ghg-monthgrid-v1_Data_Flow.qmd b/data_workflow/gra2pes-ghg-monthgrid-v1_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/influx-testbed-ghg-concentrations_Data_Flow.qmd b/data_workflow/influx-testbed-ghg-concentrations_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/lam-testbed-ghg-concentrations_Data_Flow.qmd b/data_workflow/lam-testbed-ghg-concentrations_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/lpjeosim-wetlandch4-grid-v1_Data_Flow.qmd b/data_workflow/lpjeosim-wetlandch4-grid-v1_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/media/.png b/data_workflow/media/.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/ceos-ch4budget-yeargrid-v1_Data_Flow.png b/data_workflow/media/ceos-ch4budget-yeargrid-v1_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/ceos-co2budget-yeargrid-v1_Data_Flow.png b/data_workflow/media/ceos-co2budget-yeargrid-v1_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/ct-ch4-monthgrid-v2023_Data_Flow.png b/data_workflow/media/ct-ch4-monthgrid-v2023_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/eccodarwin-co2flux-monthgrid-v5_Data_Flow.png b/data_workflow/media/eccodarwin-co2flux-monthgrid-v5_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/emit-ch4plume-v1_Data_Flow.png b/data_workflow/media/emit-ch4plume-v1_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/epa-ch4emission-grid-v2express_Data_Flow.png b/data_workflow/media/epa-ch4emission-grid-v2express_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/goes-ch4plume-v1_Data_Flow.png b/data_workflow/media/goes-ch4plume-v1_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/gosat-based-ch4budget-yeargrid-v1_Data_Flow.png b/data_workflow/media/gosat-based-ch4budget-yeargrid-v1_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/gra2pes-ghg-monthgrid-v1_Data_Flow.png b/data_workflow/media/gra2pes-ghg-monthgrid-v1_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/influx-testbed-ghg-concentrations_Data_Flow.png b/data_workflow/media/influx-testbed-ghg-concentrations_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/lam-testbed-ghg-concentrations_Data_Flow.png b/data_workflow/media/lam-testbed-ghg-concentrations_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/lpjeosim-wetlandch4-grid-v2_Data_Flow.png b/data_workflow/media/lpjeosim-wetlandch4-grid-v2_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/micasa-carbonflux-daygrid-v1_Data_Flow.png b/data_workflow/media/micasa-carbonflux-daygrid-v1_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/nec-testbed-ghg-concentrations_Data_Flow.png b/data_workflow/media/nec-testbed-ghg-concentrations_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/noaa-gggrn-ch4-concentrations_Data_Flow.png b/data_workflow/media/noaa-gggrn-ch4-concentrations_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/noaa-gggrn-co2-concentrations_Data_Flow.png b/data_workflow/media/noaa-gggrn-co2-concentrations_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/oco2geos-co2-daygrid-v10r_Data_Flow.png b/data_workflow/media/oco2geos-co2-daygrid-v10r_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/odiac-ffco2-monthgrid-v2023_Data_Flow.png b/data_workflow/media/odiac-ffco2-monthgrid-v2023_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/odiac-ffco2-monthgrid-v2024_Data_Flow.png b/data_workflow/media/odiac-ffco2-monthgrid-v2024_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/sedac-popdensity-yeargrid5yr-v4.11_Data_Flow.png b/data_workflow/media/sedac-popdensity-yeargrid5yr-v4.11_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/media/vulcan-ffco2-yeargrid-v4_Data_Flow.png b/data_workflow/media/vulcan-ffco2-yeargrid-v4_Data_Flow.png old mode 100644 new mode 100755 diff --git a/data_workflow/micasa-carbonflux-daygrid-v1_Data_Flow.qmd b/data_workflow/micasa-carbonflux-daygrid-v1_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/nec-testbed-ghg-concentrations_Data_Flow.qmd b/data_workflow/nec-testbed-ghg-concentrations_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/noaa-gggrn-ch4-concentrations_Data_Flow.qmd b/data_workflow/noaa-gggrn-ch4-concentrations_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/noaa-gggrn-co2-concentrations_Data_Flow.qmd b/data_workflow/noaa-gggrn-co2-concentrations_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/oco2-mip-co2budget-yeargrid-v1_Data_Flow.qmd b/data_workflow/oco2-mip-co2budget-yeargrid-v1_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/oco2geos-co2-daygrid-v10r_Data_Flow.qmd b/data_workflow/oco2geos-co2-daygrid-v10r_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/odiac-ffco2-monthgrid-v2024_Data_Flow.qmd b/data_workflow/odiac-ffco2-monthgrid-v2024_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/sedac-popdensity-yeargrid5yr-v4.11_Data_Flow.qmd b/data_workflow/sedac-popdensity-yeargrid5yr-v4.11_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow/vulcan-ffco2-yeargrid-v4_Data_Flow.qmd b/data_workflow/vulcan-ffco2-yeargrid-v4_Data_Flow.qmd old mode 100644 new mode 100755 diff --git a/data_workflow2/NRT_data_download.qmd b/data_workflow2/NRT_data_download.qmd old mode 100644 new mode 100755 diff --git a/data_workflow2/NRT_directory_structure.qmd b/data_workflow2/NRT_directory_structure.qmd old mode 100644 new mode 100755 diff --git a/data_workflow2/media/NRT_data.png b/data_workflow2/media/NRT_data.png old mode 100644 new mode 100755 diff --git a/data_workflow2/media/NRT_dir.png b/data_workflow2/media/NRT_dir.png old mode 100644 new mode 100755 diff --git a/datasetingestion.qmd b/datasetingestion.qmd old mode 100644 new mode 100755 diff --git a/datatransformationcode.qmd b/datatransformationcode.qmd old mode 100644 new mode 100755 diff --git a/datausage.qmd b/datausage.qmd old mode 100644 new mode 100755 diff --git a/git-github-comprehensive-guide.qmd b/git-github-comprehensive-guide.qmd old mode 100644 new mode 100755 diff --git a/index.qmd b/index.qmd old mode 100644 new mode 100755 diff --git a/jupyterhub.qmd b/jupyterhub.qmd old mode 100644 new mode 100755 diff --git a/logo/disasters-logo.svg b/logo/disasters-logo.svg old mode 100644 new mode 100755 diff --git a/logo/disasters_logo.png b/logo/disasters_logo.png old mode 100644 new mode 100755 diff --git a/logo/ghgc-logo-dark.svg b/logo/ghgc-logo-dark.svg old mode 100644 new mode 100755 diff --git a/logo/ghgc-logo-light.svg b/logo/ghgc-logo-light.svg old mode 100644 new mode 100755 diff --git a/password-protect.html b/password-protect.html old mode 100644 new mode 100755 diff --git a/processingreport.qmd b/processingreport.qmd old mode 100644 new mode 100755 diff --git a/quarto-guide.qmd b/quarto-guide.qmd old mode 100644 new mode 100755 diff --git a/requirements.txt b/requirements.txt old mode 100644 new mode 100755 diff --git a/services/apis.qmd b/services/apis.qmd old mode 100644 new mode 100755 diff --git a/services/jupyterhub.qmd b/services/jupyterhub.qmd old mode 100644 new mode 100755 diff --git a/styles.css b/styles.css old mode 100644 new mode 100755 diff --git a/user_data_notebooks/New_Mexico_Fire_2025.ipynb b/user_data_notebooks/New_Mexico_Fire_2025.ipynb old mode 100644 new mode 100755 index cebe5a1..d101e71 --- a/user_data_notebooks/New_Mexico_Fire_2025.ipynb +++ b/user_data_notebooks/New_Mexico_Fire_2025.ipynb @@ -122,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "id": "728bcdf2-f81c-4122-8808-cd46782153fa", "metadata": {}, "outputs": [], @@ -164,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "id": "df4cbcbf-ca63-42e4-8903-845cc2396f75", "metadata": {}, "outputs": [], @@ -179,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "id": "91886850-d2ea-43c2-8516-8c8302b21614", "metadata": {}, "outputs": [ @@ -2433,7 +2433,7 @@ "" ] }, - "execution_count": 10, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -2456,7 +2456,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "id": "06444ab8-537d-4bd5-a0d6-711b81f65a87", "metadata": {}, "outputs": [ @@ -2481,7 +2481,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 5, "id": "9e242647-3700-4aa6-ab24-ec08aedee89a", "metadata": {}, "outputs": [ @@ -5914,7 +5914,7 @@ "" ] }, - "execution_count": 12, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -5928,7 +5928,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "id": "8b9743e9-1926-4dc0-9bed-4d25a60eed3c", "metadata": {}, "outputs": [], @@ -5948,7 +5948,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "id": "28dae225-10a4-4fb1-a07e-bba3236ec87c", "metadata": {}, "outputs": [], @@ -5974,7 +5974,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "id": "39765c05-2b88-40ad-b481-35603564ba05", "metadata": {}, "outputs": [], @@ -5985,7 +5985,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 9, "id": "0618f6e2-793c-4574-8dfe-55260114f707", "metadata": {}, "outputs": [ @@ -6063,7 +6063,7 @@ " 'valid_percent': 87.95561863327674}}]" ] }, - "execution_count": 16, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -6082,7 +6082,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 10, "id": "a7a4b0ef-41ec-46fd-abd5-7addf88d606f", "metadata": {}, "outputs": [ @@ -9515,7 +9515,7 @@ "" ] }, - "execution_count": 17, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -9526,7 +9526,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 11, "id": "04961b73-c15e-45d2-af88-71b5a3c26ae4", "metadata": {}, "outputs": [ @@ -9546,7 +9546,7 @@ " 'center': [-107.92606117542319, 32.92221525662006, 0]}" ] }, - "execution_count": 18, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -9564,7 +9564,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 12, "id": "75d7d58c-be57-4960-85ca-d69e2db27800", "metadata": {}, "outputs": [ @@ -9584,7 +9584,7 @@ " 'center': [-107.9261023710369, 32.922251929595305, 0]}" ] }, - "execution_count": 19, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -9626,7 +9626,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 13, "id": "89cb22fc-03e3-46a7-9961-03ce96574e5a", "metadata": {}, "outputs": [ @@ -9652,7 +9652,7 @@ " <meta name="viewport" content="width=device-width,\n", " initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />\n", " <style>\n", - " #map_fd34321beb635176f636659c9b17d41f {\n", + " #map_a9443ee0114295fd854372f4ac10e294 {\n", " position: absolute;\n", " width: 50.0%;\n", " height: 100.0%;\n", @@ -9689,7 +9689,7 @@ " <meta name="viewport" content="width=device-width,\n", " initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />\n", " <style>\n", - " #map_9d026b33eff87a9ac902ac8a21b95353 {\n", + " #map_4369f9cb03221c96a10bd803b52aa5db {\n", " position: absolute;\n", " width: 50.0%;\n", " height: 100.0%;\n", @@ -9740,17 +9740,17 @@ "Sentinel-2 Imagery Pre Fire (2025-06-09) and Post Fire (2025-06-29)\n", "</div>\n", " \n", - " <div class="folium-map" id="map_fd34321beb635176f636659c9b17d41f" ></div>\n", + " <div class="folium-map" id="map_a9443ee0114295fd854372f4ac10e294" ></div>\n", " \n", " \n", - " <div class="folium-map" id="map_9d026b33eff87a9ac902ac8a21b95353" ></div>\n", + " <div class="folium-map" id="map_4369f9cb03221c96a10bd803b52aa5db" ></div>\n", " \n", "</body>\n", "<script>\n", " \n", " \n", - " var map_fd34321beb635176f636659c9b17d41f = L.map(\n", - " "map_fd34321beb635176f636659c9b17d41f",\n", + " var map_a9443ee0114295fd854372f4ac10e294 = L.map(\n", + " "map_a9443ee0114295fd854372f4ac10e294",\n", " {\n", " center: [32.97, -108.15],\n", " crs: L.CRS.EPSG3857,\n", @@ -9767,7 +9767,7 @@ "\n", " \n", " \n", - " var tile_layer_1a2a30f78a032cbca80e6c5e8a7109c2 = L.tileLayer(\n", + " var tile_layer_3c26a1bbf58e4284dfbf31ef60afa15b = L.tileLayer(\n", " "https://tile.openstreetmap.org/{z}/{x}/{y}.png",\n", " {\n", " "minZoom": 0,\n", @@ -9784,10 +9784,10 @@ " );\n", " \n", " \n", - " tile_layer_1a2a30f78a032cbca80e6c5e8a7109c2.addTo(map_fd34321beb635176f636659c9b17d41f);\n", + " tile_layer_3c26a1bbf58e4284dfbf31ef60afa15b.addTo(map_a9443ee0114295fd854372f4ac10e294);\n", " \n", " \n", - " var tile_layer_ef7552c4f353e83d5bf52c243f3ae084 = L.tileLayer(\n", + " var tile_layer_db6a6694dca435db807ce6ca82c35eea = L.tileLayer(\n", " "https://dev.openveda.cloud/api/raster/collections/sentinel-2-all-vars-daily/items/sentinel-2-2025-06-09/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=colorIR",\n", " {\n", " "minZoom": 0,\n", @@ -9804,11 +9804,11 @@ " );\n", " \n", " \n", - " tile_layer_ef7552c4f353e83d5bf52c243f3ae084.addTo(map_fd34321beb635176f636659c9b17d41f);\n", + " tile_layer_db6a6694dca435db807ce6ca82c35eea.addTo(map_a9443ee0114295fd854372f4ac10e294);\n", " \n", " \n", - " var map_9d026b33eff87a9ac902ac8a21b95353 = L.map(\n", - " "map_9d026b33eff87a9ac902ac8a21b95353",\n", + " var map_4369f9cb03221c96a10bd803b52aa5db = L.map(\n", + " "map_4369f9cb03221c96a10bd803b52aa5db",\n", " {\n", " center: [32.97, -108.15],\n", " crs: L.CRS.EPSG3857,\n", @@ -9825,7 +9825,7 @@ "\n", " \n", " \n", - " var tile_layer_1e731382fae93a770ac0d8a6fa8306f1 = L.tileLayer(\n", + " var tile_layer_f5a7e27313dc52368c24cfe945c88e26 = L.tileLayer(\n", " "https://tile.openstreetmap.org/{z}/{x}/{y}.png",\n", " {\n", " "minZoom": 0,\n", @@ -9842,10 +9842,10 @@ " );\n", " \n", " \n", - " tile_layer_1e731382fae93a770ac0d8a6fa8306f1.addTo(map_9d026b33eff87a9ac902ac8a21b95353);\n", + " tile_layer_f5a7e27313dc52368c24cfe945c88e26.addTo(map_4369f9cb03221c96a10bd803b52aa5db);\n", " \n", " \n", - " var tile_layer_b8e4e6feb25ac95ffca15971fcc36f25 = L.tileLayer(\n", + " var tile_layer_d4de486b8ff640396729fdeb6f47a395 = L.tileLayer(\n", " "https://dev.openveda.cloud/api/raster/collections/sentinel-2-all-vars-daily/items/sentinel-2-2025-06-29/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=colorIR",\n", " {\n", " "minZoom": 0,\n", @@ -9862,20 +9862,20 @@ " );\n", " \n", " \n", - " tile_layer_b8e4e6feb25ac95ffca15971fcc36f25.addTo(map_9d026b33eff87a9ac902ac8a21b95353);\n", + " tile_layer_d4de486b8ff640396729fdeb6f47a395.addTo(map_4369f9cb03221c96a10bd803b52aa5db);\n", " \n", " \n", - " map_fd34321beb635176f636659c9b17d41f.sync(map_9d026b33eff87a9ac902ac8a21b95353);\n", - " map_9d026b33eff87a9ac902ac8a21b95353.sync(map_fd34321beb635176f636659c9b17d41f);\n", + " map_a9443ee0114295fd854372f4ac10e294.sync(map_4369f9cb03221c96a10bd803b52aa5db);\n", + " map_4369f9cb03221c96a10bd803b52aa5db.sync(map_a9443ee0114295fd854372f4ac10e294);\n", " \n", "</script>\n", "</html>\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen>" ], "text/plain": [ - "" + "" ] }, - "execution_count": 20, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -9954,7 +9954,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 14, "id": "a092616d-b2ed-447a-8e0b-d2e284062f4b", "metadata": {}, "outputs": [ @@ -11220,7 +11220,7 @@ "" ] }, - "execution_count": 21, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -11236,7 +11236,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 15, "id": "0ddc9fa1-f259-4132-ba8b-b558245ab245", "metadata": {}, "outputs": [ @@ -11261,7 +11261,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 16, "id": "6427feb8-d688-424f-98de-dc153f490d0d", "metadata": {}, "outputs": [ @@ -12704,7 +12704,7 @@ "" ] }, - "execution_count": 23, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -12718,7 +12718,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 17, "id": "30c1bc97-865a-4b37-9399-7af090df6296", "metadata": {}, "outputs": [], @@ -12730,7 +12730,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 18, "id": "63823181-3c00-4961-bd7c-5b426f83f163", "metadata": {}, "outputs": [], @@ -12756,7 +12756,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 19, "id": "251dd290-78e1-4835-9df3-39dad69be341", "metadata": {}, "outputs": [], @@ -12775,7 +12775,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 20, "id": "bd057b3b-177c-4157-a332-6adf6c54627e", "metadata": {}, "outputs": [ @@ -12798,7 +12798,7 @@ " 'valid_percent': 99.24179101642272}}]" ] }, - "execution_count": 27, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -12817,7 +12817,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 21, "id": "b768dac6-f095-430d-99c5-583781439c4a", "metadata": {}, "outputs": [ @@ -12841,7 +12841,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 22, "id": "8856722f-e9e5-43f0-a8ab-d0263994ccf5", "metadata": {}, "outputs": [], @@ -12854,7 +12854,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 23, "id": "8ec78018-ddd5-4b47-b574-0c3cbd7ff526", "metadata": {}, "outputs": [ @@ -12874,7 +12874,7 @@ " 'center': [-108.12659906928377, 32.95762424115675, 0]}" ] }, - "execution_count": 30, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -12904,7 +12904,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 24, "id": "548d82a3-7a13-4031-a530-9e3e0b9c56d7", "metadata": {}, "outputs": [ @@ -12912,7 +12912,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/jq/m05tkv2d1llbn0w9wc6cltyr0000gn/T/ipykernel_90434/1287173695.py:37: MatplotlibDeprecationWarning: The get_cmap function was deprecated in Matplotlib 3.7 and will be removed in 3.11. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap()`` or ``pyplot.get_cmap()`` instead.\n", + "/tmp/ipykernel_218/1287173695.py:37: MatplotlibDeprecationWarning: The get_cmap function was deprecated in Matplotlib 3.7 and will be removed in 3.11. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap()`` or ``pyplot.get_cmap()`` instead.\n", " mpl_colormap = mpl_cm.get_cmap(color_map.lower())\n" ] }, @@ -12938,7 +12938,7 @@ " <meta name="viewport" content="width=device-width,\n", " initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />\n", " <style>\n", - " #map_51197e1d17e4a0c1c6f940f532017316 {\n", + " #map_d3085cbbeab647bb172403cf3ac4258d {\n", " position: relative;\n", " width: 100.0%;\n", " height: 100.0%;\n", @@ -12998,14 +12998,14 @@ "<svg height="40" width="450"><line x1="0" y1="15" x2="0" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="1" y1="15" x2="1" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="2" y1="15" x2="2" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="3" y1="15" x2="3" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="4" y1="15" x2="4" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="5" y1="15" x2="5" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="6" y1="15" x2="6" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="7" y1="15" x2="7" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="8" y1="15" x2="8" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="9" y1="15" x2="9" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="10" y1="15" x2="10" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="11" y1="15" x2="11" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="12" y1="15" x2="12" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="13" y1="15" x2="13" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="14" y1="15" x2="14" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="15" y1="15" x2="15" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="16" y1="15" x2="16" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="17" y1="15" x2="17" y2="27" style="stroke:#02010cff;stroke-width:2;" /><line x1="18" y1="15" x2="18" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="19" y1="15" x2="19" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="20" y1="15" x2="20" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="21" y1="15" x2="21" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="22" y1="15" x2="22" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="23" y1="15" x2="23" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="24" y1="15" x2="24" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="25" y1="15" x2="25" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="26" y1="15" x2="26" y2="27" style="stroke:#050417ff;stroke-width:2;" /><line x1="27" y1="15" x2="27" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="28" y1="15" x2="28" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="29" y1="15" x2="29" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="30" y1="15" x2="30" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="31" y1="15" x2="31" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="32" y1="15" x2="32" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="33" y1="15" x2="33" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="34" y1="15" x2="34" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="35" y1="15" x2="35" y2="27" style="stroke:#0a0623ff;stroke-width:2;" /><line x1="36" y1="15" x2="36" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="37" y1="15" x2="37" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="38" y1="15" x2="38" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="39" y1="15" x2="39" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="40" y1="15" x2="40" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="41" y1="15" x2="41" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="42" y1="15" x2="42" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="43" y1="15" x2="43" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="44" y1="15" x2="44" y2="27" style="stroke:#10092fff;stroke-width:2;" /><line x1="45" y1="15" x2="45" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="46" y1="15" x2="46" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="47" y1="15" x2="47" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="48" y1="15" x2="48" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="49" y1="15" x2="49" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="50" y1="15" x2="50" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="51" y1="15" x2="51" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="52" y1="15" x2="52" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="53" y1="15" x2="53" y2="27" style="stroke:#170b3cff;stroke-width:2;" /><line x1="54" y1="15" x2="54" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="55" y1="15" x2="55" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="56" y1="15" x2="56" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="57" y1="15" x2="57" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="58" y1="15" x2="58" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="59" y1="15" x2="59" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="60" y1="15" x2="60" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="61" y1="15" x2="61" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="62" y1="15" x2="62" y2="27" style="stroke:#1f0c48ff;stroke-width:2;" /><line x1="63" y1="15" x2="63" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="64" y1="15" x2="64" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="65" y1="15" x2="65" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="66" y1="15" x2="66" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="67" y1="15" x2="67" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="68" y1="15" x2="68" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="69" y1="15" x2="69" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="70" y1="15" x2="70" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="71" y1="15" x2="71" y2="27" style="stroke:#280b54ff;stroke-width:2;" /><line x1="72" y1="15" x2="72" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="73" y1="15" x2="73" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="74" y1="15" x2="74" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="75" y1="15" x2="75" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="76" y1="15" x2="76" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="77" y1="15" x2="77" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="78" y1="15" x2="78" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="79" y1="15" x2="79" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="80" y1="15" x2="80" y2="27" style="stroke:#31095dff;stroke-width:2;" /><line x1="81" y1="15" x2="81" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="82" y1="15" x2="82" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="83" y1="15" x2="83" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="84" y1="15" x2="84" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="85" y1="15" x2="85" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="86" y1="15" x2="86" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="87" y1="15" x2="87" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="88" y1="15" x2="88" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="89" y1="15" x2="89" y2="27" style="stroke:#3a0964ff;stroke-width:2;" /><line x1="90" y1="15" x2="90" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="91" y1="15" x2="91" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="92" y1="15" x2="92" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="93" y1="15" x2="93" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="94" y1="15" x2="94" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="95" y1="15" x2="95" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="96" y1="15" x2="96" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="97" y1="15" x2="97" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="98" y1="15" x2="98" y2="27" style="stroke:#430a68ff;stroke-width:2;" /><line x1="99" y1="15" x2="99" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="100" y1="15" x2="100" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="101" y1="15" x2="101" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="102" y1="15" x2="102" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="103" y1="15" x2="103" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="104" y1="15" x2="104" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="105" y1="15" x2="105" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="106" y1="15" x2="106" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="107" y1="15" x2="107" y2="27" style="stroke:#4c0c6bff;stroke-width:2;" /><line x1="108" y1="15" x2="108" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="109" y1="15" x2="109" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="110" y1="15" x2="110" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="111" y1="15" x2="111" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="112" y1="15" x2="112" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="113" y1="15" x2="113" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="114" y1="15" x2="114" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="115" y1="15" x2="115" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="116" y1="15" x2="116" y2="27" style="stroke:#540f6dff;stroke-width:2;" /><line x1="117" y1="15" x2="117" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="118" y1="15" x2="118" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="119" y1="15" x2="119" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="120" y1="15" x2="120" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="121" y1="15" x2="121" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="122" y1="15" x2="122" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="123" y1="15" x2="123" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="124" y1="15" x2="124" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="125" y1="15" x2="125" y2="27" style="stroke:#5d126eff;stroke-width:2;" /><line x1="126" y1="15" x2="126" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="127" y1="15" x2="127" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="128" y1="15" x2="128" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="129" y1="15" x2="129" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="130" y1="15" x2="130" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="131" y1="15" x2="131" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="132" y1="15" x2="132" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="133" y1="15" x2="133" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="134" y1="15" x2="134" y2="27" style="stroke:#65156eff;stroke-width:2;" /><line x1="135" y1="15" x2="135" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="136" y1="15" x2="136" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="137" y1="15" x2="137" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="138" y1="15" x2="138" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="139" y1="15" x2="139" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="140" y1="15" x2="140" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="141" y1="15" x2="141" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="142" y1="15" x2="142" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="143" y1="15" x2="143" y2="27" style="stroke:#6d186eff;stroke-width:2;" /><line x1="144" y1="15" x2="144" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="145" y1="15" x2="145" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="146" y1="15" x2="146" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="147" y1="15" x2="147" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="148" y1="15" x2="148" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="149" y1="15" x2="149" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="150" y1="15" x2="150" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="151" y1="15" x2="151" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="152" y1="15" x2="152" y2="27" style="stroke:#761b6dff;stroke-width:2;" /><line x1="153" y1="15" x2="153" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="154" y1="15" x2="154" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="155" y1="15" x2="155" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="156" y1="15" x2="156" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="157" y1="15" x2="157" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="158" y1="15" x2="158" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="159" y1="15" x2="159" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="160" y1="15" x2="160" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="161" y1="15" x2="161" y2="27" style="stroke:#7e1e6cff;stroke-width:2;" /><line x1="162" y1="15" x2="162" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="163" y1="15" x2="163" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="164" y1="15" x2="164" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="165" y1="15" x2="165" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="166" y1="15" x2="166" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="167" y1="15" x2="167" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="168" y1="15" x2="168" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="169" y1="15" x2="169" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="170" y1="15" x2="170" y2="27" style="stroke:#86216bff;stroke-width:2;" /><line x1="171" y1="15" x2="171" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="172" y1="15" x2="172" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="173" y1="15" x2="173" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="174" y1="15" x2="174" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="175" y1="15" x2="175" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="176" y1="15" x2="176" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="177" y1="15" x2="177" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="178" y1="15" x2="178" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="179" y1="15" x2="179" y2="27" style="stroke:#8f2469ff;stroke-width:2;" /><line x1="180" y1="15" x2="180" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="181" y1="15" x2="181" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="182" y1="15" x2="182" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="183" y1="15" x2="183" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="184" y1="15" x2="184" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="185" y1="15" x2="185" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="186" y1="15" x2="186" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="187" y1="15" x2="187" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="188" y1="15" x2="188" y2="27" style="stroke:#972766ff;stroke-width:2;" /><line x1="189" y1="15" x2="189" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="190" y1="15" x2="190" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="191" y1="15" x2="191" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="192" y1="15" x2="192" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="193" y1="15" x2="193" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="194" y1="15" x2="194" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="195" y1="15" x2="195" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="196" y1="15" x2="196" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="197" y1="15" x2="197" y2="27" style="stroke:#9f2a63ff;stroke-width:2;" /><line x1="198" y1="15" x2="198" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="199" y1="15" x2="199" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="200" y1="15" x2="200" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="201" y1="15" x2="201" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="202" y1="15" x2="202" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="203" y1="15" x2="203" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="204" y1="15" x2="204" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="205" y1="15" x2="205" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="206" y1="15" x2="206" y2="27" style="stroke:#a72d5fff;stroke-width:2;" /><line x1="207" y1="15" x2="207" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="208" y1="15" x2="208" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="209" y1="15" x2="209" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="210" y1="15" x2="210" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="211" y1="15" x2="211" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="212" y1="15" x2="212" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="213" y1="15" x2="213" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="214" y1="15" x2="214" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="215" y1="15" x2="215" y2="27" style="stroke:#af305bff;stroke-width:2;" /><line x1="216" y1="15" x2="216" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="217" y1="15" x2="217" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="218" y1="15" x2="218" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="219" y1="15" x2="219" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="220" y1="15" x2="220" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="221" y1="15" x2="221" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="222" y1="15" x2="222" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="223" y1="15" x2="223" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="224" y1="15" x2="224" y2="27" style="stroke:#b73457ff;stroke-width:2;" /><line x1="225" y1="15" x2="225" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="226" y1="15" x2="226" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="227" y1="15" x2="227" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="228" y1="15" x2="228" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="229" y1="15" x2="229" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="230" y1="15" x2="230" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="231" y1="15" x2="231" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="232" y1="15" x2="232" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="233" y1="15" x2="233" y2="27" style="stroke:#bf3952ff;stroke-width:2;" /><line x1="234" y1="15" x2="234" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="235" y1="15" x2="235" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="236" y1="15" x2="236" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="237" y1="15" x2="237" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="238" y1="15" x2="238" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="239" y1="15" x2="239" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="240" y1="15" x2="240" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="241" y1="15" x2="241" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="242" y1="15" x2="242" y2="27" style="stroke:#c63d4dff;stroke-width:2;" /><line x1="243" y1="15" x2="243" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="244" y1="15" x2="244" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="245" y1="15" x2="245" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="246" y1="15" x2="246" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="247" y1="15" x2="247" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="248" y1="15" x2="248" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="249" y1="15" x2="249" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="250" y1="15" x2="250" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="251" y1="15" x2="251" y2="27" style="stroke:#cd4247ff;stroke-width:2;" /><line x1="252" y1="15" x2="252" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="253" y1="15" x2="253" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="254" y1="15" x2="254" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="255" y1="15" x2="255" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="256" y1="15" x2="256" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="257" y1="15" x2="257" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="258" y1="15" x2="258" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="259" y1="15" x2="259" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="260" y1="15" x2="260" y2="27" style="stroke:#d44842ff;stroke-width:2;" /><line x1="261" y1="15" x2="261" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="262" y1="15" x2="262" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="263" y1="15" x2="263" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="264" y1="15" x2="264" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="265" y1="15" x2="265" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="266" y1="15" x2="266" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="267" y1="15" x2="267" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="268" y1="15" x2="268" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="269" y1="15" x2="269" y2="27" style="stroke:#db4e3cff;stroke-width:2;" /><line x1="270" y1="15" x2="270" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="271" y1="15" x2="271" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="272" y1="15" x2="272" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="273" y1="15" x2="273" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="274" y1="15" x2="274" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="275" y1="15" x2="275" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="276" y1="15" x2="276" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="277" y1="15" x2="277" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="278" y1="15" x2="278" y2="27" style="stroke:#e05536ff;stroke-width:2;" /><line x1="279" y1="15" x2="279" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="280" y1="15" x2="280" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="281" y1="15" x2="281" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="282" y1="15" x2="282" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="283" y1="15" x2="283" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="284" y1="15" x2="284" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="285" y1="15" x2="285" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="286" y1="15" x2="286" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="287" y1="15" x2="287" y2="27" style="stroke:#e65c2fff;stroke-width:2;" /><line x1="288" y1="15" x2="288" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="289" y1="15" x2="289" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="290" y1="15" x2="290" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="291" y1="15" x2="291" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="292" y1="15" x2="292" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="293" y1="15" x2="293" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="294" y1="15" x2="294" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="295" y1="15" x2="295" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="296" y1="15" x2="296" y2="27" style="stroke:#eb6329ff;stroke-width:2;" /><line x1="297" y1="15" x2="297" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="298" y1="15" x2="298" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="299" y1="15" x2="299" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="300" y1="15" x2="300" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="301" y1="15" x2="301" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="302" y1="15" x2="302" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="303" y1="15" x2="303" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="304" y1="15" x2="304" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="305" y1="15" x2="305" y2="27" style="stroke:#ef6c23ff;stroke-width:2;" /><line x1="306" y1="15" x2="306" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="307" y1="15" x2="307" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="308" y1="15" x2="308" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="309" y1="15" x2="309" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="310" y1="15" x2="310" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="311" y1="15" x2="311" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="312" y1="15" x2="312" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="313" y1="15" x2="313" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="314" y1="15" x2="314" y2="27" style="stroke:#f3741cff;stroke-width:2;" /><line x1="315" y1="15" x2="315" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="316" y1="15" x2="316" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="317" y1="15" x2="317" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="318" y1="15" x2="318" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="319" y1="15" x2="319" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="320" y1="15" x2="320" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="321" y1="15" x2="321" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="322" y1="15" x2="322" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="323" y1="15" x2="323" y2="27" style="stroke:#f67d15ff;stroke-width:2;" /><line x1="324" y1="15" x2="324" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="325" y1="15" x2="325" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="326" y1="15" x2="326" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="327" y1="15" x2="327" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="328" y1="15" x2="328" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="329" y1="15" x2="329" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="330" y1="15" x2="330" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="331" y1="15" x2="331" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="332" y1="15" x2="332" y2="27" style="stroke:#f8860eff;stroke-width:2;" /><line x1="333" y1="15" x2="333" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="334" y1="15" x2="334" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="335" y1="15" x2="335" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="336" y1="15" x2="336" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="337" y1="15" x2="337" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="338" y1="15" x2="338" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="339" y1="15" x2="339" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="340" y1="15" x2="340" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="341" y1="15" x2="341" y2="27" style="stroke:#fa8f08ff;stroke-width:2;" /><line x1="342" y1="15" x2="342" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="343" y1="15" x2="343" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="344" y1="15" x2="344" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="345" y1="15" x2="345" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="346" y1="15" x2="346" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="347" y1="15" x2="347" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="348" y1="15" x2="348" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="349" y1="15" x2="349" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="350" y1="15" x2="350" y2="27" style="stroke:#fc9906ff;stroke-width:2;" /><line x1="351" y1="15" x2="351" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="352" y1="15" x2="352" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="353" y1="15" x2="353" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="354" y1="15" x2="354" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="355" y1="15" x2="355" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="356" y1="15" x2="356" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="357" y1="15" x2="357" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="358" y1="15" x2="358" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="359" y1="15" x2="359" y2="27" style="stroke:#fca308ff;stroke-width:2;" /><line x1="360" y1="15" x2="360" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="361" y1="15" x2="361" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="362" y1="15" x2="362" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="363" y1="15" x2="363" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="364" y1="15" x2="364" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="365" y1="15" x2="365" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="366" y1="15" x2="366" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="367" y1="15" x2="367" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="368" y1="15" x2="368" y2="27" style="stroke:#fcad11ff;stroke-width:2;" /><line x1="369" y1="15" x2="369" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="370" y1="15" x2="370" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="371" y1="15" x2="371" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="372" y1="15" x2="372" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="373" y1="15" x2="373" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="374" y1="15" x2="374" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="375" y1="15" x2="375" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="376" y1="15" x2="376" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="377" y1="15" x2="377" y2="27" style="stroke:#fcb71bff;stroke-width:2;" /><line x1="378" y1="15" x2="378" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="379" y1="15" x2="379" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="380" y1="15" x2="380" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="381" y1="15" x2="381" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="382" y1="15" x2="382" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="383" y1="15" x2="383" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="384" y1="15" x2="384" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="385" y1="15" x2="385" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="386" y1="15" x2="386" y2="27" style="stroke:#fbc127ff;stroke-width:2;" /><line x1="387" y1="15" x2="387" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="388" y1="15" x2="388" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="389" y1="15" x2="389" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="390" y1="15" x2="390" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="391" y1="15" x2="391" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="392" y1="15" x2="392" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="393" y1="15" x2="393" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="394" y1="15" x2="394" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="395" y1="15" x2="395" y2="27" style="stroke:#f9cb34ff;stroke-width:2;" /><line x1="396" y1="15" x2="396" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="397" y1="15" x2="397" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="398" y1="15" x2="398" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="399" y1="15" x2="399" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="400" y1="15" x2="400" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="401" y1="15" x2="401" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="402" y1="15" x2="402" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="403" y1="15" x2="403" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="404" y1="15" x2="404" y2="27" style="stroke:#f7d642ff;stroke-width:2;" /><line x1="405" y1="15" x2="405" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="406" y1="15" x2="406" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="407" y1="15" x2="407" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="408" y1="15" x2="408" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="409" y1="15" x2="409" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="410" y1="15" x2="410" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="411" y1="15" x2="411" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="412" y1="15" x2="412" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="413" y1="15" x2="413" y2="27" style="stroke:#f4e053ff;stroke-width:2;" /><line x1="414" y1="15" x2="414" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="415" y1="15" x2="415" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="416" y1="15" x2="416" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="417" y1="15" x2="417" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="418" y1="15" x2="418" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="419" y1="15" x2="419" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="420" y1="15" x2="420" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="421" y1="15" x2="421" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="422" y1="15" x2="422" y2="27" style="stroke:#f2e966ff;stroke-width:2;" /><line x1="423" y1="15" x2="423" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="424" y1="15" x2="424" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="425" y1="15" x2="425" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="426" y1="15" x2="426" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="427" y1="15" x2="427" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="428" y1="15" x2="428" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="429" y1="15" x2="429" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="430" y1="15" x2="430" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="431" y1="15" x2="431" y2="27" style="stroke:#f2f27cff;stroke-width:2;" /><line x1="432" y1="15" x2="432" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="433" y1="15" x2="433" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="434" y1="15" x2="434" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="435" y1="15" x2="435" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="436" y1="15" x2="436" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="437" y1="15" x2="437" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="438" y1="15" x2="438" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="439" y1="15" x2="439" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="440" y1="15" x2="440" y2="27" style="stroke:#f6f991ff;stroke-width:2;" /><line x1="441" y1="15" x2="441" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><line x1="442" y1="15" x2="442" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><line x1="443" y1="15" x2="443" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><line x1="444" y1="15" x2="444" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><line x1="445" y1="15" x2="445" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><line x1="446" y1="15" x2="446" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><line x1="447" y1="15" x2="447" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><line x1="448" y1="15" x2="448" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><line x1="449" y1="15" x2="449" y2="27" style="stroke:#fdffa5ff;stroke-width:2;" /><text x="0" y="38" style="text-anchor:start; font-size:11px; font:Arial; fill:black">-0.1365383543458513</text><text x="75" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">0.0</text><text x="150" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">0.2</text><text x="225" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">0.4</text><text x="300" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">0.6</text><text x="375" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">0.8</text><text x="450" y="38" style="text-anchor:end; font-size:11px; font:Arial; fill:black">0.9816958355058069</text><text x="0" y="12" style="font-size:11px; font:Arial; fill:black">dNBR</text></svg>\n", "</div>\n", " \n", - " <div class="folium-map" id="map_51197e1d17e4a0c1c6f940f532017316" ></div>\n", + " <div class="folium-map" id="map_d3085cbbeab647bb172403cf3ac4258d" ></div>\n", " \n", "</body>\n", "<script>\n", " \n", " \n", - " var map_51197e1d17e4a0c1c6f940f532017316 = L.map(\n", - " "map_51197e1d17e4a0c1c6f940f532017316",\n", + " var map_d3085cbbeab647bb172403cf3ac4258d = L.map(\n", + " "map_d3085cbbeab647bb172403cf3ac4258d",\n", " {\n", " center: [32.97, -108.15],\n", " crs: L.CRS.EPSG3857,\n", @@ -13022,7 +13022,7 @@ "\n", " \n", " \n", - " var tile_layer_bed7bf2d9e81da43ed5456839b60447f = L.tileLayer(\n", + " var tile_layer_27ae18128bb8f96d120cc1a9279c8387 = L.tileLayer(\n", " "https://tile.openstreetmap.org/{z}/{x}/{y}.png",\n", " {\n", " "minZoom": 0,\n", @@ -13039,10 +13039,10 @@ " );\n", " \n", " \n", - " tile_layer_bed7bf2d9e81da43ed5456839b60447f.addTo(map_51197e1d17e4a0c1c6f940f532017316);\n", + " tile_layer_27ae18128bb8f96d120cc1a9279c8387.addTo(map_d3085cbbeab647bb172403cf3ac4258d);\n", " \n", " \n", - " var tile_layer_fa0c50e4eb4239b6f356151bf25f6177 = L.tileLayer(\n", + " var tile_layer_52dc5eb0409be93238b9813439424b05 = L.tileLayer(\n", " "https://dev.openveda.cloud/api/raster/collections/opera-all-vars-subdaily/items/opera-2025-06-21T18:05:00/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=dnbr\\u0026color_formula=gamma+r+1.05\\u0026colormap_name=inferno\\u0026rescale=-0.1365383543458513%2C0.9816958355058067",\n", " {\n", " "minZoom": 0,\n", @@ -13059,16 +13059,16 @@ " );\n", " \n", " \n", - " tile_layer_fa0c50e4eb4239b6f356151bf25f6177.addTo(map_51197e1d17e4a0c1c6f940f532017316);\n", + " tile_layer_52dc5eb0409be93238b9813439424b05.addTo(map_d3085cbbeab647bb172403cf3ac4258d);\n", " \n", "</script>\n", "</html>\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen>" ], "text/plain": [ - "" + "" ] }, - "execution_count": 31, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -13165,7 +13165,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 25, "id": "7f7a4740-01a8-411e-93b1-0762859d0ea8", "metadata": {}, "outputs": [ @@ -16095,7 +16095,7 @@ "" ] }, - "execution_count": 32, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -16111,7 +16111,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 26, "id": "493401d9-ed94-47a0-b4e3-a0f64859b0e0", "metadata": {}, "outputs": [ @@ -16136,7 +16136,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 27, "id": "32be823a-e3d9-4025-82d2-fba4675e30b2", "metadata": {}, "outputs": [ @@ -17579,7 +17579,7 @@ "" ] }, - "execution_count": 34, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -17593,7 +17593,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 28, "id": "0d893308-a7b1-48fe-a273-a56d73da74d5", "metadata": {}, "outputs": [], @@ -17613,7 +17613,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 29, "id": "41dcbd5b-94d6-4103-81cb-72c4f537f8d4", "metadata": {}, "outputs": [], @@ -17631,7 +17631,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 30, "id": "a46e907a-5c3e-45f4-a400-12478378c38f", "metadata": {}, "outputs": [], @@ -17641,7 +17641,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 31, "id": "fdefb63a-3272-4b09-b1e9-ddee62f18954", "metadata": {}, "outputs": [ @@ -17664,7 +17664,7 @@ " 'valid_percent': 5.792476624015748}}]" ] }, - "execution_count": 38, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -17683,7 +17683,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 32, "id": "e1fffb4c-076b-441c-a00e-a32483a5be09", "metadata": {}, "outputs": [ @@ -17707,7 +17707,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 33, "id": "fd5be007-1576-4824-8046-166ba1b5baad", "metadata": {}, "outputs": [], @@ -17728,7 +17728,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 34, "id": "00a9db9f-46b0-48ac-afb9-c460ca0634b4", "metadata": {}, "outputs": [ @@ -17748,7 +17748,7 @@ " 'center': [-107.9896895719003, 32.469441118100555, 0]}" ] }, - "execution_count": 41, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -17768,7 +17768,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 35, "id": "42a38e9e-4b9c-4b9b-aa3d-75b008e68c68", "metadata": {}, "outputs": [], @@ -17782,7 +17782,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 36, "id": "0e3accd2-4fdb-4fb0-812c-9eb8b3acbb2e", "metadata": {}, "outputs": [ @@ -17802,7 +17802,7 @@ " 'center': [-107.9896895719003, 32.469441118100555, 0]}" ] }, - "execution_count": 43, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -17827,7 +17827,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 37, "id": "6707b871-2e7c-453c-b7a3-419d8b51107d", "metadata": {}, "outputs": [ @@ -17835,7 +17835,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/jq/m05tkv2d1llbn0w9wc6cltyr0000gn/T/ipykernel_90434/3402120942.py:36: MatplotlibDeprecationWarning: The get_cmap function was deprecated in Matplotlib 3.7 and will be removed in 3.11. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap()`` or ``pyplot.get_cmap()`` instead.\n", + "/tmp/ipykernel_218/2684050226.py:36: MatplotlibDeprecationWarning: The get_cmap function was deprecated in Matplotlib 3.7 and will be removed in 3.11. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap()`` or ``pyplot.get_cmap()`` instead.\n", " mpl_colormap = mpl_cm.get_cmap(color_map.lower())\n" ] }, @@ -17861,7 +17861,7 @@ " <meta name="viewport" content="width=device-width,\n", " initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />\n", " <style>\n", - " #map_59f8c3faf112e82c2b8bf5f8725586e7 {\n", + " #map_f900e662354a1f61c74acdad4ca22449 {\n", " position: relative;\n", " width: 100.0%;\n", " height: 100.0%;\n", @@ -17921,14 +17921,14 @@ "<svg height="40" width="450"><line x1="0" y1="15" x2="0" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="1" y1="15" x2="1" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="2" y1="15" x2="2" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="3" y1="15" x2="3" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="4" y1="15" x2="4" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="5" y1="15" x2="5" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="6" y1="15" x2="6" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="7" y1="15" x2="7" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="8" y1="15" x2="8" y2="27" style="stroke:#000003ff;stroke-width:2;" /><line x1="9" y1="15" x2="9" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="10" y1="15" x2="10" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="11" y1="15" x2="11" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="12" y1="15" x2="12" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="13" y1="15" x2="13" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="14" y1="15" x2="14" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="15" y1="15" x2="15" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="16" y1="15" x2="16" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="17" y1="15" x2="17" y2="27" style="stroke:#02010bff;stroke-width:2;" /><line x1="18" y1="15" x2="18" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="19" y1="15" x2="19" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="20" y1="15" x2="20" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="21" y1="15" x2="21" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="22" y1="15" x2="22" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="23" y1="15" x2="23" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="24" y1="15" x2="24" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="25" y1="15" x2="25" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="26" y1="15" x2="26" y2="27" style="stroke:#050416ff;stroke-width:2;" /><line x1="27" y1="15" x2="27" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="28" y1="15" x2="28" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="29" y1="15" x2="29" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="30" y1="15" x2="30" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="31" y1="15" x2="31" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="32" y1="15" x2="32" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="33" y1="15" x2="33" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="34" y1="15" x2="34" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="35" y1="15" x2="35" y2="27" style="stroke:#090721ff;stroke-width:2;" /><line x1="36" y1="15" x2="36" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="37" y1="15" x2="37" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="38" y1="15" x2="38" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="39" y1="15" x2="39" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="40" y1="15" x2="40" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="41" y1="15" x2="41" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="42" y1="15" x2="42" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="43" y1="15" x2="43" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="44" y1="15" x2="44" y2="27" style="stroke:#0f0b2cff;stroke-width:2;" /><line x1="45" y1="15" x2="45" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="46" y1="15" x2="46" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="47" y1="15" x2="47" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="48" y1="15" x2="48" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="49" y1="15" x2="49" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="50" y1="15" x2="50" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="51" y1="15" x2="51" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="52" y1="15" x2="52" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="53" y1="15" x2="53" y2="27" style="stroke:#150e38ff;stroke-width:2;" /><line x1="54" y1="15" x2="54" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="55" y1="15" x2="55" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="56" y1="15" x2="56" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="57" y1="15" x2="57" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="58" y1="15" x2="58" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="59" y1="15" x2="59" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="60" y1="15" x2="60" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="61" y1="15" x2="61" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="62" y1="15" x2="62" y2="27" style="stroke:#1b1044ff;stroke-width:2;" /><line x1="63" y1="15" x2="63" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="64" y1="15" x2="64" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="65" y1="15" x2="65" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="66" y1="15" x2="66" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="67" y1="15" x2="67" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="68" y1="15" x2="68" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="69" y1="15" x2="69" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="70" y1="15" x2="70" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="71" y1="15" x2="71" y2="27" style="stroke:#231151ff;stroke-width:2;" /><line x1="72" y1="15" x2="72" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="73" y1="15" x2="73" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="74" y1="15" x2="74" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="75" y1="15" x2="75" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="76" y1="15" x2="76" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="77" y1="15" x2="77" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="78" y1="15" x2="78" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="79" y1="15" x2="79" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="80" y1="15" x2="80" y2="27" style="stroke:#2b115eff;stroke-width:2;" /><line x1="81" y1="15" x2="81" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="82" y1="15" x2="82" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="83" y1="15" x2="83" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="84" y1="15" x2="84" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="85" y1="15" x2="85" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="86" y1="15" x2="86" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="87" y1="15" x2="87" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="88" y1="15" x2="88" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="89" y1="15" x2="89" y2="27" style="stroke:#341069ff;stroke-width:2;" /><line x1="90" y1="15" x2="90" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="91" y1="15" x2="91" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="92" y1="15" x2="92" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="93" y1="15" x2="93" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="94" y1="15" x2="94" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="95" y1="15" x2="95" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="96" y1="15" x2="96" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="97" y1="15" x2="97" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="98" y1="15" x2="98" y2="27" style="stroke:#3d0f71ff;stroke-width:2;" /><line x1="99" y1="15" x2="99" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="100" y1="15" x2="100" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="101" y1="15" x2="101" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="102" y1="15" x2="102" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="103" y1="15" x2="103" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="104" y1="15" x2="104" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="105" y1="15" x2="105" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="106" y1="15" x2="106" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="107" y1="15" x2="107" y2="27" style="stroke:#460f77ff;stroke-width:2;" /><line x1="108" y1="15" x2="108" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="109" y1="15" x2="109" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="110" y1="15" x2="110" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="111" y1="15" x2="111" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="112" y1="15" x2="112" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="113" y1="15" x2="113" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="114" y1="15" x2="114" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="115" y1="15" x2="115" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="116" y1="15" x2="116" y2="27" style="stroke:#4e117bff;stroke-width:2;" /><line x1="117" y1="15" x2="117" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="118" y1="15" x2="118" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="119" y1="15" x2="119" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="120" y1="15" x2="120" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="121" y1="15" x2="121" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="122" y1="15" x2="122" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="123" y1="15" x2="123" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="124" y1="15" x2="124" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="125" y1="15" x2="125" y2="27" style="stroke:#56147dff;stroke-width:2;" /><line x1="126" y1="15" x2="126" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="127" y1="15" x2="127" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="128" y1="15" x2="128" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="129" y1="15" x2="129" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="130" y1="15" x2="130" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="131" y1="15" x2="131" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="132" y1="15" x2="132" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="133" y1="15" x2="133" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="134" y1="15" x2="134" y2="27" style="stroke:#5f177fff;stroke-width:2;" /><line x1="135" y1="15" x2="135" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="136" y1="15" x2="136" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="137" y1="15" x2="137" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="138" y1="15" x2="138" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="139" y1="15" x2="139" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="140" y1="15" x2="140" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="141" y1="15" x2="141" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="142" y1="15" x2="142" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="143" y1="15" x2="143" y2="27" style="stroke:#671b80ff;stroke-width:2;" /><line x1="144" y1="15" x2="144" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="145" y1="15" x2="145" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="146" y1="15" x2="146" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="147" y1="15" x2="147" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="148" y1="15" x2="148" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="149" y1="15" x2="149" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="150" y1="15" x2="150" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="151" y1="15" x2="151" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="152" y1="15" x2="152" y2="27" style="stroke:#6f1e81ff;stroke-width:2;" /><line x1="153" y1="15" x2="153" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="154" y1="15" x2="154" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="155" y1="15" x2="155" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="156" y1="15" x2="156" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="157" y1="15" x2="157" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="158" y1="15" x2="158" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="159" y1="15" x2="159" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="160" y1="15" x2="160" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="161" y1="15" x2="161" y2="27" style="stroke:#772181ff;stroke-width:2;" /><line x1="162" y1="15" x2="162" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="163" y1="15" x2="163" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="164" y1="15" x2="164" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="165" y1="15" x2="165" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="166" y1="15" x2="166" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="167" y1="15" x2="167" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="168" y1="15" x2="168" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="169" y1="15" x2="169" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="170" y1="15" x2="170" y2="27" style="stroke:#7f2482ff;stroke-width:2;" /><line x1="171" y1="15" x2="171" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="172" y1="15" x2="172" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="173" y1="15" x2="173" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="174" y1="15" x2="174" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="175" y1="15" x2="175" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="176" y1="15" x2="176" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="177" y1="15" x2="177" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="178" y1="15" x2="178" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="179" y1="15" x2="179" y2="27" style="stroke:#872781ff;stroke-width:2;" /><line x1="180" y1="15" x2="180" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="181" y1="15" x2="181" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="182" y1="15" x2="182" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="183" y1="15" x2="183" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="184" y1="15" x2="184" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="185" y1="15" x2="185" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="186" y1="15" x2="186" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="187" y1="15" x2="187" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="188" y1="15" x2="188" y2="27" style="stroke:#902a81ff;stroke-width:2;" /><line x1="189" y1="15" x2="189" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="190" y1="15" x2="190" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="191" y1="15" x2="191" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="192" y1="15" x2="192" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="193" y1="15" x2="193" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="194" y1="15" x2="194" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="195" y1="15" x2="195" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="196" y1="15" x2="196" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="197" y1="15" x2="197" y2="27" style="stroke:#982d80ff;stroke-width:2;" /><line x1="198" y1="15" x2="198" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="199" y1="15" x2="199" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="200" y1="15" x2="200" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="201" y1="15" x2="201" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="202" y1="15" x2="202" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="203" y1="15" x2="203" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="204" y1="15" x2="204" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="205" y1="15" x2="205" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="206" y1="15" x2="206" y2="27" style="stroke:#a12f7eff;stroke-width:2;" /><line x1="207" y1="15" x2="207" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="208" y1="15" x2="208" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="209" y1="15" x2="209" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="210" y1="15" x2="210" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="211" y1="15" x2="211" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="212" y1="15" x2="212" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="213" y1="15" x2="213" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="214" y1="15" x2="214" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="215" y1="15" x2="215" y2="27" style="stroke:#a9327dff;stroke-width:2;" /><line x1="216" y1="15" x2="216" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="217" y1="15" x2="217" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="218" y1="15" x2="218" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="219" y1="15" x2="219" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="220" y1="15" x2="220" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="221" y1="15" x2="221" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="222" y1="15" x2="222" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="223" y1="15" x2="223" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="224" y1="15" x2="224" y2="27" style="stroke:#b2357bff;stroke-width:2;" /><line x1="225" y1="15" x2="225" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="226" y1="15" x2="226" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="227" y1="15" x2="227" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="228" y1="15" x2="228" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="229" y1="15" x2="229" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="230" y1="15" x2="230" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="231" y1="15" x2="231" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="232" y1="15" x2="232" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="233" y1="15" x2="233" y2="27" style="stroke:#ba3878ff;stroke-width:2;" /><line x1="234" y1="15" x2="234" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="235" y1="15" x2="235" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="236" y1="15" x2="236" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="237" y1="15" x2="237" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="238" y1="15" x2="238" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="239" y1="15" x2="239" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="240" y1="15" x2="240" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="241" y1="15" x2="241" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="242" y1="15" x2="242" y2="27" style="stroke:#c33b75ff;stroke-width:2;" /><line x1="243" y1="15" x2="243" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="244" y1="15" x2="244" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="245" y1="15" x2="245" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="246" y1="15" x2="246" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="247" y1="15" x2="247" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="248" y1="15" x2="248" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="249" y1="15" x2="249" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="250" y1="15" x2="250" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="251" y1="15" x2="251" y2="27" style="stroke:#cb3e72ff;stroke-width:2;" /><line x1="252" y1="15" x2="252" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="253" y1="15" x2="253" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="254" y1="15" x2="254" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="255" y1="15" x2="255" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="256" y1="15" x2="256" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="257" y1="15" x2="257" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="258" y1="15" x2="258" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="259" y1="15" x2="259" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="260" y1="15" x2="260" y2="27" style="stroke:#d3426eff;stroke-width:2;" /><line x1="261" y1="15" x2="261" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="262" y1="15" x2="262" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="263" y1="15" x2="263" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="264" y1="15" x2="264" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="265" y1="15" x2="265" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="266" y1="15" x2="266" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="267" y1="15" x2="267" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="268" y1="15" x2="268" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="269" y1="15" x2="269" y2="27" style="stroke:#db476aff;stroke-width:2;" /><line x1="270" y1="15" x2="270" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="271" y1="15" x2="271" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="272" y1="15" x2="272" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="273" y1="15" x2="273" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="274" y1="15" x2="274" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="275" y1="15" x2="275" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="276" y1="15" x2="276" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="277" y1="15" x2="277" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="278" y1="15" x2="278" y2="27" style="stroke:#e24d66ff;stroke-width:2;" /><line x1="279" y1="15" x2="279" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="280" y1="15" x2="280" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="281" y1="15" x2="281" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="282" y1="15" x2="282" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="283" y1="15" x2="283" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="284" y1="15" x2="284" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="285" y1="15" x2="285" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="286" y1="15" x2="286" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="287" y1="15" x2="287" y2="27" style="stroke:#e95362ff;stroke-width:2;" /><line x1="288" y1="15" x2="288" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="289" y1="15" x2="289" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="290" y1="15" x2="290" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="291" y1="15" x2="291" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="292" y1="15" x2="292" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="293" y1="15" x2="293" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="294" y1="15" x2="294" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="295" y1="15" x2="295" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="296" y1="15" x2="296" y2="27" style="stroke:#ee5b5fff;stroke-width:2;" /><line x1="297" y1="15" x2="297" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="298" y1="15" x2="298" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="299" y1="15" x2="299" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="300" y1="15" x2="300" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="301" y1="15" x2="301" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="302" y1="15" x2="302" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="303" y1="15" x2="303" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="304" y1="15" x2="304" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="305" y1="15" x2="305" y2="27" style="stroke:#f3635cff;stroke-width:2;" /><line x1="306" y1="15" x2="306" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="307" y1="15" x2="307" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="308" y1="15" x2="308" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="309" y1="15" x2="309" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="310" y1="15" x2="310" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="311" y1="15" x2="311" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="312" y1="15" x2="312" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="313" y1="15" x2="313" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="314" y1="15" x2="314" y2="27" style="stroke:#f66c5cff;stroke-width:2;" /><line x1="315" y1="15" x2="315" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="316" y1="15" x2="316" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="317" y1="15" x2="317" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="318" y1="15" x2="318" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="319" y1="15" x2="319" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="320" y1="15" x2="320" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="321" y1="15" x2="321" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="322" y1="15" x2="322" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="323" y1="15" x2="323" y2="27" style="stroke:#f9765cff;stroke-width:2;" /><line x1="324" y1="15" x2="324" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="325" y1="15" x2="325" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="326" y1="15" x2="326" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="327" y1="15" x2="327" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="328" y1="15" x2="328" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="329" y1="15" x2="329" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="330" y1="15" x2="330" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="331" y1="15" x2="331" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="332" y1="15" x2="332" y2="27" style="stroke:#fb805eff;stroke-width:2;" /><line x1="333" y1="15" x2="333" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="334" y1="15" x2="334" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="335" y1="15" x2="335" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="336" y1="15" x2="336" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="337" y1="15" x2="337" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="338" y1="15" x2="338" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="339" y1="15" x2="339" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="340" y1="15" x2="340" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="341" y1="15" x2="341" y2="27" style="stroke:#fc8a62ff;stroke-width:2;" /><line x1="342" y1="15" x2="342" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="343" y1="15" x2="343" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="344" y1="15" x2="344" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="345" y1="15" x2="345" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="346" y1="15" x2="346" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="347" y1="15" x2="347" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="348" y1="15" x2="348" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="349" y1="15" x2="349" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="350" y1="15" x2="350" y2="27" style="stroke:#fd9466ff;stroke-width:2;" /><line x1="351" y1="15" x2="351" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="352" y1="15" x2="352" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="353" y1="15" x2="353" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="354" y1="15" x2="354" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="355" y1="15" x2="355" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="356" y1="15" x2="356" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="357" y1="15" x2="357" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="358" y1="15" x2="358" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="359" y1="15" x2="359" y2="27" style="stroke:#fe9d6cff;stroke-width:2;" /><line x1="360" y1="15" x2="360" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="361" y1="15" x2="361" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="362" y1="15" x2="362" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="363" y1="15" x2="363" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="364" y1="15" x2="364" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="365" y1="15" x2="365" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="366" y1="15" x2="366" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="367" y1="15" x2="367" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="368" y1="15" x2="368" y2="27" style="stroke:#ffa772ff;stroke-width:2;" /><line x1="369" y1="15" x2="369" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="370" y1="15" x2="370" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="371" y1="15" x2="371" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="372" y1="15" x2="372" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="373" y1="15" x2="373" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="374" y1="15" x2="374" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="375" y1="15" x2="375" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="376" y1="15" x2="376" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="377" y1="15" x2="377" y2="27" style="stroke:#ffb179ff;stroke-width:2;" /><line x1="378" y1="15" x2="378" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="379" y1="15" x2="379" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="380" y1="15" x2="380" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="381" y1="15" x2="381" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="382" y1="15" x2="382" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="383" y1="15" x2="383" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="384" y1="15" x2="384" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="385" y1="15" x2="385" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="386" y1="15" x2="386" y2="27" style="stroke:#ffba80ff;stroke-width:2;" /><line x1="387" y1="15" x2="387" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="388" y1="15" x2="388" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="389" y1="15" x2="389" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="390" y1="15" x2="390" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="391" y1="15" x2="391" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="392" y1="15" x2="392" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="393" y1="15" x2="393" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="394" y1="15" x2="394" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="395" y1="15" x2="395" y2="27" style="stroke:#ffc488ff;stroke-width:2;" /><line x1="396" y1="15" x2="396" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="397" y1="15" x2="397" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="398" y1="15" x2="398" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="399" y1="15" x2="399" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="400" y1="15" x2="400" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="401" y1="15" x2="401" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="402" y1="15" x2="402" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="403" y1="15" x2="403" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="404" y1="15" x2="404" y2="27" style="stroke:#fece90ff;stroke-width:2;" /><line x1="405" y1="15" x2="405" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="406" y1="15" x2="406" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="407" y1="15" x2="407" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="408" y1="15" x2="408" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="409" y1="15" x2="409" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="410" y1="15" x2="410" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="411" y1="15" x2="411" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="412" y1="15" x2="412" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="413" y1="15" x2="413" y2="27" style="stroke:#fed799ff;stroke-width:2;" /><line x1="414" y1="15" x2="414" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="415" y1="15" x2="415" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="416" y1="15" x2="416" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="417" y1="15" x2="417" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="418" y1="15" x2="418" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="419" y1="15" x2="419" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="420" y1="15" x2="420" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="421" y1="15" x2="421" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="422" y1="15" x2="422" y2="27" style="stroke:#fee1a2ff;stroke-width:2;" /><line x1="423" y1="15" x2="423" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="424" y1="15" x2="424" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="425" y1="15" x2="425" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="426" y1="15" x2="426" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="427" y1="15" x2="427" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="428" y1="15" x2="428" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="429" y1="15" x2="429" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="430" y1="15" x2="430" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="431" y1="15" x2="431" y2="27" style="stroke:#fdeaacff;stroke-width:2;" /><line x1="432" y1="15" x2="432" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="433" y1="15" x2="433" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="434" y1="15" x2="434" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="435" y1="15" x2="435" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="436" y1="15" x2="436" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="437" y1="15" x2="437" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="438" y1="15" x2="438" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="439" y1="15" x2="439" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="440" y1="15" x2="440" y2="27" style="stroke:#fdf4b5ff;stroke-width:2;" /><line x1="441" y1="15" x2="441" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><line x1="442" y1="15" x2="442" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><line x1="443" y1="15" x2="443" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><line x1="444" y1="15" x2="444" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><line x1="445" y1="15" x2="445" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><line x1="446" y1="15" x2="446" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><line x1="447" y1="15" x2="447" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><line x1="448" y1="15" x2="448" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><line x1="449" y1="15" x2="449" y2="27" style="stroke:#fcfdbfff;stroke-width:2;" /><text x="0" y="38" style="text-anchor:start; font-size:11px; font:Arial; fill:black">10.0</text><text x="75" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">25.0</text><text x="150" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">40.0</text><text x="225" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">55.0</text><text x="300" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">70.0</text><text x="375" y="38"; style="text-anchor:middle; font-size:11px; font:Arial; fill:black">85.0</text><text x="450" y="38" style="text-anchor:end; font-size:11px; font:Arial; fill:black">100.0</text><text x="0" y="12" style="font-size:11px; font:Arial; fill:black">Vegetation Loss (%)</text></svg>\n", "</div>\n", " \n", - " <div class="folium-map" id="map_59f8c3faf112e82c2b8bf5f8725586e7" ></div>\n", + " <div class="folium-map" id="map_f900e662354a1f61c74acdad4ca22449" ></div>\n", " \n", "</body>\n", "<script>\n", " \n", " \n", - " var map_59f8c3faf112e82c2b8bf5f8725586e7 = L.map(\n", - " "map_59f8c3faf112e82c2b8bf5f8725586e7",\n", + " var map_f900e662354a1f61c74acdad4ca22449 = L.map(\n", + " "map_f900e662354a1f61c74acdad4ca22449",\n", " {\n", " center: [32.97, -108.15],\n", " crs: L.CRS.EPSG3857,\n", @@ -17945,7 +17945,7 @@ "\n", " \n", " \n", - " var tile_layer_b87491b71628e3eeae72ab7de759f62d = L.tileLayer(\n", + " var tile_layer_9d26282261d262d03cbd291caffe9415 = L.tileLayer(\n", " "https://tile.openstreetmap.org/{z}/{x}/{y}.png",\n", " {\n", " "minZoom": 0,\n", @@ -17962,10 +17962,10 @@ " );\n", " \n", " \n", - " tile_layer_b87491b71628e3eeae72ab7de759f62d.addTo(map_59f8c3faf112e82c2b8bf5f8725586e7);\n", + " tile_layer_9d26282261d262d03cbd291caffe9415.addTo(map_f900e662354a1f61c74acdad4ca22449);\n", " \n", " \n", - " var tile_layer_0a63039fb44facced1c97ab468a1fc51 = L.tileLayer(\n", + " var tile_layer_ba4cdf5f80ffd25ff18b6491c048d9ca = L.tileLayer(\n", " "https://dev.openveda.cloud/api/raster/collections/opera-all-vars-daily/items/opera-2025-06-24/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=VEG-ANOM-MAX\\u0026color_formula=gamma+r+1.05\\u0026colormap_name=magma\\u0026rescale=10%2C100",\n", " {\n", " "minZoom": 0,\n", @@ -17982,16 +17982,16 @@ " );\n", " \n", " \n", - " tile_layer_0a63039fb44facced1c97ab468a1fc51.addTo(map_59f8c3faf112e82c2b8bf5f8725586e7);\n", + " tile_layer_ba4cdf5f80ffd25ff18b6491c048d9ca.addTo(map_f900e662354a1f61c74acdad4ca22449);\n", " \n", "</script>\n", "</html>\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen>" ], "text/plain": [ - "" + "" ] }, - "execution_count": 44, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -18092,7 +18092,7 @@ ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -18106,7 +18106,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.2" + "version": "3.12.11" } }, "nbformat": 4, diff --git a/user_data_notebooks/Texas_Flood_2025.ipynb b/user_data_notebooks/Texas_Flood_2025.ipynb old mode 100644 new mode 100755 index 15b55ea..be5a265 --- a/user_data_notebooks/Texas_Flood_2025.ipynb +++ b/user_data_notebooks/Texas_Flood_2025.ipynb @@ -112168,7 +112168,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.11" + "version": "3.12.12" } }, "nbformat": 4, diff --git a/utility.qmd b/utility.qmd old mode 100644 new mode 100755 diff --git a/workflow.qmd b/workflow.qmd old mode 100644 new mode 100755