X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=bombe.ipynb;h=59442e4f4da5bf6481be0f923171939245d2c938;hb=ea80d31dac330167760e2dd7850d3bf6ed9036fc;hp=ab1b457c441d51cb55d4e6a5d2385a37379fc6c2;hpb=628c83045960e5d94ea55fe90437b465a860d4c7;p=cipher-tools.git

diff --git a/bombe.ipynb b/bombe.ipynb
index ab1b457..59442e4 100644
--- a/bombe.ipynb
+++ b/bombe.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 797,
+   "execution_count": 1,
    "metadata": {
     "collapsed": true
    },
@@ -17,100 +17,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 798,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": [
-    "# wheel_i_spec = 'ekmflgdqvzntowyhxuspaibrcj'\n",
-    "# wheel_ii_spec = 'ajdksiruxblhwtmcqgznpyfvoe'\n",
-    "# wheel_iii_spec = 'bdfhjlcprtxvznyeiwgakmusqo'\n",
-    "# wheel_iv_spec = 'esovpzjayquirhxlnftgkdcmwb'\n",
-    "# wheel_v_spec = 'vzbrgityupsdnhlxawmjqofeck'\n",
-    "# wheel_vi_spec = 'jpgvoumfyqbenhzrdkasxlictw'\n",
-    "# wheel_vii_spec = 'nzjhgrcxmyswboufaivlpekqdt'\n",
-    "# wheel_viii_spec = 'fkqhtlxocbjspdzramewniuygv'\n",
-    "# beta_wheel_spec = 'leyjvcnixwpbqmdrtakzgfuhos'\n",
-    "# gamma_wheel_spec = 'fsokanuerhmbtiycwlqpzxvgjd'\n",
-    "\n",
-    "# wheel_i_pegs = ['q']\n",
-    "# wheel_ii_pegs = ['e']\n",
-    "# wheel_iii_pegs = ['v']\n",
-    "# wheel_iv_pegs = ['j']\n",
-    "# wheel_v_pegs = ['z']\n",
-    "# wheel_vi_pegs = ['z', 'm']\n",
-    "# wheel_vii_pegs = ['z', 'm']\n",
-    "# wheel_viii_pegs = ['z', 'm']\n",
-    "\n",
-    "# reflector_b_spec = 'ay br cu dh eq fs gl ip jx kn mo tz vw'\n",
-    "# reflector_c_spec = 'af bv cp dj ei go hy kr lz mx nw tq su'"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 799,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": [
-    "class Bank(object):\n",
-    "    def __init__(self):\n",
-    "        self.signals = dict(zip(string.ascii_lowercase, [False]*len(string.ascii_lowercase)))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 800,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{'a': False,\n",
-       " 'b': False,\n",
-       " 'c': False,\n",
-       " 'd': False,\n",
-       " 'e': False,\n",
-       " 'f': False,\n",
-       " 'g': False,\n",
-       " 'h': False,\n",
-       " 'i': False,\n",
-       " 'j': False,\n",
-       " 'k': False,\n",
-       " 'l': False,\n",
-       " 'm': False,\n",
-       " 'n': False,\n",
-       " 'o': False,\n",
-       " 'p': False,\n",
-       " 'q': False,\n",
-       " 'r': False,\n",
-       " 's': False,\n",
-       " 't': False,\n",
-       " 'u': False,\n",
-       " 'v': False,\n",
-       " 'w': False,\n",
-       " 'x': False,\n",
-       " 'y': False,\n",
-       " 'z': False}"
-      ]
-     },
-     "execution_count": 800,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "c1 = Bank()\n",
-    "c1.signals"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 801,
+   "execution_count": 2,
    "metadata": {
     "collapsed": true
    },
@@ -123,7 +30,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 802,
+   "execution_count": 3,
    "metadata": {
     "collapsed": true
    },
