Created
October 8, 2015 20:22
-
-
Save chakpongchung/fb020e39d8a93519dec9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 410, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "01010001\n", | |
| "64\n", | |
| "1110000011100000111000001110000011110000111100001111000011110000\n", | |
| "1010101010101010101010101010101010101010101010101010101010101010\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import binascii\n", | |
| "def hextobin( hexval):\n", | |
| " '''\n", | |
| " Takes a string representation of hex data with\n", | |
| " arbitrary length and converts to string representation\n", | |
| " of binary. Includes padding 0s\n", | |
| " '''\n", | |
| " thelen = len(hexval)*4\n", | |
| " binval = bin(int(hexval, 16))[2:]\n", | |
| " while ((len(binval)) < thelen):\n", | |
| " binval = '0' + binval\n", | |
| " return binval\n", | |
| "# test hextobin()\n", | |
| "print hextobin('51')\n", | |
| "\n", | |
| "# # INPUT AND KEY for a2 in CS772 FALL 2015\n", | |
| "# input='5500 0000 0000 0055'.replace(\" \", \"\")\n", | |
| "# key='1F1F 1F1F 0F0F 0F0F'.replace(\" \", \"\")\n", | |
| "\n", | |
| "# INPUT AND KEY for a2 in CS772 FALL 2014\n", | |
| "input=' AAAA AAAA AAAA AAAA'.replace(\" \", \"\")\n", | |
| "key='E0E0 E0E0 F0F0 F0F0'.replace(\" \", \"\")\n", | |
| "\n", | |
| "input=hextobin(input)\n", | |
| "key64=hextobin(key)\n", | |
| "print len(key64)\n", | |
| "\n", | |
| "## test case for key64\n", | |
| "# key64='00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001'.replace(\" \", \"\")\n", | |
| "# # test case for ip\n", | |
| "# input='0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111'.replace(\" \", \"\")\n", | |
| "\n", | |
| "print key64\n", | |
| "print input\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 411, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "56\n", | |
| "1110000011100000111000001110000011110000111100001111000011110000\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "pc_1=[ 57,49,41,33,25,17,9,\n", | |
| " 1,58,50,42,34,26,18,\n", | |
| " 10,2,59,51,43,35,27,\n", | |
| " 19,11, 3,60,52,44,36,\n", | |
| " 63,55,47,39,31,23,15,\n", | |
| " 7,62,54,46,38,30,22,\n", | |
| " 14,6,61,53,45,37,29,\n", | |
| " 21,13, 5,28,20,12,4]\n", | |
| "# testing key56 and pc_1\n", | |
| "# key64=[]\n", | |
| "# for i in range(64):\n", | |
| "# key64.append( i )\n", | |
| "\n", | |
| "print len(pc_1)\n", | |
| "print key64" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 412, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "key56=[]\n", | |
| "for i in range(len(pc_1)):\n", | |
| " key56.append( key64[pc_1[i]-1] )\n", | |
| " \n", | |
| "# print key56\n", | |
| "# print pc_1[2]\n", | |
| "# print key64[41]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 413, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "c0=key56[0:len(key56)/2]\n", | |
| "d0=key56[len(key56)/2:]\n", | |
| "# print c0\n", | |
| "# print d0" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 414, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# len(d0)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 415, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "c1=[]\n", | |
| "d1=[]\n", | |
| "for i in range(1,len(c0)):\n", | |
| "# print i\n", | |
| " c1.append(c0[i])\n", | |
| " d1.append(d0[i])\n", | |
| "c1.append(c0[0])\n", | |
| "d1.append(d0[0]) \n", | |
| "# print c1\n", | |
| "# print d1" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 416, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "pc_2=[\n", | |
| "14,17,11,24, 1,5\n", | |
| ", 3,28,15, 6,21,10\n", | |
| ",23,19,12, 4,26,8\n", | |
| ",16, 7,27,20,13,2\n", | |
| ",41,52,31,37,47,55\n", | |
| ",30,40,51,45,33,48\n", | |
| ",44,49,39,56,34,53\n", | |
| ",46,42,50,36,29,32\n", | |
| "]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 417, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "k1=c1+d1\n", | |
| "# print k1\n", | |
| "# len(k1)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 418, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "key48=[]\n", | |
| "for i in range(len(pc_2)):\n", | |
| " key48.append( k1[pc_2[i]-1] )\n", | |
| "# print key48\n", | |
| "# len(key48)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 419, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "ip=[\n", | |
| "58,50,42,34,26,18,10,2\n", | |
| ",60,52,44,36,28,20,12,4\n", | |
| ",62,54,46,38,30,22,14,6\n", | |
| ",64,56,48,40,32,24,16,8\n", | |
| ",57,49,41,33,25,17, 9,1\n", | |
| ",59,51,43,35,27,19,11,3\n", | |
| ",61,53,45,37,29,21,13,5\n", | |
| ",63,55,47,39,31,23,15,7\n", | |
| "]\n", | |
| "# len(ip)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 420, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# # test case for ip\n", | |
| "# input='0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111'.replace(\" \", \"\")\n", | |
| "# print input" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 421, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "inputAfterIP=[]\n", | |
| "for i in range(len(ip)):\n", | |
| " inputAfterIP.append(input[ip[i]-1])\n", | |
| "# print inputAfterIP\n", | |
| "# len(inputAfterIP) " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 422, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "l0=inputAfterIP[:len(inputAfterIP)/2]\n", | |
| "r0=inputAfterIP[len(inputAfterIP)/2:]\n", | |
| "# print l0\n", | |
| "# print r0\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 423, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "l1=r0\n", | |
| "bst=[\n", | |
| " 32,1,2,3,4,5,\n", | |
| " 4,5,6,7,8,9,\n", | |
| " 8,9,10,11,12,13,\n", | |
| "12,13,14,15,16,17,\n", | |
| "16,17,18,19,20,21,\n", | |
| "20,21,22,23,24,25,\n", | |
| "24,25,26,27,28,29,\n", | |
| "28,29,30,31,32,1\n", | |
| "]\n", | |
| "# len(bst)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 424, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "E_r0=[]\n", | |
| "for i in range(len(bst)):\n", | |
| " E_r0.append(r0[bst[i]-1])\n", | |
| "# print E_r0\n", | |
| "# len(E_r0)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 425, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "k1pE_r0=[]\n", | |
| "for i in range(len(key48)):\n", | |
| " k1pE_r0.append( int(key48[i]!=E_r0[i]) ) \n", | |
| "# print k1pE_r0\n", | |
| "# len(k1pE_r0)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 426, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "0\n", | |
| "3\n", | |
| "13\n", | |
| "13\n", | |
| "14\n", | |
| "10\n", | |
| "13\n", | |
| "1\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "import numpy as np\n", | |
| "# s1 = np.matrix('14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7;0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8;4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0;15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13')\n", | |
| "# print s1.item((1,0))\n", | |
| "s1=np.matrix([\n", | |
| "[14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7]\n", | |
| ",[0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8]\n", | |
| ",[4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0]\n", | |
| ",[15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13]\n", | |
| "])\n", | |
| "print s1.item((1,0))\n", | |
| "\n", | |
| "s2=np.matrix([\n", | |
| "[15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10]\n", | |
| ",[3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5]\n", | |
| ",[0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15]\n", | |
| ",[13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9]\n", | |
| "])\n", | |
| "print s2.item((1,0))\n", | |
| "\n", | |
| "s3=np.matrix([\n", | |
| "[10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8]\n", | |
| ",[13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1]\n", | |
| ",[13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7]\n", | |
| ",[1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12]\n", | |
| "])\n", | |
| "print s3.item((1,0))\n", | |
| "\n", | |
| "s4=np.matrix([\n", | |
| "[7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15]\n", | |
| ",[13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9]\n", | |
| ",[10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4]\n", | |
| ",[3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14]\n", | |
| "])\n", | |
| "print s4.item((1,0))\n", | |
| "\n", | |
| "s5=np.matrix([\n", | |
| "[2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9]\n", | |
| ",[14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6]\n", | |
| ",[4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14]\n", | |
| ",[11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3]\n", | |
| "])\n", | |
| "print s5.item((1,0))\n", | |
| "\n", | |
| "\n", | |
| "s6=np.matrix([\n", | |
| " [12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11]\n", | |
| ",[10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8]\n", | |
| ",[9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6]\n", | |
| ",[4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13]\n", | |
| "])\n", | |
| "print s6.item((1,0))\n", | |
| "\n", | |
| "s7=np.matrix([\n", | |
| " [4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1]\n", | |
| ",[13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6]\n", | |
| ",[1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2]\n", | |
| ",[6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12]\n", | |
| "])\n", | |
| "print s7.item((1,0))\n", | |
| "\n", | |
| "s8=np.matrix([\n", | |
| " [13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7]\n", | |
| ",[1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2]\n", | |
| ",[7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8]\n", | |
| ",[2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11]\n", | |
| "])\n", | |
| "print s8.item((1,0))\n", | |
| "\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 427, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "48\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print len(k1pE_r0)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 428, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "B=[]\n", | |
| "for i in range(8):\n", | |
| " B.append(k1pE_r0[6*i:6*i+6])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 429, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[0, 0, 0, 0, 0, 0]\n", | |
| "[0, 0, 0, 0, 0, 0]\n", | |
| "[0, 0, 0, 0, 0, 0]\n", | |
| "[0, 0, 0, 0, 0, 0]\n", | |
| "[1, 1, 1, 1, 1, 1]\n", | |
| "[1, 1, 1, 1, 1, 1]\n", | |
| "[1, 1, 1, 1, 1, 1]\n", | |
| "[1, 1, 1, 1, 1, 1]\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "for i in range(8):\n", | |
| " print B[i]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 430, | |
| "metadata": { | |
| "collapsed": false, | |
| "scrolled": true | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "sBox=[]\n", | |
| "sBox.append(s1)\n", | |
| "sBox.append(s2)\n", | |
| "sBox.append(s3)\n", | |
| "sBox.append(s4)\n", | |
| "sBox.append(s5)\n", | |
| "sBox.append(s6)\n", | |
| "sBox.append(s7)\n", | |
| "sBox.append(s8)\n", | |
| "# print sBox" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 431, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "8\n", | |
| "0 0\n", | |
| "0 0\n", | |
| "0 0\n", | |
| "0 0\n", | |
| "3 15\n", | |
| "3 15\n", | |
| "3 15\n", | |
| "3 15\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "result32=''\n", | |
| "print len(B)\n", | |
| "for i in range(len(B)):\n", | |
| " row=int(str(B[i][0])+str(B[i][-1]), 2)\n", | |
| " column=int(str(B[i][1])+str(B[i][2])+str(B[i][3])+str(B[i][4]), 2)\n", | |
| " print row,column\n", | |
| " temp=sBox[i].item((row,column))\n", | |
| " result32+=(\"{0:04b}\".format(temp))\n", | |
| "# print result32\n", | |
| "# len(result32)\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 432, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# print l1\n" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 433, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "p=[16,7,20,21\n", | |
| ",29,12,28,17\n", | |
| ", 1,15,23,26\n", | |
| ", 5,18,31,10\n", | |
| ", 2,8,24,14\n", | |
| ",32,27,3,9\n", | |
| ",19,13,30,6\n", | |
| ",22,11,4,25]" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 434, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "f=[]\n", | |
| "for i in range(len(p)):\n", | |
| " f.append( result32[p[i]-1] )\n", | |
| "# print f " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 435, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "[1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1]\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "r1=[]\n", | |
| "for i in range(len(l0)):\n", | |
| " r1.append( int(l0[i]!=f[i]) ) \n", | |
| "print r1" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 436, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# final answer for the first around of DES\n", | |
| "l1=[int(x) for x in l1]\n", | |
| "# print l1\n", | |
| "# print r1\n", | |
| "\n", | |
| "l1=[str(x) for x in l1]\n", | |
| "r1=[str(x) for x in r1]\n", | |
| "# print l1\n", | |
| "# print r1" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 437, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# print len(l1),len(r1)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 438, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '0', '0', '0', '1', '1', '0', '1', '1', '0', '1', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '0', '0', '1', '1', '1', '0', '1']\n", | |
| "64\n", | |
| "0xd\n", | |
| "['0xf', '0xf', '0xf', '0xf', '0xf', '0xf', '0xf', '0xf', '0xf', '0x8', '0xd', '0xa', '0xf', '0xb', '0x9', '0xd']\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# final result in hex !!!!\n", | |
| "\n", | |
| "print l1+r1\n", | |
| "print len(l1+r1)\n", | |
| "lr=l1+r1\n", | |
| "result=[]\n", | |
| "for x in range(len(lr)/4):\n", | |
| " result.append( hex( int(''.join(lr[4*x:4*x+4]), 2) ) )\n", | |
| "print hex(int(''.join( lr[60:60+4] ), 2))\n", | |
| "print result" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 439, | |
| "metadata": { | |
| "collapsed": false | |
| }, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "0x0\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print h" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "collapsed": true | |
| }, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 2", | |
| "language": "python", | |
| "name": "python2" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 2 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython2", | |
| "version": "2.7.9" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment