{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "authorship_tag": "ABX9TyOLSl8Lc1IogC23tATXokEf", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "code", "source": [ "import numpy as N\n", "import pylab as P\n", "\n", "def _blob(x,y,area,colour):\n", " \"\"\"\n", " Draws a square-shaped blob with the given area (< 1) at\n", " the given coordinates.\n", " \"\"\"\n", " hs = N.sqrt(area) / 2\n", " xcorners = N.array([x - hs, x + hs, x + hs, x - hs])\n", " ycorners = N.array([y - hs, y - hs, y + hs, y + hs])\n", " P.fill(xcorners, ycorners, colour, edgecolor=colour)\n", "\n", "def hinton(W, maxWeight=None):\n", " \"\"\"\n", " Draws a Hinton diagram for visualizing a weight matrix.\n", " Temporarily disables matplotlib interactive mode if it is on,\n", " otherwise this takes forever.\n", " \"\"\"\n", " reenable = False\n", " if P.isinteractive():\n", " P.ioff()\n", " P.clf()\n", " height, width = W.shape\n", " if not maxWeight:\n", " maxWeight = 2**N.ceil(N.log(N.max(N.abs(W)))/N.log(2))\n", "\n", " P.fill(N.array([0,width,width,0]),N.array([0,0,height,height]),'gray')\n", " P.axis('off')\n", " P.axis('equal')\n", " for x in range(width):\n", " for y in range(height):\n", " _x = x+1\n", " _y = y+1\n", " w = W[y,x]\n", " if w > 0:\n", " _blob(_x - 0.5, height - _y + 0.5, min(1,w/maxWeight),'white')\n", " elif w < 0:\n", " _blob(_x - 0.5, height - _y + 0.5, min(1,-w/maxWeight),'black')\n", " if reenable:\n", " P.ion()\n", " P.show()" ], "metadata": { "id": "FddTV2bAxCtx" }, "execution_count": 28, "outputs": [] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qDfGWH9TpL_e", "outputId": "876719e5-20cf-4be3-b288-e3fb6552c7c3" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[0.001 0. 0. 0.001]\n", " [0. 0.001 0. 0. ]\n", " [0. 0. 0.001 0. ]]\n" ] } ], "source": [ "# Hebb's rule\n", "\n", "import numpy as np\n", "\n", "x = np.array([[1, 0, 0, 1],\n", " [0, 1, 0, 0],\n", " [0, 0, 1, 0]])\n", "\n", "\n", "y = np.array([[1, 0, 0],\n", " [0, 1, 0],\n", " [0, 0, 1]])\n", "\n", "\n", "N_pattern = x.shape[0]\n", "\n", "n_input = x.shape[1]\n", "\n", "n_output = y.shape[1]\n", "\n", "learning_rate = 0.001\n", "\n", "W = np.zeros((n_output, n_input))\n", "\n", "\n", "for k in range(N_pattern):\n", " for j in range(n_output):\n", " for i in range(n_input):\n", " W[j, i] += learning_rate * x[k,i] * y[k,j]\n", "\n", "\n", "print(W)\n", "\n" ] }, { "cell_type": "code", "source": [ "y_test = W @ x.T\n", "\n", "print(y_test.T)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "faf-XsHQvkSg", "outputId": "0d1cbb72-4e65-4386-83fb-09959747b25c" }, "execution_count": 22, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[0.002 0. 0. ]\n", " [0. 0.001 0. ]\n", " [0. 0. 0.001]]\n" ] } ] }, { "cell_type": "code", "source": [ "hinton(W)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 406 }, "id": "O4xFw8pxxEtC", "outputId": "ba7c5342-293e-497d-b752-17d2cbd1bdbc" }, "execution_count": 29, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAH10lEQVR4nO3dsY3sNgBFUdpYJQpU6fbw8XtQpQyYKFgH7uCPAVq45zQwD1iBc1cM5q+fn5+fAQBk/b17AACwlxgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACDua/eAMcb4/fv37gkAsM2vX7+2fr43AwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADi/hc/Yfyp67rGeZ67Z7zWWmvMOXfPADZyjn7m7efo62Pguq7x/f09juPYPeW1nucZ932/+kEG/pxz9HNvP0dff01wnqcH+EPHcfiPAMKco597+zn6+hgAAD4jBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEvT4G1lrjeZ7dM17teZ6x1to9A9jEOfq5t5+jX7sHfGrOOe77Hud57p7yWmutMefcPQPYxDn6ubefo6+PgTH+fZDf/EcA2M052vb6awIA4DNiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIj72j0Arusa53nunvFqa60x59w9A3gpMcBW13WN7+/vcRzH7imv9jzPuO9bEAB/xDUBW53nKQT+A8dxeLsC/DExAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBhgq7XWeJ5n94zXe55nrLV2zwBe6mv3ANrmnOO+73Ge5+4pr7bWGnPO3TOAlxIDbDfn9EUGsJFrAgCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABA3NfuAcD7Xdc1zvPcPePV1lpjzrl7BlFiAPjIdV3j+/t7HMexe8qrPc8z7vsWBGzhmgD4yHmeQuA/cByHtytsIwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkB4CNrrfE8z+4Zr/c8z1hr7Z5B1NfuAcC7zTnHfd/jPM/dU15trTXmnLtnECUGgI/NOX2RwYu5JgCAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIj76+fn52f3CABgH28GACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACDuHwUpumsnTxFPAAAAAElFTkSuQmCC\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "hinton(y_test)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 406 }, "id": "dMOUho2Vxxfx", "outputId": "6d67b628-3126-4963-e131-f9e45a6f825a" }, "execution_count": 30, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAHwklEQVR4nO3dsY3kRhRF0ZIwdGgw0s5hsTkw0jLKoTFy1hEkQYamxe6550TwPF7UN/jb5+fn5wAAsn6/ewAAcC8xAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgLiPuwdU/Pz58+4JAG/px48fd0/49rwMAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIjzC+M3cRzH2Pf97hlva6015px3zwB4SWLgDRzHMR6Px9i27e4pb+u6rnGepyAA+BvOBG9g33ch8B9t2+ZlBeAfiAEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWLgDay1xnVdd894a9d1jbXW3TMAXtLH3QP4d3POcZ7n2Pf97ilva6015px3zwB4SWLgTcw5fcwAeApnAgCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMR93D0A+KvjOMa+73fPeJq11phz3j0D+EUMwIs5jmM8Ho+xbdvdU57muq5xnqcggBfhTAAvZt/3bx0CY4yxbdu3fvmAdyMGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwPwYtZa47quu2c81XVdY6119wzgl4+7BwB/Nucc53mOfd/vnvI0a60x57x7BvCLGIAXNOf0sQT+N84EABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQNzH3QMAvpvjOMa+73fPeJq11phz3j2DLyQGAL7QcRzj8XiMbdvunvI013WN8zwFwTfiTADwhfZ9/9YhMMYY27Z965ePIjEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGAD4QmutcV3X3TOe6rqusda6ewZf6OPuAQDfyZxznOc59n2/e8rTrLXGnPPuGXwhMQDwxeacPpa8FWcCAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxP32+fn5efcIAOA+XgYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAEDcH+Nij1cxnhxsAAAAAElFTkSuQmCC\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "# Hebbian learning\n", "\n", "class Hebb:\n", " def __init__(self, x, y):\n", " self.n_input = x.shape[1]\n", " self.n_output = y.shape[1]\n", " self.W = np.zeros((self.n_output, self.n_input))\n", "\n", " def fit(self, x, y, lr):\n", "\n", " N_pattern = x.shape[0]\n", "\n", " for k in range(N_pattern):\n", " for j in range(self.n_output):\n", " for i in range(self.n_input):\n", " self.W[j, i] += lr * x[k,i] * y[k,j]\n", "\n", " def pred(self, x):\n", " return self.W @ x.T\n", "\n" ], "metadata": { "id": "Bg91mXemyJQV" }, "execution_count": 37, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "Wz-cXdeH28we" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "id": "Go-z9m8xyF9o" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "import numpy as np\n", "\n", "x = np.array([[1, 0, 0, 1],\n", " [0, 1, 0, 0],\n", " [0, 0, 1, 0]])\n", "\n", "\n", "y = np.array([[1, 0, 0],\n", " [0, 1, 0],\n", " [0, 0, 1]])\n", "\n", "\n", "model = Hebb(x,y)\n", "\n", "model.fit(x, y, 0.001)\n", "\n", "test = model.pred(x)\n", "\n", "hinton(test)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 406 }, "id": "UOeXn4Sh0Ngp", "outputId": "618f06de-70b1-469a-9c04-9b246fd705e4" }, "execution_count": 38, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAHwklEQVR4nO3dsY3kRhRF0ZIwdGgw0s5hsTkw0jLKoTFy1hEkQYamxe6550TwPF7UN/jb5+fn5wAAsn6/ewAAcC8xAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgLiPuwdU/Pz58+4JAG/px48fd0/49rwMAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIjzC+M3cRzH2Pf97hlva6015px3zwB4SWLgDRzHMR6Px9i27e4pb+u6rnGepyAA+BvOBG9g33ch8B9t2+ZlBeAfiAEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWLgDay1xnVdd894a9d1jbXW3TMAXtLH3QP4d3POcZ7n2Pf97ilva6015px3zwB4SWLgTcw5fcwAeApnAgCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMR93D0A+KvjOMa+73fPeJq11phz3j0D+EUMwIs5jmM8Ho+xbdvdU57muq5xnqcggBfhTAAvZt/3bx0CY4yxbdu3fvmAdyMGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwPwYtZa47quu2c81XVdY6119wzgl4+7BwB/Nucc53mOfd/vnvI0a60x57x7BvCLGIAXNOf0sQT+N84EABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQNzH3QMAvpvjOMa+73fPeJq11phz3j2DLyQGAL7QcRzj8XiMbdvunvI013WN8zwFwTfiTADwhfZ9/9YhMMYY27Z965ePIjEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGAD4QmutcV3X3TOe6rqusda6ewZf6OPuAQDfyZxznOc59n2/e8rTrLXGnPPuGXwhMQDwxeacPpa8FWcCAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxP32+fn5efcIAOA+XgYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAEDcH+Nij1cxnhxsAAAAAElFTkSuQmCC\n" }, "metadata": {} } ] } ] }