@@ -168,15 +75,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 803,
+   "execution_count": 4,
    "metadata": {
     "collapsed": false
    },
    "outputs": [],
    "source": [
     "class Bombe(object):\n",
+    "    \n",
     "    def __init__(self, wheel1_spec, wheel2_spec, wheel3_spec, reflector_spec,\n",
-    "                menu=None, start_signal=None, use_diagonal_board=True, verify_plugboard=True):\n",
+    "                menu=None, start_signal=None, use_diagonal_board=True, \n",
+    "                verify_plugboard=True):\n",
     "        self.connections = []\n",
     "        self.wheel1_spec = wheel1_spec\n",
     "        self.wheel2_spec = wheel2_spec\n",
@@ -198,9 +107,10 @@
     "            return object.__getattribute__(self, name)\n",
     "        \n",
     "    def __call__(self, start_positions):\n",
-    "        return start_positions, self.test(start_positions=start_positions, \n",
-    "                                          use_diagonal_board=self.use_diagonal_board,\n",
-    "                                          verify_plugboard=self.verify_plugboard)\n",
+    "        return start_positions, self.test(initial_signal=self.test_start,\n",
+    "            start_positions=start_positions, \n",
+    "            use_diagonal_board=self.use_diagonal_board,\n",
+    "            verify_plugboard=self.verify_plugboard)\n",
     "        \n",
     "    def add_connection(self, bank_before, bank_after, scrambler):\n",
     "        self.connections += [Connection([bank_before, bank_after], scrambler)]\n",
@@ -284,12 +194,12 @@
     "                possibles = possibles.union({frozenset((b, active[0]))})\n",
     "            if len(inactive) == 1:\n",
     "                possibles = possibles.union({frozenset((b, inactive[0]))})\n",
-    "        return possibles"
+    "        return possibles\n"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 804,
+   "execution_count": 5,
    "metadata": {
     "collapsed": false
    },
@@ -301,7 +211,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 805,
+   "execution_count": 6,
    "metadata": {
     "collapsed": true
    },
@@ -317,7 +227,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 806,
+   "execution_count": 7,
    "metadata": {
     "collapsed": false
    },
@@ -328,7 +238,7 @@
        "'opgndxcrwomnlnecjz'"
       ]
      },
-     "execution_count": 806,
+     "execution_count": 7,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -342,7 +252,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 807,
+   "execution_count": 8,
    "metadata": {
     "collapsed": false
    },
@@ -353,7 +263,7 @@
        "'aas'"
       ]
      },
-     "execution_count": 807,
+     "execution_count": 8,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -364,7 +274,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 808,
+   "execution_count": 9,
    "metadata": {
     "collapsed": false
    },
@@ -392,7 +302,7 @@
        " MenuIem(before='e', after='z', number=18)]"
       ]
      },
-     "execution_count": 808,
+     "execution_count": 9,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -404,7 +314,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 809,
+   "execution_count": 10,
    "metadata": {
     "collapsed": true
    },
@@ -417,7 +327,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 810,
+   "execution_count": 11,
    "metadata": {
     "collapsed": false
    },
@@ -445,7 +355,7 @@
        " MenuIem(before='e', after='z', number=18)]"
       ]
      },
-     "execution_count": 810,
+     "execution_count": 11,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -456,7 +366,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 811,
+   "execution_count": 12,
    "metadata": {
     "collapsed": false
    },
@@ -467,7 +377,7 @@
        "'s'"
       ]
      },
-     "execution_count": 811,
+     "execution_count": 12,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -478,7 +388,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 812,
+   "execution_count": 13,
    "metadata": {
     "collapsed": false
    },
@@ -489,7 +399,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 813,
+   "execution_count": 14,
    "metadata": {
     "collapsed": false
    },
@@ -500,7 +410,7 @@
        "18"
       ]
      },
-     "execution_count": 813,
+     "execution_count": 14,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -511,7 +421,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 814,
+   "execution_count": 15,
    "metadata": {
     "collapsed": false
    },
@@ -548,7 +458,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 815,
+   "execution_count": 16,
    "metadata": {
     "collapsed": false
    },
@@ -559,7 +469,7 @@
        "False"
       ]
      },
-     "execution_count": 815,
+     "execution_count": 16,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -570,7 +480,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 816,
+   "execution_count": 17,
    "metadata": {
     "collapsed": false
    },
@@ -606,7 +516,7 @@
        " 'z': True}"
       ]
      },
-     "execution_count": 816,
+     "execution_count": 17,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -617,7 +527,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 817,
+   "execution_count": 18,
    "metadata": {
     "collapsed": false
    },
@@ -668,7 +578,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 818,
+   "execution_count": 19,
    "metadata": {
     "collapsed": false
    },
@@ -679,7 +589,7 @@
        "('a', 'a', 'a')"
       ]
      },
-     "execution_count": 818,
+     "execution_count": 19,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -690,7 +600,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 819,
+   "execution_count": 20,
    "metadata": {
     "collapsed": false
    },
@@ -728,7 +638,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 820,
+   "execution_count": 21,
    "metadata": {
     "collapsed": false
    },
@@ -740,7 +650,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 821,
+   "execution_count": 22,
    "metadata": {
     "collapsed": false
    },
