{"action":"created","comment":{"url":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/comments/69629948","id":69629948,"diff_hunk":"@@ -0,0 +1,781 @@\n+\n+#pragma once\n+\n+#include \"astronomy/date.hpp\"\n+\n+#include <array>\n+#include <cstdint>\n+\n+#include \"astronomy/epoch.hpp\"\n+#include \"geometry/named_quantities.hpp\"\n+#include \"glog/logging.h\"\n+#include \"quantities/si.hpp\"\n+\n+// A macro to allow glog checking within C++11 constexpr code.  If |condition|,\n+// evaluates to |expression|.  Otherwise, results in a CHECK failure at runtime\n+// and a compilation error due to a call to non-constexpr code at compile time.\n+#define CHECKING(condition, expression) \\\n+  ((condition) ? (expression) : (CHECK(condition), (expression)))\n+\n+namespace principia {\n+namespace astronomy {\n+namespace internal_date {\n+\n+using quantities::Time;\n+using quantities::si::Day;\n+using quantities::si::Second;\n+\n+// The following is horrendous in part because written in C++11, thus\n+// functionally; it should perhaps be reworked once MSVC offers proper C++14\n+// constexpr.\n+\n+// Calendar classes.\n+\n+class Date {\n+ public:\n+  static constexpr Date YYYYMMDD(std::int64_t digits);\n+  static constexpr Date YYYYwwD(std::int64_t digits);\n+  static constexpr Date YYYYDDD(std::int64_t digits);\n+\n+  static constexpr Date Calendar(int const year,\n+                                 int const month,\n+                                 int const day);\n+  static constexpr Date Ordinal(int const year, int const day);\n+  static constexpr Date Week(int const year, int const week, int const day);\n+\n+  constexpr int year() const;\n+  constexpr int month() const;\n+  constexpr int day() const;\n+\n+  constexpr int ordinal() const;\n+\n+  constexpr Date next_day() const;\n+\n+ private:\n+  constexpr Date(int const year,\n+                 std::int8_t const month,\n+                 std::int8_t const day);\n+\n+  int const year_;\n+  int const month_;\n+  int const day_;\n+};\n+\n+class TimeOfDay {\n+ public:\n+  static constexpr TimeOfDay hhmmss_ns(int const hhmmss, int ns);\n+\n+  constexpr int hour() const;\n+  constexpr int minute() const;\n+  constexpr int second() const;\n+  constexpr int nanosecond() const;\n+\n+  constexpr bool is_leap_second() const;\n+  // Whether |*this| is 24:00:00.\n+  constexpr bool is_end_of_day() const;\n+\n+ private:\n+  constexpr TimeOfDay(int const hour,\n+                      int const minute,\n+                      int const second,\n+                      int const nanosecond);\n+\n+  // Checks that this represents a valid time of day as per ISO 8601, thus\n+  // that the components are in the normal range, or that the object represents\n+  // a time in a leap second, or that it represents the end of the day.\n+  constexpr TimeOfDay const& checked() const;\n+\n+  int const hour_;\n+  int const minute_;\n+  int const second_;\n+  int const nanosecond_;\n+};\n+\n+class DateTime {\n+ public:\n+  constexpr Date const& date() const;\n+  constexpr TimeOfDay const& time() const;\n+\n+  // If |time()| is 24:00:00, returns an equivalent DateTime where midnight is\n+  // expressed as 00:00:00 on the next day; otherwise, returns *this.\n+  constexpr DateTime normalized_end_of_day() const;\n+\n+ private:\n+  constexpr DateTime(Date const date, TimeOfDay const time);\n+\n+  // Checks that |time| does not represent a leap second unless |date| is the\n+  // last day of June, December, March, or September.\n+  constexpr DateTime const& checked() const;\n+\n+  Date const date_;\n+  TimeOfDay const time_;\n+\n+  friend constexpr DateTime operator\"\"_DateTime(char const* string,\n+                                                 std::size_t size);\n+};\n+\n+// Arithmetico-calendrical utility functions.\n+\n+constexpr std::array<int, 12> non_leap_year_month_lengths{\n+    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};\n+\n+constexpr bool is_gregorian_leap_year(int const year) {\n+  return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n+}\n+\n+constexpr int gregorian_year_length(int const year) {\n+  return is_gregorian_leap_year(year) ? 366 : 365;\n+}\n+\n+constexpr int month_length(int year, int month) {\n+  return (is_gregorian_leap_year(year) && month == 2)\n+             ? 29\n+             : non_leap_year_month_lengths[month - 1];\n+}\n+\n+constexpr int mod_7_offset_1 (int const x) {\n+  return x % 7 == 0 ? 7 : (x % 7);\n+}\n+\n+// Result in [1, 7], 1 is Monday.\n+constexpr int day_of_week_on_january_1st(int const year) {\n+  // Gauss's formula, see\n+  // https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#Gauss.27s_algorithm.\n+  return mod_7_offset_1(1 +\n+                        5 * ((year - 1) % 4) +\n+                        4 * ((year - 1) % 100) +\n+                        6 * ((year - 1) % 400));\n+}\n+\n+constexpr bool is_53_week_year(int const year) {\n+  return day_of_week_on_january_1st(year) == 4 ||\n+         (is_gregorian_leap_year(year) &&\n+          day_of_week_on_january_1st(year) == 3);\n+}\n+\n+constexpr int ordinal_of_w_01_1(int const year) {\n+  return day_of_week_on_january_1st(year) <= 4\n+             ? 2 - day_of_week_on_january_1st(year)\n+             : (9 - day_of_week_on_january_1st(year));\n+}\n+\n+constexpr int days_from_2000_01_01_at_start_of_2000_based_year(\n+    int const years_from_2000) {\n+  return years_from_2000 > 0\n+             ? 1 + years_from_2000 * 365 +\n+               (years_from_2000 - 1) / 4 -\n+               (years_from_2000 - 1) / 100 +\n+               (years_from_2000 - 1) / 400\n+             : years_from_2000 * 365 +\n+               years_from_2000 / 4 -\n+               years_from_2000 / 100 +\n+               years_from_2000 / 400;\n+}\n+\n+// Returns the number formed by taking |size| increasingly significant digits,\n+// starting from the digit of the (10 ** |begin|)s.\n+constexpr std::int64_t digit_range(std::int64_t const digits,\n+                                   int const begin,\n+                                   int const size) {\n+  return CHECKING(\n+      digits >= 0 && begin >= 0 && size >= 0,\n+      (size == 0) ? 0 : ((begin == 0)\n+                             ? digit_range(digits / 10, 0, size - 1) * 10 +\n+                                   digits % 10\n+                             : digit_range(digits / 10, begin - 1, size)));\n+}\n+\n+// Returns x * 10 ** count.\n+constexpr std::int64_t add_0s(std::int64_t const x, int const count) {\n+  return CHECKING(count >= 0, count == 0 ? x : add_0s(x * 10, count - 1));\n+}\n+\n+// Returns |date| advanced by the specified number of |days|. |days| must be\n+// nonnegative, and the result must be in the same year.\n+constexpr Date add_days_within_year(Date const& date, int const days) {\n+  return CHECKING(\n+      days >= 0,\n+      days == 0\n+          ? date\n+          : (date.day() + days > month_length(date.year(), date.month())\n+                 ? CHECKING(\n+                       date.month() <= 11,\n+                       add_days_within_year(\n+                           Date::Calendar(date.year(), date.month() + 1, 1),\n+                           days - month_length(date.year(), date.month()) +\n+                               date.day() - 1))\n+                 : Date::Calendar(date.year(),\n+                                  date.month(),\n+                                  date.day() + days)));\n+}\n+\n+// The |day|th day of some |year|.  The resulting date need not be in |year|.\n+constexpr Date ArbitraryOrdinal(int const year, int const day) {\n+  return day < 1\n+             ? ArbitraryOrdinal(year - 1, gregorian_year_length(year - 1) + day)\n+             : day > gregorian_year_length(year)\n+                   ? ArbitraryOrdinal(year + 1,\n+                                      day - gregorian_year_length(year))\n+                   : Date::Ordinal(year, day);\n+}\n+\n+// Implementation of class |Date|.\n+\n+constexpr Date Date::YYYYMMDD(std::int64_t digits) {\n+  return CHECKING(digits > 0 && digits < 9999'99'99,\n+                  Date::Calendar(digit_range(digits, 4, 4),\n+                                 digit_range(digits, 2, 2),\n+                                 digit_range(digits, 0, 2)));\n+}\n+\n+constexpr Date Date::YYYYDDD(std::int64_t digits) {\n+  return CHECKING(\n+      digits > 0 && digits < 9999'999,\n+      Date::Ordinal(digit_range(digits, 3, 4), digit_range(digits, 0, 3)));\n+}\n+\n+constexpr Date Date::YYYYwwD(std::int64_t digits) {\n+  return CHECKING(digits > 0 && digits < 9999'99'9,\n+                  Date::Week(digit_range(digits, 3, 4),\n+                             digit_range(digits, 1, 2),\n+                             digit_range(digits, 0, 1)));\n+}\n+\n+constexpr Date Date::Calendar(int const year, int const month, int const day) {\n+  return CHECKING(year >= 1583 && year <= 9999 && month >= 1 && month <= 12 &&\n+                  day >= 1 && day <= month_length(year, month),\n+                  Date(year, month, day));\n+}\n+\n+constexpr Date Date::Ordinal(int const year, int const day) {\n+  return CHECKING(\n+      day >= 1 && day <= gregorian_year_length(year),\n+      add_days_within_year(Date::Calendar(year, 1, 1), day - 1));\n+}\n+\n+constexpr Date Date::Week(int const year, int const week, int const day) {\n+  return CHECKING(week >= 1 && week <= (is_53_week_year(year) ? 53 : 52) &&\n+                  day >= 1 && day <= 7,\n+                  ArbitraryOrdinal(\n+                      year,\n+                      (week - 1) * 7 + day - 1 + ordinal_of_w_01_1(year)));\n+}\n+\n+constexpr int Date::year() const {\n+  return year_;\n+}\n+\n+constexpr int Date::month() const {\n+  return month_;\n+}\n+\n+constexpr int Date::day() const {\n+  return day_;\n+}\n+\n+constexpr int Date::ordinal() const {\n+  return day_ > 1 ? (day_ - 1) + Date(year_, month_, 1).ordinal()\n+                  : month_ > 1\n+                        ? month_length(year_, month_ - 1) +\n+                              Date(year_, month_ - 1, 1).ordinal()\n+                        : 1;\n+}\n+\n+constexpr Date Date::next_day() const {\n+  return day_ == month_length(year_, month_)\n+             ? month_ == 12 ? Date(year_ + 1, 1, 1) : Date(year_, month_ + 1, 1)\n+             : Date(year_, month_, day_ + 1);\n+}\n+\n+constexpr Date::Date(int const year,\n+                     std::int8_t const month,\n+                     std::int8_t const day)\n+      : year_(year),\n+        month_(month),\n+        day_(day) {}\n+\n+// Implementation of class TimeOfDay.\n+\n+constexpr TimeOfDay TimeOfDay::hhmmss_ns(int const hhmmss, int ns) {\n+  return TimeOfDay(digit_range(hhmmss, 4, 2),\n+                   digit_range(hhmmss, 2, 2),\n+                   digit_range(hhmmss, 0, 2),\n+                   ns).checked();\n+}\n+\n+constexpr int TimeOfDay::hour() const {\n+  return hour_;\n+}\n+\n+constexpr int TimeOfDay::minute() const {\n+  return minute_;\n+}\n+\n+constexpr int TimeOfDay::second() const {\n+  return second_;\n+}\n+\n+constexpr int TimeOfDay::nanosecond() const {\n+  return nanosecond_;\n+}\n+\n+constexpr bool TimeOfDay::is_leap_second() const {\n+  return second_ == 60;\n+}\n+\n+constexpr bool TimeOfDay::is_end_of_day() const {\n+  return hour_ == 24;\n+}\n+\n+constexpr TimeOfDay::TimeOfDay(int const hour,\n+                               int const minute,\n+                               int const second,\n+                               int const nanosecond)\n+    : hour_(hour),\n+      minute_(minute),\n+      second_(second),\n+      nanosecond_(nanosecond) {}\n+\n+constexpr TimeOfDay const& TimeOfDay::checked() const {\n+  return CHECKING(\n+      (hour_ == 24 && minute_ == 0 && second_ == 0 && nanosecond_ == 0) ||\n+          ((nanosecond_ >= 0 && nanosecond_ <= 999'999'999) &&\n+           ((hour_ == 23 && minute_ == 59 && second_ == 60) ||\n+            (hour_ >= 0 && hour_ <= 23 && minute_ >= 0 && minute_ <= 59 &&\n+             second_ >= 0 && second_ <= 59))),\n+      *this);\n+}\n+\n+// Implementation of class DateTime.\n+\n+constexpr Date const& DateTime::date() const {\n+  return date_;\n+}\n+\n+constexpr TimeOfDay const& DateTime::time() const {\n+  return time_;\n+}\n+\n+constexpr DateTime DateTime::normalized_end_of_day() const {\n+  return time_.is_end_of_day()\n+             ? DateTime(date_.next_day(), TimeOfDay::hhmmss_ns(00'00'00, 0))\n+             : *this;\n+}\n+\n+constexpr DateTime::DateTime(Date const date, TimeOfDay const time)\n+    : date_(date),\n+      time_(time) {}\n+\n+constexpr DateTime const& DateTime::checked() const {\n+  return CHECKING(\n+      !time_.is_leap_second() ||\n+          (date_.day() == month_length(date_.year(), date_.month()) &&\n+           (date_.month() == 6 || date_.month() == 12 || date_.month() == 3 ||\n+            date_.month() == 9)),\n+      *this);\n+}\n+\n+// Date parsing.\n+\n+struct DateStringInfo {\n+  constexpr DateStringInfo Fill() const {","path":"astronomy/date_body.hpp","position":381,"original_position":381,"commit_id":"e634d8f6cd92fb60038561d356d9bb19f200f63f","original_commit_id":"e634d8f6cd92fb60038561d356d9bb19f200f63f","user":{"login":"pleroy","id":7423020,"avatar_url":"https://avatars.githubusercontent.com/u/7423020?v=3","gravatar_id":"","url":"https://api.github.com/users/pleroy","html_url":"https://github.com/pleroy","followers_url":"https://api.github.com/users/pleroy/followers","following_url":"https://api.github.com/users/pleroy/following{/other_user}","gists_url":"https://api.github.com/users/pleroy/gists{/gist_id}","starred_url":"https://api.github.com/users/pleroy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pleroy/subscriptions","organizations_url":"https://api.github.com/users/pleroy/orgs","repos_url":"https://api.github.com/users/pleroy/repos","events_url":"https://api.github.com/users/pleroy/events{/privacy}","received_events_url":"https://api.github.com/users/pleroy/received_events","type":"User","site_admin":false},"body":"Can we put the definition out-of-line?  Also, a comment as to what this does.","created_at":"2016-07-05T20:17:20Z","updated_at":"2016-07-05T20:17:20Z","html_url":"https://github.com/mockingbirdnest/Principia/pull/1087#discussion_r69629948","pull_request_url":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/1087","_links":{"self":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/comments/69629948"},"html":{"href":"https://github.com/mockingbirdnest/Principia/pull/1087#discussion_r69629948"},"pull_request":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/1087"}}},"pull_request":{"url":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/1087","id":76194463,"html_url":"https://github.com/mockingbirdnest/Principia/pull/1087","diff_url":"https://github.com/mockingbirdnest/Principia/pull/1087.diff","patch_url":"https://github.com/mockingbirdnest/Principia/pull/1087.patch","issue_url":"https://api.github.com/repos/mockingbirdnest/Principia/issues/1087","number":1087,"state":"open","locked":false,"title":"Dates","user":{"login":"eggrobin","id":2284290,"avatar_url":"https://avatars.githubusercontent.com/u/2284290?v=3","gravatar_id":"","url":"https://api.github.com/users/eggrobin","html_url":"https://github.com/eggrobin","followers_url":"https://api.github.com/users/eggrobin/followers","following_url":"https://api.github.com/users/eggrobin/following{/other_user}","gists_url":"https://api.github.com/users/eggrobin/gists{/gist_id}","starred_url":"https://api.github.com/users/eggrobin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eggrobin/subscriptions","organizations_url":"https://api.github.com/users/eggrobin/orgs","repos_url":"https://api.github.com/users/eggrobin/repos","events_url":"https://api.github.com/users/eggrobin/events{/privacy}","received_events_url":"https://api.github.com/users/eggrobin/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-07-04T19:07:05Z","updated_at":"2016-07-05T20:17:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f1f225d4bf594a6ff3e7f4563ca679827d8ab308","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/1087/commits","review_comments_url":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/1087/comments","review_comment_url":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mockingbirdnest/Principia/issues/1087/comments","statuses_url":"https://api.github.com/repos/mockingbirdnest/Principia/statuses/e634d8f6cd92fb60038561d356d9bb19f200f63f","head":{"label":"eggrobin:dates","ref":"dates","sha":"e634d8f6cd92fb60038561d356d9bb19f200f63f","user":{"login":"eggrobin","id":2284290,"avatar_url":"https://avatars.githubusercontent.com/u/2284290?v=3","gravatar_id":"","url":"https://api.github.com/users/eggrobin","html_url":"https://github.com/eggrobin","followers_url":"https://api.github.com/users/eggrobin/followers","following_url":"https://api.github.com/users/eggrobin/following{/other_user}","gists_url":"https://api.github.com/users/eggrobin/gists{/gist_id}","starred_url":"https://api.github.com/users/eggrobin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eggrobin/subscriptions","organizations_url":"https://api.github.com/users/eggrobin/orgs","repos_url":"https://api.github.com/users/eggrobin/repos","events_url":"https://api.github.com/users/eggrobin/events{/privacy}","received_events_url":"https://api.github.com/users/eggrobin/received_events","type":"User","site_admin":false},"repo":{"id":19360849,"name":"Principia","full_name":"eggrobin/Principia","owner":{"login":"eggrobin","id":2284290,"avatar_url":"https://avatars.githubusercontent.com/u/2284290?v=3","gravatar_id":"","url":"https://api.github.com/users/eggrobin","html_url":"https://github.com/eggrobin","followers_url":"https://api.github.com/users/eggrobin/followers","following_url":"https://api.github.com/users/eggrobin/following{/other_user}","gists_url":"https://api.github.com/users/eggrobin/gists{/gist_id}","starred_url":"https://api.github.com/users/eggrobin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eggrobin/subscriptions","organizations_url":"https://api.github.com/users/eggrobin/orgs","repos_url":"https://api.github.com/users/eggrobin/repos","events_url":"https://api.github.com/users/eggrobin/events{/privacy}","received_events_url":"https://api.github.com/users/eggrobin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/eggrobin/Principia","description":"N-Body Gravitation and Better Integrators for Kerbal Space Program","fork":true,"url":"https://api.github.com/repos/eggrobin/Principia","forks_url":"https://api.github.com/repos/eggrobin/Principia/forks","keys_url":"https://api.github.com/repos/eggrobin/Principia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/eggrobin/Principia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/eggrobin/Principia/teams","hooks_url":"https://api.github.com/repos/eggrobin/Principia/hooks","issue_events_url":"https://api.github.com/repos/eggrobin/Principia/issues/events{/number}","events_url":"https://api.github.com/repos/eggrobin/Principia/events","assignees_url":"https://api.github.com/repos/eggrobin/Principia/assignees{/user}","branches_url":"https://api.github.com/repos/eggrobin/Principia/branches{/branch}","tags_url":"https://api.github.com/repos/eggrobin/Principia/tags","blobs_url":"https://api.github.com/repos/eggrobin/Principia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/eggrobin/Principia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/eggrobin/Principia/git/refs{/sha}","trees_url":"https://api.github.com/repos/eggrobin/Principia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/eggrobin/Principia/statuses/{sha}","languages_url":"https://api.github.com/repos/eggrobin/Principia/languages","stargazers_url":"https://api.github.com/repos/eggrobin/Principia/stargazers","contributors_url":"https://api.github.com/repos/eggrobin/Principia/contributors","subscribers_url":"https://api.github.com/repos/eggrobin/Principia/subscribers","subscription_url":"https://api.github.com/repos/eggrobin/Principia/subscription","commits_url":"https://api.github.com/repos/eggrobin/Principia/commits{/sha}","git_commits_url":"https://api.github.com/repos/eggrobin/Principia/git/commits{/sha}","comments_url":"https://api.github.com/repos/eggrobin/Principia/comments{/number}","issue_comment_url":"https://api.github.com/repos/eggrobin/Principia/issues/comments{/number}","contents_url":"https://api.github.com/repos/eggrobin/Principia/contents/{+path}","compare_url":"https://api.github.com/repos/eggrobin/Principia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/eggrobin/Principia/merges","archive_url":"https://api.github.com/repos/eggrobin/Principia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/eggrobin/Principia/downloads","issues_url":"https://api.github.com/repos/eggrobin/Principia/issues{/number}","pulls_url":"https://api.github.com/repos/eggrobin/Principia/pulls{/number}","milestones_url":"https://api.github.com/repos/eggrobin/Principia/milestones{/number}","notifications_url":"https://api.github.com/repos/eggrobin/Principia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/eggrobin/Principia/labels{/name}","releases_url":"https://api.github.com/repos/eggrobin/Principia/releases{/id}","deployments_url":"https://api.github.com/repos/eggrobin/Principia/deployments","created_at":"2014-05-01T23:29:34Z","updated_at":"2016-02-06T17:41:10Z","pushed_at":"2016-07-04T19:05:50Z","git_url":"git://github.com/eggrobin/Principia.git","ssh_url":"git@github.com:eggrobin/Principia.git","clone_url":"https://github.com/eggrobin/Principia.git","svn_url":"https://github.com/eggrobin/Principia","homepage":"http://forum.kerbalspaceprogram.com/threads/68502-WIP-Principia-N-Body-Gravitation-and-Better-Integrators-for-Kerbal-Space-Program","size":25400,"stargazers_count":2,"watchers_count":2,"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":2,"default_branch":"master"}},"base":{"label":"mockingbirdnest:master","ref":"master","sha":"e461f4a8592bee1e83ee5a4f8143a0796d6b84d3","user":{"login":"mockingbirdnest","id":7462691,"avatar_url":"https://avatars.githubusercontent.com/u/7462691?v=3","gravatar_id":"","url":"https://api.github.com/users/mockingbirdnest","html_url":"https://github.com/mockingbirdnest","followers_url":"https://api.github.com/users/mockingbirdnest/followers","following_url":"https://api.github.com/users/mockingbirdnest/following{/other_user}","gists_url":"https://api.github.com/users/mockingbirdnest/gists{/gist_id}","starred_url":"https://api.github.com/users/mockingbirdnest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mockingbirdnest/subscriptions","organizations_url":"https://api.github.com/users/mockingbirdnest/orgs","repos_url":"https://api.github.com/users/mockingbirdnest/repos","events_url":"https://api.github.com/users/mockingbirdnest/events{/privacy}","received_events_url":"https://api.github.com/users/mockingbirdnest/received_events","type":"Organization","site_admin":false},"repo":{"id":16634370,"name":"Principia","full_name":"mockingbirdnest/Principia","owner":{"login":"mockingbirdnest","id":7462691,"avatar_url":"https://avatars.githubusercontent.com/u/7462691?v=3","gravatar_id":"","url":"https://api.github.com/users/mockingbirdnest","html_url":"https://github.com/mockingbirdnest","followers_url":"https://api.github.com/users/mockingbirdnest/followers","following_url":"https://api.github.com/users/mockingbirdnest/following{/other_user}","gists_url":"https://api.github.com/users/mockingbirdnest/gists{/gist_id}","starred_url":"https://api.github.com/users/mockingbirdnest/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mockingbirdnest/subscriptions","organizations_url":"https://api.github.com/users/mockingbirdnest/orgs","repos_url":"https://api.github.com/users/mockingbirdnest/repos","events_url":"https://api.github.com/users/mockingbirdnest/events{/privacy}","received_events_url":"https://api.github.com/users/mockingbirdnest/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mockingbirdnest/Principia","description":"N-Body Gravitation and Better Integrators for Kerbal Space Program","fork":false,"url":"https://api.github.com/repos/mockingbirdnest/Principia","forks_url":"https://api.github.com/repos/mockingbirdnest/Principia/forks","keys_url":"https://api.github.com/repos/mockingbirdnest/Principia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mockingbirdnest/Principia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mockingbirdnest/Principia/teams","hooks_url":"https://api.github.com/repos/mockingbirdnest/Principia/hooks","issue_events_url":"https://api.github.com/repos/mockingbirdnest/Principia/issues/events{/number}","events_url":"https://api.github.com/repos/mockingbirdnest/Principia/events","assignees_url":"https://api.github.com/repos/mockingbirdnest/Principia/assignees{/user}","branches_url":"https://api.github.com/repos/mockingbirdnest/Principia/branches{/branch}","tags_url":"https://api.github.com/repos/mockingbirdnest/Principia/tags","blobs_url":"https://api.github.com/repos/mockingbirdnest/Principia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mockingbirdnest/Principia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mockingbirdnest/Principia/git/refs{/sha}","trees_url":"https://api.github.com/repos/mockingbirdnest/Principia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mockingbirdnest/Principia/statuses/{sha}","languages_url":"https://api.github.com/repos/mockingbirdnest/Principia/languages","stargazers_url":"https://api.github.com/repos/mockingbirdnest/Principia/stargazers","contributors_url":"https://api.github.com/repos/mockingbirdnest/Principia/contributors","subscribers_url":"https://api.github.com/repos/mockingbirdnest/Principia/subscribers","subscription_url":"https://api.github.com/repos/mockingbirdnest/Principia/subscription","commits_url":"https://api.github.com/repos/mockingbirdnest/Principia/commits{/sha}","git_commits_url":"https://api.github.com/repos/mockingbirdnest/Principia/git/commits{/sha}","comments_url":"https://api.github.com/repos/mockingbirdnest/Principia/comments{/number}","issue_comment_url":"https://api.github.com/repos/mockingbirdnest/Principia/issues/comments{/number}","contents_url":"https://api.github.com/repos/mockingbirdnest/Principia/contents/{+path}","compare_url":"https://api.github.com/repos/mockingbirdnest/Principia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mockingbirdnest/Principia/merges","archive_url":"https://api.github.com/repos/mockingbirdnest/Principia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mockingbirdnest/Principia/downloads","issues_url":"https://api.github.com/repos/mockingbirdnest/Principia/issues{/number}","pulls_url":"https://api.github.com/repos/mockingbirdnest/Principia/pulls{/number}","milestones_url":"https://api.github.com/repos/mockingbirdnest/Principia/milestones{/number}","notifications_url":"https://api.github.com/repos/mockingbirdnest/Principia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mockingbirdnest/Principia/labels{/name}","releases_url":"https://api.github.com/repos/mockingbirdnest/Principia/releases{/id}","deployments_url":"https://api.github.com/repos/mockingbirdnest/Principia/deployments","created_at":"2014-02-08T02:55:32Z","updated_at":"2016-06-24T13:15:54Z","pushed_at":"2016-07-04T19:07:06Z","git_url":"git://github.com/mockingbirdnest/Principia.git","ssh_url":"git@github.com:mockingbirdnest/Principia.git","clone_url":"https://github.com/mockingbirdnest/Principia.git","svn_url":"https://github.com/mockingbirdnest/Principia","homepage":"http://forum.kerbalspaceprogram.com/threads/68502-WIP-Principia-N-Body-Gravitation-and-Better-Integrators-for-Kerbal-Space-Program","size":27564,"stargazers_count":121,"watchers_count":121,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":16,"mirror_url":null,"open_issues_count":49,"forks":16,"open_issues":49,"watchers":121,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/1087"},"html":{"href":"https://github.com/mockingbirdnest/Principia/pull/1087"},"issue":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/issues/1087"},"comments":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/issues/1087/comments"},"review_comments":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/1087/comments"},"review_comment":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/pulls/1087/commits"},"statuses":{"href":"https://api.github.com/repos/mockingbirdnest/Principia/statuses/e634d8f6cd92fb60038561d356d9bb19f200f63f"}}}}
{"actor":{"display_login":"pleroy"}}