{"action":"created","comment":{"url":"https://api.github.com/repos/angular/material/pulls/comments/31967879","id":31967879,"diff_hunk":"@@ -0,0 +1,307 @@\n+angular.module('material.components.menu')\n+.provider('$mdMenu', MenuProvider);\n+\n+/*\n+ * Interim element provider for the menu.\n+ * Handles behavior for a menu while it is open, including:\n+ *    - handling animating the menu opening/closing\n+ *    - handling key/mouse events on the menu element\n+ *    - handling enabling/disabling scroll while the menu is open\n+ *    - handling redrawing during resizes and orientation changes\n+ *\n+ */\n+\n+function MenuProvider($$interimElementProvider) {\n+  var MENU_EDGE_MARGIN = 8;\n+\n+  return $$interimElementProvider('$mdMenu')\n+    .setDefaults({\n+      methods: ['target'],\n+      options: menuDefaultOptions\n+    });\n+\n+  /* @ngInject */\n+  function menuDefaultOptions($$rAF, $window, $mdUtil, $mdTheming, $timeout, $mdConstant, $document) {\n+    return {\n+      parent: 'body',\n+      onShow: onShow,\n+      onRemove: onRemove,\n+      hasBackdrop: true,\n+      disableParentScroll: true,\n+      skipCompile: true,\n+      themable: true\n+    };\n+\n+    // Interim element onShow fn, handles inserting it into the DOM, wiring up\n+    // listeners and calling the positioning fn\n+    function onShow(scope, element, opts) {\n+      if (!opts.target) {\n+        throw new Error('$mdMenu.show() expected a target to animate from in options.target');\n+      }\n+\n+      angular.extend(opts, {\n+        alreadyOpen: false,\n+        isRemoved: false,\n+        target: angular.element(opts.target), //make sure it's not a naked dom node\n+        parent: angular.element(opts.parent),\n+        menuContentEl: angular.element(element[0].querySelector('md-menu-content')),\n+        backdrop: opts.hasBackdrop && angular.element('<md-backdrop class=\"md-menu-backdrop md-click-catcher\">')\n+      });\n+\n+      $mdTheming.inherit(opts.menuContentEl, opts.target);\n+\n+      opts.resizeFn = function() {\n+        positionMenu(scope, element, opts);\n+      };\n+      angular.element($window).on('resize', opts.resizeFn);\n+      angular.element($window).on('orientationchange', opts.resizeFn);\n+\n+      if (opts.disableParentScroll) {\n+        opts.restoreScroll = $mdUtil.disableScrollAround(opts.target);\n+      }\n+\n+      // Only activate click listeners after a short time to stop accidental double taps/clicks\n+      // from clicking the wrong item\n+      $timeout(activateInteraction, 75, false);\n+\n+      if (opts.backdrop) {\n+        $mdTheming.inherit(opts.backdrop, opts.parent);\n+        opts.parent.append(opts.backdrop);\n+      }\n+      opts.parent.append(element);\n+\n+      element.removeClass('md-leave');\n+      $$rAF(function() {\n+        $$rAF(function() {\n+          positionMenu(scope, element, opts);\n+          $$rAF(function() {\n+            element.addClass('md-active');\n+            opts.alreadyOpen = true;\n+            element[0].style[$mdConstant.CSS.TRANSFORM] = '';\n+          });\n+        });\n+      });\n+\n+      return $mdUtil.transitionEndPromise(element, {timeout: 350});\n+\n+\n+      // Activate interaction on the menu popup, allowing it to be closed by\n+      // clicking on the backdrop, with escape, clicking options, etc.\n+      function activateInteraction() {\n+        element.addClass('md-clickable');\n+        opts.backdrop && opts.backdrop.on('click', function(e) {\n+          e.preventDefault();\n+          e.stopPropagation();\n+          opts.mdMenuCtrl.close(true);\n+        });\n+\n+        opts.menuContentEl.on('keydown', function(ev) {\n+          scope.$apply(function() {\n+            switch (ev.keyCode) {\n+              case $mdConstant.KEY_CODE.ESCAPE: opts.mdMenuCtrl.close(); break;\n+              case $mdConstant.KEY_CODE.UP_ARROW: focusPrevMenuItem(ev, opts.menuContentEl, opts); break;\n+              case $mdConstant.KEY_CODE.DOWN_ARROW: focusNextMenuItem(ev, opts.menuContentEl, opts); break;\n+            }\n+          });\n+        });\n+\n+        opts.menuContentEl.on('click', function(e) {\n+          var target = e.target;\n+          do {\n+            if (target && target.hasAttribute('ng-click')) {\n+              if (!target.hasAttribute('disabled')) {\n+                close();\n+              }\n+              break;\n+            }\n+          } while ((target = target.parentNode) && target != opts.menuContentEl)\n+\n+          function close() {\n+            scope.$apply(function() {\n+              opts.mdMenuCtrl.close();\n+            });\n+          }\n+        });\n+\n+        var focusTarget = opts.menuContentEl[0].querySelector('[md-menu-focus-target]');\n+        if (!focusTarget) focusTarget = opts.menuContentEl[0].firstElementChild.firstElementChild;\n+        focusTarget.focus();\n+      }\n+    }\n+\n+    function focusPrevMenuItem(e, menuEl, opts) {\n+      var currentItem = $mdUtil.getClosest(e.target, 'MD-MENU-ITEM');\n+\n+      var items = nodesToArray(menuEl[0].children);\n+      var currentIndex = items.indexOf(currentItem);\n+\n+      for (var i = currentIndex - 1; i >= 0; --i) {\n+        var focusTarget = items[i].firstElementChild || items[i];\n+        var didFocus = attemptFocus(focusTarget);\n+        if (didFocus) {\n+          break;\n+        }\n+      }\n+    }\n+\n+    function focusNextMenuItem(e, menuEl, opts) {\n+      var currentItem = $mdUtil.getClosest(e.target, 'MD-MENU-ITEM');\n+\n+      var items = nodesToArray(menuEl[0].children);\n+\n+      var currentIndex = items.indexOf(currentItem);\n+\n+      for (var i = currentIndex + 1; i < items.length; ++i) {\n+        var focusTarget = items[i].firstElementChild || items[i];\n+        var didFocus = attemptFocus(focusTarget);\n+        if (didFocus) {\n+          break;\n+        }\n+      }\n+    }\n+\n+    function attemptFocus(el) {\n+      if (el && el.getAttribute('tabindex') != -1) {\n+        el.focus();\n+        if ($document[0].activeElement == el) {\n+          return true;\n+        } else {\n+          return false;\n+        }\n+      }\n+    }\n+\n+    // Interim element onRemove fn, handles removing the element from the DOM\n+    function onRemove(scope, element, opts) {\n+      opts.isRemoved = true;\n+      element.addClass('md-leave')\n+        .removeClass('md-clickable');\n+      angular.element($window).off('resize', opts.resizeFn);\n+      angular.element($window).off('orientationchange', opts.resizeFn);\n+      opts.resizeFn = undefined;\n+\n+      return $mdUtil.transitionEndPromise(element, { timeout: 350 }).then(function() {\n+        element.removeClass('md-active');\n+        opts.backdrop && opts.backdrop.remove();\n+        if (element[0].parentNode === opts.parent[0]) {\n+          opts.parent[0].removeChild(element[0]);\n+        }\n+        opts.restoreScroll && opts.restoreScroll();\n+      });\n+    }\n+\n+    // Handles computing the pop-ups position relative to the target (origin md-menu)\n+    function positionMenu(scope, el, opts) {\n+      if (opts.isRemoved) return;\n+\n+      var containerNode = el[0],\n+          openMenuNode = el[0].firstElementChild,\n+          openMenuNodeRect = openMenuNode.getBoundingClientRect(),\n+          boundryNode = opts.parent[0],\n+          boundryNodeRect = boundryNode.getBoundingClientRect();\n+\n+      var originNode = opts.target[0].querySelector('[md-menu-origin]') || opts.target[0],\n+          originNodeRect = originNode.getBoundingClientRect();\n+\n+\n+      var bounds = {\n+        left: boundryNodeRect.left + MENU_EDGE_MARGIN,\n+        top: boundryNodeRect.top + MENU_EDGE_MARGIN,\n+        bottom: boundryNodeRect.bottom - MENU_EDGE_MARGIN,\n+        right: boundryNodeRect.right - MENU_EDGE_MARGIN\n+      };\n+\n+\n+      var alignTarget, alignTargetRect, existingOffsets;\n+      var positionMode = opts.mdMenuCtrl.positionMode();\n+\n+      if (positionMode.top == 'target' || positionMode.left == 'target' || positionMode.left == 'target-right') {\n+        // TODO: Allow centering on an arbitrary node, for now center on first menu-item's child\n+        alignTarget = openMenuNode.firstElementChild.firstElementChild || openMenuNode.firstElementChild;\n+        alignTarget = alignTarget.querySelector('[md-menu-align-target]') || alignTarget;\n+        alignTargetRect = alignTarget.getBoundingClientRect();\n+\n+        var containerNodeStyle = $window.getComputedStyle(containerNode);\n+        existingOffsets = {\n+          top: parseFloat(containerNodeStyle.top, 10),\n+          left: parseFloat(containerNodeStyle.left, 10)\n+        };\n+      }\n+\n+      var position = { };\n+      var transformOrigin = 'top ';\n+\n+      switch (positionMode.top) {\n+        case 'target':\n+          position.top = existingOffsets.top + originNodeRect.top - alignTargetRect.top;\n+          break;\n+        // Future support for mdMenuBar\n+        // case 'top':\n+        //   position.top = originNodeRect.top;\n+        //   break;\n+        // case 'bottom':\n+        //   position.top = originNodeRect.top + originNodeRect.height;\n+        //   break;\n+        default:\n+          throw new Error('Invalid target mode \"' + positionMode.top + '\" specified for md-menu on Y axis.');\n+      }\n+\n+      switch (positionMode.left) {\n+        case 'target':\n+          position.left = existingOffsets.left + originNodeRect.left - alignTargetRect.left;\n+          transformOrigin += 'left';\n+          break;\n+        case 'target-right':\n+          position.left = originNodeRect.right - openMenuNodeRect.width + (openMenuNodeRect.right - alignTargetRect.right);\n+          transformOrigin += 'right';\n+          break;\n+        // Future support for mdMenuBar\n+        // case 'left':\n+        //   position.left = originNodeRect.left;\n+        //   transformOrigin += 'left';\n+        //   break;\n+        // case 'right':\n+        //   position.left = originNodeRect.right - containerNode.offsetWidth;\n+        //   transformOrigin += 'right';\n+        //   break;\n+        default:\n+          throw new Error('Invalid target mode \"' + positionMode.left + '\" specified for md-menu on X axis.');\n+      }\n+\n+      var offsets = opts.mdMenuCtrl.offsets();\n+      position.top += offsets.top;\n+      position.left += offsets.left;\n+\n+      clamp(position);\n+\n+      el.css({\n+        top: position.top + 'px',\n+        left: position.left + 'px'\n+      });\n+\n+      containerNode.style[$mdConstant.CSS.TRANSFORM_ORIGIN] = transformOrigin;\n+\n+      // Animate a scale out if we aren't just repositioning\n+      if (!opts.alreadyOpen) {\n+        containerNode.style[$mdConstant.CSS.TRANSFORM] = 'scale(' +\n+          Math.min(originNodeRect.width / containerNode.offsetWidth, 1.0) + ',' +\n+          Math.min(originNodeRect.height / containerNode.offsetHeight, 1.0) +\n+        ')';\n+      }\n+\n+      function clamp(pos) {\n+        pos.top = Math.max(Math.min(pos.top, bounds.bottom - containerNode.offsetHeight), bounds.top);\n+        pos.left = Math.max(Math.min(pos.left, bounds.right - containerNode.offsetWidth), bounds.left);\n+      }\n+    }\n+  }\n+}\n+\n+// Annoying method to copy nodes to an array, thanks to IE\n+function nodesToArray(nodes) {","path":"src/components/menu/menu-interim-element.js","position":301,"original_position":301,"commit_id":"e5f1c43e5a71b4884128755eddda213ddd5cbfca","original_commit_id":"e5f1c43e5a71b4884128755eddda213ddd5cbfca","user":{"login":"jelbourn","id":838736,"avatar_url":"https://avatars.githubusercontent.com/u/838736?v=3","gravatar_id":"","url":"https://api.github.com/users/jelbourn","html_url":"https://github.com/jelbourn","followers_url":"https://api.github.com/users/jelbourn/followers","following_url":"https://api.github.com/users/jelbourn/following{/other_user}","gists_url":"https://api.github.com/users/jelbourn/gists{/gist_id}","starred_url":"https://api.github.com/users/jelbourn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jelbourn/subscriptions","organizations_url":"https://api.github.com/users/jelbourn/orgs","repos_url":"https://api.github.com/users/jelbourn/repos","events_url":"https://api.github.com/users/jelbourn/events{/privacy}","received_events_url":"https://api.github.com/users/jelbourn/received_events","type":"User","site_admin":false},"body":"FYI: https://jsperf.com/nodelist-to-array/6","created_at":"2015-06-08T22:46:41Z","updated_at":"2015-06-08T22:46:41Z","html_url":"https://github.com/angular/material/pull/3173#discussion_r31967879","pull_request_url":"https://api.github.com/repos/angular/material/pulls/3173","_links":{"self":{"href":"https://api.github.com/repos/angular/material/pulls/comments/31967879"},"html":{"href":"https://github.com/angular/material/pull/3173#discussion_r31967879"},"pull_request":{"href":"https://api.github.com/repos/angular/material/pulls/3173"}}},"pull_request":{"url":"https://api.github.com/repos/angular/material/pulls/3173","id":37184840,"html_url":"https://github.com/angular/material/pull/3173","diff_url":"https://github.com/angular/material/pull/3173.diff","patch_url":"https://github.com/angular/material/pull/3173.patch","issue_url":"https://api.github.com/repos/angular/material/issues/3173","number":3173,"state":"closed","locked":false,"title":"mdMenu - a menu component - wip PR","user":{"login":"rschmukler","id":651740,"avatar_url":"https://avatars.githubusercontent.com/u/651740?v=3","gravatar_id":"","url":"https://api.github.com/users/rschmukler","html_url":"https://github.com/rschmukler","followers_url":"https://api.github.com/users/rschmukler/followers","following_url":"https://api.github.com/users/rschmukler/following{/other_user}","gists_url":"https://api.github.com/users/rschmukler/gists{/gist_id}","starred_url":"https://api.github.com/users/rschmukler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rschmukler/subscriptions","organizations_url":"https://api.github.com/users/rschmukler/orgs","repos_url":"https://api.github.com/users/rschmukler/repos","events_url":"https://api.github.com/users/rschmukler/events{/privacy}","received_events_url":"https://api.github.com/users/rschmukler/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-06-08T19:02:23Z","updated_at":"2015-06-08T22:46:41Z","closed_at":"2015-06-08T21:35:10Z","merged_at":null,"merge_commit_sha":"fc1c4b7a206b693ce4be5c9c52cccb8b3c0bbf42","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/angular/material/pulls/3173/commits","review_comments_url":"https://api.github.com/repos/angular/material/pulls/3173/comments","review_comment_url":"https://api.github.com/repos/angular/material/pulls/comments{/number}","comments_url":"https://api.github.com/repos/angular/material/issues/3173/comments","statuses_url":"https://api.github.com/repos/angular/material/statuses/e5f1c43e5a71b4884128755eddda213ddd5cbfca","head":{"label":"angular:wip-menu","ref":"wip-menu","sha":"e5f1c43e5a71b4884128755eddda213ddd5cbfca","user":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"repo":{"id":21399598,"name":"material","full_name":"angular/material","owner":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/angular/material","description":"Material design for Angular","fork":false,"url":"https://api.github.com/repos/angular/material","forks_url":"https://api.github.com/repos/angular/material/forks","keys_url":"https://api.github.com/repos/angular/material/keys{/key_id}","collaborators_url":"https://api.github.com/repos/angular/material/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/angular/material/teams","hooks_url":"https://api.github.com/repos/angular/material/hooks","issue_events_url":"https://api.github.com/repos/angular/material/issues/events{/number}","events_url":"https://api.github.com/repos/angular/material/events","assignees_url":"https://api.github.com/repos/angular/material/assignees{/user}","branches_url":"https://api.github.com/repos/angular/material/branches{/branch}","tags_url":"https://api.github.com/repos/angular/material/tags","blobs_url":"https://api.github.com/repos/angular/material/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/angular/material/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/angular/material/git/refs{/sha}","trees_url":"https://api.github.com/repos/angular/material/git/trees{/sha}","statuses_url":"https://api.github.com/repos/angular/material/statuses/{sha}","languages_url":"https://api.github.com/repos/angular/material/languages","stargazers_url":"https://api.github.com/repos/angular/material/stargazers","contributors_url":"https://api.github.com/repos/angular/material/contributors","subscribers_url":"https://api.github.com/repos/angular/material/subscribers","subscription_url":"https://api.github.com/repos/angular/material/subscription","commits_url":"https://api.github.com/repos/angular/material/commits{/sha}","git_commits_url":"https://api.github.com/repos/angular/material/git/commits{/sha}","comments_url":"https://api.github.com/repos/angular/material/comments{/number}","issue_comment_url":"https://api.github.com/repos/angular/material/issues/comments{/number}","contents_url":"https://api.github.com/repos/angular/material/contents/{+path}","compare_url":"https://api.github.com/repos/angular/material/compare/{base}...{head}","merges_url":"https://api.github.com/repos/angular/material/merges","archive_url":"https://api.github.com/repos/angular/material/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/angular/material/downloads","issues_url":"https://api.github.com/repos/angular/material/issues{/number}","pulls_url":"https://api.github.com/repos/angular/material/pulls{/number}","milestones_url":"https://api.github.com/repos/angular/material/milestones{/number}","notifications_url":"https://api.github.com/repos/angular/material/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/angular/material/labels{/name}","releases_url":"https://api.github.com/repos/angular/material/releases{/id}","created_at":"2014-07-01T19:20:06Z","updated_at":"2015-06-08T21:29:29Z","pushed_at":"2015-06-08T21:35:05Z","git_url":"git://github.com/angular/material.git","ssh_url":"git@github.com:angular/material.git","clone_url":"https://github.com/angular/material.git","svn_url":"https://github.com/angular/material","homepage":"https://material.angularjs.org/","size":85551,"stargazers_count":8741,"watchers_count":8741,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1368,"mirror_url":null,"open_issues_count":758,"forks":1368,"open_issues":758,"watchers":8741,"default_branch":"master"}},"base":{"label":"angular:master","ref":"master","sha":"69eaeb27e77f16e1f1e7d875e7a6319c1badce76","user":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"repo":{"id":21399598,"name":"material","full_name":"angular/material","owner":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/angular/material","description":"Material design for Angular","fork":false,"url":"https://api.github.com/repos/angular/material","forks_url":"https://api.github.com/repos/angular/material/forks","keys_url":"https://api.github.com/repos/angular/material/keys{/key_id}","collaborators_url":"https://api.github.com/repos/angular/material/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/angular/material/teams","hooks_url":"https://api.github.com/repos/angular/material/hooks","issue_events_url":"https://api.github.com/repos/angular/material/issues/events{/number}","events_url":"https://api.github.com/repos/angular/material/events","assignees_url":"https://api.github.com/repos/angular/material/assignees{/user}","branches_url":"https://api.github.com/repos/angular/material/branches{/branch}","tags_url":"https://api.github.com/repos/angular/material/tags","blobs_url":"https://api.github.com/repos/angular/material/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/angular/material/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/angular/material/git/refs{/sha}","trees_url":"https://api.github.com/repos/angular/material/git/trees{/sha}","statuses_url":"https://api.github.com/repos/angular/material/statuses/{sha}","languages_url":"https://api.github.com/repos/angular/material/languages","stargazers_url":"https://api.github.com/repos/angular/material/stargazers","contributors_url":"https://api.github.com/repos/angular/material/contributors","subscribers_url":"https://api.github.com/repos/angular/material/subscribers","subscription_url":"https://api.github.com/repos/angular/material/subscription","commits_url":"https://api.github.com/repos/angular/material/commits{/sha}","git_commits_url":"https://api.github.com/repos/angular/material/git/commits{/sha}","comments_url":"https://api.github.com/repos/angular/material/comments{/number}","issue_comment_url":"https://api.github.com/repos/angular/material/issues/comments{/number}","contents_url":"https://api.github.com/repos/angular/material/contents/{+path}","compare_url":"https://api.github.com/repos/angular/material/compare/{base}...{head}","merges_url":"https://api.github.com/repos/angular/material/merges","archive_url":"https://api.github.com/repos/angular/material/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/angular/material/downloads","issues_url":"https://api.github.com/repos/angular/material/issues{/number}","pulls_url":"https://api.github.com/repos/angular/material/pulls{/number}","milestones_url":"https://api.github.com/repos/angular/material/milestones{/number}","notifications_url":"https://api.github.com/repos/angular/material/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/angular/material/labels{/name}","releases_url":"https://api.github.com/repos/angular/material/releases{/id}","created_at":"2014-07-01T19:20:06Z","updated_at":"2015-06-08T21:29:29Z","pushed_at":"2015-06-08T21:35:05Z","git_url":"git://github.com/angular/material.git","ssh_url":"git@github.com:angular/material.git","clone_url":"https://github.com/angular/material.git","svn_url":"https://github.com/angular/material","homepage":"https://material.angularjs.org/","size":85551,"stargazers_count":8741,"watchers_count":8741,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1368,"mirror_url":null,"open_issues_count":758,"forks":1368,"open_issues":758,"watchers":8741,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/angular/material/pulls/3173"},"html":{"href":"https://github.com/angular/material/pull/3173"},"issue":{"href":"https://api.github.com/repos/angular/material/issues/3173"},"comments":{"href":"https://api.github.com/repos/angular/material/issues/3173/comments"},"review_comments":{"href":"https://api.github.com/repos/angular/material/pulls/3173/comments"},"review_comment":{"href":"https://api.github.com/repos/angular/material/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/angular/material/pulls/3173/commits"},"statuses":{"href":"https://api.github.com/repos/angular/material/statuses/e5f1c43e5a71b4884128755eddda213ddd5cbfca"}}}}