@@ -794,7 +704,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 822,
+   "execution_count": 23,
    "metadata": {
     "collapsed": false
    },
@@ -848,7 +758,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 823,
+   "execution_count": 24,
    "metadata": {
     "collapsed": false
    },
@@ -859,7 +769,7 @@
        "1"
       ]
      },
-     "execution_count": 823,
+     "execution_count": 24,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -870,7 +780,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 824,
+   "execution_count": 25,
    "metadata": {
     "collapsed": false
    },
@@ -883,7 +793,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 825,
+   "execution_count": 26,
    "metadata": {
     "collapsed": false
    },
@@ -896,7 +806,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 826,
+   "execution_count": 27,
    "metadata": {
     "collapsed": false
    },
@@ -907,7 +817,7 @@
        "('a', 'a', 'b')"
       ]
      },
-     "execution_count": 826,
+     "execution_count": 27,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -918,7 +828,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 827,
+   "execution_count": 28,
    "metadata": {
     "collapsed": false
    },
@@ -929,7 +839,7 @@
        "False"
       ]
      },
-     "execution_count": 827,
+     "execution_count": 28,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -940,7 +850,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 828,
+   "execution_count": 29,
    "metadata": {
     "collapsed": false
    },
@@ -951,7 +861,7 @@
        "('p', 'p', 'p')"
       ]
      },
-     "execution_count": 828,
+     "execution_count": 29,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -962,7 +872,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 829,
+   "execution_count": 30,
    "metadata": {
     "collapsed": false
    },
@@ -1013,7 +923,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 830,
+   "execution_count": 31,
    "metadata": {
     "collapsed": false
    },
@@ -1024,7 +934,7 @@
        "17576"
       ]
      },
-     "execution_count": 830,
+     "execution_count": 31,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1036,7 +946,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 831,
+   "execution_count": 32,
    "metadata": {
     "collapsed": false
    },
@@ -1047,7 +957,7 @@
        "(('a', 'a', 'b'), True)"
       ]
      },
-     "execution_count": 831,
+     "execution_count": 32,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1059,7 +969,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 832,
+   "execution_count": 33,
    "metadata": {
     "collapsed": false
    },
@@ -1070,7 +980,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 833,
+   "execution_count": 34,
    "metadata": {
     "collapsed": false
    },
@@ -1081,7 +991,7 @@
        "[('a', 'a', 'b')]"
       ]
      },
-     "execution_count": 833,
+     "execution_count": 34,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1097,7 +1007,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 857,
+   "execution_count": 35,
    "metadata": {
     "collapsed": true
    },
@@ -1119,7 +1029,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 835,
+   "execution_count": 36,
    "metadata": {
     "collapsed": false
    },
@@ -1130,7 +1040,7 @@
        "[('a', 'a', 'b')]"
       ]
      },
-     "execution_count": 835,
+     "execution_count": 36,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1141,7 +1051,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 836,
+   "execution_count": 37,
    "metadata": {
     "collapsed": false
    },
@@ -1160,7 +1070,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 837,
+   "execution_count": 38,
    "metadata": {
     "collapsed": false
    },
@@ -1171,7 +1081,7 @@
        "('e', 'l', 'e')"
       ]
      },
-     "execution_count": 837,
+     "execution_count": 38,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1183,7 +1093,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 838,
+   "execution_count": 39,
    "metadata": {
     "collapsed": false
    },
@@ -1194,7 +1104,7 @@
        "'dhnpforeeimgg'"
       ]
      },
-     "execution_count": 838,
+     "execution_count": 39,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1208,7 +1118,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 839,
+   "execution_count": 40,
    "metadata": {
     "collapsed": false
    },
@@ -1219,7 +1129,7 @@
        "('j', 'e', 'o')"
       ]
      },
-     "execution_count": 839,
+     "execution_count": 40,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1230,7 +1140,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 840,
+   "execution_count": 41,
    "metadata": {
     "collapsed": false
    },
@@ -1253,7 +1163,7 @@
        " MenuIem(before='t', after='g', number=13)]"
       ]
      },
-     "execution_count": 840,
+     "execution_count": 41,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1265,7 +1175,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 841,
+   "execution_count": 42,
    "metadata": {
     "collapsed": false,
     "scrolled": true
@@ -1338,7 +1248,7 @@
        " ('z', 'z', 'k')]"
       ]
      },
-     "execution_count": 841,
+     "execution_count": 42,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1355,7 +1265,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 842,
+   "execution_count": 43,
    "metadata": {
     "collapsed": false
    },
@@ -1366,7 +1276,7 @@
        "62"
       ]
      },
