{"action":"created","comment":{"url":"https://api.github.com/repos/spiretrading/sudoku/pulls/comments/187075332","pull_request_review_id":118776902,"id":187075332,"diff_hunk":"@@ -49,63 +49,286 @@ export class Board {\n \n   /** Returns a copy of this board. */\n   public clone(): Board {\n-    return null;\n+    const clone = Object.assign(this);\n+    clone.set = this.set;\n+    clone.get = this.get;\n+    clone.clone = this.clone;\n+    return clone;\n   }\n \n   private values: Array<Array<number>>;\n }\n \n /** Generates a solved Sudoku board. */\n export function generateBoard(): Board {\n+  const getRandomIntInRange = function(min:number, max:number): number {\n+    return Math.floor(Math.random() * (max - min + 1)) + min;\n+  }\n+  const swapRowWithin3x3BlockRow = function(board:Board): Board {\n+    let newBoard = board.clone();\n+    const blockRowForSwap = Math.floor(getRandomIntInRange(0, Board.ROWS -1) /3) * 3;\n+    const rowOne = getRandomIntInRange(blockRowForSwap, blockRowForSwap + 2);\n+    let rowTwo = getRandomIntInRange(blockRowForSwap, blockRowForSwap + 2);\n+    while(rowTwo === rowOne) {\n+      rowTwo = getRandomIntInRange(blockRowForSwap, blockRowForSwap + 2);\n+    }\n+    let column = 0;\n+    while(column < Board.COLUMNS) {\n+      const rowOneValue = board.get(rowOne, column);\n+      const rowTwoValue = board.get(rowTwo, column);\n+      newBoard.set(rowTwo, column, rowOneValue);\n+      newBoard.set(rowOne, column, rowTwoValue);\n+      column += 1;\n+    }\n+    return newBoard;\n+  }\n+\n+  const swapColumnWithin3x3BlockColumn = function(board:Board): Board {\n+    let newBoard = board.clone();\n+    const blockRowForSwap = Math.floor(getRandomIntInRange(0, Board.COLUMNS -1) /3) * 3;\n+    const columnOne = getRandomIntInRange(blockRowForSwap, blockRowForSwap + 2);\n+    let columnTwo = getRandomIntInRange(blockRowForSwap, blockRowForSwap + 2);\n+    while(columnOne === columnTwo) {\n+      columnTwo = getRandomIntInRange(blockRowForSwap, blockRowForSwap + 2);\n+    }\n+    let row = 0;\n+    while(row < Board.ROWS) {\n+      const columnOneValue = board.get(row, columnOne);\n+      const columnTwoValue = board.get(row, columnTwo);\n+      newBoard.set(row, columnOne, columnTwoValue);\n+      newBoard.set(row, columnTwo, columnOneValue);\n+      row += 1;\n+    }\n+    return newBoard;\n+  }\n+\n+  const swap3x3BlockRow = function(board:Board):Board {\n+    let newBoard = board.clone();\n+    const blockRowOne = Math.floor(getRandomIntInRange(0, Board.ROWS -1) /3) * 3;\n+    let blockRowTwo = Math.floor(getRandomIntInRange(0, Board.ROWS -1) /3) * 3;\n+    while(blockRowTwo === blockRowOne) {\n+      blockRowTwo = Math.floor(getRandomIntInRange(0, Board.ROWS -1) /3) * 3;\n+    }\n+    let rowOffset = 0;\n+    while(rowOffset < 3) {\n+      let column = 0;\n+      while(column < Board.COLUMNS) {\n+        const blockRowOneValue = board.get(blockRowOne + rowOffset, column);\n+        const blockRowTwoValue = board.get(blockRowTwo + rowOffset, column);\n+        newBoard.set(blockRowOne + rowOffset, column, blockRowTwoValue);\n+        newBoard.set(blockRowTwo + rowOffset, column, blockRowOneValue);\n+        column += 1;\n+      }\n+      rowOffset += 1;\n+    }\n+    return newBoard;\n+  }\n+\n+  const swap3x3BlockColumn = function(board:Board):Board {\n+    let newBoard = board.clone();\n+    const blockColumnOne = Math.floor(getRandomIntInRange(0, Board.COLUMNS -1) /3) * 3;\n+    let blockColumnTwo = Math.floor(getRandomIntInRange(0, Board.COLUMNS -1) /3) * 3;\n+    while(blockColumnTwo === blockColumnOne) {\n+      blockColumnTwo = Math.floor(getRandomIntInRange(0, Board.COLUMNS -1) /3) * 3;\n+    }\n+    let columnOffset = 0;\n+    while(columnOffset < 3) {\n+      let row = 0;\n+      while(row < Board.COLUMNS) {\n+        const blockColumnOneValue = board.get(row, blockColumnOne + columnOffset);\n+        const blockColumnTwoValue = board.get(row, blockColumnTwo + columnOffset);\n+        newBoard.set(row, blockColumnOne + columnOffset, blockColumnTwoValue);\n+        newBoard.set(row, blockColumnTwo + columnOffset, blockColumnOneValue);\n+        row += 1;\n+      }\n+      columnOffset += 1;\n+    }\n+    return newBoard;\n+  }\n+\n   let b = new Board();\n-  return b;\n+  const solvedBoard = solve(b);\n+  let newBoard = solvedBoard.clone();\n+  const minNumOperations = 0;\n+  const maxNumOperations = 100;\n+  const numOperations = getRandomIntInRange(minNumOperations, maxNumOperations);\n+  let i = 0;\n+  while(i < numOperations) {\n+    const decisionMakingNumber = Math.random();\n+    if(decisionMakingNumber <= 1/4) {\n+      newBoard = swapRowWithin3x3BlockRow(newBoard);\n+    } else if(decisionMakingNumber > 1/4 && decisionMakingNumber <= 1/2) {\n+      newBoard = swapColumnWithin3x3BlockColumn(newBoard);\n+    } else if(decisionMakingNumber > 1/2 && decisionMakingNumber <= 3/4) {\n+        newBoard = swap3x3BlockRow(newBoard);\n+    } else {\n+      newBoard = swap3x3BlockColumn(newBoard);\n+    }\n+    i += 1;\n+  }\n+  return newBoard;\n }\n \n /** Returns true iff the board represents a solution to a Sudoku puzzle.\n  * @param board - The board to test.\n  * @return true iff the board is a solution.\n  */\n export function isSolved(board: Board): boolean {\n-  return false;\n+  let byRow = new Map<number, Array<number>>();\n+  let byColumn = new Map<number, Array<number>>();\n+  let by3x3 = new Map<String, Array<number>>();\n+  let row = 0;\n+  while(row < Board.ROWS) {\n+    let column = 0;\n+    while(column < Board.ROWS) {\n+      const cell = board.get(row, column);\n+      if(cell < 1 || cell > 9) {\n+        return false;\n+      }\n+      const by3x3LeastMostRow = Math.floor(row/3) * 3;\n+      const by3x3LeastMostColumn = Math.floor(column/3) * 3;\n+      const by3x3Id = by3x3LeastMostRow + ',' + by3x3LeastMostColumn;\n+      let rowToCheck;\n+      let columnToCheck;\n+      let by3x3BlockToCheck;\n+      if(!byRow.has(row)) {\n+        rowToCheck = new Array<number>();\n+      } else {\n+        rowToCheck = byRow.get(row);\n+      }\n+      if(!byColumn.has(column)) {\n+        columnToCheck = new Array<number>();\n+      } else {\n+        columnToCheck = byColumn.get(column);\n+      }\n+      if(!by3x3.has(by3x3Id)) {\n+        by3x3BlockToCheck = new Array<number>();\n+      } else {\n+        by3x3BlockToCheck = by3x3.get(by3x3Id);\n+      }\n+      const rowAlreadyContainsValue = rowToCheck.filter((rowValue) => rowValue == cell).length > 0;\n+      const columnAlreadyContainsValue = columnToCheck.filter((rowValue) => rowValue == cell).length > 0;\n+      const by3x3BlockAlreadyContainsValue = by3x3BlockToCheck.filter((rowValue) => rowValue == cell).length > 0;\n+      if(rowAlreadyContainsValue || columnAlreadyContainsValue || by3x3BlockAlreadyContainsValue) {\n+        return false;\n+      }\n+      rowToCheck.push(cell);\n+      columnToCheck.push(cell);\n+      by3x3BlockToCheck.push(cell);\n+      byRow.set(row, rowToCheck);\n+      byColumn.set(column, columnToCheck);\n+      by3x3.set(by3x3Id, by3x3BlockToCheck);\n+      column += 1;\n+    }\n+    row += 1;\n+  }\n+  return true;\n+}\n+/** Returns true iff the board represents a valid sudoku board\n+ * ie: there are no violations of the sudoku rules, however some cells may be blank.\n+ * @param board - The board to test.\n+ * @return true iff the board is a solution.\n+ */\n+function isValid(board: Board): boolean {\n+  let byRow = new Map<number, Array<number>>();\n+  let byColumn = new Map<number, Array<number>>();\n+  let by3x3 = new Map<String, Array<number>>();\n+  let row = 0;\n+  while(row < Board.ROWS) {\n+    let column = 0;\n+    while(column < Board.ROWS) {\n+      const cell = board.get(row, column);\n+      if(cell == 0) {\n+        column += 1;\n+        continue;\n+      }\n+      const by3x3LeastMostRow = Math.floor(row/3) * 3;\n+      const by3x3LeastMostColumn = Math.floor(column/3) * 3;\n+      const by3x3Id = by3x3LeastMostRow + ',' + by3x3LeastMostColumn;\n+      let rowToCheck;\n+      let columnToCheck;\n+      let by3x3BlockToCheck;\n+      if(!byRow.has(row)) {\n+        rowToCheck = new Array<number>();\n+      } else {\n+        rowToCheck = byRow.get(row);\n+      }\n+      if(!byColumn.has(column)) {\n+        columnToCheck = new Array<number>();\n+      } else {\n+        columnToCheck = byColumn.get(column);\n+      }\n+      if(!by3x3.has(by3x3Id)) {\n+        by3x3BlockToCheck = new Array<number>();\n+      } else {\n+        by3x3BlockToCheck = by3x3.get(by3x3Id);\n+      }\n+      const rowAlreadyContainsValue = rowToCheck.filter((rowValue) => rowValue == cell).length > 0;\n+      const columnAlreadyContainsValue = columnToCheck.filter((rowValue) => rowValue == cell).length > 0;\n+      const by3x3BlockAlreadyContainsValue = by3x3BlockToCheck.filter((rowValue) => rowValue == cell).length > 0;\n+      if(rowAlreadyContainsValue || columnAlreadyContainsValue || by3x3BlockAlreadyContainsValue) {\n+        return false;\n+      }\n+      rowToCheck.push(cell);\n+      columnToCheck.push(cell);\n+      by3x3BlockToCheck.push(cell);\n+      byRow.set(row, rowToCheck);\n+      byColumn.set(column, columnToCheck);\n+      by3x3.set(by3x3Id, by3x3BlockToCheck);\n+      column += 1;\n+    }\n+    row += 1;\n+  }\n+  return true;\n }\n-\n /** Returns a solved version of a Sudoku board.\n  * @param board - The board to solve.\n  * @return A solved instance of the board, or null if no solution exists or\n  *         the solution is not unique. The return value will always be a\n  *         distinct object from the board argument.\n  */\n-export function solve(board: Board): Board {\n+export function solve(board:Board): Board {\n   let b = board.clone();\n-  if(isSolved(b)) {\n+  if(isSolved(b)){\n     return b;\n   }\n-  for(let i = 0; i < Board.ROWS; ++i) {\n-    for(let j = 0; j < Board.COLUMNS; ++j) {\n-      if(b.get(i, j) == 0) {\n-        let solution = null;\n-        for(let v = 1; v <= 9; ++v) {\n-          b.set(i, j, v);\n-          if(isSolved(b)) {\n-            if(solution == null) {\n-              solution = b.clone();\n-            } else {\n-              return null;\n-            }\n-          } else {\n-            let s = solve(b);\n-            if(s != null) {\n-              if(solution == null) {\n-                solution = b.clone();\n-              } else {\n-                return null;\n-              }\n-            }\n+  const solveRecursive = function(i:number, j:number, board: Board):Board {\n+    if(i >= Board.ROWS) {\n+      return board;\n+    }\n+    if(board.get(i, j) != 0) {\n+      if(isValid(board)) {\n+        let newI = i;\n+        let newJ = j + 1;\n+        if(newJ >= Board.COLUMNS) {\n+          newJ = 0;\n+          newI += 1;\n+        }\n+        return solveRecursive(newI, newJ, b);\n+      } else {\n+        return null;\n+      }\n+    } else {\n+      for(let val = 1; val < 10; val += 1){\n+        board.set(i, j, val);\n+        if(! isValid(board)) {","path":"library/source/board.ts","position":293,"original_position":293,"commit_id":"692a4a59f0a1d7e8b6aa77e55d8e72f9ecc3eae2","original_commit_id":"e3c72b020781a207edafbb31658b255c91138370","user":{"login":"kranar","id":16565529,"avatar_url":"https://avatars3.githubusercontent.com/u/16565529?v=4","gravatar_id":"","url":"https://api.github.com/users/kranar","html_url":"https://github.com/kranar","followers_url":"https://api.github.com/users/kranar/followers","following_url":"https://api.github.com/users/kranar/following{/other_user}","gists_url":"https://api.github.com/users/kranar/gists{/gist_id}","starred_url":"https://api.github.com/users/kranar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kranar/subscriptions","organizations_url":"https://api.github.com/users/kranar/orgs","repos_url":"https://api.github.com/users/kranar/repos","events_url":"https://api.github.com/users/kranar/events{/privacy}","received_events_url":"https://api.github.com/users/kranar/received_events","type":"User","site_admin":false},"body":"No space after !,\r\n\r\n!isValid(board)","created_at":"2018-05-09T15:15:21Z","updated_at":"2018-05-09T15:16:25Z","html_url":"https://github.com/spiretrading/sudoku/pull/4#discussion_r187075332","pull_request_url":"https://api.github.com/repos/spiretrading/sudoku/pulls/4","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/spiretrading/sudoku/pulls/comments/187075332"},"html":{"href":"https://github.com/spiretrading/sudoku/pull/4#discussion_r187075332"},"pull_request":{"href":"https://api.github.com/repos/spiretrading/sudoku/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/spiretrading/sudoku/pulls/4","id":186949057,"html_url":"https://github.com/spiretrading/sudoku/pull/4","diff_url":"https://github.com/spiretrading/sudoku/pull/4.diff","patch_url":"https://github.com/spiretrading/sudoku/pull/4.patch","issue_url":"https://api.github.com/repos/spiretrading/sudoku/issues/4","number":4,"state":"open","locked":false,"title":"Fb1017","user":{"login":"nicola-spire","id":38888166,"avatar_url":"https://avatars1.githubusercontent.com/u/38888166?v=4","gravatar_id":"","url":"https://api.github.com/users/nicola-spire","html_url":"https://github.com/nicola-spire","followers_url":"https://api.github.com/users/nicola-spire/followers","following_url":"https://api.github.com/users/nicola-spire/following{/other_user}","gists_url":"https://api.github.com/users/nicola-spire/gists{/gist_id}","starred_url":"https://api.github.com/users/nicola-spire/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicola-spire/subscriptions","organizations_url":"https://api.github.com/users/nicola-spire/orgs","repos_url":"https://api.github.com/users/nicola-spire/repos","events_url":"https://api.github.com/users/nicola-spire/events{/privacy}","received_events_url":"https://api.github.com/users/nicola-spire/received_events","type":"User","site_admin":false},"body":"Passing all tests. ","created_at":"2018-05-09T14:58:56Z","updated_at":"2018-05-09T15:16:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"66f600a9b854230833ca5a53bc9a1e91169119fe","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/spiretrading/sudoku/pulls/4/commits","review_comments_url":"https://api.github.com/repos/spiretrading/sudoku/pulls/4/comments","review_comment_url":"https://api.github.com/repos/spiretrading/sudoku/pulls/comments{/number}","comments_url":"https://api.github.com/repos/spiretrading/sudoku/issues/4/comments","statuses_url":"https://api.github.com/repos/spiretrading/sudoku/statuses/692a4a59f0a1d7e8b6aa77e55d8e72f9ecc3eae2","head":{"label":"spiretrading:fb1017","ref":"fb1017","sha":"692a4a59f0a1d7e8b6aa77e55d8e72f9ecc3eae2","user":{"login":"spiretrading","id":28539267,"avatar_url":"https://avatars0.githubusercontent.com/u/28539267?v=4","gravatar_id":"","url":"https://api.github.com/users/spiretrading","html_url":"https://github.com/spiretrading","followers_url":"https://api.github.com/users/spiretrading/followers","following_url":"https://api.github.com/users/spiretrading/following{/other_user}","gists_url":"https://api.github.com/users/spiretrading/gists{/gist_id}","starred_url":"https://api.github.com/users/spiretrading/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spiretrading/subscriptions","organizations_url":"https://api.github.com/users/spiretrading/orgs","repos_url":"https://api.github.com/users/spiretrading/repos","events_url":"https://api.github.com/users/spiretrading/events{/privacy}","received_events_url":"https://api.github.com/users/spiretrading/received_events","type":"Organization","site_admin":false},"repo":{"id":130869186,"name":"sudoku","full_name":"spiretrading/sudoku","owner":{"login":"spiretrading","id":28539267,"avatar_url":"https://avatars0.githubusercontent.com/u/28539267?v=4","gravatar_id":"","url":"https://api.github.com/users/spiretrading","html_url":"https://github.com/spiretrading","followers_url":"https://api.github.com/users/spiretrading/followers","following_url":"https://api.github.com/users/spiretrading/following{/other_user}","gists_url":"https://api.github.com/users/spiretrading/gists{/gist_id}","starred_url":"https://api.github.com/users/spiretrading/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spiretrading/subscriptions","organizations_url":"https://api.github.com/users/spiretrading/orgs","repos_url":"https://api.github.com/users/spiretrading/repos","events_url":"https://api.github.com/users/spiretrading/events{/privacy}","received_events_url":"https://api.github.com/users/spiretrading/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spiretrading/sudoku","description":"Starter Project for Typescript","fork":false,"url":"https://api.github.com/repos/spiretrading/sudoku","forks_url":"https://api.github.com/repos/spiretrading/sudoku/forks","keys_url":"https://api.github.com/repos/spiretrading/sudoku/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spiretrading/sudoku/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spiretrading/sudoku/teams","hooks_url":"https://api.github.com/repos/spiretrading/sudoku/hooks","issue_events_url":"https://api.github.com/repos/spiretrading/sudoku/issues/events{/number}","events_url":"https://api.github.com/repos/spiretrading/sudoku/events","assignees_url":"https://api.github.com/repos/spiretrading/sudoku/assignees{/user}","branches_url":"https://api.github.com/repos/spiretrading/sudoku/branches{/branch}","tags_url":"https://api.github.com/repos/spiretrading/sudoku/tags","blobs_url":"https://api.github.com/repos/spiretrading/sudoku/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spiretrading/sudoku/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spiretrading/sudoku/git/refs{/sha}","trees_url":"https://api.github.com/repos/spiretrading/sudoku/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spiretrading/sudoku/statuses/{sha}","languages_url":"https://api.github.com/repos/spiretrading/sudoku/languages","stargazers_url":"https://api.github.com/repos/spiretrading/sudoku/stargazers","contributors_url":"https://api.github.com/repos/spiretrading/sudoku/contributors","subscribers_url":"https://api.github.com/repos/spiretrading/sudoku/subscribers","subscription_url":"https://api.github.com/repos/spiretrading/sudoku/subscription","commits_url":"https://api.github.com/repos/spiretrading/sudoku/commits{/sha}","git_commits_url":"https://api.github.com/repos/spiretrading/sudoku/git/commits{/sha}","comments_url":"https://api.github.com/repos/spiretrading/sudoku/comments{/number}","issue_comment_url":"https://api.github.com/repos/spiretrading/sudoku/issues/comments{/number}","contents_url":"https://api.github.com/repos/spiretrading/sudoku/contents/{+path}","compare_url":"https://api.github.com/repos/spiretrading/sudoku/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spiretrading/sudoku/merges","archive_url":"https://api.github.com/repos/spiretrading/sudoku/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spiretrading/sudoku/downloads","issues_url":"https://api.github.com/repos/spiretrading/sudoku/issues{/number}","pulls_url":"https://api.github.com/repos/spiretrading/sudoku/pulls{/number}","milestones_url":"https://api.github.com/repos/spiretrading/sudoku/milestones{/number}","notifications_url":"https://api.github.com/repos/spiretrading/sudoku/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spiretrading/sudoku/labels{/name}","releases_url":"https://api.github.com/repos/spiretrading/sudoku/releases{/id}","deployments_url":"https://api.github.com/repos/spiretrading/sudoku/deployments","created_at":"2018-04-24T14:42:38Z","updated_at":"2018-05-08T18:42:51Z","pushed_at":"2018-05-09T15:10:39Z","git_url":"git://github.com/spiretrading/sudoku.git","ssh_url":"git@github.com:spiretrading/sudoku.git","clone_url":"https://github.com/spiretrading/sudoku.git","svn_url":"https://github.com/spiretrading/sudoku","homepage":null,"size":13111,"stargazers_count":0,"watchers_count":0,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"spiretrading:master","ref":"master","sha":"895de3d221c0d922f4457bbbe43111e75f132e6b","user":{"login":"spiretrading","id":28539267,"avatar_url":"https://avatars0.githubusercontent.com/u/28539267?v=4","gravatar_id":"","url":"https://api.github.com/users/spiretrading","html_url":"https://github.com/spiretrading","followers_url":"https://api.github.com/users/spiretrading/followers","following_url":"https://api.github.com/users/spiretrading/following{/other_user}","gists_url":"https://api.github.com/users/spiretrading/gists{/gist_id}","starred_url":"https://api.github.com/users/spiretrading/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spiretrading/subscriptions","organizations_url":"https://api.github.com/users/spiretrading/orgs","repos_url":"https://api.github.com/users/spiretrading/repos","events_url":"https://api.github.com/users/spiretrading/events{/privacy}","received_events_url":"https://api.github.com/users/spiretrading/received_events","type":"Organization","site_admin":false},"repo":{"id":130869186,"name":"sudoku","full_name":"spiretrading/sudoku","owner":{"login":"spiretrading","id":28539267,"avatar_url":"https://avatars0.githubusercontent.com/u/28539267?v=4","gravatar_id":"","url":"https://api.github.com/users/spiretrading","html_url":"https://github.com/spiretrading","followers_url":"https://api.github.com/users/spiretrading/followers","following_url":"https://api.github.com/users/spiretrading/following{/other_user}","gists_url":"https://api.github.com/users/spiretrading/gists{/gist_id}","starred_url":"https://api.github.com/users/spiretrading/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spiretrading/subscriptions","organizations_url":"https://api.github.com/users/spiretrading/orgs","repos_url":"https://api.github.com/users/spiretrading/repos","events_url":"https://api.github.com/users/spiretrading/events{/privacy}","received_events_url":"https://api.github.com/users/spiretrading/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spiretrading/sudoku","description":"Starter Project for Typescript","fork":false,"url":"https://api.github.com/repos/spiretrading/sudoku","forks_url":"https://api.github.com/repos/spiretrading/sudoku/forks","keys_url":"https://api.github.com/repos/spiretrading/sudoku/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spiretrading/sudoku/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spiretrading/sudoku/teams","hooks_url":"https://api.github.com/repos/spiretrading/sudoku/hooks","issue_events_url":"https://api.github.com/repos/spiretrading/sudoku/issues/events{/number}","events_url":"https://api.github.com/repos/spiretrading/sudoku/events","assignees_url":"https://api.github.com/repos/spiretrading/sudoku/assignees{/user}","branches_url":"https://api.github.com/repos/spiretrading/sudoku/branches{/branch}","tags_url":"https://api.github.com/repos/spiretrading/sudoku/tags","blobs_url":"https://api.github.com/repos/spiretrading/sudoku/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spiretrading/sudoku/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spiretrading/sudoku/git/refs{/sha}","trees_url":"https://api.github.com/repos/spiretrading/sudoku/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spiretrading/sudoku/statuses/{sha}","languages_url":"https://api.github.com/repos/spiretrading/sudoku/languages","stargazers_url":"https://api.github.com/repos/spiretrading/sudoku/stargazers","contributors_url":"https://api.github.com/repos/spiretrading/sudoku/contributors","subscribers_url":"https://api.github.com/repos/spiretrading/sudoku/subscribers","subscription_url":"https://api.github.com/repos/spiretrading/sudoku/subscription","commits_url":"https://api.github.com/repos/spiretrading/sudoku/commits{/sha}","git_commits_url":"https://api.github.com/repos/spiretrading/sudoku/git/commits{/sha}","comments_url":"https://api.github.com/repos/spiretrading/sudoku/comments{/number}","issue_comment_url":"https://api.github.com/repos/spiretrading/sudoku/issues/comments{/number}","contents_url":"https://api.github.com/repos/spiretrading/sudoku/contents/{+path}","compare_url":"https://api.github.com/repos/spiretrading/sudoku/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spiretrading/sudoku/merges","archive_url":"https://api.github.com/repos/spiretrading/sudoku/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spiretrading/sudoku/downloads","issues_url":"https://api.github.com/repos/spiretrading/sudoku/issues{/number}","pulls_url":"https://api.github.com/repos/spiretrading/sudoku/pulls{/number}","milestones_url":"https://api.github.com/repos/spiretrading/sudoku/milestones{/number}","notifications_url":"https://api.github.com/repos/spiretrading/sudoku/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spiretrading/sudoku/labels{/name}","releases_url":"https://api.github.com/repos/spiretrading/sudoku/releases{/id}","deployments_url":"https://api.github.com/repos/spiretrading/sudoku/deployments","created_at":"2018-04-24T14:42:38Z","updated_at":"2018-05-08T18:42:51Z","pushed_at":"2018-05-09T15:10:39Z","git_url":"git://github.com/spiretrading/sudoku.git","ssh_url":"git@github.com:spiretrading/sudoku.git","clone_url":"https://github.com/spiretrading/sudoku.git","svn_url":"https://github.com/spiretrading/sudoku","homepage":null,"size":13111,"stargazers_count":0,"watchers_count":0,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spiretrading/sudoku/pulls/4"},"html":{"href":"https://github.com/spiretrading/sudoku/pull/4"},"issue":{"href":"https://api.github.com/repos/spiretrading/sudoku/issues/4"},"comments":{"href":"https://api.github.com/repos/spiretrading/sudoku/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/spiretrading/sudoku/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/spiretrading/sudoku/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/spiretrading/sudoku/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/spiretrading/sudoku/statuses/692a4a59f0a1d7e8b6aa77e55d8e72f9ecc3eae2"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"kranar"}}