{"action":"created","comment":{"url":"https://api.github.com/repos/highfidelity/hifi/pulls/comments/33410082","id":33410082,"diff_hunk":"@@ -0,0 +1,181 @@\n+//\n+//  SimulationOwner.cpp\n+//  libraries/entities/src\n+//\n+//  Created by Andrew Meadows on 2015.06.19\n+//  Copyright 2015 High Fidelity, Inc.\n+//\n+//  Distributed under the Apache License, Version 2.0.\n+//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html\n+//\n+\n+#include \"SimulationOwner.h\"\n+\n+#include <iostream> // included for tests\n+#include <assert.h>\n+\n+#include <NumericalConstants.h>\n+\n+// static \n+const int SimulationOwner::NUM_BYTES_ENCODED = NUM_BYTES_RFC4122_UUID + 1;\n+\n+\n+SimulationOwner::SimulationOwner(const SimulationOwner& other) \n+    : _id(other._id), _priority(other._priority), _expiry(other._expiry) {\n+}\n+\n+QByteArray SimulationOwner::toByteArray() const {\n+    QByteArray data = _id.toRfc4122();\n+    data.append(_priority);\n+    return data;\n+}\n+\n+bool SimulationOwner::fromByteArray(const QByteArray& data) {\n+    if (data.size() == NUM_BYTES_ENCODED) {\n+        QByteArray idBytes = data.left(NUM_BYTES_RFC4122_UUID);\n+        _id = QUuid::fromRfc4122(idBytes);\n+        _priority = data[NUM_BYTES_RFC4122_UUID];\n+        return true;\n+    }\n+    return false;\n+}\n+\n+void SimulationOwner::clear() {\n+    _id = QUuid();\n+    _priority = 0;\n+    _expiry = 0;\n+}\n+\n+void SimulationOwner::setPriority(quint8 priority) {\n+    _priority = priority;\n+    if (_priority == 0) {\n+        // when priority is zero we clear everything\n+        _expiry = 0;\n+        _id = QUuid();\n+    }\n+}\n+\n+void SimulationOwner::promotePriority(quint8 priority) {\n+    if (priority > _priority) {\n+        _priority = priority;\n+        updateExpiry();\n+    }\n+}\n+\n+bool SimulationOwner::setID(const QUuid& id) {\n+    if (_id != id) {\n+        _id = id;\n+        updateExpiry();\n+        if (_id.isNull()) {\n+            _priority = 0;\n+        }\n+        return true;\n+    }\n+    return false;\n+}\n+\n+bool SimulationOwner::set(const QUuid& id, quint8 priority) {\n+    setPriority(priority);\n+    return setID(id);\n+}\n+\n+bool SimulationOwner::set(const SimulationOwner& owner) {\n+    setPriority(owner._priority);\n+    return setID(owner._id);\n+}\n+\n+void SimulationOwner::updateExpiry() {\n+    const quint64 OWNERSHIP_LOCKOUT_EXPIRY = USECS_PER_SECOND / 5;\n+    _expiry = usecTimestampNow() + OWNERSHIP_LOCKOUT_EXPIRY;\n+}\n+\n+// NOTE: eventually this code will be moved into unit tests\n+// static debug\n+void SimulationOwner::test() {\n+    { // test default constructor\n+        SimulationOwner simOwner;\n+        if (!simOwner.isNull()) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : SimulationOwner should be NULL\" << std::endl;\n+        }\n+\n+        if (simOwner.getPriority() != 0) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : unexpeced SimulationOwner priority\" << std::endl;\n+        }\n+    }\n+\n+    { // test set constructor\n+        QUuid id = QUuid::createUuid();\n+        quint8 priority = 128;\n+        SimulationOwner simOwner(id, priority);\n+        if (simOwner.isNull()) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : SimulationOwner should NOT be NULL\" << std::endl;\n+        }\n+\n+        if (simOwner.getID() != id) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : SimulationOwner with unexpected id\" << std::endl;\n+        }\n+\n+        if (simOwner.getPriority() != priority) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : unexpeced SimulationOwner priority\" << std::endl;\n+        }\n+\n+        QUuid otherID = QUuid::createUuid();\n+        if (simOwner.getID() == otherID) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : SimulationOwner with unexpected id\" << std::endl;\n+        }\n+    }\n+\n+    { // test set()\n+        QUuid id = QUuid::createUuid();\n+        quint8 priority = 1;\n+        SimulationOwner simOwner;\n+        simOwner.set(id, priority);\n+        if (simOwner.isNull()) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : SimulationOwner should NOT be NULL\" << std::endl;\n+        }\n+\n+        if (simOwner.getID() != id) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : SimulationOwner with unexpected id\" << std::endl;\n+        }\n+\n+        if (simOwner.getPriority() != priority) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : unexpeced SimulationOwner priority\" << std::endl;\n+        }\n+    }\n+\n+    { // test encode/decode\n+        SimulationOwner ownerA(QUuid::createUuid(), 1);\n+        SimulationOwner ownerB(QUuid::createUuid(), 2);\n+\n+        QByteArray data = ownerA.toByteArray();\n+        ownerB.fromByteArray(data);\n+\n+        if (ownerA.getID() != ownerB.getID()) {\n+            std::cout << __FILE__ << \":\" << __LINE__ << \" ERROR : ownerA._id should be equal to ownerB._id\" << std::endl;\n+        }\n+    }\n+}","path":"libraries/entities/src/SimulationOwner.cpp","position":157,"original_position":157,"commit_id":"4d4b97fe5947631b904df7aca8ec1a056d1fdfd6","original_commit_id":"4d4b97fe5947631b904df7aca8ec1a056d1fdfd6","user":{"login":"AndrewMeadows","id":2186405,"avatar_url":"https://avatars.githubusercontent.com/u/2186405?v=3","gravatar_id":"","url":"https://api.github.com/users/AndrewMeadows","html_url":"https://github.com/AndrewMeadows","followers_url":"https://api.github.com/users/AndrewMeadows/followers","following_url":"https://api.github.com/users/AndrewMeadows/following{/other_user}","gists_url":"https://api.github.com/users/AndrewMeadows/gists{/gist_id}","starred_url":"https://api.github.com/users/AndrewMeadows/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndrewMeadows/subscriptions","organizations_url":"https://api.github.com/users/AndrewMeadows/orgs","repos_url":"https://api.github.com/users/AndrewMeadows/repos","events_url":"https://api.github.com/users/AndrewMeadows/events{/privacy}","received_events_url":"https://api.github.com/users/AndrewMeadows/received_events","type":"User","site_admin":false},"body":"Yes, the unit test is part of the class.  As the comments say: I'll move this out after the QTest framework is in place.","created_at":"2015-06-27T06:10:01Z","updated_at":"2015-06-27T06:10:01Z","html_url":"https://github.com/highfidelity/hifi/pull/5229#discussion_r33410082","pull_request_url":"https://api.github.com/repos/highfidelity/hifi/pulls/5229","_links":{"self":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/comments/33410082"},"html":{"href":"https://github.com/highfidelity/hifi/pull/5229#discussion_r33410082"},"pull_request":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/5229"}}},"pull_request":{"url":"https://api.github.com/repos/highfidelity/hifi/pulls/5229","id":38704624,"html_url":"https://github.com/highfidelity/hifi/pull/5229","diff_url":"https://github.com/highfidelity/hifi/pull/5229.diff","patch_url":"https://github.com/highfidelity/hifi/pull/5229.patch","issue_url":"https://api.github.com/repos/highfidelity/hifi/issues/5229","number":5229,"state":"open","locked":false,"title":"DO NOT MERGE: adding simulation ownership priority","user":{"login":"AndrewMeadows","id":2186405,"avatar_url":"https://avatars.githubusercontent.com/u/2186405?v=3","gravatar_id":"","url":"https://api.github.com/users/AndrewMeadows","html_url":"https://github.com/AndrewMeadows","followers_url":"https://api.github.com/users/AndrewMeadows/followers","following_url":"https://api.github.com/users/AndrewMeadows/following{/other_user}","gists_url":"https://api.github.com/users/AndrewMeadows/gists{/gist_id}","starred_url":"https://api.github.com/users/AndrewMeadows/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndrewMeadows/subscriptions","organizations_url":"https://api.github.com/users/AndrewMeadows/orgs","repos_url":"https://api.github.com/users/AndrewMeadows/repos","events_url":"https://api.github.com/users/AndrewMeadows/events{/privacy}","received_events_url":"https://api.github.com/users/AndrewMeadows/received_events","type":"User","site_admin":false},"body":"Ths PR's ttitle is tagged with **DO NOT MERGE** so that no one merges this by accident.  If it tests well and Seth and Brad don't have any problems with it then feel free to merge -- but be warned that I'm out for the week of June 29 through July 3 so if it breaks stuff I might not be able to provide a fix in a timely manner.\r\n\r\n**NOTE: this PR bumps the version number of the entity packet!!!!**  In particular the **simulatorID** goes away in favor of a **SimuationOwner** struct which combines **ID** and **priority** in one.  Also, it clumps the entity's transform and velocities together in the hopes that they'll arrive together more often (they aren't strictly grouped together yet).\r\n\r\n**NOTE: this PR adds a new entity property.**  When reviewing make sure the PROP is added in the right place.\r\n\r\nThe goal of this PR was to add a **priority** value to bids for simulation so that when an interface is poking an entity directly via script it will bid at higher priority than a simulator who is stepping in to simulation something that does not yet have an owner.\r\n\r\nThe priority is a **quint8** so it ranges from 0 (not owned) to 255, although we don't yet use priorities higher than 128 (I've got some plans for logic that use higher priorities but they'll have to be implemented later).  When an entity's simulation is owned at some priority (let's say 10) then another interface could take ownership by bidding at an equal level as long as it doesn't bid too soon (see the SimulationOwner::_expiry implementation).  If it bids at a higher level then it gets it.\r\n\r\nThe lowest owned priority is 1 (**VOLUNTEER**) which is the bid level for an active entity that has no owner, however when an interface wins a bid at 1 its level is automatically promoted to 2 (**RECRUIT**) by the entity-server to repress race condition ownership oscillations between bored volunteering interfaces.\r\n\r\nWhen an interface pokes an entity's transform/velocity directly it bids with priority of 128 (**SCRIPT**) which is the highest priority defined so far.\r\n\r\nWhen performing the **viral ownership infection** during collisions in the physics engine an owned object will trigger a bid for a non-owned object at it's priority minus one.  That is, a grabbed hockey paddle will have a priority of 128 and anything it bumps into (such as a hockey puck) will be bid for at 127, and anything dynamic that the puck hits will be bid for at 126, and so on.\r\n","created_at":"2015-06-27T05:55:33Z","updated_at":"2015-06-27T06:10:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c18ae84748d73d4a173bb441dccd7231162ddf14","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/highfidelity/hifi/pulls/5229/commits","review_comments_url":"https://api.github.com/repos/highfidelity/hifi/pulls/5229/comments","review_comment_url":"https://api.github.com/repos/highfidelity/hifi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/highfidelity/hifi/issues/5229/comments","statuses_url":"https://api.github.com/repos/highfidelity/hifi/statuses/4d4b97fe5947631b904df7aca8ec1a056d1fdfd6","head":{"label":"AndrewMeadows:actinium","ref":"actinium","sha":"4d4b97fe5947631b904df7aca8ec1a056d1fdfd6","user":{"login":"AndrewMeadows","id":2186405,"avatar_url":"https://avatars.githubusercontent.com/u/2186405?v=3","gravatar_id":"","url":"https://api.github.com/users/AndrewMeadows","html_url":"https://github.com/AndrewMeadows","followers_url":"https://api.github.com/users/AndrewMeadows/followers","following_url":"https://api.github.com/users/AndrewMeadows/following{/other_user}","gists_url":"https://api.github.com/users/AndrewMeadows/gists{/gist_id}","starred_url":"https://api.github.com/users/AndrewMeadows/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndrewMeadows/subscriptions","organizations_url":"https://api.github.com/users/AndrewMeadows/orgs","repos_url":"https://api.github.com/users/AndrewMeadows/repos","events_url":"https://api.github.com/users/AndrewMeadows/events{/privacy}","received_events_url":"https://api.github.com/users/AndrewMeadows/received_events","type":"User","site_admin":false},"repo":{"id":15350502,"name":"hifi","full_name":"AndrewMeadows/hifi","owner":{"login":"AndrewMeadows","id":2186405,"avatar_url":"https://avatars.githubusercontent.com/u/2186405?v=3","gravatar_id":"","url":"https://api.github.com/users/AndrewMeadows","html_url":"https://github.com/AndrewMeadows","followers_url":"https://api.github.com/users/AndrewMeadows/followers","following_url":"https://api.github.com/users/AndrewMeadows/following{/other_user}","gists_url":"https://api.github.com/users/AndrewMeadows/gists{/gist_id}","starred_url":"https://api.github.com/users/AndrewMeadows/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndrewMeadows/subscriptions","organizations_url":"https://api.github.com/users/AndrewMeadows/orgs","repos_url":"https://api.github.com/users/AndrewMeadows/repos","events_url":"https://api.github.com/users/AndrewMeadows/events{/privacy}","received_events_url":"https://api.github.com/users/AndrewMeadows/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AndrewMeadows/hifi","description":"Open, decentralized virtual world using sensors to control avatars and dynamically assigned devices as servers.  San Francisco based startup, we are hiring: http://highfidelity.io/jobs  You can also contribute by doing jobs listed at http://worklist.net/worklist.php","fork":true,"url":"https://api.github.com/repos/AndrewMeadows/hifi","forks_url":"https://api.github.com/repos/AndrewMeadows/hifi/forks","keys_url":"https://api.github.com/repos/AndrewMeadows/hifi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AndrewMeadows/hifi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AndrewMeadows/hifi/teams","hooks_url":"https://api.github.com/repos/AndrewMeadows/hifi/hooks","issue_events_url":"https://api.github.com/repos/AndrewMeadows/hifi/issues/events{/number}","events_url":"https://api.github.com/repos/AndrewMeadows/hifi/events","assignees_url":"https://api.github.com/repos/AndrewMeadows/hifi/assignees{/user}","branches_url":"https://api.github.com/repos/AndrewMeadows/hifi/branches{/branch}","tags_url":"https://api.github.com/repos/AndrewMeadows/hifi/tags","blobs_url":"https://api.github.com/repos/AndrewMeadows/hifi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AndrewMeadows/hifi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AndrewMeadows/hifi/git/refs{/sha}","trees_url":"https://api.github.com/repos/AndrewMeadows/hifi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AndrewMeadows/hifi/statuses/{sha}","languages_url":"https://api.github.com/repos/AndrewMeadows/hifi/languages","stargazers_url":"https://api.github.com/repos/AndrewMeadows/hifi/stargazers","contributors_url":"https://api.github.com/repos/AndrewMeadows/hifi/contributors","subscribers_url":"https://api.github.com/repos/AndrewMeadows/hifi/subscribers","subscription_url":"https://api.github.com/repos/AndrewMeadows/hifi/subscription","commits_url":"https://api.github.com/repos/AndrewMeadows/hifi/commits{/sha}","git_commits_url":"https://api.github.com/repos/AndrewMeadows/hifi/git/commits{/sha}","comments_url":"https://api.github.com/repos/AndrewMeadows/hifi/comments{/number}","issue_comment_url":"https://api.github.com/repos/AndrewMeadows/hifi/issues/comments{/number}","contents_url":"https://api.github.com/repos/AndrewMeadows/hifi/contents/{+path}","compare_url":"https://api.github.com/repos/AndrewMeadows/hifi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AndrewMeadows/hifi/merges","archive_url":"https://api.github.com/repos/AndrewMeadows/hifi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AndrewMeadows/hifi/downloads","issues_url":"https://api.github.com/repos/AndrewMeadows/hifi/issues{/number}","pulls_url":"https://api.github.com/repos/AndrewMeadows/hifi/pulls{/number}","milestones_url":"https://api.github.com/repos/AndrewMeadows/hifi/milestones{/number}","notifications_url":"https://api.github.com/repos/AndrewMeadows/hifi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AndrewMeadows/hifi/labels{/name}","releases_url":"https://api.github.com/repos/AndrewMeadows/hifi/releases{/id}","created_at":"2013-12-20T23:18:13Z","updated_at":"2015-04-03T16:42:09Z","pushed_at":"2015-06-27T05:32:20Z","git_url":"git://github.com/AndrewMeadows/hifi.git","ssh_url":"git@github.com:AndrewMeadows/hifi.git","clone_url":"https://github.com/AndrewMeadows/hifi.git","svn_url":"https://github.com/AndrewMeadows/hifi","homepage":"http://highfidelity.io","size":162147,"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":"highfidelity:master","ref":"master","sha":"9b42221123968bfd8d7440da56ef800305b74895","user":{"login":"highfidelity","id":1565370,"avatar_url":"https://avatars.githubusercontent.com/u/1565370?v=3","gravatar_id":"","url":"https://api.github.com/users/highfidelity","html_url":"https://github.com/highfidelity","followers_url":"https://api.github.com/users/highfidelity/followers","following_url":"https://api.github.com/users/highfidelity/following{/other_user}","gists_url":"https://api.github.com/users/highfidelity/gists{/gist_id}","starred_url":"https://api.github.com/users/highfidelity/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/highfidelity/subscriptions","organizations_url":"https://api.github.com/users/highfidelity/orgs","repos_url":"https://api.github.com/users/highfidelity/repos","events_url":"https://api.github.com/users/highfidelity/events{/privacy}","received_events_url":"https://api.github.com/users/highfidelity/received_events","type":"Organization","site_admin":false},"repo":{"id":5372872,"name":"hifi","full_name":"highfidelity/hifi","owner":{"login":"highfidelity","id":1565370,"avatar_url":"https://avatars.githubusercontent.com/u/1565370?v=3","gravatar_id":"","url":"https://api.github.com/users/highfidelity","html_url":"https://github.com/highfidelity","followers_url":"https://api.github.com/users/highfidelity/followers","following_url":"https://api.github.com/users/highfidelity/following{/other_user}","gists_url":"https://api.github.com/users/highfidelity/gists{/gist_id}","starred_url":"https://api.github.com/users/highfidelity/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/highfidelity/subscriptions","organizations_url":"https://api.github.com/users/highfidelity/orgs","repos_url":"https://api.github.com/users/highfidelity/repos","events_url":"https://api.github.com/users/highfidelity/events{/privacy}","received_events_url":"https://api.github.com/users/highfidelity/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/highfidelity/hifi","description":"Open source software for shared virtual worlds using HMDs and dynamically assigned devices as servers.  San Francisco based startup, we are hiring: http://highfidelity.com/jobs  Documentation at http://docs.highfidelity.com  Contribute by reporting bugs & doing jobs on http://worklist.net","fork":false,"url":"https://api.github.com/repos/highfidelity/hifi","forks_url":"https://api.github.com/repos/highfidelity/hifi/forks","keys_url":"https://api.github.com/repos/highfidelity/hifi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/highfidelity/hifi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/highfidelity/hifi/teams","hooks_url":"https://api.github.com/repos/highfidelity/hifi/hooks","issue_events_url":"https://api.github.com/repos/highfidelity/hifi/issues/events{/number}","events_url":"https://api.github.com/repos/highfidelity/hifi/events","assignees_url":"https://api.github.com/repos/highfidelity/hifi/assignees{/user}","branches_url":"https://api.github.com/repos/highfidelity/hifi/branches{/branch}","tags_url":"https://api.github.com/repos/highfidelity/hifi/tags","blobs_url":"https://api.github.com/repos/highfidelity/hifi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/highfidelity/hifi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/highfidelity/hifi/git/refs{/sha}","trees_url":"https://api.github.com/repos/highfidelity/hifi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/highfidelity/hifi/statuses/{sha}","languages_url":"https://api.github.com/repos/highfidelity/hifi/languages","stargazers_url":"https://api.github.com/repos/highfidelity/hifi/stargazers","contributors_url":"https://api.github.com/repos/highfidelity/hifi/contributors","subscribers_url":"https://api.github.com/repos/highfidelity/hifi/subscribers","subscription_url":"https://api.github.com/repos/highfidelity/hifi/subscription","commits_url":"https://api.github.com/repos/highfidelity/hifi/commits{/sha}","git_commits_url":"https://api.github.com/repos/highfidelity/hifi/git/commits{/sha}","comments_url":"https://api.github.com/repos/highfidelity/hifi/comments{/number}","issue_comment_url":"https://api.github.com/repos/highfidelity/hifi/issues/comments{/number}","contents_url":"https://api.github.com/repos/highfidelity/hifi/contents/{+path}","compare_url":"https://api.github.com/repos/highfidelity/hifi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/highfidelity/hifi/merges","archive_url":"https://api.github.com/repos/highfidelity/hifi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/highfidelity/hifi/downloads","issues_url":"https://api.github.com/repos/highfidelity/hifi/issues{/number}","pulls_url":"https://api.github.com/repos/highfidelity/hifi/pulls{/number}","milestones_url":"https://api.github.com/repos/highfidelity/hifi/milestones{/number}","notifications_url":"https://api.github.com/repos/highfidelity/hifi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/highfidelity/hifi/labels{/name}","releases_url":"https://api.github.com/repos/highfidelity/hifi/releases{/id}","created_at":"2012-08-10T18:26:22Z","updated_at":"2015-06-26T04:40:25Z","pushed_at":"2015-06-27T05:55:34Z","git_url":"git://github.com/highfidelity/hifi.git","ssh_url":"git@github.com:highfidelity/hifi.git","clone_url":"https://github.com/highfidelity/hifi.git","svn_url":"https://github.com/highfidelity/hifi","homepage":"","size":214230,"stargazers_count":282,"watchers_count":282,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":158,"mirror_url":null,"open_issues_count":58,"forks":158,"open_issues":58,"watchers":282,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/5229"},"html":{"href":"https://github.com/highfidelity/hifi/pull/5229"},"issue":{"href":"https://api.github.com/repos/highfidelity/hifi/issues/5229"},"comments":{"href":"https://api.github.com/repos/highfidelity/hifi/issues/5229/comments"},"review_comments":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/5229/comments"},"review_comment":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/5229/commits"},"statuses":{"href":"https://api.github.com/repos/highfidelity/hifi/statuses/4d4b97fe5947631b904df7aca8ec1a056d1fdfd6"}}}}