{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/265659954","pull_request_review_id":214627852,"id":265659954,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2NTY1OTk1NA==","diff_hunk":"@@ -356,202 +410,228 @@ private static unsafe void GetCursorPosition(out int left, out int top)\n                 return;\n             }\n \n-            // Create a buffer to read the response into.  We start with stack memory and grow\n-            // into the heap only if we need to, and we choose a limit that should be large\n-            // enough for the vast, vast majority of use cases, such that when we do grow, we\n-            // just allocate, rather than employing any complicated pooling strategy.\n-            int readBytesPos = 0;\n-            Span<byte> readBytes = stackalloc byte[256];\n-\n-            // Synchronize with all other stdin readers.  We need to do this in case multiple threads are\n-            // trying to read/write concurrently, and to minimize the chances of resulting conflicts.\n-            // This does mean that Console.get_CursorLeft/Top can't be used concurrently with Console.Read*, etc.;\n-            // attempting to do so will block one of them until the other completes, but in doing so we prevent\n-            // one thread's get_CursorLeft/Top from providing input to the other's Console.Read*.\n-            lock (StdInReader) \n+            while (true)\n             {\n-                // Because the CPR request/response protocol involves blocking until we get a certain\n-                // response from the terminal, we want to avoid doing so if we don't know the terminal\n-                // will definitely respond.  As such, we start with minChars == 0, which causes the\n-                // terminal's read timer to start immediately.  Once we've received a response for\n-                // a request such that we know the terminal supports the protocol, we then specify\n-                // minChars == 1.  With that, the timer won't start until the first character is\n-                // received.  This makes the mechanism more reliable when there are high latencies\n-                // involved in reading/writing, such as when accessing a remote system. We also extend\n-                // the timeout on the very first request to 15 seconds, to account for potential latency\n-                // before we know if we will receive a response.\n-                Interop.Sys.InitializeConsoleBeforeRead(minChars: (byte)(s_everReceivedCursorPositionResponse ? 1 : 0), decisecondsTimeout: (byte)(s_firstCursorPositionRequest ? 100 : 10));\n-                try\n+                int cursorVersion;\n+                lock (s_cursorGate)\n                 {\n-                    // Write out the cursor position report request.\n-                    Debug.Assert(!string.IsNullOrEmpty(TerminalFormatStrings.CursorPositionReport));\n-                    WriteStdoutAnsiString(TerminalFormatStrings.CursorPositionReport);\n-\n-                    // Read the cursor position report (CPR), of the form \\ESC[row;colR. This is not\n-                    // as easy it it sounds.  Prior to the CPR having been supplied to stdin, other\n-                    // user input could have come in and be available to read first from stdin.  Plus,\n-                    // that user input could include escape sequences, and those escape sequences could\n-                    // have a prefix very similar to that of the CPR (e.g. other escape sequences start\n-                    // with \\ESC + '['.  It's also possible that some terminal implementations may not\n-                    // write the CPR to stdin atomically, such that the CPR could have other user input\n-                    // in the middle of it, and that user input could have escape sequences!  Handling\n-                    // that last case is very challenging, and rare, so we don't try, but we do need to\n-                    // handle the rest.  The min bar here is doing something reasonable, which may include\n-                    // giving up and just returning default top and left values.\n-\n-                    // Consume from stdin until we find all of the key markers for the CPR:\n-                    // \\ESC, '[', ';', and 'R'.  For everything before the \\ESC, it's definitely\n-                    // not part of the CPR sequence, so we just immediately move any such bytes\n-                    // over to the StdInReader's extra buffer.  From there until the end, we buffer\n-                    // everything into readBytes for subsequent parsing.\n-                    const byte Esc = 0x1B;\n-                    StdInReader r = StdInReader.Inner;\n-                    int escPos, bracketPos, semiPos, rPos;\n-                    if (!AppendToStdInReaderUntil(Esc, r, readBytes, ref readBytesPos, out escPos) ||\n-                        !BufferUntil((byte)'[', r, ref readBytes, ref readBytesPos, out bracketPos) ||\n-                        !BufferUntil((byte)';', r, ref readBytes, ref readBytesPos, out semiPos) ||\n-                        !BufferUntil((byte)'R', r, ref readBytes, ref readBytesPos, out rPos))\n+                    if (HasCachedCursorPosition())\n                     {\n-                        // We were unable to read everything from stdin, e.g. a timeout ocurred.\n-                        // Since we couldn't get the complete CPR, transfer any bytes we did read\n-                        // back to the StdInReader's extra buffer, treating it all as user input,\n-                        // and exit having not computed a valid cursor position.\n-                        TransferBytes(readBytes.Slice(readBytesPos), r);\n+                        left = s_cursorLeft;\n+                        top = s_cursorTop;\n                         return;\n                     }\n \n-                    // At this point, readBytes starts with \\ESC and ends with 'R'.\n-                    Debug.Assert(readBytesPos > 0 && readBytesPos <= readBytes.Length);\n-                    Debug.Assert(escPos == 0 && bracketPos > escPos && semiPos > bracketPos && rPos > semiPos);\n-                    Debug.Assert(readBytes[escPos] == Esc);\n-                    Debug.Assert(readBytes[bracketPos] == '[');\n-                    Debug.Assert(readBytes[semiPos] == ';');\n-                    Debug.Assert(readBytes[rPos] == 'R');\n-\n-                    // There are other sequences that begin with \\ESC + '[' and that might be in our sequence before\n-                    // the CPR, so we don't immediately trust escPos and bracketPos.  Instead, as a heuristic we trust\n-                    // semiPos (which we only tracked after seeing a '[' after seeing an \\ESC) and search backwards from\n-                    // there looking for '[' and then \\ESC.\n-                    bracketPos = readBytes.Slice(0, semiPos).LastIndexOf((byte)'[');\n-                    escPos = readBytes.Slice(0, bracketPos).LastIndexOf(Esc);\n-\n-                    // Everything before the \\ESC is transferred back to the StdInReader. As is everything\n-                    // between the \\ESC and the '['; there really shouldn't be anything there, but we're\n-                    // defensive in case the CPR wasn't written atomically and something crept in.\n-                    TransferBytes(readBytes.Slice(0, escPos), r);\n-                    TransferBytes(readBytes.Slice(escPos + 1, bracketPos - (escPos + 1)), r);\n-\n-                    // Now loop through all characters between the '[' and the ';' to compute the row,\n-                    // and then between the ';' and the 'R' to compute the column. We incorporate any\n-                    // digits we find, and while we shouldn't find anything else, we defensively put anything\n-                    // else back into the StdInReader.\n-                    ReadRowOrCol(bracketPos, semiPos, r, readBytes, ref top);\n-                    ReadRowOrCol(semiPos, rPos, r, readBytes, ref left);\n-\n-                    // Mark that we've successfully received a CPR response at least once.\n-                    s_everReceivedCursorPositionResponse = true;\n-                }\n-                finally\n-                {\n-                    Interop.Sys.UninitializeConsoleAfterRead();\n-                    s_firstCursorPositionRequest = false;\n+                    cursorVersion = s_cursorVersion;\n                 }\n \n-\n-                bool BufferUntil(byte toFind, StdInReader src, ref Span<byte> dst, ref int dstPos, out int foundPos)\n+                // Create a buffer to read the response into.  We start with stack memory and grow","path":"src/System.Console/src/System/ConsolePal.Unix.cs","position":266,"original_position":266,"commit_id":"a59cc2a0714e25ed0b1423a299426efada6e7ff1","original_commit_id":"a59cc2a0714e25ed0b1423a299426efada6e7ff1","user":{"login":"tmds","id":1025424,"node_id":"MDQ6VXNlcjEwMjU0MjQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1025424?v=4","gravatar_id":"","url":"https://api.github.com/users/tmds","html_url":"https://github.com/tmds","followers_url":"https://api.github.com/users/tmds/followers","following_url":"https://api.github.com/users/tmds/following{/other_user}","gists_url":"https://api.github.com/users/tmds/gists{/gist_id}","starred_url":"https://api.github.com/users/tmds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tmds/subscriptions","organizations_url":"https://api.github.com/users/tmds/orgs","repos_url":"https://api.github.com/users/tmds/repos","events_url":"https://api.github.com/users/tmds/events{/privacy}","received_events_url":"https://api.github.com/users/tmds/received_events","type":"User","site_admin":false},"body":"GitHub shows a lot of changes here. This is mostly indentation.","created_at":"2019-03-14T16:35:59Z","updated_at":"2019-03-14T16:35:59Z","html_url":"https://github.com/dotnet/corefx/pull/36049#discussion_r265659954","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/36049","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/265659954"},"html":{"href":"https://github.com/dotnet/corefx/pull/36049#discussion_r265659954"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/36049"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/36049","id":261244189,"node_id":"MDExOlB1bGxSZXF1ZXN0MjYxMjQ0MTg5","html_url":"https://github.com/dotnet/corefx/pull/36049","diff_url":"https://github.com/dotnet/corefx/pull/36049.diff","patch_url":"https://github.com/dotnet/corefx/pull/36049.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/36049","number":36049,"state":"open","locked":false,"title":"Console: Unix: Improve Cursor{Left,Top} performance by caching them","user":{"login":"tmds","id":1025424,"node_id":"MDQ6VXNlcjEwMjU0MjQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1025424?v=4","gravatar_id":"","url":"https://api.github.com/users/tmds","html_url":"https://github.com/tmds","followers_url":"https://api.github.com/users/tmds/followers","following_url":"https://api.github.com/users/tmds/following{/other_user}","gists_url":"https://api.github.com/users/tmds/gists{/gist_id}","starred_url":"https://api.github.com/users/tmds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tmds/subscriptions","organizations_url":"https://api.github.com/users/tmds/orgs","repos_url":"https://api.github.com/users/tmds/repos","events_url":"https://api.github.com/users/tmds/events{/privacy}","received_events_url":"https://api.github.com/users/tmds/received_events","type":"User","site_admin":false},"body":"We keep a cached version for CursorLeft and CursorTop. When we write\r\ndata to stdout, we try to update the cached values based on the buffer\r\ncontent, or we invalidate the cursor position.\r\n\r\nA lock is used to deal with multi-threading issues. We synchronize\r\nbetween some blocks using a 'version' field. This field is incremented\r\neach time a cursor change may have occured. If the value has not\r\nchanged between two blocks, we know the the cursor is still at the same\r\nposition.\r\n\r\nOn signals that may mean the cursor position has changed (SIGCONT,\r\nSIGCHLD, SIGWINCH) we invalidate the cached values.","created_at":"2019-03-14T16:25:39Z","updated_at":"2019-03-14T16:35:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1cc5961caa3e37524910a138d8c0f844d53e6591","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/36049/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/36049/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/36049/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/a59cc2a0714e25ed0b1423a299426efada6e7ff1","head":{"label":"tmds:cached_cursor","ref":"cached_cursor","sha":"a59cc2a0714e25ed0b1423a299426efada6e7ff1","user":{"login":"tmds","id":1025424,"node_id":"MDQ6VXNlcjEwMjU0MjQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1025424?v=4","gravatar_id":"","url":"https://api.github.com/users/tmds","html_url":"https://github.com/tmds","followers_url":"https://api.github.com/users/tmds/followers","following_url":"https://api.github.com/users/tmds/following{/other_user}","gists_url":"https://api.github.com/users/tmds/gists{/gist_id}","starred_url":"https://api.github.com/users/tmds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tmds/subscriptions","organizations_url":"https://api.github.com/users/tmds/orgs","repos_url":"https://api.github.com/users/tmds/repos","events_url":"https://api.github.com/users/tmds/events{/privacy}","received_events_url":"https://api.github.com/users/tmds/received_events","type":"User","site_admin":false},"repo":{"id":74844888,"node_id":"MDEwOlJlcG9zaXRvcnk3NDg0NDg4OA==","name":"corefx","full_name":"tmds/corefx","private":false,"owner":{"login":"tmds","id":1025424,"node_id":"MDQ6VXNlcjEwMjU0MjQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1025424?v=4","gravatar_id":"","url":"https://api.github.com/users/tmds","html_url":"https://github.com/tmds","followers_url":"https://api.github.com/users/tmds/followers","following_url":"https://api.github.com/users/tmds/following{/other_user}","gists_url":"https://api.github.com/users/tmds/gists{/gist_id}","starred_url":"https://api.github.com/users/tmds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tmds/subscriptions","organizations_url":"https://api.github.com/users/tmds/orgs","repos_url":"https://api.github.com/users/tmds/repos","events_url":"https://api.github.com/users/tmds/events{/privacy}","received_events_url":"https://api.github.com/users/tmds/received_events","type":"User","site_admin":false},"html_url":"https://github.com/tmds/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":true,"url":"https://api.github.com/repos/tmds/corefx","forks_url":"https://api.github.com/repos/tmds/corefx/forks","keys_url":"https://api.github.com/repos/tmds/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tmds/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tmds/corefx/teams","hooks_url":"https://api.github.com/repos/tmds/corefx/hooks","issue_events_url":"https://api.github.com/repos/tmds/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/tmds/corefx/events","assignees_url":"https://api.github.com/repos/tmds/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/tmds/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/tmds/corefx/tags","blobs_url":"https://api.github.com/repos/tmds/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tmds/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tmds/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/tmds/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tmds/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/tmds/corefx/languages","stargazers_url":"https://api.github.com/repos/tmds/corefx/stargazers","contributors_url":"https://api.github.com/repos/tmds/corefx/contributors","subscribers_url":"https://api.github.com/repos/tmds/corefx/subscribers","subscription_url":"https://api.github.com/repos/tmds/corefx/subscription","commits_url":"https://api.github.com/repos/tmds/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/tmds/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/tmds/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/tmds/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/tmds/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/tmds/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tmds/corefx/merges","archive_url":"https://api.github.com/repos/tmds/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tmds/corefx/downloads","issues_url":"https://api.github.com/repos/tmds/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/tmds/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/tmds/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/tmds/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tmds/corefx/labels{/name}","releases_url":"https://api.github.com/repos/tmds/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/tmds/corefx/deployments","created_at":"2016-11-26T19:04:46Z","updated_at":"2019-02-08T10:54:37Z","pushed_at":"2019-03-14T16:21:53Z","git_url":"git://github.com/tmds/corefx.git","ssh_url":"git@github.com:tmds/corefx.git","clone_url":"https://github.com/tmds/corefx.git","svn_url":"https://github.com/tmds/corefx","homepage":"https://docs.microsoft.com/dotnet/","size":199909,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"231bcfc265570ae42a412ac6cc5b09c5d47ca042","user":{"login":"dotnet","id":9141961,"node_id":"MDEyOk9yZ2FuaXphdGlvbjkxNDE5NjE=","avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":26295345,"node_id":"MDEwOlJlcG9zaXRvcnkyNjI5NTM0NQ==","name":"corefx","full_name":"dotnet/corefx","private":false,"owner":{"login":"dotnet","id":9141961,"node_id":"MDEyOk9yZ2FuaXphdGlvbjkxNDE5NjE=","avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/dotnet/corefx","description":"CoreFX is the foundational class libraries for .NET Core. It includes types for collections, file systems, console, JSON, XML, async and many others.","fork":false,"url":"https://api.github.com/repos/dotnet/corefx","forks_url":"https://api.github.com/repos/dotnet/corefx/forks","keys_url":"https://api.github.com/repos/dotnet/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx/events","assignees_url":"https://api.github.com/repos/dotnet/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx/merges","archive_url":"https://api.github.com/repos/dotnet/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/corefx/deployments","created_at":"2014-11-06T23:42:48Z","updated_at":"2019-03-14T16:31:21Z","pushed_at":"2019-03-14T16:31:06Z","git_url":"git://github.com/dotnet/corefx.git","ssh_url":"git@github.com:dotnet/corefx.git","clone_url":"https://github.com/dotnet/corefx.git","svn_url":"https://github.com/dotnet/corefx","homepage":"https://docs.microsoft.com/dotnet/core/","size":202495,"stargazers_count":15955,"watchers_count":15955,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4764,"mirror_url":null,"archived":false,"open_issues_count":2668,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":4764,"open_issues":2668,"watchers":15955,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/36049"},"html":{"href":"https://github.com/dotnet/corefx/pull/36049"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/36049"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/36049/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/36049/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/36049/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/a59cc2a0714e25ed0b1423a299426efada6e7ff1"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"tmds"}}