{"action":"created","comment":{"url":"https://api.github.com/repos/ampproject/amphtml/pulls/comments/229839016","pull_request_review_id":170415745,"id":229839016,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyOTgzOTAxNg==","diff_hunk":"@@ -0,0 +1,401 @@\n+/**\n+ * Copyright 2018 The AMP HTML Authors. All Rights Reserved.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *      http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS-IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+import {\n+  Action,\n+  StateProperty,\n+  UIType,\n+  getStoreService,\n+} from './amp-story-store-service';\n+import {CSS} from '../../../build/amp-story-tooltip-1.0.css';\n+import {EventType, dispatch} from './events';\n+import {Services} from '../../../src/services';\n+import {\n+  addAttributesToElement,\n+  childElement,\n+  removeElement,\n+} from '../../../src/dom';\n+import {createShadowRootWithStyle, getSourceOriginForElement} from './utils';\n+import {dev} from '../../../src/log';\n+import {dict} from '../../../src/utils/object';\n+import {getAmpdoc} from '../../../src/service';\n+import {htmlFor, htmlRefs} from '../../../src/static-template';\n+import {parseUrlDeprecated} from '../../../src/url';\n+import {setImportantStyles} from '../../../src/style';\n+\n+/**\n+ * Minimum vertical space needed to position tooltip.\n+ */\n+const MIN_VERTICAL_SPACE = 56;\n+\n+/**\n+ * Padding between tooltip and edges of screen.\n+ */\n+const EDGE_PADDING = 8;\n+\n+/**\n+ * List of selectors that can trigger a tooltip.\n+ * @const {!Array<string>}\n+ */\n+export const TOOLTIP_TRIGGERABLE_SELECTORS = ['a[href]'];\n+\n+/**\n+ * @struct @typedef {{\n+ *   tooltip: !Element,\n+ *   buttonLeft: !Element,\n+ *   buttonRight: !Element,\n+ *   arrow: !Element,\n+ * }}\n+ */\n+let tooltipElementsDef;\n+\n+/**\n+ * Tooltip element triggered by clickable elements in the amp-story-grid-layer.\n+ */\n+export class AmpStoryTooltip {\n+  /**\n+   * @param {!Window} win\n+   * @param {!Element} storyEl\n+   */\n+  constructor(win, storyEl) {\n+    /** @private {!Window} */\n+    this.win_ = win;\n+\n+    /** @private {!Element} */\n+    this.storyEl_ = storyEl;\n+\n+    /** @private {boolean} */\n+    this.isBuilt_ = false;\n+\n+    /** @private {?Element} */\n+    this.shadowRoot_ = null;\n+\n+    /** @private {?Element} */\n+    this.tooltipOverlayEl_ = null;\n+\n+    /** @private {?Element} */\n+    this.tooltip_ = null;\n+\n+    /** @private {?Element} */\n+    this.tooltipArrow_ = null;\n+\n+    /** @private @const {!./amp-story-store-service.AmpStoryStoreService} */\n+    this.storeService_ = getStoreService(this.win_);\n+\n+    /** @private @const {!../../../src/service/resources-impl.Resources} */\n+    this.resources_ = Services.resourcesForDoc(getAmpdoc(this.win_.document));\n+\n+    /**\n+     * Clicked element producing the tooltip. Used to avoid building the same\n+     * element twice.\n+     * @private {?Element} */\n+    this.clickedElem_ = null;\n+\n+    this.storeService_.subscribe(StateProperty.TOOLTIP_ELEMENT, elem => {\n+      if (!elem) {\n+        return;\n+      }\n+\n+      if (!this.isBuilt_) {\n+        this.storyEl_.appendChild(this.build_());\n+      }\n+\n+      if (elem != this.clickedElem_) {\n+        this.clickedElem_ = elem;\n+        this.attachTooltipToEl_(elem);\n+      }\n+      this.onTooltipStateUpdate_(true);\n+    });\n+  }\n+\n+  /**\n+   * Builds the tooltip overlay and appends it to the provided story.\n+   * @private\n+   */\n+  build_() {\n+    this.isBuilt_ = true;\n+\n+    this.shadowRoot_ = this.win_.document.createElement('div');\n+\n+    this.tooltipOverlayEl_ =\n+      dev().assert(this.buildTemplate_(this.win_.document));\n+    createShadowRootWithStyle(this.shadowRoot_, this.tooltipOverlayEl_, CSS);\n+\n+    this.tooltipOverlayEl_\n+        .addEventListener('click', event => this.onOutsideClickableEls_(event));\n+\n+    this.storeService_.subscribe(StateProperty.UI_STATE, isDesktop => {\n+      this.onUIStateUpdate_(isDesktop);\n+    }, true /** callToInitialize */);\n+\n+    this.storeService_.subscribe(StateProperty.CURRENT_PAGE_ID, () => {\n+      // Hide active tooltip when page switch is triggered by keyboard or\n+      // desktop buttons.\n+      this.closeTooltip_();\n+    });\n+\n+    return this.shadowRoot_;\n+  }\n+\n+  /**\n+   * Hides the tooltip layer.\n+   * @private\n+   */\n+  closeTooltip_() {\n+    this.storeService_.dispatch(Action.TOGGLE_TOOLTIP, null);\n+    // Hide active tooltip when page switch is triggered by keyboard or\n+    // desktop buttons.\n+    this.onTooltipStateUpdate_(false);\n+  }\n+\n+  /**\n+   * Reacts to store updates related to tooltip active status.\n+   * @param {boolean} tooltipIsActive\n+   * @private\n+   */\n+  onTooltipStateUpdate_(tooltipIsActive) {\n+    this.resources_.mutateElement(dev().assertElement(this.tooltipOverlayEl_),\n+        () => {\n+          this.tooltipOverlayEl_\n+              .classList.toggle('i-amphtml-hidden', !tooltipIsActive);\n+        });\n+  }\n+\n+  /**\n+   * Reacts to desktop state updates and hides navigation buttons since we\n+   * already have in the desktop UI.\n+   * @param {!UIType} uiState\n+   * @private\n+   */\n+  onUIStateUpdate_(uiState) {\n+    this.resources_.mutateElement(dev().assertElement(this.tooltipOverlayEl_),\n+        () => {\n+          uiState === UIType.DESKTOP ?\n+            this.tooltipOverlayEl_.setAttribute('desktop', '') :\n+            this.tooltipOverlayEl_.removeAttribute('desktop');\n+        });\n+  }\n+\n+  /**\n+   * Builds tooltip and attaches it depending on the clicked element content and\n+   * position.\n+   * @param {!Element} clickedEl\n+   * @private\n+   */\n+  attachTooltipToEl_(clickedEl) {\n+    const {href} = parseUrlDeprecated(clickedEl.getAttribute('href'));\n+\n+    const domainName = getSourceOriginForElement(clickedEl, href);\n+    const tooltipText = clickedEl.getAttribute('tooltipText') || domainName;\n+    this.appendTextToTooltip_(tooltipText);\n+\n+    const iconAttr = clickedEl.getAttribute('tooltipIcon');\n+    const iconSrc = iconAttr ? parseUrlDeprecated(iconAttr).href : '';\n+    this.appendIconToTooltip_(iconSrc);\n+\n+    this.positionTooltip_(clickedEl);\n+  }\n+\n+  /**\n+   * Checks for existing text content and modifies it or appends a new text node\n+   * if building tooltip for the first time.\n+   * @param {string} tooltipText\n+   * @private\n+   */\n+  appendTextToTooltip_(tooltipText) {\n+    const existingTooltipText = childElement(\n+        dev().assertElement(this.tooltip_),\n+        el => el.classList.contains('i-amphtml-tooltip-text'));\n+\n+    if (existingTooltipText) {\n+      existingTooltipText.textContent = tooltipText;\n+    } else {\n+      const html = htmlFor(this.win_.document);\n+      const tooltipTextEl =\n+        html`<p class=\"i-amphtml-tooltip-text\" ref=\"text\"></p>`;\n+      tooltipTextEl.textContent = tooltipText;\n+      this.tooltip_.insertBefore(tooltipTextEl, this.tooltip_.firstChild);\n+    }\n+  }\n+\n+  /**\n+   * Checks for existing icon source and modifies it or appends a new tooltip\n+   * icon node if building tooltip for the first time.\n+   * @param {string} iconSrc\n+   * @private\n+   */\n+  appendIconToTooltip_(iconSrc) {\n+    const existingTooltipIcon = childElement(\n+        dev().assertElement(this.tooltip_),\n+        el => el.classList.contains('i-amphtml-story-tooltip-icon'));","path":"extensions/amp-story/1.0/amp-story-tooltip.js","position":243,"original_position":243,"commit_id":"72a324b249de611187973742e97547a43b59c221","original_commit_id":"72a324b249de611187973742e97547a43b59c221","user":{"login":"gmajoulet","id":1492044,"node_id":"MDQ6VXNlcjE0OTIwNDQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1492044?v=4","gravatar_id":"","url":"https://api.github.com/users/gmajoulet","html_url":"https://github.com/gmajoulet","followers_url":"https://api.github.com/users/gmajoulet/followers","following_url":"https://api.github.com/users/gmajoulet/following{/other_user}","gists_url":"https://api.github.com/users/gmajoulet/gists{/gist_id}","starred_url":"https://api.github.com/users/gmajoulet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmajoulet/subscriptions","organizations_url":"https://api.github.com/users/gmajoulet/orgs","repos_url":"https://api.github.com/users/gmajoulet/repos","events_url":"https://api.github.com/users/gmajoulet/events{/privacy}","received_events_url":"https://api.github.com/users/gmajoulet/received_events","type":"User","site_admin":false},"body":"Same as above","created_at":"2018-10-31T19:36:43Z","updated_at":"2018-10-31T19:51:15Z","html_url":"https://github.com/ampproject/amphtml/pull/18945#discussion_r229839016","pull_request_url":"https://api.github.com/repos/ampproject/amphtml/pulls/18945","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/ampproject/amphtml/pulls/comments/229839016"},"html":{"href":"https://github.com/ampproject/amphtml/pull/18945#discussion_r229839016"},"pull_request":{"href":"https://api.github.com/repos/ampproject/amphtml/pulls/18945"}}},"pull_request":{"url":"https://api.github.com/repos/ampproject/amphtml/pulls/18945","id":225560441,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI1NTYwNDQx","html_url":"https://github.com/ampproject/amphtml/pull/18945","diff_url":"https://github.com/ampproject/amphtml/pull/18945.diff","patch_url":"https://github.com/ampproject/amphtml/pull/18945.patch","issue_url":"https://api.github.com/repos/ampproject/amphtml/issues/18945","number":18945,"state":"open","locked":false,"title":"✨ Implements tooltip for amp-story","user":{"login":"Enriqe","id":5449100,"node_id":"MDQ6VXNlcjU0NDkxMDA=","avatar_url":"https://avatars0.githubusercontent.com/u/5449100?v=4","gravatar_id":"","url":"https://api.github.com/users/Enriqe","html_url":"https://github.com/Enriqe","followers_url":"https://api.github.com/users/Enriqe/followers","following_url":"https://api.github.com/users/Enriqe/following{/other_user}","gists_url":"https://api.github.com/users/Enriqe/gists{/gist_id}","starred_url":"https://api.github.com/users/Enriqe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Enriqe/subscriptions","organizations_url":"https://api.github.com/users/Enriqe/orgs","repos_url":"https://api.github.com/users/Enriqe/repos","events_url":"https://api.github.com/users/Enriqe/events{/privacy}","received_events_url":"https://api.github.com/users/Enriqe/received_events","type":"User","site_admin":false},"body":"Resolves #16521\r\nResolves #16512\r\nResolves #16516\r\n\r\nImplements the tooltip UI and enables intercepting clicks in the amp-story-grid-layer. So far the supported clickable elements will be `<a>` tags.\r\n\r\nDemo: https://stamp-demo.firebaseapp.com/examples/amp-story/artezan/clickable-anchor.html\r\n1. Go to third page in story.\r\n2. Click on any of the colored rectangles.\r\n\r\nStill pending:\r\n- [ ] Validation for `<a>` tags inside `<amp-story-grid-layer>`\r\n- [ ] UX review\r\n- [ ] ABE documentation","created_at":"2018-10-24T21:44:29Z","updated_at":"2018-10-31T19:51:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5d4e40c27bd78f819249fbb9b87cf07300a391fb","assignee":{"login":"Enriqe","id":5449100,"node_id":"MDQ6VXNlcjU0NDkxMDA=","avatar_url":"https://avatars0.githubusercontent.com/u/5449100?v=4","gravatar_id":"","url":"https://api.github.com/users/Enriqe","html_url":"https://github.com/Enriqe","followers_url":"https://api.github.com/users/Enriqe/followers","following_url":"https://api.github.com/users/Enriqe/following{/other_user}","gists_url":"https://api.github.com/users/Enriqe/gists{/gist_id}","starred_url":"https://api.github.com/users/Enriqe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Enriqe/subscriptions","organizations_url":"https://api.github.com/users/Enriqe/orgs","repos_url":"https://api.github.com/users/Enriqe/repos","events_url":"https://api.github.com/users/Enriqe/events{/privacy}","received_events_url":"https://api.github.com/users/Enriqe/received_events","type":"User","site_admin":false},"assignees":[{"login":"Enriqe","id":5449100,"node_id":"MDQ6VXNlcjU0NDkxMDA=","avatar_url":"https://avatars0.githubusercontent.com/u/5449100?v=4","gravatar_id":"","url":"https://api.github.com/users/Enriqe","html_url":"https://github.com/Enriqe","followers_url":"https://api.github.com/users/Enriqe/followers","following_url":"https://api.github.com/users/Enriqe/following{/other_user}","gists_url":"https://api.github.com/users/Enriqe/gists{/gist_id}","starred_url":"https://api.github.com/users/Enriqe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Enriqe/subscriptions","organizations_url":"https://api.github.com/users/Enriqe/orgs","repos_url":"https://api.github.com/users/Enriqe/repos","events_url":"https://api.github.com/users/Enriqe/events{/privacy}","received_events_url":"https://api.github.com/users/Enriqe/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":731143317,"node_id":"MDU6TGFiZWw3MzExNDMzMTc=","url":"https://api.github.com/repos/ampproject/amphtml/labels/Category:%20AMP%20Story","name":"Category: AMP Story","color":"1d76db","default":false},{"id":284529946,"node_id":"MDU6TGFiZWwyODQ1Mjk5NDY=","url":"https://api.github.com/repos/ampproject/amphtml/labels/Type:%20Feature%20Request","name":"Type: Feature Request","color":"d4c5f9","default":false},{"id":596633554,"node_id":"MDU6TGFiZWw1OTY2MzM1NTQ=","url":"https://api.github.com/repos/ampproject/amphtml/labels/cla:%20yes","name":"cla: yes","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ampproject/amphtml/pulls/18945/commits","review_comments_url":"https://api.github.com/repos/ampproject/amphtml/pulls/18945/comments","review_comment_url":"https://api.github.com/repos/ampproject/amphtml/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ampproject/amphtml/issues/18945/comments","statuses_url":"https://api.github.com/repos/ampproject/amphtml/statuses/72a324b249de611187973742e97547a43b59c221","head":{"label":"Enriqe:tooltip","ref":"tooltip","sha":"72a324b249de611187973742e97547a43b59c221","user":{"login":"Enriqe","id":5449100,"node_id":"MDQ6VXNlcjU0NDkxMDA=","avatar_url":"https://avatars0.githubusercontent.com/u/5449100?v=4","gravatar_id":"","url":"https://api.github.com/users/Enriqe","html_url":"https://github.com/Enriqe","followers_url":"https://api.github.com/users/Enriqe/followers","following_url":"https://api.github.com/users/Enriqe/following{/other_user}","gists_url":"https://api.github.com/users/Enriqe/gists{/gist_id}","starred_url":"https://api.github.com/users/Enriqe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Enriqe/subscriptions","organizations_url":"https://api.github.com/users/Enriqe/orgs","repos_url":"https://api.github.com/users/Enriqe/repos","events_url":"https://api.github.com/users/Enriqe/events{/privacy}","received_events_url":"https://api.github.com/users/Enriqe/received_events","type":"User","site_admin":false},"repo":{"id":119459204,"node_id":"MDEwOlJlcG9zaXRvcnkxMTk0NTkyMDQ=","name":"amphtml","full_name":"Enriqe/amphtml","private":false,"owner":{"login":"Enriqe","id":5449100,"node_id":"MDQ6VXNlcjU0NDkxMDA=","avatar_url":"https://avatars0.githubusercontent.com/u/5449100?v=4","gravatar_id":"","url":"https://api.github.com/users/Enriqe","html_url":"https://github.com/Enriqe","followers_url":"https://api.github.com/users/Enriqe/followers","following_url":"https://api.github.com/users/Enriqe/following{/other_user}","gists_url":"https://api.github.com/users/Enriqe/gists{/gist_id}","starred_url":"https://api.github.com/users/Enriqe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Enriqe/subscriptions","organizations_url":"https://api.github.com/users/Enriqe/orgs","repos_url":"https://api.github.com/users/Enriqe/repos","events_url":"https://api.github.com/users/Enriqe/events{/privacy}","received_events_url":"https://api.github.com/users/Enriqe/received_events","type":"User","site_admin":false},"html_url":"https://github.com/Enriqe/amphtml","description":"AMP HTML source code, samples, and documentation.  See below for more info.","fork":true,"url":"https://api.github.com/repos/Enriqe/amphtml","forks_url":"https://api.github.com/repos/Enriqe/amphtml/forks","keys_url":"https://api.github.com/repos/Enriqe/amphtml/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Enriqe/amphtml/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Enriqe/amphtml/teams","hooks_url":"https://api.github.com/repos/Enriqe/amphtml/hooks","issue_events_url":"https://api.github.com/repos/Enriqe/amphtml/issues/events{/number}","events_url":"https://api.github.com/repos/Enriqe/amphtml/events","assignees_url":"https://api.github.com/repos/Enriqe/amphtml/assignees{/user}","branches_url":"https://api.github.com/repos/Enriqe/amphtml/branches{/branch}","tags_url":"https://api.github.com/repos/Enriqe/amphtml/tags","blobs_url":"https://api.github.com/repos/Enriqe/amphtml/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Enriqe/amphtml/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Enriqe/amphtml/git/refs{/sha}","trees_url":"https://api.github.com/repos/Enriqe/amphtml/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Enriqe/amphtml/statuses/{sha}","languages_url":"https://api.github.com/repos/Enriqe/amphtml/languages","stargazers_url":"https://api.github.com/repos/Enriqe/amphtml/stargazers","contributors_url":"https://api.github.com/repos/Enriqe/amphtml/contributors","subscribers_url":"https://api.github.com/repos/Enriqe/amphtml/subscribers","subscription_url":"https://api.github.com/repos/Enriqe/amphtml/subscription","commits_url":"https://api.github.com/repos/Enriqe/amphtml/commits{/sha}","git_commits_url":"https://api.github.com/repos/Enriqe/amphtml/git/commits{/sha}","comments_url":"https://api.github.com/repos/Enriqe/amphtml/comments{/number}","issue_comment_url":"https://api.github.com/repos/Enriqe/amphtml/issues/comments{/number}","contents_url":"https://api.github.com/repos/Enriqe/amphtml/contents/{+path}","compare_url":"https://api.github.com/repos/Enriqe/amphtml/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Enriqe/amphtml/merges","archive_url":"https://api.github.com/repos/Enriqe/amphtml/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Enriqe/amphtml/downloads","issues_url":"https://api.github.com/repos/Enriqe/amphtml/issues{/number}","pulls_url":"https://api.github.com/repos/Enriqe/amphtml/pulls{/number}","milestones_url":"https://api.github.com/repos/Enriqe/amphtml/milestones{/number}","notifications_url":"https://api.github.com/repos/Enriqe/amphtml/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Enriqe/amphtml/labels{/name}","releases_url":"https://api.github.com/repos/Enriqe/amphtml/releases{/id}","deployments_url":"https://api.github.com/repos/Enriqe/amphtml/deployments","created_at":"2018-01-30T00:20:37Z","updated_at":"2018-10-24T21:17:48Z","pushed_at":"2018-10-31T14:57:36Z","git_url":"git://github.com/Enriqe/amphtml.git","ssh_url":"git@github.com:Enriqe/amphtml.git","clone_url":"https://github.com/Enriqe/amphtml.git","svn_url":"https://github.com/Enriqe/amphtml","homepage":"https://www.ampproject.org","size":532778,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ampproject:master","ref":"master","sha":"7bc13892e58072ff3d42069f0532afbbb082f59e","user":{"login":"ampproject","id":14114390,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MTE0Mzkw","avatar_url":"https://avatars3.githubusercontent.com/u/14114390?v=4","gravatar_id":"","url":"https://api.github.com/users/ampproject","html_url":"https://github.com/ampproject","followers_url":"https://api.github.com/users/ampproject/followers","following_url":"https://api.github.com/users/ampproject/following{/other_user}","gists_url":"https://api.github.com/users/ampproject/gists{/gist_id}","starred_url":"https://api.github.com/users/ampproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ampproject/subscriptions","organizations_url":"https://api.github.com/users/ampproject/orgs","repos_url":"https://api.github.com/users/ampproject/repos","events_url":"https://api.github.com/users/ampproject/events{/privacy}","received_events_url":"https://api.github.com/users/ampproject/received_events","type":"Organization","site_admin":false},"repo":{"id":41766002,"node_id":"MDEwOlJlcG9zaXRvcnk0MTc2NjAwMg==","name":"amphtml","full_name":"ampproject/amphtml","private":false,"owner":{"login":"ampproject","id":14114390,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MTE0Mzkw","avatar_url":"https://avatars3.githubusercontent.com/u/14114390?v=4","gravatar_id":"","url":"https://api.github.com/users/ampproject","html_url":"https://github.com/ampproject","followers_url":"https://api.github.com/users/ampproject/followers","following_url":"https://api.github.com/users/ampproject/following{/other_user}","gists_url":"https://api.github.com/users/ampproject/gists{/gist_id}","starred_url":"https://api.github.com/users/ampproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ampproject/subscriptions","organizations_url":"https://api.github.com/users/ampproject/orgs","repos_url":"https://api.github.com/users/ampproject/repos","events_url":"https://api.github.com/users/ampproject/events{/privacy}","received_events_url":"https://api.github.com/users/ampproject/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ampproject/amphtml","description":"AMP HTML source code, samples, and documentation.  See below for more info.","fork":false,"url":"https://api.github.com/repos/ampproject/amphtml","forks_url":"https://api.github.com/repos/ampproject/amphtml/forks","keys_url":"https://api.github.com/repos/ampproject/amphtml/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ampproject/amphtml/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ampproject/amphtml/teams","hooks_url":"https://api.github.com/repos/ampproject/amphtml/hooks","issue_events_url":"https://api.github.com/repos/ampproject/amphtml/issues/events{/number}","events_url":"https://api.github.com/repos/ampproject/amphtml/events","assignees_url":"https://api.github.com/repos/ampproject/amphtml/assignees{/user}","branches_url":"https://api.github.com/repos/ampproject/amphtml/branches{/branch}","tags_url":"https://api.github.com/repos/ampproject/amphtml/tags","blobs_url":"https://api.github.com/repos/ampproject/amphtml/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ampproject/amphtml/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ampproject/amphtml/git/refs{/sha}","trees_url":"https://api.github.com/repos/ampproject/amphtml/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ampproject/amphtml/statuses/{sha}","languages_url":"https://api.github.com/repos/ampproject/amphtml/languages","stargazers_url":"https://api.github.com/repos/ampproject/amphtml/stargazers","contributors_url":"https://api.github.com/repos/ampproject/amphtml/contributors","subscribers_url":"https://api.github.com/repos/ampproject/amphtml/subscribers","subscription_url":"https://api.github.com/repos/ampproject/amphtml/subscription","commits_url":"https://api.github.com/repos/ampproject/amphtml/commits{/sha}","git_commits_url":"https://api.github.com/repos/ampproject/amphtml/git/commits{/sha}","comments_url":"https://api.github.com/repos/ampproject/amphtml/comments{/number}","issue_comment_url":"https://api.github.com/repos/ampproject/amphtml/issues/comments{/number}","contents_url":"https://api.github.com/repos/ampproject/amphtml/contents/{+path}","compare_url":"https://api.github.com/repos/ampproject/amphtml/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ampproject/amphtml/merges","archive_url":"https://api.github.com/repos/ampproject/amphtml/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ampproject/amphtml/downloads","issues_url":"https://api.github.com/repos/ampproject/amphtml/issues{/number}","pulls_url":"https://api.github.com/repos/ampproject/amphtml/pulls{/number}","milestones_url":"https://api.github.com/repos/ampproject/amphtml/milestones{/number}","notifications_url":"https://api.github.com/repos/ampproject/amphtml/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ampproject/amphtml/labels{/name}","releases_url":"https://api.github.com/repos/ampproject/amphtml/releases{/id}","deployments_url":"https://api.github.com/repos/ampproject/amphtml/deployments","created_at":"2015-09-01T22:10:53Z","updated_at":"2018-10-31T19:24:56Z","pushed_at":"2018-10-31T19:46:35Z","git_url":"git://github.com/ampproject/amphtml.git","ssh_url":"git@github.com:ampproject/amphtml.git","clone_url":"https://github.com/ampproject/amphtml.git","svn_url":"https://github.com/ampproject/amphtml","homepage":"https://www.ampproject.org","size":532661,"stargazers_count":12119,"watchers_count":12119,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":2667,"mirror_url":null,"archived":false,"open_issues_count":1519,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":2667,"open_issues":1519,"watchers":12119,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ampproject/amphtml/pulls/18945"},"html":{"href":"https://github.com/ampproject/amphtml/pull/18945"},"issue":{"href":"https://api.github.com/repos/ampproject/amphtml/issues/18945"},"comments":{"href":"https://api.github.com/repos/ampproject/amphtml/issues/18945/comments"},"review_comments":{"href":"https://api.github.com/repos/ampproject/amphtml/pulls/18945/comments"},"review_comment":{"href":"https://api.github.com/repos/ampproject/amphtml/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ampproject/amphtml/pulls/18945/commits"},"statuses":{"href":"https://api.github.com/repos/ampproject/amphtml/statuses/72a324b249de611187973742e97547a43b59c221"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"gmajoulet"}}