{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# BSRN Data Retrieval\n", "\n", "This tutorial covers how to browse the BSRN FTP inventory and download station-to-archive files." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Setup\n", "\n", "BSRN FTP requires credentials. Obtain them by emailing Amelie Driemel at amelie.Driemel@awi.de." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import os\n", "import bsrn\n", "\n", "# Replace with your BSRN FTP credentials\n", "BSRN_USER = os.environ.get(\"BSRN_USER\", \"your_username\")\n", "BSRN_PASS = os.environ.get(\"BSRN_PASS\", \"your_password\")\n", "username = BSRN_USER\n", "password = BSRN_PASS\n", "\n", "# §4 download target (absolute path)\n", "ARCHIVE_DATA_DIR = \"/Volumes/Macintosh Research/Data/bsrn-qc/data/QIQ\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Check file inventory\n", "\n", "Before downloading, you can check which files are available for specific stations. Here we check the inventory for ASP, PAY, QIQ, and TAT stations." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1/4] Fetching inventory for station ASP...\n", "[2/4] Fetching inventory for station PAY...\n", "[3/4] Fetching inventory for station QIQ...\n", "[4/4] Fetching inventory for station TAT...\n", "ASP: 301 files available\n", " First file: asp0100.dat.gz\n", " Last file: asp1299.dat.gz\n", "PAY: 399 files available\n", " First file: pay0100.dat.gz\n", " Last file: pay1299.dat.gz\n", "QIQ: 14 files available\n", " First file: qiq0124.dat.gz\n", " Last file: qiq1224.dat.gz\n", "TAT: 356 files available\n", " First file: tat0100.dat.gz\n", " Last file: tat1299.dat.gz\n" ] } ], "source": [ "stations = ['ASP', 'PAY', 'QIQ', 'TAT']\n", "inventory = bsrn.io.retrieval.get_bsrn_file_inventory(stations, username, password)\n", "\n", "for stn, files in inventory.items():\n", " print(f\"{stn}: {len(files)} files available\")\n", " if files:\n", " print(f\" First file: {files[0]}\")\n", " print(f\" Last file: {files[-1]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Visualize archive availability\n", "\n", "`plot_bsrn_availability` draws a heatmap of which monthly station-to-archive files exist on the BSRN FTP (years × months) for the stations you choose. It uses the same credentials as above and calls the inventory internally." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Searching BSRN FTP for stations: ASP, PAY, QIQ, TAT...\n", "[1/4] Fetching inventory for station ASP...\n", "[2/4] Fetching inventory for station PAY...\n", "[3/4] Fetching inventory for station QIQ...\n", "[4/4] Fetching inventory for station TAT...\n" ] }, { "data": { "image/png": "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/O1vf4uRI0dOtry2tjbmmWeemH/++WPFFVeMgQMHxlprrTXN/dTX18fRRx8dv/jFL2Leeeed6vXBgwfHSSedFBMmTJhseZcuXWKdddaJ4447brLll1xySdx+++1RV1fXuKxHjx7x61//OpZccsmZeMcAAAAAUGjLun333Teuvvrq2GabbRqX7brrrrH//vvHtttum0O7+++/P0444YT4zW9+M1l41tRTTz0V//vf/+Luu+9u9vX+/fvH73//+9h0000bl80111xx8cUXTxXUJQcffHCceeaZUVNTk9dLz6+66ipBHQAAAABzbliXpEBu/fXXb3y+3377xS677JLvzz///MaA7a677oo77rij2X3ceuut+T69nlrZNSe10vvBD34QK6+8cn4+ceLE6Np12g0OF1lkkRzWpW122mmn3AoPAAAAAObosC7p3r17s8tTmHbooYdGt27d8vPUZXZKb731VvznP//Jwdo777yTW9lNSwrcUvg299xz57AutbablmuvvTa+/OUvx0YbbdSm9wQAAAAAHTKsa0lqEdenT5/8+P3332+2VV3qMrv22mvn57fddluL+1t88cVzq73kvvvuiyeffHKqdV588cV47LHH4oADDqjSuwAAAACAOSCsSz777LN836tXr6mWP/DAA7HjjjvGzjvvnJellnWphV1Ltt9++1hjjTXy49/+9rcxatSoxtfGjx+fu98edthhMd98882CdwMAAABAZ9dhw7p///vfjS3qvvSlL032WhrHbt11141FF100zxa77LLL5jHr0kyuLUldZr/3ve/lGWc//PDDuPzyyxtfu+aaa2L55ZePAQMGzKJ3BAAAAEBnV9vRWtGlFm7//Oc/44wzzsgB3Oqrrx677bZb43ppzLk0oUSajKIiTQSR3HPPPTF69OgWj9O7d+8862wl9Bs8eHCeUXbQoEF59lcAAAAAmFWmPe1pYX73u9/FRx99lFu8pZAutZbbc889Y6uttppsRtYU5KXAbYUVVmhctvnmm8dVV10Vw4cPz6Fb6u7akjTW3aOPPhpPP/10/OY3v8kTXRxyyCHRs2fPWfoeAQAAAOjcOkxYl2ZrbRrKTcstt9wSX/va1yZblsK2bbbZJq6//vrcFXZ6YV1yxBFHxHe/+93c1Xa99dYz+ysAAAAAs1yHCeta4+WXX85dVq+44op8ayp1j01j0r355pvxzDPPxJprrtnivtJ4d8stt1w8//zz0bdv31lccgAAAACYw8K61KoujTdXGaNuSqeccko89thjcdttt003rAMAAACA2a3DTDAxPcOGDYt//etfMXDgwBbHokvSeu+9995sLB0AAAAAdKKwLo1Fl8aVm2+++aa5zlprrZW7t9bV1eX1AQAAAKAkRYd1Y8aMaXw8evToaa732Wefxd/+9rfYbLPNWtxfbW1tbLDBBvnxXXfdlWeHbc3xx44dO4MlBwAAAIA5KKxLrd8efvjhxucPPPBAs+uNGzcuLrzwwhgxYsR0w7f6+vrG4C2Ff+edd16MGjWq2XXfeuuteOONN/LjZ599NgeCAAAAANDpwrorr7wy9txzz7j33nsbl1100UWxzz775BZxFe+8807svffe8eCDD+bnv/zlL/MEE821hPvoo4/yuk23f/zxx/M+Bw0aNNnYdwceeGAcccQROQhMhgwZEvvtt18cffTRs+w9AwAAAECRs8Huu++++TY9Sy65ZFx33XWt2ufCCy8cV1999XTX69WrV1x22WWt2icAAAAAzPEt6wAAAACgMxLWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABSia1s3vOaaa+KRRx6JpZdeOg4++OBYeOGFq1syAAAAAOhkWgzr1l577YaVunaNgQMHxumnn56f77nnnnHddddFfX19fn7hhRfGE088Eb17954dZQYAAACAztcN9plnnol55pknrr322sag7sorr8zPu3XrFuedd148++yzscMOO8Rxxx03u8oMAAAAAJ2vZV1NTU38+c9/jmWWWSY/Hz9+fPzsZz/Ly0888cQ44ogj8vIU2vXv33/2lBgAAAAAOmPLuqWWWqoxqEsuu+yyePPNN2PZZZeNH/7wh43LUzfZ9957b9aWFAAAAAA6c1jXq1ev+OCDD/LjdJ9a06VWdSeccELuBlvx8MMPxyeffDLrSwsAAAAAnbUb7GGHHZYnlth+++3jhhtuyIHdhhtuGN/61rca13n11VfjgAMOmB1lBQAAAIDOG9Z9+9vfjnHjxsX5558fH374Yey0005x8cUXN75+6KGHxk033RSjRo2Keeedd3aUFwAAAAA6ZzfY5Mgjj4yXX345hg8fHjfffHMsvvjija+l4O7999+PESNG5BsAAAAAMAvDutY66aSTqrUrAAAAAOiUqhLWpZZ3p59+ejV2BQAAAACdVotj1iV//OMf45prrok33ngjRo8eHfX19ZO9Pn78+Hjvvfeirq5uVpYTAAAAADp3WHfCCSfEySefPFVA15yamppqlgsAAAAAOp0Ww7oLLrgg3++3335x4IEHxhJLLBFdu069yb/+9a/4xje+MetKCQAAAACdPaxLwdwiiywSV1xxRYs76dOnT6y++urVLhsAAAAAdCotTjBx6KGH5jHpWtMNdtCgQdUsFwAAAAB0Oi2GdT/72c9iww03zJNMTM8Xv/jFapYLAAAAADqdFrvBPvzww3HUUUfFqaeeGj169IiFF154qnUmTJiQ13v33XdnZTkBAAAAoHOHdQcccEAMGTIkP77//vtnV5kAAAAAoFNqMaw79thj46CDDoqll146lllmmejWrVvU1NRMts6YMWPixRdfjOHDh8/qsgIAAABA5w3r9ttvv7jkkkvi0UcfbXEnH3/8cSy77LLVLhsAAAAAdCotTjDRpUuX+PnPf57HpWvJQgstFOeee261ywYAAAAAnUqLLeuSrbbaKt+PHz8+HnvssXjjjTdi/vnnj9VWWy369u3buN6BBx44a0sKAAAAAJ09rEvOOeecOO200+LDDz+cbPmAAQPyTLEDBw6cVeUDAAAAgE6jxW6wlXHrfvjDH8bQoUOjvr4+5p133lhyySWjd+/e8a9//Su3vDv55JNnT2kBAAAAoLOGdVdeeWVcddVVscIKK8QFF1wQr7/+eowYMSLefPPNePfdd2PkyJHx17/+NS699NL4xz/+MftKDQAAAACdrRvsRRddFLvvvnsO7Lp16zbV6927d4+dd945zwT7k5/8pHF8OwAAAACgymHdyy+/HHfddVezQV1Ta665Zrz11lttODwAAAAA0KpusEsssUT06NEjpidNPPH2229Pdz0AAAAAoI1hXZpI4qmnnmpplTyG3d577x1f+MIXWlwPAAAAAJiJsO7II4+MnXbaKU80MXz48MblY8eOjWeffTaPU7fSSivlySUOP/zw6RwKAAAAAGjzmHXbbrttHHroofGtb30ramtrY4EFFoiampoYNmxY4zr19fX59f3226/FAwEAAAAAM9GyLjn++OPjzjvvjLXXXjuHdB9//HEO6NItdZNNM8Zefvnl09sNAAAAADAzLesqtt5663x79dVX44UXXohRo0bF8ssvnwO81OIOAAAAAJhNYV3Fcsstl2/N+eCDD6J3795VKBIdRvctI7qu2N6lgI6t24DPH6tTMPPUKagudQqqS52C6uqybMyJaupTf9YqWHzxxeO9996rxq4AAAAAoPO2rLv77rvjlltuiQMPPDD69+/f+GKaBXZ6xo8fH/fdd18MHTp01pYUAAAAAOZwuWXdQgstFJ9++mlssMEG8fDDDze+uNJKK8XLL7883Z2kxnlpltiJEyfO4uJSknMPvySGPPt6excDOrSNdl0vdj965/xYnYKZp07BLKxTv7ojhrz8QXsXCTq0jb60Uuy+14b5cd2nJ0RMeKm9iwQdW9eVonaBk2KObFn3/e9/P6677ro47LDDJnvx0EMPjWOOOSYGDhwYiy22WHTr1m2qHYwbNy4ee+yxGDJkyOwrNUVIfwC98IiTC8yMfqt/PsaCOgUzT52CWVinXv4gXnjurXYtD3R0/ZZvMs57CurGP9WexQFKDuuOP/74fJvS/vvvH4888kjccMMNLe4kzQ675JJLzrpSAgAAAEAnUNvSi7169YqjjjpqujuZd9554+qrr65muQAAAACg02kxrLvoooti4403nu5Ozj///Nhuu+2qWS4AAAAA6HRaDOvOOuusVu1kjz32iFNOOaVaZQIAAACATqnFsK61RowYEZdffnk1dgUAAAAAnXuCiYoHH3wwjj766Bg6dGh+/vbbb8dyyy3X4g7GjBkTH3zwgQkmAAAAAKCaYd2mm24agwYNiiOPPDIuu+yyqKmpiddee226O+ndu3ce3w4AAAAAqFJYV5nZ9ZJLLomllloqrrzyyhzeTUsK8+aZZ55YdNFFZ6IIAAAAAECzYV3FiSeeGMOGDYs+ffr4pAAAAACgvSeYOPfcc6e7g+uvvz7+/Oc/V7NMAAAAANApTbNlXWt95StfyZNLjBo1Kg444IDqlAoAAAAAOqEWw7oJEybESSedFHfccUd8+umnUVdXN9nr6fknn3wSw4cPj5/85CfCOgAAAACYVWHdySefHKecckqrdrT55pvPTDkAAAAAoNNrccy6NBbdjjvuGPfdd1/873//i1122SWefPLJGDJkSL69+uqr8fWvfz1uvfXWuPbaa2dfqQEAAACgs7Ws++CDD+KZZ56JueeeOz8/5JBD4oEHHogjjzyycZ1TTz01Nt5443j88cfNHAsAAAAAs6pl3bLLLtsY1CXbbrtt3H777TF+/PjGZSussEJe5/DDD5+ZcgAAAABAp9diWNe7d+8488wz4/XXX49x48ZFTU1N7vb6ox/9qHGdwYMHxzvvvBP333//7CgvAAAAAHTOsC7N8JqCueWWWy7f0uyvBx54YDz44IMxYMCAHNxtsskmeXnfvn1nX6kBAAAAoLOFdVtssUVcddVVscYaa8RGG20UtbW10aVLl7j++uvj008/jRtvvDFGjhwZPXr0iHPOOWf2lRoAAAAAOtsEE8lee+2Vb03169cvnnvuubj77rtzq7oNN9wwFllkkVlZTgAAAADo3C3rLrroomm+1r1799hhhx1ip512ij/96U85tAMAAAAAZlFYd9ZZZ7VqJ3vssUeccsopM1EMAAAAAKDFsK61RowYEZdffnk1dgUAAAAAndZkY9alWV6PPvroGDp0aH7+9ttv51lgWzJmzJj44IMPYskll5y1JQUAAACAzhTWbbrppjFo0KA48sgj47LLLouampp47bXXpruT3r17tzi+HQAAAADQhtlg55133rjkkktiqaWWiiuvvDKHd9OSwrx55pknFl100VYcCgAAAACYobCu4sQTT4xhw4ZFnz59WtwBAAAAADCLw7rk3HPPnWrZyJEj45Zbbok333wz+vbtGzvttFNuXQcAAAAAVCms++1vf5u7tU7p8MMPb3ycusTuueeejRNQJKm77A033BDrrbfeTBYFAAAAADq3xrBu/vnnj/322y9qa2vja1/7Wg7lBgwY0LjiCy+8EDvuuGOMHj06P19++eVjzTXXjMceeyy23XbbGDx4cCyzzDLt8y4AAAAAYE4K69LEEnPNNVfcdNNNOXyb0sEHH5yDutT67jvf+U6cc845OdgbNWpUfPWrX43TTjstLrjggtldfgAAAACY88K6W2+9NU8q0VxQd/XVV8c///nPHNRttNFGcd5550XTkC+FdFtuueXsKzUAAAAAzIFqKw8eeeSROOKII6ZaYezYsfHTn/40P05h3fnnnz/VOsstt1yMGzduVpcVAAAAADpHWFdXVxc9evSYaoWzzz473njjjRzU7bPPPnmcuuZ079591pYUAAAAADpLWJfGnqtMHlExZMiQOPnkk/PjeeaZJ0455ZRmd/Lqq69Gr169ZnVZAQAAAKBzhHUbb7xxHH/88Y0vjBkzJs8Im0K81KoudYVdcsklm93JL3/5y9hqq61mT4kBAAAAYE6fYOInP/lJbLjhhvHMM8/EWmutlSec+O9//5tfGzBgQPzoRz9qdgdnnXVWXHLJJfH3v/999pUaAAAAAObksG7ttdfOs74ecMABcc899zSukAK8m2++Obp06RJNJ6N46KGH8vrPPfdcXva///3PjLAAAAAAUI2wLvn6178em222Wdxyyy3x8ccfR//+/WPrrbfO3WCbevPNN6NPnz5x7LHHzsyxAQAAAIBphXVJ796946CDDoqW7LHHHi2+DgAAAADMxAQTAAAAAED7EtYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUomt0MO+88078/e9/j2eeeSbGjx8fo0ePjrnnnjvWXHPN2GabbaJv376Trf/yyy/HqaeeGh9++OFky+eaa65Yd91148c//vFUxxg3blzcfffd8c9//jOGDh0aEyZMiIkTJ8Zyyy0Xm222WWy66aZRU1Mzy98rAAAAAJ1Lhwnr6uvr45prrom//vWvsdNOO8WJJ54YvXr1yq+9++67cd1118X3v//92GWXXWK//faL2tqGRoMrrLBCXH755TF48OD42c9+lpf1798/jjvuuOjevftUx3n++efjnHPOiYUXXjj233//WHnllfPysWPHxr333hsXXnhh3HzzzfF///d/0bt379n6GQAAAAAwZ6vtKEHdmWeeGddee20ccsghOYyrBHXJEkssEUceeWR84xvfyGHer371q6irq5tsHymgW2CBBfLj9dZbr9mgLrWkO/7442PxxRePk08+uTGoS9L62223XZx22mm5dd+PfvSjePvtt2fp+wYAAACgc+kQYV0K6R544IFYZ511Yuutt57mervvvnvuqvrwww/nlnZTqgR0zQV1b775Zpx99tm5RV4K/rp169bsMVI32xQKfvzxxzm4Sy3uAAAAAKBThHVpzLhK8Lbzzju3uG4K2nbcccf8OG2Ttm2tSy+9NI9/t8EGG8Siiy7a4rrbbrttHvPujTfeiFtvvbXVxwAAAACADh3WpTAsTfCQwrE11lhjuuun1ndp8oe0zW233daqY7z++uvx9NNP58cDBgyY7vqpZd5qq62WH6fx66bscgsAAAAAc2RY9+STT+b7Pn36RJcuXaa7fhrLbskll5xs2+n517/+1fi4X79+rdqmEtZ9+umn8corr7RqGwAAAADosGFdah331ltv5cdNJ5SYnspEEmkcuokTJ053/ddee63x8UILLTRDx5hyewAAAACYI8O6ESNG5Jlgk3nmmafV21WCtLTt8OHDp7t+03Vae5ymYV1rjgEAAAAAHTqsazoja2pl11ppfLumk07MiuM03SaNkQcAAAAAc3RY16NHj+jatWt+PGrUqFZvN3LkyMZALe1jehZccMGptp2epuWZkS66AAAAANAhw7qkb9+++b4ydl1rfPDBB/l++eWXb9WkFE0nlWjtcSrHSFZaaaVWlw0AAAAAOmxYt8EGG+T7oUOHxkcffTTd9UePHt0YuG2yySatPkalK+uLL77Yqm1efvnlxqCvMvssAAAAAMzRYd1WW20V8803X358//33T3f9Rx55JOrq6nLX1C233LJVx1h44YUbg70HHnigVYHgE088kR/vttturToGAAAAAHT4sC6Fbvvtt19+fNNNN8Vnn302zXXHjRsX119/fW4ld9hhh8W888472etjx45tXG9KBxxwQPTs2TPeeOON6YaCN954Y4wZMybWX3/9VrfeAwAAAIAOH9Yl2267bey+++7xySefxFlnnRXjx4+fap2JEyfG+eefH++++24O3jbccMPJXn/hhRfi008/zY9Tq7hKcNe0dd2JJ56YW/H97ne/i9dee63Zsjz22GPxl7/8JVZZZZX4wQ9+UNX3CQAAAEDn1jDVagew9957x1JLLRWXX355Dsm+8pWvxAorrBD19fV5/LhbbrklRowYEccee2xu8VaRXjvllFMmG+/u6aefzvtbZ5114sc//nHj8i984Qvx61//On7729/GMcccE7vssksMGDAgzyibJpRIXWRTq7sddtgh9t133zzbLAAAAAB0urAu2WKLLWKjjTaKO++8My644ILJurMeeOCBsd1228Vcc8012TYp0LviiitafYwUCJ566qkxePDgHAxed911ja+ttdZaceGFF8Ziiy1WpXcEAAAAAB2sG2xT3bt3zy3efv7zn+cx5ipeffXVqYK6mdG/f/847bTT8n3FK6+8EnPPPXfVjgEAAAAAHTqsq1h11VXjnHPOyffJoEGD4u67767qMdIEFWkcu2984xtRW1sbw4cPz91kJ0yYUNXjAAAAAECHDuuSRRddNHdZPeKII/KssWmsudRFtpq6dOkSe+21V5x99tmxxhpr5O6xp59+eowcObKqxwEAAACADjVmXXNSi7ett946Nt9883jooYfinnvuifvuuy+23377WHnllaN3795VOU6/fv3i5JNPjpdeeikH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9vfSSy/FHXfcEUcddVSzx7vlllvi0ksvjdra2ujVq1d069YtLx86dGhMnDgxFlhggZhnnnnyshEjRuTyJX/+859j3nnnnUWfAgAAAACdRdFh3ZgxY6J79+5x7LHHxlprrdW4/JprrskB2fLLLx9nnHFG4/L33nsvfvnLX8aoUaOmGcb985//jP333z8WXHDBZo+3yiqrxI9//OMc1lUcdNBB8cEHH8Q+++wTW2+9dV6WQsFHH300zjzzzBg9erSwDgAAAIA5uxtsCsFSC7mmQV1LFl988fj+97+ft5vSRx99FI888kiMHz8+/v73v0/zeN/97ncnC+qmpaamJjbaaKNcvuaOBwAAAABzVFiXArH1119/hrZZdtllY8kll5xq+W233Za7zSZ33nln7tY6paWXXjrfZkQqXyonAAAAAMzRYd1SSy0VK6+88gxvt9VWW032fOzYsfGPf/wjd2/t2rVrbmWXurBO6ctf/vIMH2vVVVfN5QQAAACAOTqsq5ZBgwbl8e1Sd9rUdbXS0g4AAAAAStIpwroUzO2666758S677JLv//3vf8err77aziUDAAAAgE4U1j399NN5TLnKJBVf+MIXGrvWal0HAAAAQEnm+LDu1ltvbWxVV7Hzzjvn+wceeCCGDx/eTiUDAAAAgE4U1r3zzju5q+tmm2022fINN9wwFl100Rg3blyeeAIAAAAAStA15mC33HJLTJgwIb73ve9N9VoK6pI77rgjt7zr0qVLO5QQAAAAADpBWDdy5Mh48MEH44ILLogFFlhgqtc/+eSTOOCAA2Lo0KHx+OOP59Z2AAAAANCe5thusHfddVess846zQZ1yYILLhgbbLBBfmyiCQAAAABKMEeGdRMnTozbb789tttuuxbX22abbfL9c889F6+99tpsKh0AAAAAzEFh3ZgxY/L92LFjm309zfKarLLKKi3uZ/XVV4+ePXvmxzfccMM01xs9enSLxwMAAACAThnWpbHonn766fz4rbfeyrem0vMrrrgi6uvrY/jw4S3ua9SoUVFbW9sY8N1zzz1TrfPss8/GiBEj8uMnn3wyxo8fX8V3AwAAAAAdNKz72c9+Fvvss0+8/vrrjTO6HnHEEXHggQfGsGHD4rrrrovvfOc7efKINHHEt771rbjoooua3dfNN9+cX//0008bl5177rmx11575UDu1Vdfjf333z+OO+64xtefeuqp+OY3vxlnn332bHi3AAAAAHQ2HWo22F/84hctvr777rvnW2vssssu+TYtyy23XG6hBwAAAACzS4dqWQcAAAAAczJhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABSia3sXgA6s60rtXQLo+Los+/ljdQqqWqdWXrB3uxYF5gR9evT6/InzFMw8v/2gurrOmfWopr6+vr69CwEAAAAA6AYLAAAAAMUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAABQCGEdAAAAABRCWAcAAAAAhRDWAQAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AAAAAFEJYBwAAAACFENYBAAAAQCGEdQAAAMAco66urr2LADNFWAcFn1jq6+vbtSwAMCXnKZg11CeYeWPHjs33tbW1Ajs6NGEdFGLcuHExZsyYePvtt2PUqFExfvz4qKmpae9iQYc3ceLE9i4CzBHSeSmdq9566618vqqcp9QxaJtUd9It1ask1SeBHbTdZ599Fj/4wQ/iT3/6U34usKMj69reBQAihg0bFueff34O6YYMGRJdu3aNpZZaKrbZZptYbrnlol+/fu1dROhwP9Zuu+22+MY3vhFdunTJfwyle6BtRowYEVdccUW8+eab8fLLL0ffvn1jiSWWiMMOOyzmn39+dQzaUKeuvfbaHH6n330rrbRS7LbbbjmwS+FCChmAGfPxxx/nOnX99dfH3HPPHV/5ylcaAzt1io5GWAcF/Fg78cQTY4sttoh11lknRo8eHTfeeGM8/vjj+Q+i9MfQnnvuGZtsskl7FxWKl1okpD90Hn300XxVNdWvgw8+WGAHM2H48OHx05/+NN54443GZa+++mq+pdbgJ598cvTs2bOx/gEtS+em4447Ll577bXGZU888USuawceeKBQAdognYMWWWSR6NOnT7z++uvx+9//PtelXXbZRWBHhySsg3b2r3/9K7dQ2HXXXRuXHXPMMXHvvffGgw8+GIMHD45f/epX8cknn8SOO+7YrmWF0lWCgqeeeirfp9Z1icAO2iZ1df3Nb36Tg7ovfOELsfHGG8c888wT//3vf+PFF1/MYcPVV18dBx10UG4dBLRswoQJcdlll+W6k+rUiiuumM9dt99+e9xyyy2x2Wab5eXAjEn1aN555829kxZeeOH8W/Dyyy/Prwns6Ij8qoJ29sorr+RusBWVMGHLLbfMV4YWXHDBuP/+++OSSy7Jr6WTDTBtTz75ZG61kOrK3//+9xzYpR9wKUwQ2MGMSa29X3jhhRwonHrqqdGtW7e8PLUGT12NzjrrrHj66adzACGsg+lL56Pnn38+96b4yU9+0lin1l133dzT4t13381hXdOWqlqtwvRVgrgU2PXv3z+fp84888ypAju/A+koxMrQztKPtA8++CDfknTyqPwoS38cpTG3ttpqq/xaOtncc8897VxiKFvqOp66Fx1wwAF5kOE0Zsmtt94al156aX69EtgB0/f+++/nMSDTuSidr1JLu6R79+6x/PLLx7777htDhw7NXc+B6YcJqb4khxxySK5T6XyUfvettdZa8a1vfSveeeedPIFLar366aef5sknKuPYAdNWaTGXgrp0MSm1Uk09Kyp/Q9188835saCOjsIlUGhniy66aL6Kmlou9O7de6qrPUsuuWR87Wtfy8tT19gLL7wwb7PGGmu0a7mhVAsttFBjC5/1118/jj766Pj1r3+dA7tECztovfnmmy8WX3zxWHrppfPzSiuginRRKQ3lkEI9YPphQuoxseqqq+a61fQibbLAAgvkgfGfeeaZ+M9//hPLLrtsLLPMMo0TuejCB9OXhmpIwzQkaQihVMcuuuiiyVrYpV4XaYihvffeu51LC9Pmv/bQztJMr+mKaRq/JF0FSieUKa+eppZC6WQzYMCA3KrhgQceiLFjxzb+uAM+l1rSNe2Ol+pNCuy0sIMZly4YpRZ0qbVPc3r16hVf+tKXcrCQqFPQsnQuSnUqtZqrqPzuSyFDqmsvvfRSfp4u5j788MPxs5/9LE8+kYI6v/2gZallXQrFK+ej7bbbLg499ND8OAV2Z5xxRh5eKAXjTSdOgtII66CdVH5srbLKKrHhhhvmMbZOO+203D2iMgBqU+mH3TbbbJNbN6QfbqnbrPFL4HMt/QEjsIMZl8ahq/yhk1qsTqvOpcG8K91jm7ZWTWPZpRkugQaV880OO+zQ2Fq1ab1J3cnT773UdS8N53DUUUflnhRpMoo//OEPuU767Qct//ZLF2w//vjjPDZkpd5tv/32eWiUSj1LQzmkOpZar+piTqmEdTAbpPFG0kkjNcn+3//+N9Xru+++ez5ZpJZ1ada9jz76aLLArnIiWnvttWOTTTaJUaNGxSOPPJKXOcHQGbVUp6YV2rUU2FVCCeismqtTlQAhnZ/S8AtTqoQGq622Wu6iV1GpT6mL0eOPP57/UHKuorNprk5VurA2NwTD22+/HSussEKetCUFC+mclWZfPuGEE2LgwIF5DDtdYOnMWvPbL51vUj1ZaaWV8vpN61v6+6mybuqhlPaVVCadgNIYsw5msdRtIQVwb775ZmM3ojQDWOo2tNFGG+XxfxZbbLH8QywNfJrGKbn44otzc+007XhlfJJ0n042X//613M32MoAxX640dm0pk5NSyWwq4xhl36wpRYMZrGkM2upTqWW32kcrWlJdSj9kZNmNU8zx6a6VKmDaZzVZ599Nnbbbbc8Jit0Fm05T6Uu56mValIZUzXdpzqVJqNIrexef/31PHwKdDatrVOVYC4NIfTkk0/m333JHXfckf++ShdsN9100/jHP/4RF1xwQQ7tdt55Z2MYUyR/ncAslLq2pibW6cdVam5dkU4e6WpOmlo8nUTS/eabbx4ffvhhDBo0KB577LHcpejwww/PrRnSH0MplEvL0sko/ZgT0tEZtbZOtTQId9PALg0wnKTALv2QSy2C0o826Cxmtk6l5WmcrTRYfnpc+YPp3HPPzUGdWSzpbNpap5p2b60EB5XJJ1IdS+FDql/pua6wdCZtqVOpwcO///3v/Phvf/tbY1D33e9+N/dSSq1Y06R9aczwFIin1qxQGmEdzCLpamgaXySdWFJT7NTVNZ1A0gnnr3/9awwZMiT+/ve/N17xSYN077rrrvlxGpPuqaeeyl0ffvjDHzZOQlH5I2iRRRbJ+0z8aKOzmJE6Nb0wO61zzDHHxK9+9asc2KVu5SNHjszjRkJnUY06VQkVevbs2Ti7ZQrqUqu6tOz000/Ps8lCZ1DN81TT33jpPu2v6Th30Bm0tU6ttdZa8dxzz8W1114b11xzzWRBXbLtttvmVnVXX311HsoBSiSsg1kktdB54YUXYplllolTTjllsi4Pyy23XFx11VW5BV0az2e99dbLV4NSK7rUzTX9GEvNs1955ZU8A9hWW20Va665Zj5JPfTQQ7mrbCXYE9TRWcxonWpJqm/rrrtu7lp03nnn5VarKbjr06fPbHgnMOfUqUp3vfRH0meffRa///3vJwvqhAt0JtU6T1VaCFV+46WJWlI38zQGV9qn3350Fm2pU5Ux6QYPHpy7zPbo0SP3VkpjQDatX7vsskt8+ctfzq9DifSjg1mkMn5PGqsnnVgqM+WlE0g64aQrQ+kqT2XK8MrVoNTCbuutt46f//znuTteGsPkpptuihNPPDEvu/POO+PHP/6xlgp0OjNap1pSqW9p7JPUvejUU08V1NHpVKNOVQb1TuMJnXnmmflCk6COzqoadaoyQH5l0onrrrsut/7ZZpttYq655hLU0am0pU6lOpL+ntprr73y5EcHHXRQY1BXGVqoQlBHybSsg1kktZJL4yWkcRSSypWgSneGNFbCDjvskJtof+UrX5nsCmpqpZBOHgceeGD+0ZZ+rKUTVRrkO+2v6ax70FnMTJ1qTpqkJY1ncvLJJ+fZLqGzqUadqkzOMmbMmHj++efzuUtQR2dVjTpV6Vqewu80Jlf6HZiGaEgXb6GzmZk6lSaSWGWVVfLwQYmhg+hotKyDWaAymHY6QTQ3y2TlRJGuCKUrRk2XJambQ2qlUPnRloKE1AU2taYT1NEZVaNOpS56TaWrrqnFavqhB51NtevURx99lMesE9TRWVWzTqVxuNKF2jSLcpoMKXX3g85mZupUCuZSnUqt7ir7EtTR0QjrYBZIV3VSyJbGmkszvKaros1Jg5ymqz2p1VxTH3zwQeMMRtPaFjqTatSp1OonqWybfvhVrtRCZ1PNOpUuLi200EK59U/6owk6o2rWqRR4p4tJv/jFL9QpOq2ZqVMpmGtapypDNkBHohsszKQ0g+TLL78c7777bv7DP3VVXX311fNJIY2BlbotVLo0TCld5UkDp6Y/dFLXocpA3a+++mrcfPPN0b9//zyeFnQm6hR0nDq1xhpr5Bbfafby7t27z/b3BnNSnUpjFKc6lfbZdCB9mNP57QdTE9bBTEhNrtMfKGk8hffeey/eeuutxubaa6+9dp4WPP0RUzlpNJWWpT9sUtfWyh84lXX++c9/5hPWgw8+mCebgM5CnYKOVafSDOWp1UMa+B46g1lZp1555ZVcp5yn6Ez89oPmCeugjdJg2r/85S9jiy22yAOapqs6//3vf+OGG27IU4z/5z//ySeJY445JpZYYomptq+cSNKJ5eOPP86DpybnnntuPPzww3mMhTXXXHO2vy9oL+oUdMw6ZRwgOgvnKagudQqmzZh10EapqXU6AWy33Xb5eWqmvfLKK8dhhx0We++9dyy11FL5Cumxxx4bL7300mQDpTY1duzYxinE04nl3nvvzVeP0ixgaWBh6CzUKagudQqqS52C6lKnYNqEddBGqYn2008/3Tj7UOUEkQY4HThwYOyzzz7Rr1+/fJUnDbqdZvVK61QGR62caNIYDOlq0O9+97t8YunZs2de32x6dDbqFFSXOgXVpU5BdalTMG3COmijdBUoXf159tlnp7rCkwYxXXfddWP//ffPJ5h0AjrppJPio48+ys2103aVbkOjRo3KJ5Pbb789n1hOP/10JxY6JXUKqkudgupSp6C61CmYNmEdtFGamWjBBReMQYMG5fEW0smi6ZTiaRavL37xi/mK0LLLLhvvv/9+XHnllXla8bRu5eTy6aef5qtKafYiV4DozNQpqC51CqpLnYLqUqdg2oR10AbpJJJODukqTxr49MILL8zL01WepieYrl27xmqrrRY777xzLLTQQvH888/n5tuVfVROLmm7M844I5ZZZpl2ekfQvtQpqC51CqpLnYLqUqegZcI6mI5x48bF0KFD84khnUgqTbTnnXfe+OY3v5nHR3jggQfiiiuuyMvTiaJpM+70+vrrrx+bbLJJfPjhh3HPPfc0rpdOMCuttFIe/NQVIDoLdQqqS52C6lKnoLrUKZhxNfWpszcwzRmKzjvvvNys+t13383L0pWdNODphhtumE8wf/zjH+PGG2/Mr+2xxx75lqQTR2U68eSdd96JE044IY+/cPbZZ+fBUStNvZuuB3MydQqqS52C6lKnoLrUKWgbLetgGkaMGBHHHXdcPPHEE40zFCXpitBf//rXGDx4cH6+wQYb5FvKvW+++ea47rrrpmrCnV5LsxR95StfyftK4yxUrhY5sdBZqFNQXeoUVJc6BdWlTkHbdZ2JbWGOlU4KV111Vbz++uux8sorxze+8Y18EkgzDf3lL3+J//73v3m2oXQ1aIUVVohtttkmXzV64YUX8sklrfetb32r8cSR9pfGW0gzHqXm2WnwU+hM1CmoLnUKqkudgupSp2DmCOugGekqzb///e98Ijj55JPzTEQVffv2zU21H3zwwXzbdNNNo3///rkJ9p133hmPP/54vlKUZivae++9o3fv3o3bp1mO0qCn6WRTabYNnYE6BdWlTkF1qVNQXeoUzBxhHUwhNbH+5JNPYuTIkfnkkE4M48ePz/fppLP44ovH7rvvHk899VS+UpROLskaa6wRvXr1ilVWWSWuvvrqeOSRR+Kll17Ky1ddddV8pejuu++OY489VlNtOhV1CqpLnYLqUqegutQpmHnCOphCujqz6KKLxmKLLRbzzTdfXla5kpOu3qSTz7LLLhu77rprHmehMo5COmGkqzzptu666+YrQukENGTIkDy9eBpjIZ1Y0rbQmahTUF3qFFSXOgXVpU7BzBPWwRTSySPd0hTgzak0tU5NugcNGpRPLnPNNVfjtmlq8oUWWih22WWXfBs7dmw+8aTtXAGiM1KnoLrUKagudQqqS52CmWc2WJhCOgmkKz7bbbddfPbZZzFhwoRm10szFi2xxBJ53ISm23744Yf5KlCSmnl37949D4bqxEJnpU5BdalTUF3qFFSXOgUzT1gH05DGUhg4cGA+MTQnXfVJJ480HkNSab79xhtvxPXXX5/HVEgnKaCBOgXVpU5BdalTUF3qFLSdbz60YFonh3QiSVd20gmo0mS7cqXnoYceygOlpvt0AgI+p05BdalTUF3qFFSXOgVtI6yDNqicSOaee+4YNmxY4/Jzzz03n1RSU+111lnHVOLQSuoUVJc6BdWlTkF1qVPQMmEdzIQ02GnlBJJOLPfee2/MP//8cdZZZ+XZj4AZo05BdalTUF3qFFSXOgXNE9ZBG1SaY6cBUVOz7UsuuSSfWHr27BmnnXZantkIaD11CqpLnYLqUqegutQpaFnzIz0CrTJ69Oj49a9/HW+//XY+sZx++ulOLDAT1CmoLnUKqkudgupSp6B5WtZBG1Saao8YMSKfWHr06OEKEMwEdQqqS52C6lKnoLrUKWiZlnUwE9I042lw1DPOOMOJBapAnYLqUqegutQpqC51CppXU28uZGiTurq6uOOOO+KLX/xi9OvXr72LAx2eOgXVpU5BdalTUF3qFEybsA5m8gRTW6s3OVSLOgXVpU5BdalTUF3qFDRPWAcAAAAAhRBhAwAAAEAhhHUAAAAAUAhhHQAAAAAUQlgHAAAAAIUQ1gEAAABAIYR1AAAAAFAIYR0AANO05ZZbRk1NzVS3RRZZJAYNGjTZuq+//nostNBCk63XpUuXOPzww9ut/AAAHY2wDgCAabr77rvj1ltvjV69ejUu+853vhNDhw6NLbbYYrJ1+/TpEx9++GF85Stfyc832mijeOmll+KCCy6Y7eUGAOiohHUAALRoxx13jD/+8Y+Nz+vr63OruebU1tbGUkstFQMGDIh77703VlhhhdlYUgCAjq+mPv3aAgCA6UjdWS+88MLo1q1bDB48OFZZZZWp1nnrrbdirbXWiocffjhWXHHFdiknAEBHJqwDAKBVPvvss1hjjTViyJAhseGGG8ZDDz2UW9I1tcMOO8TAgQPjhz/8YbuVEwCgI9MNFgCAVunRo0dcfvnluQvso48+Gueee+5kr//hD3+Ijz76KI466qjJlqdlKbxbc8018wQUaWy7Y489NsaMGTPVMf7yl7/EJptsEquvvnosuOCC0b9//3ycKa8vP/HEE7HHHnvkCTDSaz/+8Y/z+l/72teirq5uFn0CAACznrAOAIBW23zzzfMEE8lPf/rTePnll/Pjd999NwdmKcxr2trujTfeiPXXXz9WXnnlePrpp3M32bSP0047LY+FN3HixMZ107Kvf/3r8b3vfS+ee+65eOWVV6J79+7x/e9/Py699NK8Tgr4dttttzx5xXXXXRcTJkzI21100UXx6aefxo033phb/gEAdFTCOgAAZsgZZ5wRyy+/fIwePToOOuig3LLtsMMOiyOOOCJWXXXVydbdZ599YquttoqDDz44t8ibd9554+KLL84t7O6555648sorG9f95S9/me9TGJcsvPDCjcHgHXfcke/nnnvuuP766+O3v/1tfv7mm2/GyJEj8+y0J598cm7Vt9xyy822zwIAoNqEdQAAzJAUuP3+97/PLejuv//+2HnnnXNo9n//939TdVV94IEHcmu5plLgVpl84oYbbmhcnmaOTd1em840u/TSS+f71GquqUogN378+Dj++OPzpBeppd9ZZ501zZlqAQA6gq7tXQAAADqeNK7ckUceGWeffXbcdttt8dRTT0XXrpP/tLz33nvz/SGHHJLDtKZS+JZazg0bNqxx2WOPPdb4OIVwqUtr6t6aTDkOXeVYKbRLXWUBAOYUWtYBANAmqUVdRZoQYkppvLokhXkvvvjiZLc0xt2HH34YjzzySOP6qaVeGpMudbNNs8qOGDHCrLIAQKcjrAMAYJZIkz8k//3vf1u1fpqAYo011siP77zzzjweXpqBFgCgMxHWAQAwSyyxxBL5/tprr53mOpWusu+9915svfXWecy6NPZd0xllAQA6E7+CAACYJTbbbLN8/+c//zluvvnmqV5/6aWX4qabbmqcaCJ1i+3Tp0+z+5pyzDoAgDmVsA4AgDYZOXJk4+PRo0dP9foWW2wRa665ZtTX18duu+0Wxx57bLzwwgvx+uuvx5/+9KfYbrvtYv/9958sjEvBXmWsu9Qt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cOedd26clfTuu++OddddN7fa23LLLXMAVnHVVVfFkUcembvgJZtvvnmssMIKsd9++zVbjrTtbrvtllu6feELX4hbbrllqnU+++yzHFiuuuqquRttpTtbJcScEalb7p577hnbb799boGYpNZ1U0pjxjV0Ufx8oo70XivSWHdLLLFE42tpPL6Kp59+Onbdddf82abupP369ctlTS35mkr7SKFhW2Z8ffnll3OLwDXWWCMWX3zxWHrppXNAmmZybUma3XX99dePeeaZJ1ZfffW45pprYkaNGjUqzxa7zjrr5FZs6XM4/PDDm/3uAABAawnrAOgwevTokWfoTG644YYYMmTIVOuk4CeFTmlSgumNUZfCtxS0pJAuPX7rrbfiF7/4RQ6yUsCUxr1LPvrooxwApXAnTQyRxmRKs9KmMDDNijd69Oi45557Yp999mncd3qcxjpL+66EQylY+sMf/jBVOdJxN95448Yx29J6KbhLy5tK+0zHe+qpp2Lo0KF5htS2jH03ZsyYuPTSS3MomVTCvjRu3ZSz/B188MF5XLtKSJpmsU0hZcVcc82VZ0tdbbXVcoCaZrpNUtnS55XCsxTapf2mSRvOPffcxn/DJIVqhxxySA65ZnTG1/T5pn+/NMPrE088kfeV9p1aVX7ta1+b5nYpCE0hZSrThAkT4vnnn49vfvObebKN1koThmy66aY5jE2fT/q3SkHjhRdemEPH9p7lFwCAjktYB0CHklpupYBo4sSJcdZZZ031emohlQKYabVgq0gB2ze+8Y1YZZVV8gQQqZttahmWQpv0PIUvaVKKdJwUVKVwqzJTaQr2HnrooXjjjTdyy7wU1FW6506vRVdzUrCYWpalY6bga80118yhYwrPKtJx0oQZqXxp0o0khUUzMjtu01Z/KUirzHSagq1ll102HzPNDDulAQMGNAZ7zbUaS7Psps8ztSRsOh7e+PHj875TaNqlS5c49thj82tNx/BLreF+//vft2nG19SCcvjw4bm1Y/fu3fOy9G+Uvh+PPPJILldz0medgtjXXnstB75pFtrKtmlMxNZI7zVNWnHiiSfm7063bt3y7MVf/OIXc/iXxlUEAIC2ENYB0KGkroYpsEouv/zy3OqtqRTgfec732kMtKYltb5KLdi++tWvTvVaCqZS+JNahKWALAVNKXDq27dvfr1Pnz451Kq0attiiy1y99kkBXgzKrXkqwRGqRtsChGTFCZVfPDBB/n+4osvzmFkxR577JG3mRGp9dsPf/jDxufp/aWuwJUALIVsUzr00ENzCJbG4auUpSK1Fkyt/lJgVZG6/KaWkKlLb0VqZZc0F6K1ZTKEdIx0zNSqryKVsTLz67TCuhRWppCwUqbrr78+/3un950mBJmed999N6+XwtymUtibutRWWn4CAEBbCOsA6HCOPvroHIykMcMuuOCCxuV33XVXDuBSWDc9lTHKKgFcU6kl3UYbbZQf33777Y3LK2FUGn+tuRAxSS3MZtSUXVkXXnjhfN+0K2Uapy4FWrfddlseJy+FZkkKmVLX3dZKXVhToJXG0Juyu2saey+17Lvxxhun2i4dO4VTzbW+S6Fp2r6p1CU2tcKrBHQPPvhgHnMwaa6ra9Ogr7XSv3P6jFLLv+SZZ57JoeOHH36Yn1fGC5xSCiebSmVM3Y6TFNBOT+qum1pcnnTSSbHyyitPdkvvM/37pRZ/AADQFsI6ADqcFFxtt912+XEany6NwZaceeaZeUy15sK0Kf373//O9yn0a07qHjtlS7lprZukrpDJjIy5Nr19NQ2b0kQIf/nLX2LJJZeMwYMH5/efurKm7p4zIo3LllqGTRkypZZ9lcCsuYkmkkoI2rR1XwquUuu5VK7m3se1114b22yzTe4iPCOhYmulMqeQdscdd8yt3VI36ba00kufQWUsuumpfCfS5/Diiy9OdktdmVNYmLotAwBAWwjrAOiwreuSNNFCGvPsueeey2PHtXbss9QqL2k6g2tTvXr1yvfzzz9/tJcpg780CcV//vOf+OlPf5q7mD7++OOxySabTDNcm1JqdZgmp0jjsk0ZMqVbCtSShx9+uNkWZqm14VprrZUDqZtvvrmx2+y3v/3tqdZNgVUK6VIrvdTN9Pjjj29sZVctqRVjmgn21FNPzWMKptZ8K664Ypv2Vek6W5lIoyWVoPK///1vlCi1fjz99NPzmITLL798nvAihaqdVWqFmupOqsspyE/d6KdV7zur9J1OYXeaITp1aU/jdjY3gc+cLo1FusMOO+RhDVKL580226yxFXNnklqUp//ep3PrtLzyyiu5LqXPKbXwThe40ridY8eOna1lBZhTCesA6JDSOHFpJtBKi7o00UKaaCCNY9YaKcSozCjaUiBTGYOsFClwOPnkk3Pwttdee+VALwWUTce3m5Y0E+uBBx44zS6naWKL9dZbLz+uzOo6rdZ1v/nNb3Ig98ILL8TAgQOnWi+NBZgC1DQ+3KwKPNMssikITC0OK2PQtdWwYcPyfQojp6fS5bnpBCBTqgSfs1v6Q3nbbbfNn/s//vGP/Ad16hq85ZZb5s+qs0njKaZWqKl+pLqSxrhMXeBTCFMJ7Du7FOCvscYauR6lkDd9d0477bTo169fdCaXXXZZnrE6XQBI9SYFuum/h+n709oLIh1d+m9aarGdWipXZidvTvrvfhp+INWl1Bo5XSBIF3yOO+64/N+atgwHAcDkhHUAdPjWdSm4uvLKKxuft8ZOO+3U+MdJGn9sSpVujLvvvvtMlbGlrrMz4l//+tdkY8Wlrp6pJUwKxVKwmFrZtSRNtpD+CE8TRUwvAKvMmJpaLU4pBYSp1eF9992XP+/9999/qveYZkNNY7elUCuNj9ecaY0n11ppTLj0/tM4e5Ux/mbmGGmG3zSWXWXsupakWXiT1AW5uT/i0+eW/vBvD//3f/+Xg8I0gUqa4TdJ7ymNN5i6iHem1lKpu3L690ljGabgJX1nLrzwwvx9TbMBp9aYnV1qIZtaHaaJalIr2DR5TmeUhhY47LDD4rvf/W5uXZi+I+m/Xeki0FZbbZUnHXrsscdiTpfGQ60MbdCSAw44IL785S/n0C4Fdam1dWqRWWmdOCuGPADobIR1ABQvTSJQGZeuqRRCVCaI2HDDDRsnhWi6XcWU26c/vlKXxzR+25QtjlLrpHvvvTcHU1/84hen2kfT2VinNOVMqmmsueaO33S95sLC5vaVWrNNuZ/KRBFLLbVUtCS1lOvfv/90u6L+f3t3GhLV/sdx/GcU3TQTwsw2qLAsETEzKsjAFiIjSLIIggqi9UGatmeU0Uo7QgVCUglFRGmCFkW0PCiyIBJ6YEHPQosksjJoOX8+v8sZxpmxe2/9y9Oc9wu8jrOe+Xnm2Pne76Lgn05U9TpHjhwJu13vRwE6N9C5ePHiToNkOgG+du2avax1Dh78oaw89bNz6YQv0nsOvi70NmVKKSOuoqLC/qwMD5UI67Xc19BAjtAMqtDyYgV1amtrTVFRUdhJaqTXVlamsjhFPfJ0kq/sJAV49TzK+nQn+v5Oyh7TZGH1dHQzJF06kdY6qLzRL1QWX1dXZ/d70X6t35Uyp76XVesXt2/ftkE6Zdtu377d+Nn+/fvtcT0vLy/stsLCQnuM1rEl2qn8VyWt38sw1nFdf3d1/NexRp8r/f1RFqsyVqWqquo3bjUARCeCdQAAT1Ngpbq62rS0tIRljykTSgEWiZRVd/ny5cBlBVGCM62UmabsMZ2YrF692gbn3ACfglFDhgwJKwV1hzmon1tw0EwZO8ruE2WUBXODfeoDpxM+nRTrPbmvJ6HlRm6/OGV7Bb+Oykrz8/MDJa8KVCm7TGWPoYHK0O1WWZtKk4IDmJHovXTr9vc/Dw4fPhwItgXTeukETRkobm+/0GENyurSequETJfVP02ZGG5JrPobKbvJpUw9aWhoCAuuuWuq37+7/XoeDcVwswF1sqghF8rmc4dFaF3Ueyk2Ntb+7AZ2FeTV1FtRgE1rqswznbAHU8mkegRGKmtVlqMb2NOgCZVk630qiKcecSoj+90U/FTAIdK+oNI29zOh9+UH+hy7vQiDufuNyr79SsdT7ff6vCh7zO8U2JVIg3L0P0T0t0b3iZRtHI3++uuvTm9TFp2OlaEZ1fq5pKTEXvbLOgHAL+UAAOBR27Ztc/r06aM0KPsVExPjDB482GlsbAzcp62tzRk3bpzz9evXwHX19fVO//79A49zvxISEpzNmzd3eA09V0FBgZOYmOgMGzbMyczMdPbu3et8+PAhcJ/W1lYnKSmpw3NpuyoqKpw9e/Y4cXFxHW5LSUkJPPbZs2dOVlaWvf/SpUud5uZmZ/Hixfa9uPfv1q2bM3XqVKepqclJTk4Oe53bt287DQ0NHa4fOHCgk56e7uzatcv59OlTp2u4fPnyDo/r1auXs2/fvoj3LS4udnr06BG2bmlpaWH3nTlzpt2mzjx8+NDJzs62rzdx4kTn0aNH9vqSkhL7eygrK7M/v379Omxt4+PjnerqaufLly9h69G7d2/n1KlT9rHPnz93cnNzndjYWCcjI8O5fv26vf7o0aP2OVatWuV8/vw5sE3t7e1OeXm53R6t66hRo5wpU6Y4Fy5cCNv+8+fPh/1etS3v3r0L3OfNmzdOYWGh3Se1bqmpqfa1v3375nSFnJwcu53aJyMZNGiQvb2mpsbx+3FFn9Hgz7jfLFmyxO4LJ06c6OpN8YTu3bvb9ejsmOb+Pamrq3P8QH+j9H4rKyv/0+OePn1qH6djIQDg58ToP782HAgAAIBfLT4+3rx//972b3T7RwVLT0+3PabKysrsdF4/UuaoBqKop5/Xhsf8LsqMUhaoerIp81TljBoOoExXZcBu2bIl4tCYaKasW03JPn78eMTp1srEfvXqVaefrWij/pYqa9XnRJf/LWVBqxR2w4YNYZnKAID/hjJYAACAP5zKpRWoE/VijCQhISHQy8+Pmpqa7LAAlTRG6o3oFxcvXrSl+ArW3b9/3+zevdv2r1NptwbZaI005dNP1KtTTp48GdaTVP003c9MZwNz8LcbN27YEloN6gAA/ByCdQAAAH+44D50bo++UG4vwkjDWqKZJiGrl5aGbqjvob7Uwy90sIxfKDDnTvTU0ITExET7s/pLqn+dek2qD6Sf+o6pl6gyT588eWIWLlxo37t6jKpvqAYNuf1O/Tot99/QYCYN+yktLf3HQUYAgH9GsA4AAOAPF5zx01mHE3fibt++fY2fKKPw0KFDtoxRA1k0jETZU5qC6pdhG6FlsJ1NkFagSuulQS4qj/ULvWcNAdq4caMN2Cmwq2Exd+7csSXD7iRsd7Iwwu3bt8+kpKSYTZs2dfWmAEBUIFgHAADwh1MAzg3YdTbx9+3bt/a7m0nlN1ofZUmp9FOlwm1tbbZnmx/79ok7mTmYAlK5ubn2sjsJ2S+0Hgo46X2/ePHC7htr164NTIpV8E7rg3Ca4q3p6iqxVpk5AODnEawDAAD4w+kEOS0tzV5++fJlxPu0tLTY75mZmcbPVKKnMs/vrVU069evX4egXSi3hNEt/fR7DzZl2sXExJj169d39eZ4UnNzsx3KUVNTY5KSkrp6cwAgahCsAwAAiAIzZsyw3zXxNZQa5Kt3W1xcnMnJyTF+N2nSJPt9wIABxm+ys7M73U9EAwJk5MiRxs9UKl1UVGQvr1ixwowdO7arN8lzlJ26YMECO5zE7/sLAPy/EawDAACIAurBpiES6rMV6t69e/b73LlzTc+ePY3fKXCpdXADnH6i4Ipcv349bPKpqARU+9GcOXOMn23ZssUGNNW/7vDhw129OZ6jcvt58+aZnTt3mqysrIj7EQDgxxGsAwAAiAIjRoyw5Z2NjY3m8ePHHW47ffq07belqZcw5uzZs3aYQHJysvGbCRMmmPz8fFsCXFVV1eE2DeG4evWq3Y+GDh1q/Eq96w4cOGAmTpxo6uvrfderzg3iaiJuZ4G6goICU1xcbCZPntzhNg24qaursxOYAQA/jmAdAABAlDh48KAt11u5cqVpbW21J87l5eWmtrbWnDlzxgwfPtz4xezZs+3E0x07dtgyYLdPm0oaR48e7evAZWVlpUlPTzdr1qwxd+/etddpf1m0aJEZM2aMOXLkiPEbBaiuXbtmsy1LS0ttIOrWrVu+m57c3t5u+/SJhrFEGlQzffp0c/PmTTuwRQNr3C+tlTJWZ82aZfLy8rpg6wEgesQ4+lccAAAAoqaP1LZt28yVK1dsOaOCMipVy8jIMH5y7Ngxc+jQIZtBpswoDdZITU01y5YtM+PHjzd+p6DL1q1bzaVLl2yARRNy58+fb9atWxeYLOwXyiQ8d+6cHa4xbdo0OzDBHdjitxJpBfY/fvwYuE4BuN27d9v/ASD67Dx48OC7z6P9SYMntE8BAH4MwToAAAAAAADAIyiDBQAAAAAAADyCYB0AAAAAAADgEQTrAAAAAAAAAI8gWAcAAAAAAAB4BME6AAAAAAAAwCMI1gEAAAAAAAAeQbAOAAAAAAAA8AiCdQAAAAAAAIBHEKwDAAAAAAAAPIJgHQAAAAAAAOARBOsAAAAAAAAAjyBYBwAAAAAAAHgEwToAAAAAAADAIwjWAQAAAAAAAB5BsA4AAAAAAADwCIJ1AAAAAAAAgEcQrAMAAAAAAAA8gmAdAAAAAAAA4BEE6wAAAAAAAACPIFgHAAAAAAAAeATBOgAAAAAAAMAjCNYBAAAAAAAAHkGwDgAAAAAAAPAIgnUAAAAAAACARxCsAwAAAAAAADyCYB0AAAAAAADgEQTrAAAAAAAAAI8gWAcAAAAAAAAYb/gf0rVDTJqGVs0AAAAASUVORK5CYII=", "text/plain": [ "" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from bsrn.visualization import plot_bsrn_availability\n", "\n", "# Heatmap of monthly .dat.gz presence on FTP for the same stations as in §2 (narrow year span for speed).\n", "fig = plot_bsrn_availability(\n", " stations=stations,\n", " username=username,\n", " password=password,\n", " start_year=2020,\n", " end_year=2024,\n", " output_file=None, # e.g. \"qiq_availability.png\" to save next to the notebook\n", ")\n", "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Download QIQ 2024 data\n", "\n", "Download all 12 monthly files for the QIQ station for the year 2024." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading to /Volumes/Macintosh Research/Data/bsrn-qc/data/QIQ\n", "--------------------------------------------------\n", " qiq0124.dat.gz: OK\n", " qiq0224.dat.gz: OK\n", " qiq0324.dat.gz: OK\n", " qiq0424.dat.gz: OK\n", " qiq0524.dat.gz: OK\n", " qiq0624.dat.gz: OK\n", " qiq0724.dat.gz: OK\n", " qiq0824.dat.gz: OK\n", " qiq0924.dat.gz: OK\n", " qiq1024.dat.gz: OK\n", " qiq1124.dat.gz: OK\n", " qiq1224.dat.gz: OK\n", "--------------------------------------------------\n", "Done. 12/12 files downloaded.\n" ] } ], "source": [ "OUTPUT_DIR = ARCHIVE_DATA_DIR\n", "os.makedirs(OUTPUT_DIR, exist_ok=True)\n", "\n", "# Construct filenames for 2024 (qiq0124.dat.gz to qiq1224.dat.gz)\n", "filenames = [f\"qiq{m:02d}24.dat.gz\" for m in range(1, 13)]\n", "\n", "print(f\"Downloading to {OUTPUT_DIR}\")\n", "print(\"-\" * 50)\n", "\n", "paths = bsrn.io.retrieval.download_bsrn_files(\n", " filenames=filenames,\n", " local_dir=OUTPUT_DIR,\n", " username=username,\n", " password=password\n", ")\n", "\n", "for fn, p in zip(filenames, paths):\n", " status = \"OK\" if p else \"FAILED\"\n", " print(f\" {fn}: {status}\")\n", "\n", "ok = sum(1 for p in paths if p)\n", "print(\"-\" * 50)\n", "print(f\"Done. {ok}/{len(paths)} files downloaded.\")" ] } ], "metadata": { "kernelspec": { "display_name": "base", "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.13.9" } }, "nbformat": 4, "nbformat_minor": 4 }