{"action":"created","comment":{"url":"https://api.github.com/repos/dartsim/dart/pulls/comments/51055573","id":51055573,"diff_hunk":"@@ -0,0 +1,338 @@\n+/*\n+ * Copyright (c) 2015, Georgia Tech Research Corporation\n+ * All rights reserved.\n+ *\n+ * Author(s): Michael X. Grey <mxgrey@gatech.edu>\n+ *\n+ * Georgia Tech Graphics Lab and Humanoid Robotics Lab\n+ *\n+ * Directed by Prof. C. Karen Liu and Prof. Mike Stilman\n+ * <karenliu@cc.gatech.edu> <mstilman@cc.gatech.edu>\n+ *\n+ * This file is provided under the following \"BSD-style\" License:\n+ *   Redistribution and use in source and binary forms, with or\n+ *   without modification, are permitted provided that the following\n+ *   conditions are met:\n+ *   * Redistributions of source code must retain the above copyright\n+ *     notice, this list of conditions and the following disclaimer.\n+ *   * Redistributions in binary form must reproduce the above\n+ *     copyright notice, this list of conditions and the following\n+ *     disclaimer in the documentation and/or other materials provided\n+ *     with the distribution.\n+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ *   CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n+ *   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n+ *   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n+ *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\n+ *   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n+ *   AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n+ *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n+ *   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ *   POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#ifndef DART_COMMON_DETAIL_ADDON_H_\n+#define DART_COMMON_DETAIL_ADDON_H_\n+\n+#include <cassert>\n+\n+#include \"dart/common/Console.h\"\n+#include \"dart/common/Addon.h\"\n+\n+namespace dart {\n+namespace common {\n+\n+#define DART_COMMON_CAST_NEW_MANAGER_TYPE(Base, ManagerType, newManager,\\\n+                                          castedManager, func)\\\n+  ManagerType* castedManager = dynamic_cast<ManagerType*>(newManager);\\\n+  if(nullptr == castedManager)\\\n+  {\\\n+    dterr << \"[\" << typeid(Base).name() << \"::\" << #func << \"] Attempting to \"\\\n+          << \"use a [\" << typeid(newManager).name() << \"] type manager, but \"\\\n+          << \"this Addon is only designed to be attached to a [\"\\\n+          << typeid(ManagerType).name() << \"] type manager. This may cause \"\\\n+          << \"undefined behavior!\\n\";\\\n+    assert(false);\\\n+  }\n+\n+#define DART_COMMON_CAST_NEW_MANAGER_TYPE_AND_RETURN_NULL_IF_BAD(\\\n+  Base, ManagerType, newManager, castedManager, func)\\\n+  DART_COMMON_CAST_NEW_MANAGER_TYPE(Base, ManagerType, newManager, castedManager, func)\\\n+  if(nullptr == castedManager) return nullptr;\n+\n+//==============================================================================\n+template <class Base, typename StateData,\n+          class ManagerType, void (*updateState)(Base*)>\n+AddonWithProtectedState<Base, StateData, ManagerType, updateState>::\n+AddonWithProtectedState(\n+    AddonManager* mgr, const StateData& state)\n+  : Addon(mgr),\n+    mState(state)\n+{\n+  // Do nothing\n+}\n+\n+//==============================================================================\n+template <class Base, typename StateData,\n+          class ManagerType, void (*updateState)(Base*)>\n+void AddonWithProtectedState<Base, StateData, ManagerType, updateState>::\n+setAddonState(const Addon::State& otherState)\n+{\n+  setState(static_cast<const State&>(otherState));\n+}\n+\n+//==============================================================================\n+template <class Base, typename StateData,\n+          class ManagerType, void (*updateState)(Base*)>\n+const Addon::State*\n+AddonWithProtectedState<Base, StateData, ManagerType, updateState>::\n+getAddonState() const\n+{\n+  return &mState;\n+}\n+\n+//==============================================================================\n+template <class Base, typename StateData,\n+          class ManagerType, void (*updateState)(Base*)>\n+void AddonWithProtectedState<Base, StateData, ManagerType, updateState>::\n+setState(const StateData& state)\n+{\n+  static_cast<StateData&>(mState) = state;\n+  UpdateState(static_cast<Base*>(this));\n+}\n+\n+//==============================================================================\n+template <class Base, typename StateData,\n+          class ManagerType, void (*updateState)(Base*)>\n+auto AddonWithProtectedState<Base, StateData, ManagerType, updateState>::\n+getState() const -> const State&\n+{\n+  return mState;\n+}\n+\n+//==============================================================================\n+template <class Base, typename StateData,\n+          class ManagerType, void (*updateState)(Base*)>\n+std::unique_ptr<Addon>\n+AddonWithProtectedState<Base, StateData, ManagerType, updateState>::\n+    cloneAddon(AddonManager* newManager) const\n+{\n+  DART_COMMON_CAST_NEW_MANAGER_TYPE_AND_RETURN_NULL_IF_BAD(\n+        Base, ManagerType, newManager, castedManager, clone);\n+  return std::unique_ptr<Base>(new Base(newManager, mState));","path":"dart/common/detail/Addon.h","position":125,"original_position":125,"commit_id":"bded5301b75e49760d9fcfc71522b54524becafd","original_commit_id":"bded5301b75e49760d9fcfc71522b54524becafd","user":{"login":"jslee02","id":4038467,"avatar_url":"https://avatars.githubusercontent.com/u/4038467?v=3","gravatar_id":"","url":"https://api.github.com/users/jslee02","html_url":"https://github.com/jslee02","followers_url":"https://api.github.com/users/jslee02/followers","following_url":"https://api.github.com/users/jslee02/following{/other_user}","gists_url":"https://api.github.com/users/jslee02/gists{/gist_id}","starred_url":"https://api.github.com/users/jslee02/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jslee02/subscriptions","organizations_url":"https://api.github.com/users/jslee02/orgs","repos_url":"https://api.github.com/users/jslee02/repos","events_url":"https://api.github.com/users/jslee02/events{/privacy}","received_events_url":"https://api.github.com/users/jslee02/received_events","type":"User","site_admin":false},"body":"That makes sense to me. Then other lines should use `newManager` as well, right? I found three lines passing in the cased version in `common/detail/Addon.h` and `dynamics/detail/Addon.h`.","created_at":"2016-01-27T21:48:39Z","updated_at":"2016-01-27T21:48:39Z","html_url":"https://github.com/dartsim/dart/pull/531#discussion_r51055573","pull_request_url":"https://api.github.com/repos/dartsim/dart/pulls/531","_links":{"self":{"href":"https://api.github.com/repos/dartsim/dart/pulls/comments/51055573"},"html":{"href":"https://github.com/dartsim/dart/pull/531#discussion_r51055573"},"pull_request":{"href":"https://api.github.com/repos/dartsim/dart/pulls/531"}}},"pull_request":{"url":"https://api.github.com/repos/dartsim/dart/pulls/531","id":48028839,"html_url":"https://github.com/dartsim/dart/pull/531","diff_url":"https://github.com/dartsim/dart/pull/531.diff","patch_url":"https://github.com/dartsim/dart/pull/531.patch","issue_url":"https://api.github.com/repos/dartsim/dart/issues/531","number":531,"state":"open","locked":false,"title":"[Preliminary] Nodes and Addons","user":{"login":"mxgrey","id":1307217,"avatar_url":"https://avatars.githubusercontent.com/u/1307217?v=3","gravatar_id":"","url":"https://api.github.com/users/mxgrey","html_url":"https://github.com/mxgrey","followers_url":"https://api.github.com/users/mxgrey/followers","following_url":"https://api.github.com/users/mxgrey/following{/other_user}","gists_url":"https://api.github.com/users/mxgrey/gists{/gist_id}","starred_url":"https://api.github.com/users/mxgrey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mxgrey/subscriptions","organizations_url":"https://api.github.com/users/mxgrey/orgs","repos_url":"https://api.github.com/users/mxgrey/repos","events_url":"https://api.github.com/users/mxgrey/events{/privacy}","received_events_url":"https://api.github.com/users/mxgrey/received_events","type":"User","site_admin":false},"body":"### This is a preliminary pull request for facilitating review and discussion\r\n\r\n*Current Status: Everything is implemented except the SoftBodyNode Addon. More unit tests should be created to ensure that everything works as expected.*\r\n\r\nThis pull request brings a tremendous amount of additional functionality to the ``Node`` class and introduces the ``Addon`` class.\r\n\r\nThe ``Node`` class exists primarily to allow users to embed custom classes into the kinematic/dynamic structure of a Skeleton. ``Node``s are objects that attach to ``BodyNode``s, and they are allowed to contain a ``State`` structure and a ``Properties`` structure. ``Node``s are also cloneable. The State of a Node will be saved when the State of its Skeleton is saved, and same for the Node's Properties. There is no limit to how many instances of a single Node type you can attach to a single BodyNode.\r\n\r\nThe ``Addon`` class allows the user to embed extra data into any class that inherits ``common::AddonManager``. An ``Addon`` can contain ``State`` and/or ``Properties``, and Addons are cloneable. Unlike Nodes, you can only add a single instance of a particular Addon type to an AddonManager.\r\n\r\nIn order to deal with the huge amount of boilerplate code that is needed to produce Nodes and Addons, I took some creative liberties with CRTP and macro patterns. I think my CRTP implementations should be fairly good (even if they don't look very pretty), but my use of macros could probably use some heavy critiquing.\r\n\r\nI try not to use macros too much since I consider them a rather gross legacy of C, but they were the only way I could think of to keep the code reasonably DRY. I'm pretty sure we can't avoid using macros if we want DRYness, but I would be very open to any suggestions as far as improving the naming conventions or style that the macros are written with.\r\n\r\nNote: This pull request already includes the changes of #530","created_at":"2015-10-19T03:43:57Z","updated_at":"2016-01-27T21:48:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c8d4384d659830babc673bd65bfdf692bd2361d0","assignee":null,"milestone":{"url":"https://api.github.com/repos/dartsim/dart/milestones/13","html_url":"https://github.com/dartsim/dart/milestones/DART%206.0.0","labels_url":"https://api.github.com/repos/dartsim/dart/milestones/13/labels","id":1199830,"number":13,"title":"DART 6.0.0","description":"Compiler requirements\r\n\r\n* Visual Studio 2015","creator":{"login":"mxgrey","id":1307217,"avatar_url":"https://avatars.githubusercontent.com/u/1307217?v=3","gravatar_id":"","url":"https://api.github.com/users/mxgrey","html_url":"https://github.com/mxgrey","followers_url":"https://api.github.com/users/mxgrey/followers","following_url":"https://api.github.com/users/mxgrey/following{/other_user}","gists_url":"https://api.github.com/users/mxgrey/gists{/gist_id}","starred_url":"https://api.github.com/users/mxgrey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mxgrey/subscriptions","organizations_url":"https://api.github.com/users/mxgrey/orgs","repos_url":"https://api.github.com/users/mxgrey/repos","events_url":"https://api.github.com/users/mxgrey/events{/privacy}","received_events_url":"https://api.github.com/users/mxgrey/received_events","type":"User","site_admin":false},"open_issues":4,"closed_issues":31,"state":"open","created_at":"2015-07-09T03:10:42Z","updated_at":"2016-01-22T15:12:16Z","due_on":"2016-02-15T05:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/dartsim/dart/pulls/531/commits","review_comments_url":"https://api.github.com/repos/dartsim/dart/pulls/531/comments","review_comment_url":"https://api.github.com/repos/dartsim/dart/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dartsim/dart/issues/531/comments","statuses_url":"https://api.github.com/repos/dartsim/dart/statuses/bded5301b75e49760d9fcfc71522b54524becafd","head":{"label":"dartsim:grey/addons","ref":"grey/addons","sha":"bded5301b75e49760d9fcfc71522b54524becafd","user":{"login":"dartsim","id":4191609,"avatar_url":"https://avatars.githubusercontent.com/u/4191609?v=3","gravatar_id":"","url":"https://api.github.com/users/dartsim","html_url":"https://github.com/dartsim","followers_url":"https://api.github.com/users/dartsim/followers","following_url":"https://api.github.com/users/dartsim/following{/other_user}","gists_url":"https://api.github.com/users/dartsim/gists{/gist_id}","starred_url":"https://api.github.com/users/dartsim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dartsim/subscriptions","organizations_url":"https://api.github.com/users/dartsim/orgs","repos_url":"https://api.github.com/users/dartsim/repos","events_url":"https://api.github.com/users/dartsim/events{/privacy}","received_events_url":"https://api.github.com/users/dartsim/received_events","type":"Organization","site_admin":false},"repo":{"id":2418592,"name":"dart","full_name":"dartsim/dart","owner":{"login":"dartsim","id":4191609,"avatar_url":"https://avatars.githubusercontent.com/u/4191609?v=3","gravatar_id":"","url":"https://api.github.com/users/dartsim","html_url":"https://github.com/dartsim","followers_url":"https://api.github.com/users/dartsim/followers","following_url":"https://api.github.com/users/dartsim/following{/other_user}","gists_url":"https://api.github.com/users/dartsim/gists{/gist_id}","starred_url":"https://api.github.com/users/dartsim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dartsim/subscriptions","organizations_url":"https://api.github.com/users/dartsim/orgs","repos_url":"https://api.github.com/users/dartsim/repos","events_url":"https://api.github.com/users/dartsim/events{/privacy}","received_events_url":"https://api.github.com/users/dartsim/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dartsim/dart","description":"Dynamic Animation and Robotics Toolkit","fork":false,"url":"https://api.github.com/repos/dartsim/dart","forks_url":"https://api.github.com/repos/dartsim/dart/forks","keys_url":"https://api.github.com/repos/dartsim/dart/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dartsim/dart/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dartsim/dart/teams","hooks_url":"https://api.github.com/repos/dartsim/dart/hooks","issue_events_url":"https://api.github.com/repos/dartsim/dart/issues/events{/number}","events_url":"https://api.github.com/repos/dartsim/dart/events","assignees_url":"https://api.github.com/repos/dartsim/dart/assignees{/user}","branches_url":"https://api.github.com/repos/dartsim/dart/branches{/branch}","tags_url":"https://api.github.com/repos/dartsim/dart/tags","blobs_url":"https://api.github.com/repos/dartsim/dart/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dartsim/dart/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dartsim/dart/git/refs{/sha}","trees_url":"https://api.github.com/repos/dartsim/dart/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dartsim/dart/statuses/{sha}","languages_url":"https://api.github.com/repos/dartsim/dart/languages","stargazers_url":"https://api.github.com/repos/dartsim/dart/stargazers","contributors_url":"https://api.github.com/repos/dartsim/dart/contributors","subscribers_url":"https://api.github.com/repos/dartsim/dart/subscribers","subscription_url":"https://api.github.com/repos/dartsim/dart/subscription","commits_url":"https://api.github.com/repos/dartsim/dart/commits{/sha}","git_commits_url":"https://api.github.com/repos/dartsim/dart/git/commits{/sha}","comments_url":"https://api.github.com/repos/dartsim/dart/comments{/number}","issue_comment_url":"https://api.github.com/repos/dartsim/dart/issues/comments{/number}","contents_url":"https://api.github.com/repos/dartsim/dart/contents/{+path}","compare_url":"https://api.github.com/repos/dartsim/dart/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dartsim/dart/merges","archive_url":"https://api.github.com/repos/dartsim/dart/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dartsim/dart/downloads","issues_url":"https://api.github.com/repos/dartsim/dart/issues{/number}","pulls_url":"https://api.github.com/repos/dartsim/dart/pulls{/number}","milestones_url":"https://api.github.com/repos/dartsim/dart/milestones{/number}","notifications_url":"https://api.github.com/repos/dartsim/dart/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dartsim/dart/labels{/name}","releases_url":"https://api.github.com/repos/dartsim/dart/releases{/id}","deployments_url":"https://api.github.com/repos/dartsim/dart/deployments","created_at":"2011-09-19T21:53:51Z","updated_at":"2016-01-21T00:22:04Z","pushed_at":"2016-01-27T11:46:10Z","git_url":"git://github.com/dartsim/dart.git","ssh_url":"git@github.com:dartsim/dart.git","clone_url":"https://github.com/dartsim/dart.git","svn_url":"https://github.com/dartsim/dart","homepage":"http://dartsim.github.io/","size":110824,"stargazers_count":80,"watchers_count":80,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":58,"mirror_url":null,"open_issues_count":108,"forks":58,"open_issues":108,"watchers":80,"default_branch":"master"}},"base":{"label":"dartsim:master","ref":"master","sha":"c3bfb608cd69bda05f16a5b6ad0693331736f50d","user":{"login":"dartsim","id":4191609,"avatar_url":"https://avatars.githubusercontent.com/u/4191609?v=3","gravatar_id":"","url":"https://api.github.com/users/dartsim","html_url":"https://github.com/dartsim","followers_url":"https://api.github.com/users/dartsim/followers","following_url":"https://api.github.com/users/dartsim/following{/other_user}","gists_url":"https://api.github.com/users/dartsim/gists{/gist_id}","starred_url":"https://api.github.com/users/dartsim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dartsim/subscriptions","organizations_url":"https://api.github.com/users/dartsim/orgs","repos_url":"https://api.github.com/users/dartsim/repos","events_url":"https://api.github.com/users/dartsim/events{/privacy}","received_events_url":"https://api.github.com/users/dartsim/received_events","type":"Organization","site_admin":false},"repo":{"id":2418592,"name":"dart","full_name":"dartsim/dart","owner":{"login":"dartsim","id":4191609,"avatar_url":"https://avatars.githubusercontent.com/u/4191609?v=3","gravatar_id":"","url":"https://api.github.com/users/dartsim","html_url":"https://github.com/dartsim","followers_url":"https://api.github.com/users/dartsim/followers","following_url":"https://api.github.com/users/dartsim/following{/other_user}","gists_url":"https://api.github.com/users/dartsim/gists{/gist_id}","starred_url":"https://api.github.com/users/dartsim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dartsim/subscriptions","organizations_url":"https://api.github.com/users/dartsim/orgs","repos_url":"https://api.github.com/users/dartsim/repos","events_url":"https://api.github.com/users/dartsim/events{/privacy}","received_events_url":"https://api.github.com/users/dartsim/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dartsim/dart","description":"Dynamic Animation and Robotics Toolkit","fork":false,"url":"https://api.github.com/repos/dartsim/dart","forks_url":"https://api.github.com/repos/dartsim/dart/forks","keys_url":"https://api.github.com/repos/dartsim/dart/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dartsim/dart/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dartsim/dart/teams","hooks_url":"https://api.github.com/repos/dartsim/dart/hooks","issue_events_url":"https://api.github.com/repos/dartsim/dart/issues/events{/number}","events_url":"https://api.github.com/repos/dartsim/dart/events","assignees_url":"https://api.github.com/repos/dartsim/dart/assignees{/user}","branches_url":"https://api.github.com/repos/dartsim/dart/branches{/branch}","tags_url":"https://api.github.com/repos/dartsim/dart/tags","blobs_url":"https://api.github.com/repos/dartsim/dart/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dartsim/dart/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dartsim/dart/git/refs{/sha}","trees_url":"https://api.github.com/repos/dartsim/dart/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dartsim/dart/statuses/{sha}","languages_url":"https://api.github.com/repos/dartsim/dart/languages","stargazers_url":"https://api.github.com/repos/dartsim/dart/stargazers","contributors_url":"https://api.github.com/repos/dartsim/dart/contributors","subscribers_url":"https://api.github.com/repos/dartsim/dart/subscribers","subscription_url":"https://api.github.com/repos/dartsim/dart/subscription","commits_url":"https://api.github.com/repos/dartsim/dart/commits{/sha}","git_commits_url":"https://api.github.com/repos/dartsim/dart/git/commits{/sha}","comments_url":"https://api.github.com/repos/dartsim/dart/comments{/number}","issue_comment_url":"https://api.github.com/repos/dartsim/dart/issues/comments{/number}","contents_url":"https://api.github.com/repos/dartsim/dart/contents/{+path}","compare_url":"https://api.github.com/repos/dartsim/dart/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dartsim/dart/merges","archive_url":"https://api.github.com/repos/dartsim/dart/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dartsim/dart/downloads","issues_url":"https://api.github.com/repos/dartsim/dart/issues{/number}","pulls_url":"https://api.github.com/repos/dartsim/dart/pulls{/number}","milestones_url":"https://api.github.com/repos/dartsim/dart/milestones{/number}","notifications_url":"https://api.github.com/repos/dartsim/dart/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dartsim/dart/labels{/name}","releases_url":"https://api.github.com/repos/dartsim/dart/releases{/id}","deployments_url":"https://api.github.com/repos/dartsim/dart/deployments","created_at":"2011-09-19T21:53:51Z","updated_at":"2016-01-21T00:22:04Z","pushed_at":"2016-01-27T11:46:10Z","git_url":"git://github.com/dartsim/dart.git","ssh_url":"git@github.com:dartsim/dart.git","clone_url":"https://github.com/dartsim/dart.git","svn_url":"https://github.com/dartsim/dart","homepage":"http://dartsim.github.io/","size":110824,"stargazers_count":80,"watchers_count":80,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":58,"mirror_url":null,"open_issues_count":108,"forks":58,"open_issues":108,"watchers":80,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dartsim/dart/pulls/531"},"html":{"href":"https://github.com/dartsim/dart/pull/531"},"issue":{"href":"https://api.github.com/repos/dartsim/dart/issues/531"},"comments":{"href":"https://api.github.com/repos/dartsim/dart/issues/531/comments"},"review_comments":{"href":"https://api.github.com/repos/dartsim/dart/pulls/531/comments"},"review_comment":{"href":"https://api.github.com/repos/dartsim/dart/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dartsim/dart/pulls/531/commits"},"statuses":{"href":"https://api.github.com/repos/dartsim/dart/statuses/bded5301b75e49760d9fcfc71522b54524becafd"}}}}