-     "execution_count": 842,
+     "execution_count": 43,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1377,7 +1287,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 843,
+   "execution_count": 44,
    "metadata": {
     "collapsed": false,
     "scrolled": true
@@ -1401,7 +1311,7 @@
        " ('y', 'n', 'c')]"
       ]
      },
-     "execution_count": 843,
+     "execution_count": 44,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1418,7 +1328,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 858,
+   "execution_count": 45,
    "metadata": {
     "collapsed": false
    },
@@ -1441,7 +1351,7 @@
        " ('y', 'n', 'c')]"
       ]
      },
-     "execution_count": 858,
+     "execution_count": 45,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1452,7 +1362,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 844,
+   "execution_count": 46,
    "metadata": {
     "collapsed": false
    },
@@ -1469,7 +1379,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 845,
+   "execution_count": 47,
    "metadata": {
     "collapsed": false
    },
@@ -1480,7 +1390,7 @@
        "13"
       ]
      },
-     "execution_count": 845,
+     "execution_count": 47,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1491,7 +1401,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 846,
+   "execution_count": 48,
    "metadata": {
     "collapsed": false
    },
@@ -1503,7 +1413,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 847,
+   "execution_count": 49,
    "metadata": {
     "collapsed": false
    },
@@ -1514,7 +1424,7 @@
        "Signal(bank='e', wire='e')"
       ]
      },
-     "execution_count": 847,
+     "execution_count": 49,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1525,7 +1435,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 848,
+   "execution_count": 50,
    "metadata": {
     "collapsed": false
    },
@@ -1536,7 +1446,7 @@
        "True"
       ]
      },
-     "execution_count": 848,
+     "execution_count": 50,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1547,7 +1457,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 849,
+   "execution_count": 51,
    "metadata": {
     "collapsed": false
    },
@@ -1558,7 +1468,7 @@
        "True"
       ]
      },
-     "execution_count": 849,
+     "execution_count": 51,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1569,7 +1479,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 850,
+   "execution_count": 52,
    "metadata": {
     "collapsed": false
    },
@@ -1623,7 +1533,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 851,
+   "execution_count": 53,
    "metadata": {
     "collapsed": false
    },
@@ -1677,7 +1587,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 852,
+   "execution_count": 54,
    "metadata": {
     "collapsed": false
    },
@@ -1685,15 +1595,15 @@
     {
      "data": {
       "text/plain": [
-       "{frozenset({'e', 'y'}),\n",
-       " frozenset({'t', 'x'}),\n",
+       "{frozenset({'m'}),\n",
        " frozenset({'i', 'n'}),\n",
-       " frozenset({'m'}),\n",
-       " frozenset({'b', 'g'}),\n",
-       " frozenset({'f', 'p'})}"
+       " frozenset({'f', 'p'}),\n",
+       " frozenset({'t', 'x'}),\n",
+       " frozenset({'e', 'y'}),\n",
+       " frozenset({'b', 'g'})}"
       ]
      },
-     "execution_count": 852,
+     "execution_count": 54,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1705,7 +1615,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 853,
+   "execution_count": 55,
    "metadata": {
     "collapsed": false
    },
@@ -1716,7 +1626,7 @@
        "True"
       ]
      },
-     "execution_count": 853,
+     "execution_count": 55,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1727,7 +1637,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 854,
+   "execution_count": 56,
    "metadata": {
     "collapsed": false
    },
@@ -1735,13 +1645,13 @@
     {
      "data": {
       "text/plain": [
-       "({frozenset({1, 2}), frozenset({2, 3}), frozenset({3, 4})},\n",
+       "({frozenset({1, 2}), frozenset({3, 4}), frozenset({2, 3})},\n",
        " frozenset({1, 2}),\n",
        " frozenset({3, 4}),\n",
        " frozenset({2, 3}))"
       ]
      },
-     "execution_count": 854,
+     "execution_count": 56,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1760,7 +1670,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 855,
+   "execution_count": 57,
    "metadata": {
     "collapsed": false
    },
@@ -1771,7 +1681,7 @@
        "False"
       ]
      },
-     "execution_count": 855,
+     "execution_count": 57,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1782,7 +1692,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 856,
+   "execution_count": 58,
    "metadata": {
     "collapsed": false
    },
@@ -1793,7 +1703,7 @@
        "False"
       ]
      },
-     "execution_count": 856,
+     "execution_count": 58,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1828,7 +1738,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.5.1+"
+   "version": "3.4.3+"
   }
  },
  "nbformat": 4,