{"action":"created","comment":{"url":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/comments/24735454","id":24735454,"diff_hunk":"@@ -37,37 +44,207 @@ DECLARE_int32(demo_port);\n namespace demo {\n \n using bricks::FileSystem;\n+using bricks::time::Now;\n+using bricks::strings::Printf;\n using bricks::net::api::HTTP;\n using bricks::net::api::Request;\n using bricks::net::HTTPResponseCode;\n using namespace bricks::gnuplot;\n+using namespace bricks::cerealize;\n+\n+\n+struct LayoutCell {\n+  std::string meta_url = \"/meta\";\n+\n+  // Define only output serialization (`JSON.stringify()`), forbid input serialization (`JSON.parse()`).\n+  template <typename A>\n+  void save(A& ar) const {\n+    ar(CEREAL_NVP(meta_url));\n+  }\n+};\n+static_assert(is_write_cerealizable<LayoutCell>::value, \"\");\n+static_assert(!is_read_cerealizable<LayoutCell>::value, \"\");\n+\n+struct LayoutItem {\n+  std::vector<LayoutItem> row;\n+  std::vector<LayoutItem> col;\n+  LayoutCell cell;\n+\n+  // Define only output serialization (`JSON.stringify()`), forbid input serialization (`JSON.parse()`).\n+  template <typename A>\n+  void save(A& ar) const {\n+    if (!row.empty()) {\n+      ar(CEREAL_NVP(row));\n+    } else if (!col.empty()) {\n+      ar(CEREAL_NVP(col));\n+    } else {\n+      ar(CEREAL_NVP(cell));\n+    }\n+  }\n+};\n+static_assert(is_write_cerealizable<LayoutItem>::value, \"\");\n+static_assert(!is_read_cerealizable<LayoutItem>::value, \"\");\n+\n+struct ExampleMeta {\n+  struct Options {\n+    std::string header_text = \"Real-time Data Made Easy\";\n+    std::string color = \"blue\";\n+    double min = 0;\n+    double max = 1;\n+    double time_interval = 10000;\n+    template <typename A>\n+    void serialize(A& ar) {\n+      ar(CEREAL_NVP(header_text),\n+         CEREAL_NVP(color),\n+         CEREAL_NVP(min),\n+         CEREAL_NVP(max),\n+         CEREAL_NVP(time_interval));\n+    }\n+  };\n+  std::string data_url = \"/data\";\n+  std::string visualizer_name = \"plot-visualizer\";\n+  Options visualizer_options;\n+  template <typename A>\n+  void serialize(A& ar) {\n+    ar(CEREAL_NVP(data_url), CEREAL_NVP(visualizer_name), CEREAL_NVP(visualizer_options));\n+  }\n+};\n+\n \n-struct DemoServer {\n+class DemoServer {\n+ public:\n   DemoServer(int port = FLAGS_demo_port) : port_(port) {\n+    printf(\"Preparing to listen on port %d...\\n\", port_);\n     HTTP(port).Register(\"/ok\", [](Request r) { r.connection.SendHTTPResponse(\"OK\\n\"); });\n     HTTP(port).Register(\"/uptime\", UptimeTracker());\n-    HTTP(port).Register(\"/\", State::ClassBoundaries);\n-    FileSystem::ScanDir(\"static\", [&port](const std::string& fn) {\n+    HTTP(port).Register(\"/yingyang.svg\", State::ClassBoundaries);\n+    HTTP(port).Register(\"/config.json\", [](Request r) {\n+      // TODO(sompylasar): Use cerealize.\n+      r.connection.SendHTTPResponse(\n+          \"{}\\n\",\n+          HTTPResponseCode::OK, \"application/json\");\n+    });\n+    HTTP(port).Register(\"/layout/data\", [](Request r) {\n+      std::thread([](Request&& r) {\n+                    // Since we are in another thread, need to catch exceptions ourselves.\n+                    try {\n+                      auto response = r.connection.SendChunkedHTTPResponse(\n+                          HTTPResponseCode::OK,\n+                          \"application/json; charset=utf-8\",\n+                          {{\"Connection\", \"keep-alive\"}, {\"Access-Control-Allow-Origin\", \"*\"}});\n+                      std::string data;\n+                      const double begin = static_cast<double>(Now());\n+                      const double t = atof(r.url.query[\"t\"].c_str());\n+                      const double end = (t > 0) ? (begin + t * 1e3) : 1e18;\n+                      double current;\n+                      while ((current = static_cast<double>(Now())) < end) {\n+                        std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 100 + 100));\n+                        const double x = current;\n+                        const double y = sin(5e-3 * (current - begin));\n+                        data += Printf(\"{\\\"x\\\":%lf,\\\"y\\\":%lf}\\n\", x, y);\n+                        const double f = (rand() % 101) * (rand() % 101) * (rand() % 101) * 1e-6;\n+                        const size_t n = static_cast<size_t>(data.length() * f);\n+                        if (n) {\n+                          response.Send(data.substr(0, n));\n+                          data = data.substr(n);\n+                        }\n+                      }\n+                    } catch (const std::exception& e) {\n+                      std::cerr << \"Exception in data serving thread: \" << e.what() << std::endl;\n+                    }\n+                  },\n+                  std::move(r)).detach();\n+    });\n+    HTTP(port).Register(\"/layout/meta\", [](Request r) {\n+      r.connection.SendHTTPResponse(ExampleMeta(),\n+                                    \"meta\",\n+                                    HTTPResponseCode::OK,\n+                                    \"application/json; charset=utf-8\",\n+                                    {{\"Connection\", \"close\"}, {\"Access-Control-Allow-Origin\", \"*\"}});\n+    });\n+    HTTP(port).Register(\"/layout\", [](Request r) {\n+      LayoutItem layout;\n+      LayoutItem row;\n+      layout.col.push_back(row);\n+      r.connection.SendHTTPResponse(layout,\n+                                    \"layout\",\n+                                    HTTPResponseCode::OK,\n+                                    \"application/json; charset=utf-8\",\n+                                    {{\"Connection\", \"close\"}, {\"Access-Control-Allow-Origin\", \"*\"}});\n+    });\n+    // The \"./static/\" directory should be a symlink to \"Web/build\" or \"Web/build-dev\".\n+    FileSystem::ScanDir(\"./static/\", [&port](const std::string& filename) {\n+      std::string filepath = \"./static/\" + filename;\n+      std::string fileurl = \"/static/\" + filename;\n+      // The default route points to the frontend entry point file.\n+      if (filename == \"index.html\") {\n+        fileurl.assign(\"/\");\n+      }\n       // Hack with string ownership.\n       // TODO(dkorolev): Make this cleaner.\n-      std::string* ps = new std::string();\n-      *ps = FileSystem::ReadFileAsString(\"static/\" + fn);\n-      HTTP(port).Register(\"/static/\" + fn, [ps](Request r) {\n-        r.connection.SendHTTPResponse(*ps, HTTPResponseCode::OK, \"text/plain\");\n+      std::string* contentType = new std::string(DemoServer::GetFileMimeType(filename));\n+      std::string* content = new std::string();\n+      *content = FileSystem::ReadFileAsString(filepath);\n+      HTTP(port).Register(fileurl, [content, contentType](Request r) {\n+        r.connection.SendHTTPResponse(*content, HTTPResponseCode::OK, *contentType);\n       });\n     });\n   }\n \n   void Join() {\n-    using bricks::net::api::HTTP;\n-\n     printf(\"Listening on port %d\\n\", port_);\n     HTTP(port_).Join();\n     printf(\"Done.\\n\");\n   }\n \n+ private:\n   State state_;\n   const int port_;\n+\n+  /**\n+   * Gets the file extension from the file name or path.\n+   */\n+  static const std::string GetFileExtension(const std::string& filename) {\n+    size_t fileextIndex = filename.find_last_of(\"/\\\\.\");\n+\n+    if (fileextIndex == std::string::npos || filename[fileextIndex] != '.') {","path":"demo/demo.h","position":191,"original_position":191,"commit_id":"8d1cdc708446236e5a0ccb74590346e69bb2cd11","original_commit_id":"8d1cdc708446236e5a0ccb74590346e69bb2cd11","user":{"login":"dkorolev","id":2159447,"avatar_url":"https://avatars.githubusercontent.com/u/2159447?v=3","gravatar_id":"","url":"https://api.github.com/users/dkorolev","html_url":"https://github.com/dkorolev","followers_url":"https://api.github.com/users/dkorolev/followers","following_url":"https://api.github.com/users/dkorolev/following{/other_user}","gists_url":"https://api.github.com/users/dkorolev/gists{/gist_id}","starred_url":"https://api.github.com/users/dkorolev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dkorolev/subscriptions","organizations_url":"https://api.github.com/users/dkorolev/orgs","repos_url":"https://api.github.com/users/dkorolev/repos","events_url":"https://api.github.com/users/dkorolev/events{/privacy}","received_events_url":"https://api.github.com/users/dkorolev/received_events","type":"User","site_admin":false},"body":"LOL, just got to this one: You actually coded this one smarter than I did :+1: \r\n\r\nAnyway, it's in Bricks now, pending your and Alex's review.","created_at":"2015-02-16T07:52:23Z","updated_at":"2015-02-16T07:52:23Z","html_url":"https://github.com/KnowSheet/KnowSheet/pull/7#discussion_r24735454","pull_request_url":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/7","_links":{"self":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/comments/24735454"},"html":{"href":"https://github.com/KnowSheet/KnowSheet/pull/7#discussion_r24735454"},"pull_request":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/7"}}},"pull_request":{"url":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/7","id":29330306,"html_url":"https://github.com/KnowSheet/KnowSheet/pull/7","diff_url":"https://github.com/KnowSheet/KnowSheet/pull/7.diff","patch_url":"https://github.com/KnowSheet/KnowSheet/pull/7.patch","issue_url":"https://api.github.com/repos/KnowSheet/KnowSheet/issues/7","number":7,"state":"open","locked":false,"title":"Integrate demo with frontend","user":{"login":"sompylasar","id":498274,"avatar_url":"https://avatars.githubusercontent.com/u/498274?v=3","gravatar_id":"","url":"https://api.github.com/users/sompylasar","html_url":"https://github.com/sompylasar","followers_url":"https://api.github.com/users/sompylasar/followers","following_url":"https://api.github.com/users/sompylasar/following{/other_user}","gists_url":"https://api.github.com/users/sompylasar/gists{/gist_id}","starred_url":"https://api.github.com/users/sompylasar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sompylasar/subscriptions","organizations_url":"https://api.github.com/users/sompylasar/orgs","repos_url":"https://api.github.com/users/sompylasar/repos","events_url":"https://api.github.com/users/sompylasar/events{/privacy}","received_events_url":"https://api.github.com/users/sompylasar/received_events","type":"User","site_admin":false},"body":"Please merge the frontend before the C++ demo: https://github.com/KnowSheet/Web/pull/6","created_at":"2015-02-15T05:19:41Z","updated_at":"2015-02-16T07:52:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b55afe16693659a4b601223f1582416f31a800fc","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/7/commits","review_comments_url":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/7/comments","review_comment_url":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/comments/{number}","comments_url":"https://api.github.com/repos/KnowSheet/KnowSheet/issues/7/comments","statuses_url":"https://api.github.com/repos/KnowSheet/KnowSheet/statuses/8d1cdc708446236e5a0ccb74590346e69bb2cd11","head":{"label":"sompylasar:integrate-demo-with-frontend","ref":"integrate-demo-with-frontend","sha":"8d1cdc708446236e5a0ccb74590346e69bb2cd11","user":{"login":"sompylasar","id":498274,"avatar_url":"https://avatars.githubusercontent.com/u/498274?v=3","gravatar_id":"","url":"https://api.github.com/users/sompylasar","html_url":"https://github.com/sompylasar","followers_url":"https://api.github.com/users/sompylasar/followers","following_url":"https://api.github.com/users/sompylasar/following{/other_user}","gists_url":"https://api.github.com/users/sompylasar/gists{/gist_id}","starred_url":"https://api.github.com/users/sompylasar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sompylasar/subscriptions","organizations_url":"https://api.github.com/users/sompylasar/orgs","repos_url":"https://api.github.com/users/sompylasar/repos","events_url":"https://api.github.com/users/sompylasar/events{/privacy}","received_events_url":"https://api.github.com/users/sompylasar/received_events","type":"User","site_admin":false},"repo":{"id":30814921,"name":"KnowSheet","full_name":"sompylasar/KnowSheet","owner":{"login":"sompylasar","id":498274,"avatar_url":"https://avatars.githubusercontent.com/u/498274?v=3","gravatar_id":"","url":"https://api.github.com/users/sompylasar","html_url":"https://github.com/sompylasar","followers_url":"https://api.github.com/users/sompylasar/followers","following_url":"https://api.github.com/users/sompylasar/following{/other_user}","gists_url":"https://api.github.com/users/sompylasar/gists{/gist_id}","starred_url":"https://api.github.com/users/sompylasar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sompylasar/subscriptions","organizations_url":"https://api.github.com/users/sompylasar/orgs","repos_url":"https://api.github.com/users/sompylasar/repos","events_url":"https://api.github.com/users/sompylasar/events{/privacy}","received_events_url":"https://api.github.com/users/sompylasar/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sompylasar/KnowSheet","description":"Top-level KnowSheet repository.","fork":true,"url":"https://api.github.com/repos/sompylasar/KnowSheet","forks_url":"https://api.github.com/repos/sompylasar/KnowSheet/forks","keys_url":"https://api.github.com/repos/sompylasar/KnowSheet/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sompylasar/KnowSheet/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sompylasar/KnowSheet/teams","hooks_url":"https://api.github.com/repos/sompylasar/KnowSheet/hooks","issue_events_url":"https://api.github.com/repos/sompylasar/KnowSheet/issues/events{/number}","events_url":"https://api.github.com/repos/sompylasar/KnowSheet/events","assignees_url":"https://api.github.com/repos/sompylasar/KnowSheet/assignees{/user}","branches_url":"https://api.github.com/repos/sompylasar/KnowSheet/branches{/branch}","tags_url":"https://api.github.com/repos/sompylasar/KnowSheet/tags","blobs_url":"https://api.github.com/repos/sompylasar/KnowSheet/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sompylasar/KnowSheet/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sompylasar/KnowSheet/git/refs{/sha}","trees_url":"https://api.github.com/repos/sompylasar/KnowSheet/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sompylasar/KnowSheet/statuses/{sha}","languages_url":"https://api.github.com/repos/sompylasar/KnowSheet/languages","stargazers_url":"https://api.github.com/repos/sompylasar/KnowSheet/stargazers","contributors_url":"https://api.github.com/repos/sompylasar/KnowSheet/contributors","subscribers_url":"https://api.github.com/repos/sompylasar/KnowSheet/subscribers","subscription_url":"https://api.github.com/repos/sompylasar/KnowSheet/subscription","commits_url":"https://api.github.com/repos/sompylasar/KnowSheet/commits{/sha}","git_commits_url":"https://api.github.com/repos/sompylasar/KnowSheet/git/commits{/sha}","comments_url":"https://api.github.com/repos/sompylasar/KnowSheet/comments{/number}","issue_comment_url":"https://api.github.com/repos/sompylasar/KnowSheet/issues/comments/{number}","contents_url":"https://api.github.com/repos/sompylasar/KnowSheet/contents/{+path}","compare_url":"https://api.github.com/repos/sompylasar/KnowSheet/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sompylasar/KnowSheet/merges","archive_url":"https://api.github.com/repos/sompylasar/KnowSheet/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sompylasar/KnowSheet/downloads","issues_url":"https://api.github.com/repos/sompylasar/KnowSheet/issues{/number}","pulls_url":"https://api.github.com/repos/sompylasar/KnowSheet/pulls{/number}","milestones_url":"https://api.github.com/repos/sompylasar/KnowSheet/milestones{/number}","notifications_url":"https://api.github.com/repos/sompylasar/KnowSheet/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sompylasar/KnowSheet/labels{/name}","releases_url":"https://api.github.com/repos/sompylasar/KnowSheet/releases{/id}","created_at":"2015-02-15T01:55:11Z","updated_at":"2015-02-15T01:55:11Z","pushed_at":"2015-02-15T05:15:09Z","git_url":"git://github.com/sompylasar/KnowSheet.git","ssh_url":"git@github.com:sompylasar/KnowSheet.git","clone_url":"https://github.com/sompylasar/KnowSheet.git","svn_url":"https://github.com/sompylasar/KnowSheet","homepage":null,"size":186,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"KnowSheet:master","ref":"master","sha":"16b93e6afaeb431cefc2c64630b5210c9ba4d2dd","user":{"login":"KnowSheet","id":9897562,"avatar_url":"https://avatars.githubusercontent.com/u/9897562?v=3","gravatar_id":"","url":"https://api.github.com/users/KnowSheet","html_url":"https://github.com/KnowSheet","followers_url":"https://api.github.com/users/KnowSheet/followers","following_url":"https://api.github.com/users/KnowSheet/following{/other_user}","gists_url":"https://api.github.com/users/KnowSheet/gists{/gist_id}","starred_url":"https://api.github.com/users/KnowSheet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KnowSheet/subscriptions","organizations_url":"https://api.github.com/users/KnowSheet/orgs","repos_url":"https://api.github.com/users/KnowSheet/repos","events_url":"https://api.github.com/users/KnowSheet/events{/privacy}","received_events_url":"https://api.github.com/users/KnowSheet/received_events","type":"Organization","site_admin":false},"repo":{"id":29337892,"name":"KnowSheet","full_name":"KnowSheet/KnowSheet","owner":{"login":"KnowSheet","id":9897562,"avatar_url":"https://avatars.githubusercontent.com/u/9897562?v=3","gravatar_id":"","url":"https://api.github.com/users/KnowSheet","html_url":"https://github.com/KnowSheet","followers_url":"https://api.github.com/users/KnowSheet/followers","following_url":"https://api.github.com/users/KnowSheet/following{/other_user}","gists_url":"https://api.github.com/users/KnowSheet/gists{/gist_id}","starred_url":"https://api.github.com/users/KnowSheet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KnowSheet/subscriptions","organizations_url":"https://api.github.com/users/KnowSheet/orgs","repos_url":"https://api.github.com/users/KnowSheet/repos","events_url":"https://api.github.com/users/KnowSheet/events{/privacy}","received_events_url":"https://api.github.com/users/KnowSheet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/KnowSheet/KnowSheet","description":"Top-level KnowSheet repository.","fork":false,"url":"https://api.github.com/repos/KnowSheet/KnowSheet","forks_url":"https://api.github.com/repos/KnowSheet/KnowSheet/forks","keys_url":"https://api.github.com/repos/KnowSheet/KnowSheet/keys{/key_id}","collaborators_url":"https://api.github.com/repos/KnowSheet/KnowSheet/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/KnowSheet/KnowSheet/teams","hooks_url":"https://api.github.com/repos/KnowSheet/KnowSheet/hooks","issue_events_url":"https://api.github.com/repos/KnowSheet/KnowSheet/issues/events{/number}","events_url":"https://api.github.com/repos/KnowSheet/KnowSheet/events","assignees_url":"https://api.github.com/repos/KnowSheet/KnowSheet/assignees{/user}","branches_url":"https://api.github.com/repos/KnowSheet/KnowSheet/branches{/branch}","tags_url":"https://api.github.com/repos/KnowSheet/KnowSheet/tags","blobs_url":"https://api.github.com/repos/KnowSheet/KnowSheet/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/KnowSheet/KnowSheet/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/KnowSheet/KnowSheet/git/refs{/sha}","trees_url":"https://api.github.com/repos/KnowSheet/KnowSheet/git/trees{/sha}","statuses_url":"https://api.github.com/repos/KnowSheet/KnowSheet/statuses/{sha}","languages_url":"https://api.github.com/repos/KnowSheet/KnowSheet/languages","stargazers_url":"https://api.github.com/repos/KnowSheet/KnowSheet/stargazers","contributors_url":"https://api.github.com/repos/KnowSheet/KnowSheet/contributors","subscribers_url":"https://api.github.com/repos/KnowSheet/KnowSheet/subscribers","subscription_url":"https://api.github.com/repos/KnowSheet/KnowSheet/subscription","commits_url":"https://api.github.com/repos/KnowSheet/KnowSheet/commits{/sha}","git_commits_url":"https://api.github.com/repos/KnowSheet/KnowSheet/git/commits{/sha}","comments_url":"https://api.github.com/repos/KnowSheet/KnowSheet/comments{/number}","issue_comment_url":"https://api.github.com/repos/KnowSheet/KnowSheet/issues/comments/{number}","contents_url":"https://api.github.com/repos/KnowSheet/KnowSheet/contents/{+path}","compare_url":"https://api.github.com/repos/KnowSheet/KnowSheet/compare/{base}...{head}","merges_url":"https://api.github.com/repos/KnowSheet/KnowSheet/merges","archive_url":"https://api.github.com/repos/KnowSheet/KnowSheet/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/KnowSheet/KnowSheet/downloads","issues_url":"https://api.github.com/repos/KnowSheet/KnowSheet/issues{/number}","pulls_url":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls{/number}","milestones_url":"https://api.github.com/repos/KnowSheet/KnowSheet/milestones{/number}","notifications_url":"https://api.github.com/repos/KnowSheet/KnowSheet/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/KnowSheet/KnowSheet/labels{/name}","releases_url":"https://api.github.com/repos/KnowSheet/KnowSheet/releases{/id}","created_at":"2015-01-16T07:35:44Z","updated_at":"2015-02-15T04:24:27Z","pushed_at":"2015-02-15T04:24:24Z","git_url":"git://github.com/KnowSheet/KnowSheet.git","ssh_url":"git@github.com:KnowSheet/KnowSheet.git","clone_url":"https://github.com/KnowSheet/KnowSheet.git","svn_url":"https://github.com/KnowSheet/KnowSheet","homepage":null,"size":186,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":2,"forks":4,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/7"},"html":{"href":"https://github.com/KnowSheet/KnowSheet/pull/7"},"issue":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/issues/7"},"comments":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/issues/7/comments"},"review_comments":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/7/comments"},"review_comment":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/pulls/7/commits"},"statuses":{"href":"https://api.github.com/repos/KnowSheet/KnowSheet/statuses/8d1cdc708446236e5a0ccb74590346e69bb2cd11"}}}}