{"action":"created","comment":{"url":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/comments/52353370","id":52353370,"diff_hunk":"@@ -638,6 +599,398 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(\n                                  << \" turns over barriers\";\n }\n \n+// requires sorted candidates\n+void EdgeBasedGraphFactory::optimizeCandidates(NodeID via_edge,\n+                                               std::vector<TurnCandidate> &turn_candidates) const\n+{\n+    if (turn_candidates.size() <= 1)\n+        return;\n+\n+    const auto getLeft = [&turn_candidates](std::size_t index)\n+    {\n+        return (index + 1) % turn_candidates.size();\n+    };\n+    const auto getRight = [&turn_candidates](std::size_t index)\n+    {\n+        return (index + turn_candidates.size() - 1) % turn_candidates.size();\n+    };\n+\n+    // handle availability of multiple u-turns (e.g. street with separated small parking roads)\n+    if (turn_candidates[0].instruction == TurnInstruction::UTurn && turn_candidates[0].angle == 0 &&\n+        turn_candidates.size() > 1)\n+    {\n+        if (turn_candidates[getLeft(0)].instruction == TurnInstruction::UTurn)\n+            turn_candidates[getLeft(0)].instruction = TurnInstruction::TurnSharpLeft;\n+        if (turn_candidates[getRight(0)].instruction == TurnInstruction::UTurn)\n+            turn_candidates[getRight(0)].instruction = TurnInstruction::TurnSharpRight;\n+    }\n+\n+    const auto keepStraight = [](double angle)\n+    {\n+        return fabs(angle - 180) < 5;\n+    };\n+\n+    if (turn_candidates.size() > 1)\n+    {\n+        for (std::size_t turn_index = 0; turn_index < turn_candidates.size(); ++turn_index)\n+        {\n+            auto &turn = turn_candidates[turn_index];\n+            if (turn.instruction > TurnInstruction::TurnSlightLeft ||\n+                turn.instruction == TurnInstruction::UTurn)\n+                continue;\n+            auto &left = turn_candidates[getLeft(turn_index)];\n+            if (turn.angle == left.angle)\n+            {\n+                util::SimpleLogger().Write()\n+                    << \"[warning] conflicting turn angles, identical road duplicated? \"\n+                    << m_node_info_list[m_node_based_graph->GetTarget(via_edge)].lat << \" \"\n+                    << m_node_info_list[m_node_based_graph->GetTarget(via_edge)].lon << std::endl;\n+            }\n+            if (isConflict(turn.instruction, left.instruction))\n+            {\n+                // begin of a conflicting region\n+                std::size_t conflict_begin = turn_index;\n+                std::size_t conflict_end = getLeft(turn_index);\n+                std::size_t conflict_size = 2;\n+                while (isConflict(turn_candidates[getLeft(conflict_end)].instruction,\n+                                  turn.instruction) &&\n+                       conflict_size < turn_candidates.size())\n+                {\n+                    conflict_end = getLeft(conflict_end);\n+                    ++conflict_size;\n+                }\n+\n+                turn_index =\n+                    (conflict_end < conflict_begin) ? turn_candidates.size() : conflict_end;\n+\n+                if (conflict_size > 3)\n+                {\n+                    // check if some turns are invalid to find out about good handling\n+                }\n+\n+                auto &instruction_left_of_end = turn_candidates[getLeft(conflict_end)].instruction;\n+                auto &instruction_right_of_begin =\n+                    turn_candidates[getRight(conflict_begin)].instruction;\n+                auto &candidate_at_end = turn_candidates[conflict_end];\n+                auto &candidate_at_begin = turn_candidates[conflict_begin];\n+                if (conflict_size == 2)\n+                {\n+                    if (turn.instruction == TurnInstruction::GoStraight)\n+                    {\n+                        if (instruction_left_of_end != TurnInstruction::TurnSlightLeft &&\n+                            instruction_right_of_begin != TurnInstruction::TurnSlightRight)\n+                        {\n+                            std::int32_t resolved_count = 0;\n+                            if (!keepStraight(candidate_at_end.angle) &&\n+                                !resolve(candidate_at_end.instruction, instruction_left_of_end,\n+                                         RESOLVE_TO_LEFT))\n+                                util::SimpleLogger().Write()\n+                                    << \"[warning] broken conflict resolution\" << std::endl;\n+                            else\n+                                ++resolved_count;\n+                            if (!keepStraight(candidate_at_begin.angle) &&\n+                                !resolve(candidate_at_begin.instruction, instruction_right_of_begin,\n+                                         RESOLVE_TO_RIGHT))\n+                                util::SimpleLogger().Write()\n+                                    << \"[warning] broken conflict resolution\" << std::endl;\n+                            else\n+                                ++resolved_count;\n+                            if (resolved_count >= 1 &&\n+                                (!keepStraight(candidate_at_begin.angle) ||\n+                                 !keepStraight(candidate_at_end.angle))) // should always be the\n+                                                                         // case, theoretically\n+                                continue;\n+                        }\n+                    }\n+                    if (candidate_at_begin.confidence < candidate_at_end.confidence)\n+                    { // if right shift is cheaper, or only option\n+                        if (resolve(candidate_at_begin.instruction, instruction_right_of_begin,\n+                                    RESOLVE_TO_RIGHT))\n+                            continue;\n+                        else if (resolve(candidate_at_end.instruction, instruction_left_of_end,\n+                                         RESOLVE_TO_LEFT))\n+                            continue;\n+                    }\n+                    else\n+                    {\n+                        if (resolve(candidate_at_end.instruction, instruction_left_of_end,\n+                                    RESOLVE_TO_LEFT))\n+                            continue;\n+                        else if (resolve(candidate_at_begin.instruction, instruction_right_of_begin,\n+                                         RESOLVE_TO_RIGHT))\n+                            continue;\n+                    }\n+                    if (isSlightTurn(turn.instruction) || isSharpTurn(turn.instruction))\n+                    {\n+                        auto resolve_direction =\n+                            (turn.instruction == TurnInstruction::TurnSlightRight ||\n+                             turn.instruction == TurnInstruction::TurnSharpLeft)\n+                                ? RESOLVE_TO_RIGHT\n+                                : RESOLVE_TO_LEFT;\n+                        if (resolve_direction == RESOLVE_TO_RIGHT &&\n+                            resolveTransitive(\n+                                candidate_at_begin.instruction, instruction_right_of_begin,\n+                                turn_candidates[getRight(getRight(conflict_begin))].instruction,\n+                                RESOLVE_TO_RIGHT))\n+                            continue;\n+                        else if (resolve_direction == RESOLVE_TO_LEFT &&\n+                                 resolveTransitive(\n+                                     candidate_at_end.instruction, instruction_left_of_end,\n+                                     turn_candidates[getLeft(getLeft(conflict_end))].instruction,\n+                                     RESOLVE_TO_LEFT))\n+                            continue;\n+                    }\n+                }\n+                else if (conflict_size >= 3)\n+                {\n+                    // a conflict of size larger than three cannot be handled with the current\n+                    // model.\n+                    // Handle it as best as possible and keep the rest of the conflicting turns\n+                    if (conflict_size > 3)\n+                    {\n+                        NodeID conflict_location = m_node_based_graph->GetTarget(via_edge);\n+                        util::SimpleLogger().Write()\n+                            << \"[warning] found conflict larget than size three at \"\n+                            << m_node_info_list[conflict_location].lat << \", \"\n+                            << m_node_info_list[conflict_location].lon << std::endl;\n+                    }\n+\n+                    if (!resolve(candidate_at_begin.instruction, instruction_right_of_begin,\n+                                 RESOLVE_TO_RIGHT))\n+                    {\n+                        if (isSlightTurn(turn.instruction))\n+                            resolveTransitive(\n+                                candidate_at_begin.instruction, instruction_right_of_begin,\n+                                turn_candidates[getRight(getRight(conflict_begin))].instruction,\n+                                RESOLVE_TO_RIGHT);\n+                        else if (isSharpTurn(turn.instruction))\n+                            resolveTransitive(\n+                                candidate_at_end.instruction, instruction_left_of_end,\n+                                turn_candidates[getLeft(getLeft(conflict_end))].instruction,\n+                                RESOLVE_TO_LEFT);\n+                    }\n+                    if (!resolve(candidate_at_end.instruction, instruction_left_of_end,\n+                                 RESOLVE_TO_LEFT))\n+                    {\n+                        if (isSlightTurn(turn.instruction))\n+                            resolveTransitive(\n+                                candidate_at_end.instruction, instruction_left_of_end,\n+                                turn_candidates[getLeft(getLeft(conflict_end))].instruction,\n+                                RESOLVE_TO_LEFT);\n+                        else if (isSharpTurn(turn.instruction))\n+                            resolveTransitive(\n+                                candidate_at_begin.instruction, instruction_right_of_begin,\n+                                turn_candidates[getRight(getRight(conflict_begin))].instruction,\n+                                RESOLVE_TO_RIGHT);\n+                    }\n+                }\n+            }\n+        }\n+    }\n+}","path":"src/extractor/edge_based_graph_factory.cpp","position":380,"original_position":381,"commit_id":"59f512d1663a62e3553e10a6a94010deba0bb061","original_commit_id":"317d895a8419a2f32519c28bb6443f84e491c43b","user":{"login":"daniel-j-h","id":527241,"avatar_url":"https://avatars.githubusercontent.com/u/527241?v=3","gravatar_id":"","url":"https://api.github.com/users/daniel-j-h","html_url":"https://github.com/daniel-j-h","followers_url":"https://api.github.com/users/daniel-j-h/followers","following_url":"https://api.github.com/users/daniel-j-h/following{/other_user}","gists_url":"https://api.github.com/users/daniel-j-h/gists{/gist_id}","starred_url":"https://api.github.com/users/daniel-j-h/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/daniel-j-h/subscriptions","organizations_url":"https://api.github.com/users/daniel-j-h/orgs","repos_url":"https://api.github.com/users/daniel-j-h/repos","events_url":"https://api.github.com/users/daniel-j-h/events{/privacy}","received_events_url":"https://api.github.com/users/daniel-j-h/received_events","type":"User","site_admin":false},"body":"Wow that was some complex ugly function :/ maybe split it into smaller logical parts?","created_at":"2016-02-09T18:43:21Z","updated_at":"2016-02-09T18:43:21Z","html_url":"https://github.com/Project-OSRM/osrm-backend/pull/1938#discussion_r52353370","pull_request_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/1938","_links":{"self":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/comments/52353370"},"html":{"href":"https://github.com/Project-OSRM/osrm-backend/pull/1938#discussion_r52353370"},"pull_request":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/1938"}}},"pull_request":{"url":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/1938","id":57637703,"html_url":"https://github.com/Project-OSRM/osrm-backend/pull/1938","diff_url":"https://github.com/Project-OSRM/osrm-backend/pull/1938.diff","patch_url":"https://github.com/Project-OSRM/osrm-backend/pull/1938.patch","issue_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues/1938","number":1938,"state":"open","locked":false,"title":"finding better turn angles and instructions","user":{"login":"MoKob","id":12932279,"avatar_url":"https://avatars.githubusercontent.com/u/12932279?v=3","gravatar_id":"","url":"https://api.github.com/users/MoKob","html_url":"https://github.com/MoKob","followers_url":"https://api.github.com/users/MoKob/followers","following_url":"https://api.github.com/users/MoKob/following{/other_user}","gists_url":"https://api.github.com/users/MoKob/gists{/gist_id}","starred_url":"https://api.github.com/users/MoKob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MoKob/subscriptions","organizations_url":"https://api.github.com/users/MoKob/orgs","repos_url":"https://api.github.com/users/MoKob/repos","events_url":"https://api.github.com/users/MoKob/events{/privacy}","received_events_url":"https://api.github.com/users/MoKob/received_events","type":"User","site_admin":false},"body":"Improves the turn angle discovery for osrm-extract.\r\n\r\nConsiders not simply the first vertex of a way but looks a bit further into the way. Not necessarily perfect, but may improve turn emission.\r\n\r\nFurther improvements:\r\n\r\n - [x] consider all turns at the intersection\r\n - [x] make slight turn angle narrower\r\n\r\n - [x] need to fix: head on at name changes may break ([*head on* to *slight left*](http://map.project-osrm.org/?z=18&center=34.070494%2C-118.234885&loc=34.070498%2C-118.234676&loc=34.070342%2C-118.235110&hl=en&ly=&alt=&df=&srv=))\r\n\r\n - [x] need to fix: identical instructions:  [*go straight* has to become *slight right*](http://map.project-osrm.org/?z=18&center=34.034724%2C-118.336776&loc=34.034630%2C-118.339738&loc=34.034653%2C-118.337109&hl=en&ly=&alt=&df=&srv=)\r\n\r\n- [x] need to fix: continue breaks: [*go straight* cannot become *turn right*](http://map.project-osrm.org/?z=18&center=32.788154%2C-116.832626&loc=32.788046%2C-116.832830&loc=32.788204%2C-116.832454&hl=en&ly=&alt=&df=&srv=)\r\n\r\n- [x] continue on street only if its [most obvious](http://map.project-osrm.org/?z=18&center=34.076443%2C-118.215659&loc=34.077581%2C-118.215294&loc=34.076323%2C-118.216141&hl=en&ly=&alt=&df=&srv=)\r\n\r\n- [x] continue needs to become [slight right](http://map.project-osrm.org/?z=18&center=34.062584%2C-117.811744&loc=34.061992%2C-117.812002&loc=34.063161%2C-117.811364&hl=en&ly=&alt=&df=&srv=)\r\n\r\n- [x] Improve conflict handling to better consider invalid turns\r\n\r\n- [ ] consider road type in conflict resolution.\r\n- [x] consider conflict resolution when deciding on turn go straight\r\n\r\n- [x] [review 47](https://github.com/MoKob/turn-report/blob/master/case_47.png)\r\n- [x] [review 58](https://github.com/MoKob/turn-report/blob/master/case_58.png)\r\n- [x] [review 66](https://github.com/MoKob/turn-report/blob/master/case_66.png)\r\n- [x] [review 85](https://github.com/MoKob/turn-report/blob/master/case_85.png)\r\n- [x] [review 109](https://github.com/MoKob/turn-report/blob/master/case_109.png) - don-t emit no-turn for equal category on very similar turns\r\n- [x] [review 118](https://github.com/MoKob/turn-report/blob/master/case_118.png) - sharp region might be to large\r\n- [x] [review 143](https://github.com/MoKob/turn-report/blob/master/case_143.png) - find separated roads by identifying  same name streets\r\n- [x] [review 200](https://github.com/MoKob/turn-report/blob/master/case_200.png) - tie breaking seems off here\r\n- [x] [review 202](https://github.com/MoKob/turn-report/blob/master/case_202.png) [and 204](https://github.com/MoKob/turn-report/blob/master/case_204.png) - go straight should be slight-right\r\n- [x] [review 237](https://github.com/MoKob/turn-report/blob/master/case_237.png) what to do about multiple valid u-turns?\r\n- [x] [review 255](https://github.com/MoKob/turn-report/blob/master/case_255.png) go straight should be slight left\r\n- [x] [review 294](https://github.com/MoKob/turn-report/blob/master/case_294.png) and [299](https://github.com/MoKob/turn-report/blob/master/case_299.png) should not emit turn\r\n- [x] [review 319](https://github.com/MoKob/turn-report/blob/master/case_319.png) should not emit turn, review obviousness\r\n- [x] [review 352](https://github.com/MoKob/turn-report/blob/master/case_352.png) make sure that no-turn is correct\r\n- [x] [review 359](https://github.com/MoKob/turn-report/blob/master/case_359.png) should not be no-turn\r\n- [x] [review 378](https://github.com/MoKob/turn-report/blob/master/case_378.png) should not force go straight\r\n- [x] [review 391](https://github.com/MoKob/turn-report/blob/master/case_391.png) should be slight left\r\n- [x] [review 392](https://github.com/MoKob/turn-report/blob/master/case_392.png) exclude name_id==0\r\n- [x] [review 455](https://github.com/MoKob/turn-report/blob/master/case_455.png) should not be go straight\r\n- [x] [review 493](https://github.com/MoKob/turn-report/blob/master/case_493.png)\r\n- [x] [review 596](https://github.com/MoKob/turn-report/blob/master/case_594.png) \r\n- [x] [review 595](https://github.com/MoKob/turn-report/blob/master/case_595.png) should not be no-turn\r\n- [x] [review 620](https://github.com/MoKob/turn-report/blob/master/case_595.png) should be slight-right\r\n- [x] [review 707](https://github.com/MoKob/turn-report/blob/master/case_707.png) may want to keep the turn-right?","created_at":"2016-01-29T11:44:53Z","updated_at":"2016-02-09T18:43:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e46f84bff3f0a5e387e20ffa051ec302da8bc6e0","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/1938/commits","review_comments_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/1938/comments","review_comment_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues/1938/comments","statuses_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/statuses/59f512d1663a62e3553e10a6a94010deba0bb061","head":{"label":"Project-OSRM:better_turn_angles","ref":"better_turn_angles","sha":"59f512d1663a62e3553e10a6a94010deba0bb061","user":{"login":"Project-OSRM","id":8207060,"avatar_url":"https://avatars.githubusercontent.com/u/8207060?v=3","gravatar_id":"","url":"https://api.github.com/users/Project-OSRM","html_url":"https://github.com/Project-OSRM","followers_url":"https://api.github.com/users/Project-OSRM/followers","following_url":"https://api.github.com/users/Project-OSRM/following{/other_user}","gists_url":"https://api.github.com/users/Project-OSRM/gists{/gist_id}","starred_url":"https://api.github.com/users/Project-OSRM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Project-OSRM/subscriptions","organizations_url":"https://api.github.com/users/Project-OSRM/orgs","repos_url":"https://api.github.com/users/Project-OSRM/repos","events_url":"https://api.github.com/users/Project-OSRM/events{/privacy}","received_events_url":"https://api.github.com/users/Project-OSRM/received_events","type":"Organization","site_admin":false},"repo":{"id":2436255,"name":"osrm-backend","full_name":"Project-OSRM/osrm-backend","owner":{"login":"Project-OSRM","id":8207060,"avatar_url":"https://avatars.githubusercontent.com/u/8207060?v=3","gravatar_id":"","url":"https://api.github.com/users/Project-OSRM","html_url":"https://github.com/Project-OSRM","followers_url":"https://api.github.com/users/Project-OSRM/followers","following_url":"https://api.github.com/users/Project-OSRM/following{/other_user}","gists_url":"https://api.github.com/users/Project-OSRM/gists{/gist_id}","starred_url":"https://api.github.com/users/Project-OSRM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Project-OSRM/subscriptions","organizations_url":"https://api.github.com/users/Project-OSRM/orgs","repos_url":"https://api.github.com/users/Project-OSRM/repos","events_url":"https://api.github.com/users/Project-OSRM/events{/privacy}","received_events_url":"https://api.github.com/users/Project-OSRM/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Project-OSRM/osrm-backend","description":"Project OSRM: C++ backend","fork":false,"url":"https://api.github.com/repos/Project-OSRM/osrm-backend","forks_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/forks","keys_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/teams","hooks_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/hooks","issue_events_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues/events{/number}","events_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/events","assignees_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/assignees{/user}","branches_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/branches{/branch}","tags_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/tags","blobs_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/refs{/sha}","trees_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/statuses/{sha}","languages_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/languages","stargazers_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/stargazers","contributors_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/contributors","subscribers_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/subscribers","subscription_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/subscription","commits_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/commits{/sha}","git_commits_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/commits{/sha}","comments_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/comments{/number}","issue_comment_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues/comments{/number}","contents_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/contents/{+path}","compare_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/merges","archive_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/downloads","issues_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues{/number}","pulls_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls{/number}","milestones_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/milestones{/number}","notifications_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/labels{/name}","releases_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/releases{/id}","deployments_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/deployments","created_at":"2011-09-22T10:05:08Z","updated_at":"2016-02-08T16:42:51Z","pushed_at":"2016-02-09T17:39:29Z","git_url":"git://github.com/Project-OSRM/osrm-backend.git","ssh_url":"git@github.com:Project-OSRM/osrm-backend.git","clone_url":"https://github.com/Project-OSRM/osrm-backend.git","svn_url":"https://github.com/Project-OSRM/osrm-backend","homepage":"http://map.project-osrm.org","size":18449,"stargazers_count":1050,"watchers_count":1050,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":482,"mirror_url":null,"open_issues_count":181,"forks":482,"open_issues":181,"watchers":1050,"default_branch":"develop"}},"base":{"label":"Project-OSRM:develop","ref":"develop","sha":"bb06bfbbd71a45e8e29b542ca5afa328370958b5","user":{"login":"Project-OSRM","id":8207060,"avatar_url":"https://avatars.githubusercontent.com/u/8207060?v=3","gravatar_id":"","url":"https://api.github.com/users/Project-OSRM","html_url":"https://github.com/Project-OSRM","followers_url":"https://api.github.com/users/Project-OSRM/followers","following_url":"https://api.github.com/users/Project-OSRM/following{/other_user}","gists_url":"https://api.github.com/users/Project-OSRM/gists{/gist_id}","starred_url":"https://api.github.com/users/Project-OSRM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Project-OSRM/subscriptions","organizations_url":"https://api.github.com/users/Project-OSRM/orgs","repos_url":"https://api.github.com/users/Project-OSRM/repos","events_url":"https://api.github.com/users/Project-OSRM/events{/privacy}","received_events_url":"https://api.github.com/users/Project-OSRM/received_events","type":"Organization","site_admin":false},"repo":{"id":2436255,"name":"osrm-backend","full_name":"Project-OSRM/osrm-backend","owner":{"login":"Project-OSRM","id":8207060,"avatar_url":"https://avatars.githubusercontent.com/u/8207060?v=3","gravatar_id":"","url":"https://api.github.com/users/Project-OSRM","html_url":"https://github.com/Project-OSRM","followers_url":"https://api.github.com/users/Project-OSRM/followers","following_url":"https://api.github.com/users/Project-OSRM/following{/other_user}","gists_url":"https://api.github.com/users/Project-OSRM/gists{/gist_id}","starred_url":"https://api.github.com/users/Project-OSRM/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Project-OSRM/subscriptions","organizations_url":"https://api.github.com/users/Project-OSRM/orgs","repos_url":"https://api.github.com/users/Project-OSRM/repos","events_url":"https://api.github.com/users/Project-OSRM/events{/privacy}","received_events_url":"https://api.github.com/users/Project-OSRM/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Project-OSRM/osrm-backend","description":"Project OSRM: C++ backend","fork":false,"url":"https://api.github.com/repos/Project-OSRM/osrm-backend","forks_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/forks","keys_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/teams","hooks_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/hooks","issue_events_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues/events{/number}","events_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/events","assignees_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/assignees{/user}","branches_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/branches{/branch}","tags_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/tags","blobs_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/refs{/sha}","trees_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/statuses/{sha}","languages_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/languages","stargazers_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/stargazers","contributors_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/contributors","subscribers_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/subscribers","subscription_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/subscription","commits_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/commits{/sha}","git_commits_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/git/commits{/sha}","comments_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/comments{/number}","issue_comment_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues/comments{/number}","contents_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/contents/{+path}","compare_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/merges","archive_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/downloads","issues_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues{/number}","pulls_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls{/number}","milestones_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/milestones{/number}","notifications_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/labels{/name}","releases_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/releases{/id}","deployments_url":"https://api.github.com/repos/Project-OSRM/osrm-backend/deployments","created_at":"2011-09-22T10:05:08Z","updated_at":"2016-02-08T16:42:51Z","pushed_at":"2016-02-09T17:39:29Z","git_url":"git://github.com/Project-OSRM/osrm-backend.git","ssh_url":"git@github.com:Project-OSRM/osrm-backend.git","clone_url":"https://github.com/Project-OSRM/osrm-backend.git","svn_url":"https://github.com/Project-OSRM/osrm-backend","homepage":"http://map.project-osrm.org","size":18449,"stargazers_count":1050,"watchers_count":1050,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":482,"mirror_url":null,"open_issues_count":181,"forks":482,"open_issues":181,"watchers":1050,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/1938"},"html":{"href":"https://github.com/Project-OSRM/osrm-backend/pull/1938"},"issue":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues/1938"},"comments":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/issues/1938/comments"},"review_comments":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/1938/comments"},"review_comment":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/pulls/1938/commits"},"statuses":{"href":"https://api.github.com/repos/Project-OSRM/osrm-backend/statuses/59f512d1663a62e3553e10a6a94010deba0bb061"}}}}