From feaaa5837f298de5b6746dd43bf3c6511d905d09 Mon Sep 17 00:00:00 2001 From: sztoor Date: Tue, 27 Aug 2024 14:32:18 +0200 Subject: [PATCH 1/5] Update example notebooks On branch SK-957 Changes to be committed: modified: examples/notebooks/API_Example.ipynb modified: examples/notebooks/Aggregators.ipynb Update example notebooks with FEDn Studio endpoints and settings. --- examples/notebooks/API_Example.ipynb | 12 +++++---- examples/notebooks/Aggregators.ipynb | 40 +++++----------------------- 2 files changed, 13 insertions(+), 39 deletions(-) diff --git a/examples/notebooks/API_Example.ipynb b/examples/notebooks/API_Example.ipynb index d5d0e616d..ca9730c15 100644 --- a/examples/notebooks/API_Example.ipynb +++ b/examples/notebooks/API_Example.ipynb @@ -33,7 +33,9 @@ "id": "1046a4e5", "metadata": {}, "source": [ - "We make a client connection to the FEDn API service. Here we assume that FEDn is deployed locally in pseudo-distributed mode with default ports." + "We connect to the FEDn API service. In this example, we assume the project is hosted on the public FEDn Studio. You can find the CONTROLLER_HOST address in the project dashboard. If you're using a local sandbox, the CONTROLLER_HOST will be \"localhost,\" and the CONTROLLER_PORT will be 8092.\n", + "\n", + "Next, you'll need to generate an access token. To do this, go to the project page in FEDn Studio, click on \"Settings,\" then \"Generate token.\" Copy the access token from the Studio and paste it into the notebook." ] }, { @@ -43,9 +45,9 @@ "metadata": {}, "outputs": [], "source": [ - "DISCOVER_HOST = '127.0.0.1'\n", - "DISCOVER_PORT = 8092\n", - "client = APIClient(DISCOVER_HOST, DISCOVER_PORT)" + "CONTROLLER_HOST = 'fedn.scaleoutsystems.com/my-project...' \n", + "ACCESS_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI3MzQ3NDA4LCJpYXQiOjE3MjQ3NTU0MDgsImp0aSI6ImQxMTY4OTJkODJlMjRhZjJiYzQzZTllZjVlNGVlZDhmIiwidXNlcl9pZCI6NTUsImNyZWF0b3IiOiJzYWxtYW4iLCJyb2xlIjoiYWRtaW4iLCJwcm9qZWN0X3NsdWciOiJldXJvcGFyMjQtd29ya3Nob3AtZWJ4In0.k9pXUh6Ldb-jEzl77FjsxvAAjcbPoB'\n", + "client = APIClient(CONTROLLER_HOST,token=ACCESS_TOKEN, secure=True,verify=True)" ] }, { @@ -160,7 +162,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKS0lEQVR4nO3deVxU9f4G8GdmYIZFQJF9cQFU3FFQwrWU8na9plZuWSou3W7qVamueXMpTam8ean0aiVqP82t0rIyN1pdCkQpVxRRAVlknWGRbeb7+wOcREABZzjM8Lxfr3kVZ86Z+Ywo83DmnOfIhBACRERERBKRSz0AERERtWwMI0RERCQphhEiIiKSFMMIERERSYphhIiIiCTFMEJERESSYhghIiIiSTGMEBERkaQspB6gPnQ6HdLS0mBnZweZTCb1OERERFQPQggUFBTAw8MDcnnd+z9MIoykpaXB29tb6jGIiIioEVJSUuDl5VXn/SYRRuzs7ABUvhh7e3uJpyEiIqL60Gg08Pb21r+P18Ukwsjtj2bs7e0ZRoiIiEzM/Q6x4AGsREREJCmGESIiIpIUwwgRERFJyiSOGakPrVaL8vJyqccgonqwtLSEQqGQegwiaibMIowUFhYiNTUVQgipRyGiepDJZPDy8kKrVq2kHoWImgGTDyNarRapqamwsbGBs7MzS9GImjkhBLKyspCamopOnTpxDwkRmX4YKS8vhxACzs7OsLa2lnocIqoHZ2dnXLt2DeXl5QwjRGQ+B7ByjwiR6eC/VyK6k9mEESIiIjJNDCNmpEOHDoiMjKz3+j/++CNkMhny8/ONNhPVbciQIdi+fbvRHl+q7++GDRswatSoJn1OIjJtDCMSkMlk97y9/vrrjXrc2NhYPP/88/Vef8CAAUhPT4eDg0Ojnq8x/P39oVKpkJGR0WTP2Rzt27cPmZmZmDhxon5Zhw4davxduNeFpR6EMb8P06dPx6lTp/DLL78Y/LGJyDwxjEggPT1df4uMjIS9vX21ZS+//LJ+XSEEKioq6vW4zs7OsLGxqfccSqUSbm5uTfb5/dGjR3Hr1i08/fTT+OSTT5rkOe9Fyl6a999/H2FhYTUuqb18+fJqfxdOnz5t8Oc29vdBqVTimWeewfvvv2/wxyYi88QwIgE3Nzf9zcHBATKZTP/1xYsXYWdnh++++w6BgYFQqVQ4evQorly5gtGjR8PV1RWtWrVCv379cOTIkWqPe/fHNDKZDBs3bsTYsWNhY2ODTp06Yd++ffr7796Nv2XLFrRu3RoHDx5E165d0apVK/zlL39Benq6fpuKigr885//ROvWrdG2bVssXLgQU6dOxZgxY+77uqOiovDMM8/gueeew6ZNm2rcn5qaikmTJsHR0RG2trYICgrCb7/9pr//66+/Rr9+/WBlZQUnJyeMHTu22mv98ssvqz1e69atsWXLFgDAtWvXIJPJsGvXLgwdOhRWVlb49NNPkZOTg0mTJsHT0xM2Njbo2bMnduzYUe1xdDod3nnnHfj5+UGlUqFdu3ZYuXIlAGDYsGGYM2dOtfWzsrKgVCoRHR1d659DVlYWvv/++1o/yrCzs6v298PZ2Vk/Q0REBDp27Ahra2v07t0bn3/+ebVt9+/fj86dO8Pa2hqPPPIIrl27Vuvz1/V9OHToEKysrGp8rDNv3jwMGzZM//XHH38Mb29v2NjYYOzYsVizZg1at25dbZtRo0Zh3759uHXrVq0zEJH0NCXlOH4lGx/9fAVzd5xGQYmExaHCBKjVagFAqNXqGvfdunVLnD9/Xty6dUsIIYROpxNFpeWS3HQ6XYNf2+bNm4WDg4P+6x9++EEAEL169RKHDh0SiYmJIicnR8THx4sNGzaIM2fOiEuXLonFixcLKysrcf36df227du3F//973/1XwMQXl5eYvv27eLy5cvin//8p2jVqpXIycmp9lx5eXn6WSwtLUVoaKiIjY0VcXFxomvXruKZZ57RP+abb74pHB0dxZ49e8SFCxfECy+8IOzt7cXo0aPv+To1Go2wtbUVZ8+eFRUVFcLV1VX8/PPP+vsLCgqEj4+PGDx4sPjll1/E5cuXxa5du8Tx48eFEEJ88803QqFQiKVLl4rz58+L+Ph4sWrVqmqvde/evdWe08HBQWzevFkIIcTVq1cFANGhQwfxxRdfiKSkJJGWliZSU1PF6tWrxenTp8WVK1fE+++/LxQKhfjtt9/0j/Ovf/1LtGnTRmzZskUkJiaKX375RXz88cdCCCE+/fRT0aZNG1FSUqJff82aNaJDhw51/n3Ys2ePsLW1FVqtttryu79/d3rzzTeFv7+/OHDggLhy5YrYvHmzUKlU4scffxRCCJGcnCxUKpUIDw8XFy9eFNu2bROurq7Vvr/3+z7c/nrjxo369e9edvToUSGXy8Xq1atFQkKCWLdunXB0dKz2d1gIIYqKioRcLhc//PBDra/n7n+3RGRc+UVl4ujlLLH+x0Tx4qdxYsg734v2C7+pdvv1SrbBn/de7993MvmekbvdKtei29KDkjz3+eUjYKM0zB/p8uXL8eijj+q/dnR0RO/evfVfr1ixAnv37sW+fftq/GZ+p2nTpmHSpEkAgFWrVuH9999HTEwM/vKXv9S6fnl5OTZs2ABfX18AwJw5c7B8+XL9/R988AEWLVqk3yuxdu1a7N+//76vZ+fOnejUqRO6d+8OAJg4cSKioqIwePBgAMD27duRlZWF2NhYODo6AgD8/Pz0269cuRITJ07EG2+8oV92559Hfc2fPx9PPvlktWV3fiw2d+5cHDx4ELt370b//v1RUFCA9957D2vXrsXUqVMBAL6+vhg0aBAA4Mknn8ScOXPw1VdfYfz48QAq9zBNmzatzo+/rl+/DldX1xof0QDAwoULsXjxYv3Xq1atwt///nesWrUKR44cQUhICADAx8cHR48exYcffoihQ4di/fr18PX1xbvvvgsA6NKlC86cOYO333672uPf6/ugUCgwceJEbN++HTNmzAAAREdHIz8/H0899RSAyu//448/rv8z69y5M44fP45vvvmm2vPY2NjAwcEB169fr/0bQURGk1dUhrNpapy5ocbZG5X/TcmtfS+lVxtr9PR0QA9PB3i0lq6ry+zCiLkICgqq9nVhYSFef/11fPvtt0hPT0dFRQVu3bqF5OTkez5Or1699P9va2sLe3t73Lx5s871bWxs9EEEANzd3fXrq9VqZGZmon///vr7FQoFAgMDodPp7jnHpk2b8Oyzz+q/fvbZZzF06FB88MEHsLOzQ3x8PPr06aMPIneLj4/HrFmz7vkc9XH3n6tWq8WqVauwe/du3LhxA2VlZSgtLdUfe3PhwgWUlpZi+PDhtT6elZWV/uOO8ePH49SpUzh79my1j8PuduvWLVhZWdV63yuvvIJp06bpv3ZyckJiYiKKi4urhVMAKCsrQ58+ffRzBgcHV7v/dnC50/2+D5MnT8ZDDz2EtLQ0eHh44NNPP8XIkSP1H8MkJCRU+3gMAPr3718jjACAtbU1iouL6/xzIKIHl1tU9mfoSK0MHjfyaw8e7Rxt0NPTAd097SsDiIcD2tgqm3ji2pldGLG2VOD88hGSPbeh2NraVvv65ZdfxuHDh/Gf//wHfn5+sLa2xtNPP42ysrJ7Po6lpWW1r2Uy2T2DQ23riwe85s/58+fx66+/IiYmBgsXLtQv12q12LlzJ2bNmnXf9tz73V/bnLUdoHr3n+vq1avx3nvvITIyEj179oStrS3mz5+v/3OtT6vvzJkzERAQgNTUVGzevBnDhg1D+/bt61zfyckJeXl5dd535x4hoDIAAMC3334LT0/PavepVKr7zndbfb4P/fr1g6+vL3bu3Il//OMf2Lt3r/64m4bKzc3VH/NCRA8uu7C0Mnik/rnXI01dUuu6HdraoEfVHo/bwcPBxrLWdZsDswsjMpnMYB+VNCfHjh3DtGnT9L+VFhYW1nmAorE4ODjA1dUVsbGxGDJkCIDKN7JTp04hICCgzu2ioqIwZMgQrFu3rtryzZs3IyoqCrNmzUKvXr2wceNG5Obm1rp3pFevXoiOjkZYWFitz+Hs7FztQNvLly/X67fyY8eOYfTo0fq9BTqdDpcuXUK3bt0AAJ06dYK1tTWio6Mxc+bMWh+jZ8+eCAoKwscff4zt27dj7dq193zOPn36ICMjA3l5eWjTps19Z+zWrRtUKhWSk5MxdOjQWtfp2rVrjb0xv/76a7Wv6/N9AIDJkyfj008/hZeXF+RyOUaOHKlft0uXLoiNja22/d1fA8CVK1dQUlKi33NDRA1zs6Ckam+HRh88MjS1Bw8fJ1t96OjuaY/uHg5wsG6+waM25veubaY6deqEPXv2YNSoUZDJZFiyZMl9Pxoxhrlz5yIiIgJ+fn7w9/fHBx98gLy8vDqPjygvL8fWrVuxfPly9OjRo9p9M2fOxJo1a3Du3DlMmjQJq1atwpgxYxAREQF3d3ecPn0aHh4eCAkJwbJlyzB8+HD4+vpi4sSJqKiowP79+/W/4Q8bNgxr165FSEgItFotFi5cWGMvT206deqEzz//HMePH0ebNm2wZs0aZGZm6sOIlZUVFi5ciH/9619QKpUYOHAgsrKycO7cOf1xFbdfy5w5c2Bra1vjY4y79enTB05OTjh27Bj+9re/3XdGOzs7vPzyy1iwYAF0Oh0GDRoEtVqNY8eOwd7eHlOnTsULL7yAd999F6+88gpmzpyJuLi4ans06vt96N69OyZPnozXX38dK1euxNNPP11t78vcuXMxZMgQrFmzBqNGjcL333+P7777rsb3/5dffoGPj0+1j/yIqHaZmhL9Ryy3j/G4WVBaYz2ZrDJ43D7Go4enA7p72MPOyrSCR20YRkzEmjVrMH36dAwYMABOTk5YuHAhNBpNk8+xcOFCZGRkYMqUKVAoFHj++ecxYsSIOi92tm/fPuTk5NT6Bt21a1d07doVUVFRWLNmDQ4dOoSXXnoJf/3rX1FRUYFu3brpf4t/+OGH8dlnn2HFihV46623YG9vr987AwDvvvsuwsLCMHjwYHh4eOC9995DXFzcfV/P4sWLkZSUhBEjRsDGxgbPP/88xowZA7VarV9nyZIlsLCwwNKlS5GWlgZ3d3e88MIL1R5n0qRJmD9/PiZNmlTn8SC3KRQKhIWF4dNPP61XGAEqD1h2dnZGREQEkpKS0Lp1a/Tt2xf//ve/AQDt2rXDF198gQULFuCDDz5A//79sWrVKkyfPh1Aw74Pfn5+6N+/P2JiYmo0+g4cOBAbNmzAG2+8gcWLF2PEiBFYsGBBjb1BO3bsMMgxPkTmRAiBjKrgcTt0nE3TIKuW4CGXAb7OraoFj24e9milMs+3bZl40AMCmoBGo4GDgwPUajXs7e2r3VdSUoKrV6+iY8eO930TIMPT6XTo2rUrxo8fjxUrVkg9jmSuXbsGX19fxMbGom/fvvddPyMjA927d8epU6fueXyJKZg1axYuXryob1w9d+4chg0bhkuXLtXZ7st/t2TuhBBIU1cPHufS1MgurHmcn1wGdHKxq/qoxV4fPMzhkIN7vX/fyfRfKTWp69ev49ChQxg6dChKS0uxdu1aXL16Fc8884zUo0mivLwcOTk5WLx4MR566KF6BRGgsvguKioKycnJJhdG/vOf/+DRRx+Fra0tvvvuO3zyySf43//+p78/PT0d//d//9eklxkgkpIQAql5t/ShozJ4aJBbVDN4KOQydHKp3OPR08sB3T0c0M3dHtZKw50AYYoYRqhB5HI5tmzZgpdffhlCCPTo0QNHjhxB165dpR5NEseOHcMjjzyCzp0712hEvZ/6tNY2RzExMXjnnXdQUFAAHx8fvP/++9UO7g0NDZVwOiLjEkIgJfeWPnScvaHG2TQ18otrnr1nIZehs6td5UctXpUHmPq72cHKgGdemguGEWoQb29vHDt2TOoxmo2HH374gU99NjW7d++WegSiJqHVCVzLKcL5NM2fx3jcUENTUvN6YZYKGbq42emP8ejp6YDOrgwe9cUwQkRELV5RaQUuZhTgQroG59M1OJ+mQUJGAW6Va2usq1TI4e9uV63Do7NbK6gsGDwai2GEiIhaDCEEbhaU4nzan6HjQroGV3OKUNtOTmtLBfzd7dDdo7K1tLtH5R4PpQWvM2tIZhNGWtquciJTxn+v1BTKtTokZRVV29txPr32A0sBwNVeha7u9ujmbo9uHpX/bd/WFgp57T1KZDgmH0Zu91uUlZXVq7qbiKR3u26/rn4aoobSlJTjYnoBzqepcT5dgwvpBUjILEBZRc1ySIVcBl9nW3Rzt68MHx6V/3VqVf/LK5BhNSqMrFu3DqtXr0ZGRgZ69+6tL1mqS2RkJNavX4/k5GQ4OTnh6aefRkREhEH6BSwsLGBjY4OsrCxYWlrWeiVUImo+dDodsrKyYGNjAwsLk/99iJrY7f6O82m393RUho+6rkrbSmWBru52+r0dXd3teWBpM9TgnwS7du1CeHg4NmzYgODgYERGRmLEiBFISEiAi4tLjfW3b9+OV199FZs2bcKAAQNw6dIl/eXV16xZ88AvQCaTwd3dHVevXuXlyolMhFwuR7t27eq8jAARAJRV6HD5ZkHVcR0FlcEjTVPr2SwA4Nnaukbw8G5jAzk/Zmn2GtzAGhwcjH79+unrn3U6Hby9vTF37ly8+uqrNdafM2cOLly4gOjoaP2yl156Cb/99huOHj1ar+esT4ObTqe77xVsiah5UCqV3ItJ1eQXl1U7ruNCegESbxagXFvzLcpCLkMnV7uqj1ns9Md3tLZRSjA53YtRGljLysoQFxeHRYsW6ZfJ5XKEhobixIkTtW4zYMAAbNu2DTExMejfvz+SkpKwf/9+PPfcc3U+T2lpKUpL/+zqr881WORyOWuliYiaOZ1OICWvuPKg0jvOaElT135FWnsri6qw4VC1t8MOfi48jdbcNCiMZGdnQ6vVwtXVtdpyV1dXXLx4sdZtnnnmGWRnZ2PQoEEQQqCiogIvvPCC/gJftYmIiMAbb7zRkNGIiKiZKSnX4lJmwR17Oyr3eBSW1v4xSztHm6qPWSqDRzcPe3g4WPHjvBbA6EeP/fjjj1i1ahX+97//ITg4GImJiZg3bx5WrFiBJUuW1LrNokWLEB4erv9ao9HA29vb2KMSEVEjZReW1tjbkZRdBK2u5scsSgs5ulT7mMUB/u52sLeylGByag4aFEacnJygUCiQmZlZbXlmZibc3Nxq3WbJkiV47rnn9Neu6NmzJ4qKivD888/jtddeq/VzY5VKBZWKp1gRETVHQghczynGsSvZOH4lB7FXc3GzoLTWdR1tldV6O7q628PH2RaWCh4zRH9qUBhRKpUIDAxEdHS0/iJfOp0O0dHRmDNnTq3bFBcX1wgct7sFWHxERGQa0tW3cDwxB8ev5ODElewax3jIZEDHtrb63o7bAcTFTsWPWei+GvwxTXh4OKZOnYqgoCD0798fkZGRKCoqQlhYGABgypQp8PT0REREBABg1KhRWLNmDfr06aP/mGbJkiUYNWoUC4+IiJqp3KIy/JqUg2OJ2ThxJQdJ2UXV7rdUyNCnXRsM8G2LEJ+26OHpAFsVe2OocRr8N2fChAnIysrC0qVLkZGRgYCAABw4cEB/UGtycnK1PSGLFy+GTCbD4sWLcePGDTg7O2PUqFFYuXKl4V4FERE9kIKScsRey8XxxBwcu5KDC+nVz2KUy4Ceng4I8XXCQL+2CGrvCGslf6Ekw2hwz4gU6nueMhER1U9JuRanrufh+JUcHLuSjT9S1TUONu3iaocQ37YY6OeE/h0d4WDNA0ypYYzSM0JERKapXKvDH6lqnLiSjWOJOYhLzqtx3Zb2bW0wwLctBvg64SGftnC244kE1DQYRoiIzJBOJ3AhQ4MTVyqP+4i5mouiMm21dVztVRjg61R53IdvW3i1sZFoWmrpGEaIiMyAEAJJ2UX6s11OXMlBXnF5tXVa21gixKdt5d4PPyf4ONnyTBdqFhhGiIhM1I38WzhedbbL8Ss5yNBUP93WVqlA/46OlXs//Nqiq5s9LxpHzRLDCBGRicguLNUHjxNXsnEtp7ja/UoLOQKrTrcd4OeEXl4OLBcjk8AwQkTUTGlKyvFbUi6OV33scjGjoNr9CrkMvbwcMMC3LQb6OqFv+zawsuTptmR6GEaIiJqJW2VanLyei+NVez/OpObj7ku7dHW3rwwffm3Rr4Mj7Hg9FzIDDCNERBIpq9Dhj9R8HEvMwfEr2TidnI8ybfXTbX2cbBFSdbptiG9bONoqJZqWyHgYRoiImohWJ3AhXYNjiVUXmLuWi+K7Trd1d7DSn247wK8t3B2sJZqWqOkwjBARGVFKbjF+SLiJY4nZ+DUpF+pb1U+3dbRVVu35qDzuo31bG55uSy0OwwgRkYHdKtPiu7Pp2H0yBb8m5Va7z05lgWAfR/01Xjq72PF0W2rxGEaIiAxACIHfU9XYfTIFX8enoaC0AgAgkwEPdWyLQZ0qP3rp6ekAC55uS1QNwwgR0QPILizFl6dvYPfJFFzKLNQv93a0xvhAbzwV6AWP1jzug+heGEaIiBqoQqvDT5eysPtkCqIv3ERF1fm3VpZy/LWHO8YFeSO4oyM/fiGqJ4YRIqJ6SsoqxGdxqfgiLhU3C0r1y3t7t8b4IC+M6u0Be/Z+EDUYwwgR0T0UlVbg2zPp+OxkCmKv5emXt7VVYmwfT4wL8kYXNzsJJyQyfQwjRER3EUIg7noedp9MwTd/pOu7QOQy4JEuLhgX5I1h/i5QWvBAVCJDYBghIqpyU1OCL07dwGcnU5CUXaRf3tHJFuOCvPBUXy+42ltJOCGReWIYIaIWrVyrw/cXb+Kzkyn4ISEL2qqDUW2UCozs6Y7x/bwR1L4Ni8iIjIhhhIhapMuZBdh9MgV7T99AdmGZfnlQ+zYYH+SNv/ZyRysVf0QSNQX+SyOiFkNTUo5vfq9sRo1Pydcvd7ZT4am+XhgX5AVf51bSDUjUQjGMEJFZE0Lgt6u52B2bgv1n01FSXnlVXAu5DMP8XTA+yBsPd3FmKyqRhBhGiMgspatv4Yu4VHwWl4rrOcX65X4urTAhyBtj+njC2U4l4YREdBvDCBGZjdIKLY6cv4ndJ1Pwy+UsVB2LilYqC4zq7YHxQV4I8G7Ng1GJmhmGESIyeefTNNh9MgVfxt9AfnG5fnlwR0dM6OeNv/Rwg42SP+6Imiv+6yQik6QuLse+329g98lUnLmh1i93s7fC04FeeDrQCx2cbCWckIjqi2GEiEyGTidw/EoOdp9MwYFzGSirqDwY1VIhw2Pd3DAuyAuDOzlDwQvUEZkUhhEiavZScovxeVwqPo9LxY38W/rl/m52mNDPG6MDPOFoq5RwQiJ6EAwjRNQslZRrcfBcBnafTMGxxBz9cnsrC4wO8MT4IG/08LTnwahEZoBhhIiaDSEEzt6oPBj1q/gb0JRU6O8b5OeEcUFeGNHdDVaWCgmnJCJDYxghIsnlFpXhy9M3sPtkCi5mFOiXe7a21l+gztvRRsIJiciYGEaISDKpecV467uLOHguA+XaylIQpYUcj/dww/ggb4T4tIWcB6MSmT2GESJqckIIfHHqBt7Ydw4FpZUfxfT0dMD4IC880dsTDjaWEk9IRE2JYYSImlROYSn+vfcMDp7LBAD0bdcay0f3QA9PB4knIyKpMIwQUZOJvpCJhV+cQXZhKSzkMix4tDP+PsSHF6kjauEYRojI6ApLK/DmN+exMzYFANDZtRXWjA/g3hAiAsAwQkRGFnstFy/t/h3JucWQyYCZgzripce68PRcItJjGCEioyit0OK/hy/jw5+vQIjK03T/M643QnzbSj0aETUzDCNEZHAXMzSYvzNe3xnyVF8vLHuiG+yteJYMEdXEMEJEBqPVCUQdTcJ/Dl5CmVYHR1slVo3tib/0cJN6NCJqxhhGiMggUnKL8dJnvyPmai4AYLi/CyKe6gkXOyuJJyOi5o5hhIgeiBACn8WlYvnX51FYWgFbpQJL/tYNE/p58yJ2RFQvDCNE1GjZhaVYtOcMDp+vLDALat8Ga8YHoF1bXkeGiOqPYYSIGuXQuQws2nMGOUVlsFTIEP5oFzw/xAcKXkuGiBqIYYSIGqSgpBwrvjmP3SdTAQD+bnZYMz4A3TzsJZ6MiEwVwwgR1VvM1VyE745Hat4tyGTA84N9EP5YZ6gsWGBGRI3HMEJE91VaocWaQ5fw0S9JEALwamONd8f1RrAPC8yI6ME16upU69atQ4cOHWBlZYXg4GDExMTUue7DDz8MmUxW4zZy5MhGD01ETed8mgaj1x7Dhz9XBpHxQV74bt5gBhEiMpgG7xnZtWsXwsPDsWHDBgQHByMyMhIjRoxAQkICXFxcaqy/Z88elJWV6b/OyclB7969MW7cuAebnIiMSqsT+OjnJKw5nIByrUBbWyUinuyJx7qzwIyIDEsmhBAN2SA4OBj9+vXD2rVrAQA6nQ7e3t6YO3cuXn311ftuHxkZiaVLlyI9PR22trb1ek6NRgMHBweo1WrY2/MgOSJjS84pxkufxSP2Wh4A4NFuroh4siecWqkknoyITEl9378btGekrKwMcXFxWLRokX6ZXC5HaGgoTpw4Ua/HiIqKwsSJE+8ZREpLS1FaWqr/WqPRNGRMImokIQR2xaZgxTfnUVSmha1SgWVPdMe4QC8WmBGR0TQojGRnZ0Or1cLV1bXacldXV1y8ePG+28fExODs2bOIioq653oRERF44403GjIaET2grIJSLNrzB45cuAkA6N/REe+O6w1vRxaYEZFxNeoA1saKiopCz5490b9//3uut2jRIqjVav0tJSWliSYkapkOnM3AiMifceTCTSgVcvz7r/7YMeshBhEiahIN2jPi5OQEhUKBzMzMasszMzPh5nbvg9qKioqwc+dOLF++/L7Po1KpoFLxs2kiY9OUlOONfefxxanKArOu7vb474Te8HfjsVlE1HQatGdEqVQiMDAQ0dHR+mU6nQ7R0dEICQm557afffYZSktL8eyzzzZuUiIyqBNXcvB45C/44lQqZDLghaG++HL2AAYRImpyDT61Nzw8HFOnTkVQUBD69++PyMhIFBUVISwsDAAwZcoUeHp6IiIiotp2UVFRGDNmDNq2ZTcBkZRKyrX4z8EERB27CiEAb0drrBkfgH4dHKUejYhaqAaHkQkTJiArKwtLly5FRkYGAgICcODAAf1BrcnJyZDLq+9wSUhIwNGjR3Ho0CHDTE1EjXL2hhrhu+NxKbMQADCxnzcW/60bWqlYxkxE0mlwz4gU2DNC9GAqtDp8+HMSIo9cQrlWwKmVEm892Quh3VzvvzERUSMZpWeEiEzPtewihO+Ox6nkfADAiO6uWDW2J9qywIyImgmGESIzJYTA9phkrPz2AorLtGilssDrT3THU309WWBGRM0KwwiRGbqpKcHCL/7ADwlZAICHfBzxn3G94dWGvSFE1PwwjBCZmf1n0vHa3jPIKy6H0kKOf43ogukDO0Iu594QImqeGEaIzIT6Vjle33cOe0/fAAB0c7fHfycEoIubncSTERHdG8MIkRk4npiNlz/7HWnqEshlwD8e9sW84Z2htGjSKz4QETUKwwiRCSsp1+KdAwnYdOwqAKB9WxusGd8bge1ZYEZEpoNhhMhEnb2hxvxd8Ui8WVlg9kxwO7z2166wZYEZEZkY/tQiMjEVWh3W/3gF70VfRoVOwNlOhXee6oVH/F2kHo2IqFEYRohMSFJWIcJ3/474lHwAwOM93LBybE842iqlHYyI6AEwjBCZACEEtv2WjFXfXsCtci3srCywfHR3jAlggRkRmT6GEaJmLlNTgn99/gd+ulRZYDbAty3+M643PFpbSzwZEZFhMIwQNWM/XcrCvJ2nkV9cDpWFHAv/4o9pAzqwwIyIzArDCFEz9XtKPv6+9SRKynXo4WmP/44PQCdXFpgRkflhGCFqhpJzijHjk1iUlOswtLMzPp4SxAIzIjJb/OlG1MzkFZVh2pYYZBeWoZu7PdZN7ssgQkRmjT/hiJqRknItnt96EklZRfBwsMLmsH5oxRIzIjJzDCNEzYROJ/DSZ78j9loe7KwssGV6f7jaW0k9FhGR0TGMEDUTbx+4iG//SIelQoYPnw1EZx6sSkQtBMMIUTOw9cQ1fPhzEgDgnad7YYCfk8QTERE1HYYRIokdOZ+JZfvOAQBeerQzxvbxkngiIqKmxTBCJKHfU/Ixd8dp6AQwIcgbc4b5ST0SEVGTYxghkkhKbmWXyK1yLYZ0dsabY3vwOjNE1CIxjBBJIL+4DFM3/9kl8r/JfWGp4D9HImqZ+NOPqImVlGvx/P/FsUuEiKgKwwhRE9LpBF75/A/EXMuFncoCm8PYJUJExDBC1ITeOZiAr39Pg4Vchg3PBaKLG7tEiIgYRoiayNZfr2PDT1cAAG8/1QsD2SVCRASAYYSoSURfyMSyr84CAMIf7YynAtklQkR0G8MIkZH9kZqPOdsru0TGB3lhLrtEiIiqYRghMqKU3GJM33ISt8q1GNzJCSvH9mSXCBHRXRhGiIxEXVyOaZtjkF1Yiq7sEiEiqhN/MhIZQWmFFrO2nsSVrCK4O1hh87R+sLOylHosIqJmiWGEyMB0OoGXP/sDMVdvd4n0g5sDu0SIiOrCMEJkYKsP/dklsv7ZQPi72Us9EhFRs8YwQmRA2369jvU/VnaJvPVULwzqxC4RIqL7YRghMpDvL2ZiaVWXyILQzniaXSJERPXCMEJkAGdS1foukXGBXvjncHaJEBHVF8MI0QNKyS3G9E9iUVxW2SWy6kl2iRARNQTDCNEDUBeXI2xLLLIKSuHvZscuESKiRuBPTaJGKq3Q4vmtJ5F4sxBu9lbYHMYuESKixmAYIWoEnU7gX5//gd+u5qJVVZeIu4O11GMREZkkhhGiRnj3cAK+ir/dJdIXXd3ZJUJE1FgMI0QNtP23ZKz7obJLJOLJnhjcyVniiYiITBvDCFED/HDxJpZUdYnMD+2EcUHeEk9ERGT6GEaI6unsDTVmbz8FrU7g6UAvzBveSeqRiIjMQqPCyLp169ChQwdYWVkhODgYMTEx91w/Pz8fs2fPhru7O1QqFTp37oz9+/c3amAiKaTmFSNsS2WXyCA/J6wayy4RIiJDsWjoBrt27UJ4eDg2bNiA4OBgREZGYsSIEUhISICLi0uN9cvKyvDoo4/CxcUFn3/+OTw9PXH9+nW0bt3aEPMTGZ36VjnCNt/RJfJsXygtuFORiMhQZEII0ZANgoOD0a9fP6xduxYAoNPp4O3tjblz5+LVV1+tsf6GDRuwevVqXLx4EZaWjetg0Gg0cHBwgFqthr09z1qgplNaocXUTTH4NSkXbvZW2Dt7AE/hJSKqp/q+fzfo17uysjLExcUhNDT0zweQyxEaGooTJ07Uus2+ffsQEhKC2bNnw9XVFT169MCqVaug1Wob8tRETU4IgYWf/4Ffkyq7RDZNY5cIEZExNOhjmuzsbGi1Wri6ulZb7urqiosXL9a6TVJSEr7//ntMnjwZ+/fvR2JiIl588UWUl5dj2bJltW5TWlqK0tJS/dcajaYhYxIZxLuHLuHLqi6R/03ui24e3CtHRGQMRv/gW6fTwcXFBR999BECAwMxYcIEvPbaa9iwYUOd20RERMDBwUF/8/bm6ZPUtHbEJGPtD4kAgFVP9sSQzuwSISIylgaFEScnJygUCmRmZlZbnpmZCTc3t1q3cXd3R+fOnaFQKPTLunbtioyMDJSVldW6zaJFi6BWq/W3lJSUhoxJ9EB+SLiJxV9Wdon8c3gnjGeXCBGRUTUojCiVSgQGBiI6Olq/TKfTITo6GiEhIbVuM3DgQCQmJkKn0+mXXbp0Ce7u7lAqlbVuo1KpYG9vX+1G1BTO3lBj9qeVXSJP9vXEglB2iRARGVuDP6YJDw/Hxx9/jE8++QQXLlzAP/7xDxQVFSEsLAwAMGXKFCxatEi//j/+8Q/k5uZi3rx5uHTpEr799lusWrUKs2fPNtyrIDKAG/m3ML2qS2SgX1u89WQvdokQETWBBveMTJgwAVlZWVi6dCkyMjIQEBCAAwcO6A9qTU5Ohlz+Z8bx9vbGwYMHsWDBAvTq1Quenp6YN28eFi5caLhXQfSAKrtEYnCzoBRdXO2w/tlAdokQETWRBveMSIE9I2RMZRU6TN0UgxNJOXC1V2HviwPh0Zqn8BIRPSij9IwQmRshBBZ+8QdOJOWglcoCm6f1ZxAhImpiDCPUoq05fAl7T9+AQi7DOnaJEBFJgmGEWqydMcn44PuqLpGxPTCUXSJERJJgGKEW6adLWXjtdpfIMD9M6NdO4omIiFouhhFqcc6lqfHitrjKLpE+nljwaGepRyIiatEYRqhFuZF/C2GbY1FUpsUA37Z46yl2iRARSY1hhFqMu7tENjzHLhEiouaAP4mpRSir0OEf2+JwKbMQLnYqbA7rB3srS6nHIiIiMIxQCyCEwKtf/IHjV3Jgq1Rg07R+7BIhImpGGEbI7P33yGXsuaNLpIeng9QjERHRHRhGyKztjk3B+9GXAQArx/TAw11cJJ6IiIjuxjBCZuunS1lYtPcMAGDuMD9M7M8uESKi5ohhhMzS3V0i4ewSISJqthhGyOyk5d/C9C2VXSIhPuwSISJq7hhGyKxoSsoRtjkWmZpSdHJpxS4RIiITwJ/SZDbKKnR4cdspJGQWwMVOhS3T+8PBml0iRETNHcMImQUhBBbtOYOjidmwqeoS8WSXCBGRSWAYIbMQeeQyvjiVyi4RIiITxDBCJm/3yRS8V9Ul8uaYHniEXSJERCaFYYRM2s+XsvDvPZVdIrMf8cUkdokQEZkchhEyWYfPZ+LvW+NQoRMYHeCBlx/rIvVIRETUCBZSD0DUUEIIbPzlKlZ9dwFCAEM7O+Odp9klQkRkqhhGyKSUa3VY+tVZ7IhJAQBMDm6H15/oDksFd/IREZkqhhEyGericry4PQ7HEnMgkwGLR3bD9IEduEeEiMjEMYyQSbieU4SwLbFIyiqCjVKBDyb1wfCurlKPRUREBsAwQs1ezNVc/H3rSeQVl8PdwQpRU/uhm4e91GMREZGBMIxQs/ZFXCpe3fMHyrUCvbwcsHFKEFzsraQei4iIDIhhhJolnU7g3cMJWPfDFQDAX3u64d1xAbBWKiSejIiIDI1hhJqdW2VavPRZPPafyQBQWWb20qNdIJfzQFUiInPEMELNys2CEsz65CR+T1XDUiFDxJO98HSgl9RjERGRETGMULNxIV2DGVtikaYuQWsbS3z4bCCCfdpKPRYRERkZwwg1C99fzMTc7adRVKaFj5MtNk3rhw5OtlKPRURETYBhhCQlhMDmY9fw5rfnoRPAAN+2WD85EA42llKPRkRETYRhhCRTrtXhja/PYduvyQCAif28sWJMD1a7ExG1MAwjJAn1rXLM2X4Kv1zOhkwGLHrcH7MG+7DanYioBWIYoSaXnFOM6Z/EIvFmIawtFYicGIAR3d2kHouIiCTCMEJN6uS1XDy/NQ65RWVwtVchamo/9PB0kHosIiKSEMMINZkvT9/Avz7/A2VaHXp42mPjlH5wc2C1OxFRS8cwQkYnhMB/j1zG+9GXAQCPdXNF5MQA2Cj514+IiBhGyMhKyrV45fM/8PXvaQCAvw/1wcIR/qx2JyIiPYYRMpqsglI8v/UkTifnw0Iuw8qxPTChXzupxyIiomaGYYSMIiGjANO3xOJG/i04WFti/bN9McDXSeqxiIioGWIYIYP7MeEm5mw/jcLSCnRoa4NN0/rBx7mV1GMREVEzxTBCBvXJ8Wt44+tz0Amgf0dHfPhsINrYKqUei4iImjGGETKICq0OK745j09OXAcAPB3ohVVje0JpwWp3IiK6N4YRemAFJeWYu+M0fkzIAgD86y9d8I+hvqx2JyKiemEYoQeSmleMGVtOIiGzAFaWcvx3fAAe7+ku9VhERGRCGrUPfd26dejQoQOsrKwQHByMmJiYOtfdsmULZDJZtZuVFVs3zcGp5DyMWXcMCZkFcLZTYfffQxhEiIiowRq8Z2TXrl0IDw/Hhg0bEBwcjMjISIwYMQIJCQlwcXGpdRt7e3skJCTov+bue9P39e9peOmz31FWoUNXd3tETQ2CR2trqcciIiIT1OA9I2vWrMGsWbMQFhaGbt26YcOGDbCxscGmTZvq3EYmk8HNzU1/c3V1faChSTpCCLx35DLm7jiNsgodhvu74PMXQhhEiIio0RoURsrKyhAXF4fQ0NA/H0AuR2hoKE6cOFHndoWFhWjfvj28vb0xevRonDt37p7PU1paCo1GU+1G0isp12LBrnj898glAMCMQR3x0ZQg2Kp46BERETVeg8JIdnY2tFptjT0brq6uyMjIqHWbLl26YNOmTfjqq6+wbds26HQ6DBgwAKmpqXU+T0REBBwcHPQ3b2/vhoxJRpBTWIpnN/6GL+PToKiqdl/yt25Q8BozRET0gIxeAhESEoIpU6YgICAAQ4cOxZ49e+Ds7IwPP/ywzm0WLVoEtVqtv6WkpBh7TLqHy5kFGPO/Yzh5PQ92VhbYEtYPk4PbSz0WERGZiQbtX3dycoJCoUBmZma15ZmZmXBzc6vXY1haWqJPnz5ITEyscx2VSgWVStWQ0chIfrmchRc/PYWCkgp4O1pj87R+8HOxk3osIiIyIw3aM6JUKhEYGIjo6Gj9Mp1Oh+joaISEhNTrMbRaLc6cOQN3d54C2txt+/U6pm2ORUFJBYLat8GXLw5kECEiIoNr8JGH4eHhmDp1KoKCgtC/f39ERkaiqKgIYWFhAIApU6bA09MTERERAIDly5fjoYcegp+fH/Lz87F69Wpcv34dM2fONOwrIYPR6gRWfnsBm45dBQCM7eOJt57qCZWFQuLJiIjIHDU4jEyYMAFZWVlYunQpMjIyEBAQgAMHDugPak1OToZc/ucOl7y8PMyaNQsZGRlo06YNAgMDcfz4cXTr1s1wr4IMprC0AvN2nEb0xZsAgJce7Yw5w/zYDUNEREYjE0IIqYe4H41GAwcHB6jVatjb20s9jtlKy7+F6VticTGjACoLOd4d3xt/6+Uh9VhERGSi6vv+zYIIAgD8npKPmf93ElkFpXBqpcTHU4LQp10bqcciIqIWgGGEsP9MOsJ3x6OkXIcurnaImhYErzY2Uo9FREQtBMNICyaEwP9+vILVByuvG/RwF2d8MKkP7KwsJZ6MiIhaEoaRFqqsQodFe87gi1OVTbjTBnTA4pFdYaEweg8eERFRNQwjLVBeURn+vi0OMVdzIZcBrz/RHVNCOkg9FhERtVAMIy3MlaxCTN8Si+s5xWilssDaZ/rg4S4uUo9FREQtGMNIC3I8MRsvbIuDpqQCXm2sETW1H7q4sVGViIikxTDSQuyMScbiL8+iQifQt11rfDQlCE6teP0fIiKSHsOImdPqBN4+cBEf/ZwEAHiitwfeeboXrCxZ7U5ERM0Dw4gZKynXYu6O0zh8vvIqy/OGd8L80E6sdiciomaFYcSMRR29isPnM6FUyLF6XC+MDvCUeiQiIqIaWCphpkortNhy/BoAYOXYHgwiRETUbDGMmKlvfk9HVkEpXO1VDCJERNSsMYyYISEENh69CgCYOqADlBb8NhMRUfPFdykzdOJKDi6ka2BtqcAz/dtJPQ4REdE9MYyYodt7RZ4O9EJrG6XE0xAREd0bw4iZuZJViO8v3oRMBoQN7CD1OERERPfFMGJmNlXtFRnu7wof51YST0NERHR/DCNmJK+oDF+cSgUAzBzcUeJpiIiI6odhxIxsj0lGSbkO3T3sEdzRUepxiIiI6oVhxEzcWXI2c3BHVr4TEZHJYBgxE3eWnI3s6SH1OERERPXGMGIGhBCIqjpwdUoIS86IiMi08F3LDJxIysH5qpKzycEsOSMiItPCMGIGon5hyRkREZkuhhETl5RViOiLNwGw5IyIiEwTw4iJ23Sscq9IaFcXlpwREZFJYhgxYXlFZfg8rrLkbMYgH4mnISIiahyGERN2Z8nZQz4sOSMiItPEMGKiyip0+KSq5GzGIJacERGR6WIYMVHf/JGGmwWlcLFT4W+9WHJGRESmi2HEBAkhsLHqdN6pA1hyRkREpo3vYibo16RcnE/XwMpSzpIzIiIyeQwjJijqaBIAlpwREZF5YBgxMUlZhThyobLkbPrAjhJPQ0RE9OAYRkzM5mPXAADD/VlyRkRE5oFhxITkF5fhs7gUAMCMwdwrQkRE5oFhxIR8+ltlyVk3d3uE+LSVehwiIiKDYBgxEWUVOvzfiWsAgJmDWXJGRETmg2HERHx7Jg2ZGpacERGR+WEYMQEsOSMiInPGdzUT8GtSLs6lVZacPdOfJWdERGReGEZMQNTRyr0iT/X1QhtblpwREZF5YRhp5pKyChF9MRMAMH0QT+clIiLzwzDSzG0+dg1CVJac+bLkjIiIzBDDSDOWX1yGz+NSAQAzuFeEiIjMFMNIM7Y9Jhm3yrXo6m6PEF+WnBERkXlqVBhZt24dOnToACsrKwQHByMmJqZe2+3cuRMymQxjxoxpzNO2KGUVOnxy/BoAYOYglpwREZH5anAY2bVrF8LDw7Fs2TKcOnUKvXv3xogRI3Dz5s17bnft2jW8/PLLGDx4cKOHbUn2n0nXl5yN6s2SMyIiMl8NDiNr1qzBrFmzEBYWhm7dumHDhg2wsbHBpk2b6txGq9Vi8uTJeOONN+Dj4/NAA7cEQghsPJoEAJgS0p4lZ0REZNYa9C5XVlaGuLg4hIaG/vkAcjlCQ0Nx4sSJOrdbvnw5XFxcMGPGjHo9T2lpKTQaTbVbS/Lb1VycvVFVchbcXupxiIiIjKpBYSQ7OxtarRaurq7Vlru6uiIjI6PWbY4ePYqoqCh8/PHH9X6eiIgIODg46G/e3t4NGdPk3Vly5siSMyIiMnNG3f9fUFCA5557Dh9//DGcnJzqvd2iRYugVqv1t5SUFCNO2bxczS7CkQssOSMiopbDoiErOzk5QaFQIDMzs9ryzMxMuLm51Vj/ypUruHbtGkaNGqVfptPpKp/YwgIJCQnw9fWtsZ1KpYJKpWrIaGZj87GrEAIYxpIzIiJqIRq0Z0SpVCIwMBDR0dH6ZTqdDtHR0QgJCamxvr+/P86cOYP4+Hj97YknnsAjjzyC+Pj4Fvfxy/3kF5fhs5OVJWczuVeEiIhaiAbtGQGA8PBwTJ06FUFBQejfvz8iIyNRVFSEsLAwAMCUKVPg6emJiIgIWFlZoUePHtW2b926NQDUWE7AjpgU3CrXwt/NjiVnRETUYjQ4jEyYMAFZWVlYunQpMjIyEBAQgAMHDugPak1OToZczlNRG6qsQoctxysPXJ052IclZ0RE1GLIhBBC6iHuR6PRwMHBAWq1Gvb29lKPYxRfnr6B+bvi4WynwtGFj0BloZB6JCIiogdS3/dv7sJoBqqVnD3UnkGEiIhaFIaRZiCmquRMZSHH5IdYckZERC0Lw0gzsPF2yVkgS86IiKjlYRiR2LU7S84G8nReIiJqeRhGJHa75OyRLs7wc2HJGRERtTwMIxJSF5dj9+2Ss8G8mjEREbVMDCMS2hGbrC85G8CSMyIiaqEYRiRSrtVhy7FrAIAZgzqy5IyIiFoshhGJ7D+TjgxNCZxaqfBEgIfU4xAREUmGYUQCQghEVZ3OOzWEJWdERNSyMYxIIPZaHv5IVbPkjIiICAwjktj4S2X1+5N9WXJGRETEMNLErmUX4XBVydmMQR2kHYaIiKgZYBhpYluOX7uj5MxO6nGIiIgkxzDShCpLzlIAADMGseSMiIgIYBhpUjtik1FcVllyNtCPJWdEREQAw0iTKdfq8MnxawBYckZERHQnhpEmsv9MOtLVLDkjIiK6G8NIE7iz5GwKS86IiIiqYRhpAiev31FyFtxO6nGIiIiaFYaRJvBnyZkn2rZSSTwNERFR88IwYmTXc4pw6Hxlydn0gR0lnoaIiKj5YRgxss3HKkvOHu7ijE6uLDkjIiK6G8OIEalv/VlyNpMlZ0RERLViGDGinTEsOSMiIrofhhEjKdfqsKWq5Gw6S86IiIjqxDBiJN+dzdCXnI1myRkREVGdGEaMQAihP533uYdYckZERHQvDCNGcLvkTGkhx7MPseSMiIjoXhhGjCDql8rq96dYckZERHRfDCMGdj2nCAfPZwBgyRkREVF9MIwY2O2Ss6GdWXJGRERUHwwjBqS+VY7PbpecDeZeESIiovpgGDGgXbHJKCrToourHQb5OUk9DhERkUlgGDGQCq0OW45dAwDMYMkZERFRvTGMGMh3ZzOQpi6BUyslnmDJGRERUb0xjBhA9ZKzDrCyZMkZERFRfTGMGEDc9Tz8XlVyNpklZ0RERA3CMGIAG6tKzp7s4wknlpwRERE1CMPIA0rOKcah2yVng3g6LxERUUMxjDygzcevQieAIZ2d0ZklZ0RERA3GMPIANCXl2B1bVXLGvSJERESNwjDyAHbFpKCoTIvOrq0wuBNLzoiIiBqDYaSRKrQ6bD5WeeDqzEE+LDkjIiJqJIaRRmLJGRERkWEwjDSCEAIbj1buFXn2ofYsOSMiInoAjQoj69atQ4cOHWBlZYXg4GDExMTUue6ePXsQFBSE1q1bw9bWFgEBAdi6dWujB24OTiXn4feUfCgt5Hj2ofZSj0NERGTSGhxGdu3ahfDwcCxbtgynTp1C7969MWLECNy8ebPW9R0dHfHaa6/hxIkT+OOPPxAWFoawsDAcPHjwgYeXyu2Ss7EBLDkjIiJ6UDIhhGjIBsHBwejXrx/Wrl0LANDpdPD29sbcuXPx6quv1usx+vbti5EjR2LFihX1Wl+j0cDBwQFqtRr29vYNGdfgUnKLMXT1D9AJ4NCCIewWISIiqkN9378btGekrKwMcXFxCA0N/fMB5HKEhobixIkT991eCIHo6GgkJCRgyJAhda5XWloKjUZT7dZcbD52jSVnREREBtSgMJKdnQ2tVgtXV9dqy11dXZGRkVHndmq1Gq1atYJSqcTIkSPxwQcf4NFHH61z/YiICDg4OOhv3t7eDRnTaDQl5dgVmwwAmMGSMyIiIoNokrNp7OzsEB8fj9jYWKxcuRLh4eH48ccf61x/0aJFUKvV+ltKSkpTjHlft0vOOrm0whCWnBERERmERUNWdnJygkKhQGZmZrXlmZmZcHNzq3M7uVwOPz8/AEBAQAAuXLiAiIgIPPzww7Wur1KpoFI1rwNDK7Q6bDl+DQAwc3BHlpwREREZSIP2jCiVSgQGBiI6Olq/TKfTITo6GiEhIfV+HJ1Oh9LS0oY8teQOnMvAjfxbaGurxOgAT6nHISIiMhsN2jMCAOHh4Zg6dSqCgoLQv39/REZGoqioCGFhYQCAKVOmwNPTExEREQAqj/8ICgqCr68vSktLsX//fmzduhXr16837Csxstun87LkjIiIyLAaHEYmTJiArKwsLF26FBkZGQgICMCBAwf0B7UmJydDLv9zh0tRURFefPFFpKamwtraGv7+/ti2bRsmTJhguFdhZHHX8xDPkjMiIiKjaHDPiBSk7hl58dM47D+TgQlB3nj76V5N/vxERESmyCg9Iy1RSm4xDpytPG15Ok/nJSIiMjiGkfvYcryy5GxwJyd0cWPJGRERkaExjNxDZclZZcfJzME+Ek9DRERknhhG7mF3bAoKSytYckZERGREDCN1qNDqsPnYNQCV1e8sOSMiIjIOhpE6HDyXqS85G9OHJWdERETGwjBSh41HkwCw5IyIiMjYGEZqEXc9D6eT86FUsOSMiIjI2BhGarHpaGX1+5g+HnC2a14X7CMiIjI3DCN3Scktxndn0wEAMwbxdF4iIiJjYxi5C0vOiIiImhbDyB0K7ig5m8HqdyIioibBMHKHXXeUnA3t7Cz1OERERC0Cw0iVO0vOprPkjIiIqMkwjFQ5dL6y5MzRVomxLDkjIiJqMgwjVTb+wpIzIiIiKTCMADiVnIdTVSVnz7HkjIiIqEkxjACIqio5Gx3AkjMiIqKm1uLDSEpuMb47U1VyNpin8xIRETW1Fh9GPrmj5MzfzV7qcYiIiFqcFh1GCkrKsbOq5Gw6S86IiIgk0aLDyO6TqSgsrYCfSysM7cSSMyIiIim02DBSWXJWeeDqjEEdIZez5IyIiEgKLTaMKOQyrBrbEyN7urPkjIiISEIWUg8gFZlMhiGdnTGE16AhIiKSVIvdM0JERETNA8MIERERSYphhIiIiCTFMEJERESSYhghIiIiSTGMEBERkaQYRoiIiEhSDCNEREQkKYYRIiIikhTDCBEREUmKYYSIiIgkxTBCREREkmIYISIiIkmZxFV7hRAAAI1GI/EkREREVF+337dvv4/XxSTCSEFBAQDA29tb4kmIiIiooQoKCuDg4FDn/TJxv7jSDOh0OqSlpcHOzg4ymcxgj6vRaODt7Y2UlBTY29sb7HGbE3N/jXx9ps/cXyNfn+kz99dozNcnhEBBQQE8PDwgl9d9ZIhJ7BmRy+Xw8vIy2uPb29ub5V+wO5n7a+TrM33m/hr5+kyfub9GY72+e+0RuY0HsBIREZGkGEaIiIhIUi06jKhUKixbtgwqlUrqUYzG3F8jX5/pM/fXyNdn+sz9NTaH12cSB7ASERGR+WrRe0aIiIhIegwjREREJCmGESIiIpIUwwgRERFJqkWGkYiICPTr1w92dnZwcXHBmDFjkJCQIPVYBrN+/Xr06tVLX2ATEhKC7777TuqxjOatt96CTCbD/PnzpR7FYF5//XXIZLJqN39/f6nHMqgbN27g2WefRdu2bWFtbY2ePXvi5MmTUo9lMB06dKjxPZTJZJg9e7bUoxmEVqvFkiVL0LFjR1hbW8PX1xcrVqy47zVITElBQQHmz5+P9u3bw9raGgMGDEBsbKzUYzXazz//jFGjRsHDwwMymQxffvlltfuFEFi6dCnc3d1hbW2N0NBQXL58uUlma5Fh5KeffsLs2bPx66+/4vDhwygvL8djjz2GoqIiqUczCC8vL7z11luIi4vDyZMnMWzYMIwePRrnzp2TejSDi42NxYcffohevXpJPYrBde/eHenp6frb0aNHpR7JYPLy8jBw4EBYWlriu+++w/nz5/Huu++iTZs2Uo9mMLGxsdW+f4cPHwYAjBs3TuLJDOPtt9/G+vXrsXbtWly4cAFvv/023nnnHXzwwQdSj2YwM2fOxOHDh7F161acOXMGjz32GEJDQ3Hjxg2pR2uUoqIi9O7dG+vWrav1/nfeeQfvv/8+NmzYgN9++w22trYYMWIESkpKjD+cIHHz5k0BQPz0009Sj2I0bdq0ERs3bpR6DIMqKCgQnTp1EocPHxZDhw4V8+bNk3okg1m2bJno3bu31GMYzcKFC8WgQYOkHqNJzZs3T/j6+gqdTif1KAYxcuRIMX369GrLnnzySTF58mSJJjKs4uJioVAoxDfffFNted++fcVrr70m0VSGA0Ds3btX/7VOpxNubm5i9erV+mX5+flCpVKJHTt2GH2eFrln5G5qtRoA4OjoKPEkhqfVarFz504UFRUhJCRE6nEMavbs2Rg5ciRCQ0OlHsUoLl++DA8PD/j4+GDy5MlITk6WeiSD2bdvH4KCgjBu3Di4uLigT58++Pjjj6Uey2jKysqwbds2TJ8+3aAX+5TSgAEDEB0djUuXLgEAfv/9dxw9ehSPP/64xJMZRkVFBbRaLaysrKott7a2Nqu9lLddvXoVGRkZ1X6eOjg4IDg4GCdOnDD685vEhfKMSafTYf78+Rg4cCB69Ogh9TgGc+bMGYSEhKCkpAStWrXC3r170a1bN6nHMpidO3fi1KlTJv357b0EBwdjy5Yt6NKlC9LT0/HGG29g8ODBOHv2LOzs7KQe74ElJSVh/fr1CA8Px7///W/Exsbin//8J5RKJaZOnSr1eAb35ZdfIj8/H9OmTZN6FIN59dVXodFo4O/vD4VCAa1Wi5UrV2Ly5MlSj2YQdnZ2CAkJwYoVK9C1a1e4urpix44dOHHiBPz8/KQez+AyMjIAAK6urtWWu7q66u8zphYfRmbPno2zZ8+aXdLt0qUL4uPjoVar8fnnn2Pq1Kn46aefzCKQpKSkYN68eTh8+HCN31rMxZ2/Xfbq1QvBwcFo3749du/ejRkzZkg4mWHodDoEBQVh1apVAIA+ffrg7Nmz2LBhg1mGkaioKDz++OPw8PCQehSD2b17Nz799FNs374d3bt3R3x8PObPnw8PDw+z+R5u3boV06dPh6enJxQKBfr27YtJkyYhLi5O6tHMTov+mGbOnDn45ptv8MMPP8DLy0vqcQxKqVTCz88PgYGBiIiIQO/evfHee+9JPZZBxMXF4ebNm+jbty8sLCxgYWGBn376Ce+//z4sLCyg1WqlHtHgWrdujc6dOyMxMVHqUQzC3d29RjDu2rWrWX0Uddv169dx5MgRzJw5U+pRDOqVV17Bq6++iokTJ6Jnz5547rnnsGDBAkREREg9msH4+vrip59+QmFhIVJSUhATE4Py8nL4+PhIPZrBubm5AQAyMzOrLc/MzNTfZ0wtMowIITBnzhzs3bsX33//PTp27Cj1SEan0+lQWloq9RgGMXz4cJw5cwbx8fH6W1BQECZPnoz4+HgoFAqpRzS4wsJCXLlyBe7u7lKPYhADBw6scTr9pUuX0L59e4kmMp7NmzfDxcUFI0eOlHoUgyouLoZcXv0tRKFQQKfTSTSR8dja2sLd3R15eXk4ePAgRo8eLfVIBtexY0e4ubkhOjpav0yj0eC3335rkuMNW+THNLNnz8b27dvx1Vdfwc7OTv95mIODA6ytrSWe7sEtWrQIjz/+ONq1a4eCggJs374dP/74Iw4ePCj1aAZhZ2dX4/geW1tbtG3b1myO+3n55ZcxatQotG/fHmlpaVi2bBkUCgUmTZok9WgGsWDBAgwYMACrVq3C+PHjERMTg48++ggfffSR1KMZlE6nw+bNmzF16lRYWJjXj9tRo0Zh5cqVaNeuHbp3747Tp09jzZo1mD59utSjGczBgwchhECXLl2QmJiIV155Bf7+/ggLC5N6tEYpLCystnf16tWriI+Ph6OjI9q1a4f58+fjzTffRKdOndCxY0csWbIEHh4eGDNmjPGHM/r5Os0QgFpvmzdvlno0g5g+fbpo3769UCqVwtnZWQwfPlwcOnRI6rGMytxO7Z0wYYJwd3cXSqVSeHp6igkTJojExESpxzKor7/+WvTo0UOoVCrh7+8vPvroI6lHMriDBw8KACIhIUHqUQxOo9GIefPmiXbt2gkrKyvh4+MjXnvtNVFaWir1aAaza9cu4ePjI5RKpXBzcxOzZ88W+fn5Uo/VaD/88EOt731Tp04VQlSe3rtkyRLh6uoqVCqVGD58eJP93ZUJYUZ1eURERGRyWuQxI0RERNR8MIwQERGRpBhGiIiISFIMI0RERCQphhEiIiKSFMMIERERSYphhIiIiCTFMEJERESSYhghIiIiSTGMEBERkaQYRoiIiEhSDCNEREQkqf8HvyIh6l4G6FIAAAAASUVORK5CYII=", "text/plain": [ "
" ] diff --git a/examples/notebooks/Aggregators.ipynb b/examples/notebooks/Aggregators.ipynb index 27b0a22f7..50281edbb 100644 --- a/examples/notebooks/Aggregators.ipynb +++ b/examples/notebooks/Aggregators.ipynb @@ -36,15 +36,9 @@ "id": "1046a4e5", "metadata": {}, "source": [ - "We make a client connection to the FEDn API service. Here we assume that FEDn is deployed locally in pseudo-distributed mode with default ports. To connect to Studio, generate an API token from the UI, and retrive the controller host URI from the Dashboard. " - ] - }, - { - "cell_type": "markdown", - "id": "8a5e4583-a6f4-456c-96e5-22f38c2c0ba8", - "metadata": {}, - "source": [ - "#### If using a local development deployment" + "We connect to the FEDn API service. In this example, we assume the project is hosted on the public FEDn Studio. You can find the CONTROLLER_HOST address in the project dashboard. If you're using a local sandbox, the CONTROLLER_HOST will be \"localhost,\" and the CONTROLLER_PORT will be 8092.\n", + "\n", + "Next, you'll need to generate an access token. To do this, go to the project page in FEDn Studio, click on \"Settings,\" then \"Generate token.\" Copy the access token from the Studio and paste it into the notebook." ] }, { @@ -54,31 +48,9 @@ "metadata": {}, "outputs": [], "source": [ - "CONTROLLER_HOST = \"127.0.0.1\"\n", - "CONTROLLER_PORT = 8092\n", - "client = APIClient(CONTROLLER_HOST, CONTROLLER_PORT)" - ] - }, - { - "cell_type": "markdown", - "id": "da10cf9e-a4fd-41b5-98ef-80fbbfa7b56d", - "metadata": {}, - "source": [ - "#### If using a FEDn Studio project" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "2e5948f2-178c-4b66-93f1-ccb72b897133", - "metadata": {}, - "outputs": [], - "source": [ - "# Get the controller host for your project from the Dashboard page in Studio\n", - "#CONTROLLER_HOST = \"fedn.scaleoutsystems.com/aggtestproject-etq-fedn-reducer\"\n", - "# Generate an API token from Settings->Generate token (the one below is just an example, it will not work)\n", - "#TOKEN = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.bl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzE3MDE5MjIwLCJpYXQiOjE3MTQ0MIjQ0OWYyODQwMDQ3NzQxMzll9pZCI6MzcsImNyZWF0b3IiOiJhbmRyZWFzaCIsInJvbGUiOiJhZG1pbiIsInByb2plY3Rfc2x1ZyI6ImFnZ3Rlc3Rwcm9qZWN0LWV0cSJ9.P1RwQElLy3kx3h2o9uE-TUICT4CLlgrrM9YuRasCrBM\"\n", - "#client = APIClient(CONTROLLER_HOST, token=TOKEN, secure=True,verify=True)" + "CONTROLLER_HOST = 'fedn.scaleoutsystems.com/my-project...' \n", + "ACCESS_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI3MzQ3NDA4LCJpYXQiOjE3MjQ3NTU0MDgsImp0aSI6ImQxMTY4OTJkODJlMjRhZjJiYzQzZTllZjVlNGVlZDhmIiwidXNlcl9pZCI6NTUsImNyZWF0b3IiOiJzYWxtYW4iLCJyb2xlIjoiYWRtaW4iLCJwcm9qZWN0X3NsdWciOiJldXJvcGFyMjQtd29ya3Nob3AtZWJ4In0.k9pXUh6Ldb-jEzl77FjsxvAAjcbPoB'\n", + "client = APIClient(CONTROLLER_HOST,token=ACCESS_TOKEN, secure=True,verify=True)" ] }, { From 8f53c2280fe0397dfc342e58f7627447a7553754 Mon Sep 17 00:00:00 2001 From: sztoor Date: Tue, 27 Aug 2024 15:19:23 +0200 Subject: [PATCH 2/5] Update example notebooks with FEDn Studio Changes to be committed: modified: examples/notebooks/API_Example.ipynb modified: examples/notebooks/Aggregators.ipynb Update example notebooks with FEDn Studio endpoints and settings. --- examples/notebooks/API_Example.ipynb | 12 +++++++----- examples/notebooks/Aggregators.ipynb | 13 ++++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/examples/notebooks/API_Example.ipynb b/examples/notebooks/API_Example.ipynb index ca9730c15..1aa12b871 100644 --- a/examples/notebooks/API_Example.ipynb +++ b/examples/notebooks/API_Example.ipynb @@ -7,9 +7,9 @@ "source": [ "## API Example\n", "\n", - "This notebook provides an example of how to use the FEDn API to organize experiments and to analyze validation results. We will here run one training session (a collection of global rounds) using FedAvg, then retrive and visualize the results.\n", + "This notebook provides an example of how to use the FEDn API to organize experiments and to analyze validation results. We will here run one training session (a collection of global rounds) using FedAvg, then retrive and visualize the results. For a complete list of implemented interfaces, please refer to the [FEDn APIs](https://fedn.readthedocs.io/en/latest/fedn.network.api.html#module-fedn.network.api.client).\n", "\n", - "When you start this tutorial you should have a deployed FEDn Network up and running, and you should have created the compute package and the initial model, see the example README for instructions." + "Before starting this tutorial, make sure you have a project running in FEDn Studio and have created the compute package and the initial model. If you're not sure how to do this, please follow the instructions in sections 1, 2, and 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html)." ] }, { @@ -33,9 +33,11 @@ "id": "1046a4e5", "metadata": {}, "source": [ - "We connect to the FEDn API service. In this example, we assume the project is hosted on the public FEDn Studio. You can find the CONTROLLER_HOST address in the project dashboard. If you're using a local sandbox, the CONTROLLER_HOST will be \"localhost,\" and the CONTROLLER_PORT will be 8092.\n", + "We connect to the FEDn API service. In this example, we assume the project is hosted on the public FEDn Studio. You can find the CONTROLLER_HOST address in the project dashboard. \n", "\n", - "Next, you'll need to generate an access token. To do this, go to the project page in FEDn Studio, click on \"Settings,\" then \"Generate token.\" Copy the access token from the Studio and paste it into the notebook." + "NOTE: If you're using a local sandbox, the CONTROLLER_HOST will be \"localhost,\" and the CONTROLLER_PORT will be 8092.\n", + "\n", + "Next, you'll need to generate an access token. To do this, go to the project page in FEDn Studio, click on \"Settings,\" then \"Generate token.\" Copy the access token from the Studio and paste it into the notebook. In case you need further details, have a look at the [Fedn ClientAPIs](https://fedn.readthedocs.io/en/latest/apiclient.html#). " ] }, { @@ -55,7 +57,7 @@ "id": "07f69f5f", "metadata": {}, "source": [ - "Initialize FEDn with the compute package and seed model. Note that these files needs to be created separately by follwing instructions in the README." + "Initialize FEDn with the compute package and seed model. Note that these files needs to be created separately. If you're not sure how to do this, please follow the instructions only in sections 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html#create-the-compute-package-and-seed-model)." ] }, { diff --git a/examples/notebooks/Aggregators.ipynb b/examples/notebooks/Aggregators.ipynb index 50281edbb..552f128bb 100644 --- a/examples/notebooks/Aggregators.ipynb +++ b/examples/notebooks/Aggregators.ipynb @@ -9,10 +9,11 @@ "\n", "This notebook shows how to use different Aggregators (FedAvg, FedAdam, FedYogi, FedAdaGrad). \n", "\n", - "When you start this tutorial you should either have an account and project in FEDn Studio, or have deployed a FEDn in pseudo-distributed mode. You should also have created the compute package and the initial model, see README.md for instructions.\n", + "For a complete list of implemented interfaces, please refer to the [FEDn APIs](https://fedn.readthedocs.io/en/latest/fedn.network.api.html#module-fedn.network.api.client).\n", "\n", + "Before starting this tutorial, make sure you have a project running in FEDn Studio and have created the compute package and the initial model. If you're not sure how to do this, please follow the instructions in sections 1, 2, and 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html).\n", " \n", - "Note that this notebook is intended to showcase the aggregator API. Fine-tuning of the server-side hyperparameters would be necessary for optimal performance and will need to be done a use-case basis." + "Note: This notebook is intended to showcase the aggregator API. Fine-tuning of the server-side hyperparameters would be necessary for optimal performance and will need to be done a use-case basis." ] }, { @@ -36,9 +37,11 @@ "id": "1046a4e5", "metadata": {}, "source": [ - "We connect to the FEDn API service. In this example, we assume the project is hosted on the public FEDn Studio. You can find the CONTROLLER_HOST address in the project dashboard. If you're using a local sandbox, the CONTROLLER_HOST will be \"localhost,\" and the CONTROLLER_PORT will be 8092.\n", + "In this example, we assume the project is hosted on the public FEDn Studio. You can find the CONTROLLER_HOST address in the project dashboard.\n", "\n", - "Next, you'll need to generate an access token. To do this, go to the project page in FEDn Studio, click on \"Settings,\" then \"Generate token.\" Copy the access token from the Studio and paste it into the notebook." + "NOTE: If you're using a local sandbox, the CONTROLLER_HOST will be \"localhost,\" and the CONTROLLER_PORT will be 8092.\n", + "\n", + "Next, you'll need to generate an access token. To do this, go to the project page in FEDn Studio, click on \"Settings,\" then \"Generate token.\" Copy the access token from the Studio and paste it into the notebook. In case you need further details, have a look at the [Fedn ClientAPIs](https://fedn.readthedocs.io/en/latest/apiclient.html#)." ] }, { @@ -58,7 +61,7 @@ "id": "07f69f5f", "metadata": {}, "source": [ - "Initialize FEDn with the compute package and seed model. Note that these files needs to be created separately by follwing instructions in the README." + "Initialize FEDn with the compute package and seed model. Note that these files needs to be created separately. If you're not sure how to do this, please follow the instructions only in sections 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html#create-the-compute-package-and-seed-model)." ] }, { From a5ec9c2ab21ea31d312c17af0ae79d6453e82023 Mon Sep 17 00:00:00 2001 From: sztoor Date: Tue, 27 Aug 2024 15:54:46 +0200 Subject: [PATCH 3/5] Update example notebooks with FEDn Studio Changes to be committed: modified: examples/notebooks/API_Example.ipynb Update example notebooks with FEDn Studio endpoints and settings. --- examples/notebooks/API_Example.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/notebooks/API_Example.ipynb b/examples/notebooks/API_Example.ipynb index 1aa12b871..6bbc9b8a8 100644 --- a/examples/notebooks/API_Example.ipynb +++ b/examples/notebooks/API_Example.ipynb @@ -57,7 +57,7 @@ "id": "07f69f5f", "metadata": {}, "source": [ - "Initialize FEDn with the compute package and seed model. Note that these files needs to be created separately. If you're not sure how to do this, please follow the instructions only in sections 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html#create-the-compute-package-and-seed-model)." + "Initialize FEDn with the compute package and seed model. Note that these files needs to be created separately. If you're not sure how to do this, please follow the instructions only in section 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html#create-the-compute-package-and-seed-model)." ] }, { From 6d01231005b0ad7c1a6ca2b6b557dbdf436bf8d2 Mon Sep 17 00:00:00 2001 From: sztoor Date: Tue, 27 Aug 2024 15:56:11 +0200 Subject: [PATCH 4/5] Update example notebooks with FEDn Studio Changes to be committed: modified: examples/notebooks/Aggregators.ipynb Update example notebooks with FEDn Studio endpoints and settings. --- examples/notebooks/Aggregators.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/notebooks/Aggregators.ipynb b/examples/notebooks/Aggregators.ipynb index 552f128bb..83b77d082 100644 --- a/examples/notebooks/Aggregators.ipynb +++ b/examples/notebooks/Aggregators.ipynb @@ -61,7 +61,7 @@ "id": "07f69f5f", "metadata": {}, "source": [ - "Initialize FEDn with the compute package and seed model. Note that these files needs to be created separately. If you're not sure how to do this, please follow the instructions only in sections 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html#create-the-compute-package-and-seed-model)." + "Initialize FEDn with the compute package and seed model. Note that these files needs to be created separately. If you're not sure how to do this, please follow the instructions only in section 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html#create-the-compute-package-and-seed-model)." ] }, { From 13019a92e28d2d211b9a64c5261c08ddc0302608 Mon Sep 17 00:00:00 2001 From: sztoor Date: Fri, 30 Aug 2024 09:16:28 +0200 Subject: [PATCH 5/5] Docs/SK-957 | Update example notebooks with fedn Changes to be committed: modified: examples/notebooks/API_Example.ipynb modified: examples/notebooks/Aggregators.ipynb Update example notebooks with fedn studio endpoints --- examples/notebooks/API_Example.ipynb | 2 +- examples/notebooks/Aggregators.ipynb | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/notebooks/API_Example.ipynb b/examples/notebooks/API_Example.ipynb index 6bbc9b8a8..79e3501c6 100644 --- a/examples/notebooks/API_Example.ipynb +++ b/examples/notebooks/API_Example.ipynb @@ -35,7 +35,7 @@ "source": [ "We connect to the FEDn API service. In this example, we assume the project is hosted on the public FEDn Studio. You can find the CONTROLLER_HOST address in the project dashboard. \n", "\n", - "NOTE: If you're using a local sandbox, the CONTROLLER_HOST will be \"localhost,\" and the CONTROLLER_PORT will be 8092.\n", + "NOTE: If you're using a local sandbox, the CONTROLLER_HOST will be \"localhost or 127.0.0.1 or your local node's IP address\" and the CONTROLLER_PORT will be 8092. \n", "\n", "Next, you'll need to generate an access token. To do this, go to the project page in FEDn Studio, click on \"Settings,\" then \"Generate token.\" Copy the access token from the Studio and paste it into the notebook. In case you need further details, have a look at the [Fedn ClientAPIs](https://fedn.readthedocs.io/en/latest/apiclient.html#). " ] diff --git a/examples/notebooks/Aggregators.ipynb b/examples/notebooks/Aggregators.ipynb index 83b77d082..265e2cdf7 100644 --- a/examples/notebooks/Aggregators.ipynb +++ b/examples/notebooks/Aggregators.ipynb @@ -9,7 +9,9 @@ "\n", "This notebook shows how to use different Aggregators (FedAvg, FedAdam, FedYogi, FedAdaGrad). \n", "\n", - "For a complete list of implemented interfaces, please refer to the [FEDn APIs](https://fedn.readthedocs.io/en/latest/fedn.network.api.html#module-fedn.network.api.client).\n", + "For a complete list of implemented interfaces, please refer to the [FEDn APIs](https://fedn.readthedocs.io/en/latest/fedn.network.api.html#module-fedn.network.api.client). \n", + "\n", + "For implementation details related to how aggregators are implemented, we recommend to read [FEDn Framework Extensions](https://www.scaleoutsystems.com/post/fedn-framework-extensions).\n", "\n", "Before starting this tutorial, make sure you have a project running in FEDn Studio and have created the compute package and the initial model. If you're not sure how to do this, please follow the instructions in sections 1, 2, and 3 of the [quickstart guide](https://fedn.readthedocs.io/en/latest/quickstart.html).\n", " \n",