{"action":"created","comment":{"url":"https://api.github.com/repos/PDAL/PDAL/pulls/comments/220363717","pull_request_review_id":158755659,"id":220363717,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMDM2MzcxNw==","diff_hunk":"@@ -0,0 +1,438 @@\n+/******************************************************************************\n+* Copyright (c) 2018, Kyle Mann (kyle@hobu.co)\n+*\n+* All rights reserved.\n+*\n+* Redistribution and use in source and binary forms, with or without\n+* modification, are permitted provided that the following\n+* conditions are met:\n+*\n+*     * Redistributions of source code must retain the above copyright\n+*       notice, this list of conditions and the following disclaimer.\n+*     * Redistributions in binary form must reproduce the above copyright\n+*       notice, this list of conditions and the following disclaimer in\n+*       the documentation and/or other materials provided\n+*       with the distribution.\n+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the\n+*       names of its contributors may be used to endorse or promote\n+*       products derived from this software without specific prior\n+*       written permission.\n+*\n+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+* \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n+* OF SUCH DAMAGE.\n+****************************************************************************/\n+\n+#include \"EsriReader.hpp\"\n+#include \"../lepcc/src/include/lepcc_c_api.h\"\n+#include \"../lepcc/src/include/lepcc_types.h\"\n+#include \"pool.hpp\"\n+#include \"SlpkExtractor.hpp\"\n+\n+#include <istream>\n+#include <cstdint>\n+#include <cstring>\n+#include <cmath>\n+#include <cstdio>\n+#include <iostream>\n+#include <vector>\n+#include <algorithm>\n+#include <chrono>\n+#include <pdal/util/FileUtils.hpp>\n+#include <pdal/util/ProgramArgs.hpp>\n+#include <pdal/util/Bounds.hpp>\n+#include <pdal/pdal_features.hpp>\n+#include <pdal/compression/LazPerfCompression.hpp>\n+#include <gdal.h>\n+\n+namespace pdal\n+{\n+void EsriReader::addArgs(ProgramArgs& args)\n+{\n+    args.add(\"bounds\", \"Bounds of the point cloud\", m_args.bounds);\n+    args.add(\"threads\", \"Number of threads to be used.\" , m_args.threads);\n+}\n+\n+void EsriReader::initialize(PointTableRef table)\n+{\n+    Json::Value config;\n+    if (log()->getLevel() > LogLevel::Debug4)\n+        config[\"arbiter\"][\"verbose\"] = true;\n+    m_arbiter.reset(new arbiter::Arbiter(config));\n+\n+    const std::string pre(\"i3s://\");\n+    if (Utils::startsWith(m_filename, pre))\n+        m_filename = m_filename.substr(pre.size());\n+\n+    if (m_filename.back() == '/')\n+        m_filename.pop_back();\n+\n+    log()->get(LogLevel::Debug) << \"Fetching info from \" << m_filename <<\n+        std::endl;\n+\n+    try\n+    {\n+        initInfo();\n+    }\n+    catch (std::exception& e)\n+    {\n+        throwError(std::string(\"Failed to fetch info: \") + e.what());\n+    }\n+\n+    //create pdal Bounds\n+    m_bounds = createBounds();\n+    //find number of nodes per nodepage\n+    m_nodeCap = m_info[\"store\"][\"index\"][\"nodesPerPage\"].asInt();\n+\n+    log()->get(LogLevel::Debug) << \"FileName: \" <<\n+        m_filename << std::endl;\n+    log()->get(LogLevel::Debug) << \"Thread Count: \" <<\n+        m_args.threads << std::endl;\n+    log()->get(LogLevel::Debug) << \"Bounds: \" <<\n+        m_args.bounds << std::endl;\n+}\n+\n+void EsriReader::addDimensions(PointLayoutPtr layout)\n+{\n+    Json::Value attributes = m_info[\"attributeStorageInfo\"];\n+    layout->registerDim(Dimension::Id::X);\n+    layout->registerDim(Dimension::Id::Y);\n+    layout->registerDim(Dimension::Id::Z);\n+    for (Json::ArrayIndex i = 0; i < attributes.size(); i++)\n+    {\n+        dimData data;\n+        std::string readName = attributes[i][\"name\"].asString();\n+        data.name = readName;\n+        data.key = std::stoi(attributes[i][\"key\"].asString());\n+        data.dataType =\n+            attributes[i][\"attributeValues\"][\"valueType\"].asString();\n+\n+\n+        if (attributes[i].isMember(\"valueType\"))\n+        {\n+            data.dataType = attributes[i][\"valueType\"].asString();\n+        }\n+\n+\n+        if (readName == \"RGB\")\n+        {\n+            layout->registerDim(Dimension::Id::Red);\n+            layout->registerDim(Dimension::Id::Green);\n+            layout->registerDim(Dimension::Id::Blue);\n+            // Since RGB are always packed together and handled specially,\n+            // we'll use Red as our indicator that RGB exists.\n+\n+            m_dimMap[Dimension::Id::Red] = data;\n+        }\n+        //Available dimension types can be found at https://git.io/fAbxS\n+        else if (m_dimensions.find(readName) != m_dimensions.end())\n+        {\n+            data.dimType = Dimension::Type::None;\n+\n+            auto it = dimTypes.find(data.dataType);\n+            if (it != dimTypes.end())\n+                data.dimType = it->second;\n+\n+            if (data.dimType != Dimension::Type::None)\n+            {\n+                layout->registerDim(m_dimensions.at(readName));\n+                m_dimMap[m_dimensions.at(readName)] = data;\n+            }\n+            else\n+            {\n+                log()->get(LogLevel::Warning) <<\n+                    \"Could not find Dimension type for \" <<\n+                    readName << std::endl;\n+            }\n+        }\n+        else if (attributes[i].isMember(\"attributeValues\"))\n+        {\n+\n+            std::string s =\n+                attributes[i][\"attributeValues\"][\"valueType\"].asString();\n+            const pdal::Dimension::Id id = layout->registerOrAssignDim(\n+                    readName, pdal::Dimension::type(s));\n+            if(data.dimType != Dimension::Type::None)\n+                m_dimMap[id] = data;\n+        }\n+        else\n+        {\n+            const pdal::Dimension::Id id = layout->\n+                registerOrAssignDim(readName, Dimension::Type::Double);\n+            m_dimMap[id] = data;\n+        }\n+    }\n+}\n+\n+void EsriReader::ready(PointTableRef)\n+{\n+    Json::Value spatialJson = m_info[\"spatialReference\"];\n+    std::string spatialStr = \"EPSG:\" + spatialJson[\"wkid\"].asString();\n+    m_nativeSrs = SpatialReference(spatialStr);\n+    setSpatialReference(m_nativeSrs);\n+\n+    m_ecefSrs = SpatialReference(\"EPSG:4978\");\n+\n+    m_ecefRef = OSRNewSpatialReference(m_ecefSrs.getWKT().c_str());\n+    m_nativeRef = OSRNewSpatialReference(m_nativeSrs.getWKT().c_str());\n+\n+    m_toEcefTransform = OCTNewCoordinateTransformation(m_nativeRef,\n+            m_ecefRef);\n+\n+    m_toNativeTransform = OCTNewCoordinateTransformation(m_ecefRef,\n+            m_nativeRef);\n+}\n+\n+\n+point_count_t EsriReader::read(PointViewPtr view, point_count_t count)\n+{\n+    /*\n+    -3Dscenelayerinfo: URL Pattern <scene-server-url/layers/<layer-id>\n+    -node index document: <layer-url >/nodepages/<iterative node page id>\n+    -shared resources: <node-url>/shared/\n+    -feature data: <node-url>/features/<feature-data-bundle-id>\n+    -geometry data: <node-url>/geometries/<geometry-data-bundle-id>\n+    -texture data: <node-url>/textures/<texture-data-bundle-id>\n+    */\n+\n+    //Build the node list that will tell us which nodes overlap with bounds\n+    std::vector<int> nodes;\n+    buildNodeList(nodes, 0);\n+\n+    //Create view with overlapping leaf nodes\n+    //Will create a thread pool on the createview class and iterate\n+    //through the node list for the nodes to be pulled.\n+    log()->get(LogLevel::Debug) << \"Fetching binaries\" << std::endl;\n+    Pool p(m_args.threads);\n+    for (std::size_t i = 0; i < nodes.size(); i++)\n+    {\n+        log()->get(LogLevel::Debug) << \"\\r\" << i << \"/\" << nodes.size();\n+        std::string localUrl;\n+\n+        localUrl = m_filename + \"/nodes/\" + std::to_string(nodes[i]);\n+\n+        p.add([localUrl, this, &view]()\n+        {\n+            createView(localUrl, view);","path":"plugins/i3s/io/EsriReader.cpp","position":null,"original_position":225,"commit_id":"f5307564286aa7b8675987c45be5c170ad5ed377","original_commit_id":"ee34f1ce4ff235fed0f402bb09bf82d4ece3d9f2","user":{"login":"connormanning","id":5015470,"node_id":"MDQ6VXNlcjUwMTU0NzA=","avatar_url":"https://avatars1.githubusercontent.com/u/5015470?v=4","gravatar_id":"","url":"https://api.github.com/users/connormanning","html_url":"https://github.com/connormanning","followers_url":"https://api.github.com/users/connormanning/followers","following_url":"https://api.github.com/users/connormanning/following{/other_user}","gists_url":"https://api.github.com/users/connormanning/gists{/gist_id}","starred_url":"https://api.github.com/users/connormanning/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/connormanning/subscriptions","organizations_url":"https://api.github.com/users/connormanning/orgs","repos_url":"https://api.github.com/users/connormanning/repos","events_url":"https://api.github.com/users/connormanning/events{/privacy}","received_events_url":"https://api.github.com/users/connormanning/received_events","type":"User","site_admin":false},"body":"Actually from the spec I'm not sure about this.\r\n\r\n\"If multiple threads of execution access the same shared_ptr without synchronization and any of those accesses uses a non-const member function of shared_ptr then a data race will occur\".  The copy constructor is not a non-const member so maybe it's ok...","created_at":"2018-09-25T21:35:20Z","updated_at":"2018-09-25T21:35:20Z","html_url":"https://github.com/PDAL/PDAL/pull/2176#discussion_r220363717","pull_request_url":"https://api.github.com/repos/PDAL/PDAL/pulls/2176","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/PDAL/PDAL/pulls/comments/220363717"},"html":{"href":"https://github.com/PDAL/PDAL/pull/2176#discussion_r220363717"},"pull_request":{"href":"https://api.github.com/repos/PDAL/PDAL/pulls/2176"}},"in_reply_to_id":220356776},"pull_request":{"url":"https://api.github.com/repos/PDAL/PDAL/pulls/2176","id":217481174,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE3NDgxMTc0","html_url":"https://github.com/PDAL/PDAL/pull/2176","diff_url":"https://github.com/PDAL/PDAL/pull/2176.diff","patch_url":"https://github.com/PDAL/PDAL/pull/2176.patch","issue_url":"https://api.github.com/repos/PDAL/PDAL/issues/2176","number":2176,"state":"open","locked":false,"title":"I3S and SLPK readers","user":{"login":"kylemann16","id":39525199,"node_id":"MDQ6VXNlcjM5NTI1MTk5","avatar_url":"https://avatars2.githubusercontent.com/u/39525199?v=4","gravatar_id":"","url":"https://api.github.com/users/kylemann16","html_url":"https://github.com/kylemann16","followers_url":"https://api.github.com/users/kylemann16/followers","following_url":"https://api.github.com/users/kylemann16/following{/other_user}","gists_url":"https://api.github.com/users/kylemann16/gists{/gist_id}","starred_url":"https://api.github.com/users/kylemann16/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kylemann16/subscriptions","organizations_url":"https://api.github.com/users/kylemann16/orgs","repos_url":"https://api.github.com/users/kylemann16/repos","events_url":"https://api.github.com/users/kylemann16/events{/privacy}","received_events_url":"https://api.github.com/users/kylemann16/received_events","type":"User","site_admin":false},"body":"Adds two new readers as plugins: An I3S reader which uses an \"i3s://\" protocol prefix as well as an SLPK reader which uses a \".slpk\" suffix. ","created_at":"2018-09-22T22:13:42Z","updated_at":"2018-09-25T21:35:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1bf0dc5900c3b1b3eb705e81970673595984cbb6","assignee":null,"assignees":[],"requested_reviewers":[{"login":"hobu","id":87751,"node_id":"MDQ6VXNlcjg3NzUx","avatar_url":"https://avatars2.githubusercontent.com/u/87751?v=4","gravatar_id":"","url":"https://api.github.com/users/hobu","html_url":"https://github.com/hobu","followers_url":"https://api.github.com/users/hobu/followers","following_url":"https://api.github.com/users/hobu/following{/other_user}","gists_url":"https://api.github.com/users/hobu/gists{/gist_id}","starred_url":"https://api.github.com/users/hobu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hobu/subscriptions","organizations_url":"https://api.github.com/users/hobu/orgs","repos_url":"https://api.github.com/users/hobu/repos","events_url":"https://api.github.com/users/hobu/events{/privacy}","received_events_url":"https://api.github.com/users/hobu/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/PDAL/PDAL/pulls/2176/commits","review_comments_url":"https://api.github.com/repos/PDAL/PDAL/pulls/2176/comments","review_comment_url":"https://api.github.com/repos/PDAL/PDAL/pulls/comments{/number}","comments_url":"https://api.github.com/repos/PDAL/PDAL/issues/2176/comments","statuses_url":"https://api.github.com/repos/PDAL/PDAL/statuses/f5307564286aa7b8675987c45be5c170ad5ed377","head":{"label":"PDAL:i3s","ref":"i3s","sha":"f5307564286aa7b8675987c45be5c170ad5ed377","user":{"login":"PDAL","id":859797,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1OTc5Nw==","avatar_url":"https://avatars1.githubusercontent.com/u/859797?v=4","gravatar_id":"","url":"https://api.github.com/users/PDAL","html_url":"https://github.com/PDAL","followers_url":"https://api.github.com/users/PDAL/followers","following_url":"https://api.github.com/users/PDAL/following{/other_user}","gists_url":"https://api.github.com/users/PDAL/gists{/gist_id}","starred_url":"https://api.github.com/users/PDAL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PDAL/subscriptions","organizations_url":"https://api.github.com/users/PDAL/orgs","repos_url":"https://api.github.com/users/PDAL/repos","events_url":"https://api.github.com/users/PDAL/events{/privacy}","received_events_url":"https://api.github.com/users/PDAL/received_events","type":"Organization","site_admin":false},"repo":{"id":2234863,"node_id":"MDEwOlJlcG9zaXRvcnkyMjM0ODYz","name":"PDAL","full_name":"PDAL/PDAL","private":false,"owner":{"login":"PDAL","id":859797,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1OTc5Nw==","avatar_url":"https://avatars1.githubusercontent.com/u/859797?v=4","gravatar_id":"","url":"https://api.github.com/users/PDAL","html_url":"https://github.com/PDAL","followers_url":"https://api.github.com/users/PDAL/followers","following_url":"https://api.github.com/users/PDAL/following{/other_user}","gists_url":"https://api.github.com/users/PDAL/gists{/gist_id}","starred_url":"https://api.github.com/users/PDAL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PDAL/subscriptions","organizations_url":"https://api.github.com/users/PDAL/orgs","repos_url":"https://api.github.com/users/PDAL/repos","events_url":"https://api.github.com/users/PDAL/events{/privacy}","received_events_url":"https://api.github.com/users/PDAL/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/PDAL/PDAL","description":"PDAL is Point Data Abstraction Library. GDAL for point cloud data.","fork":false,"url":"https://api.github.com/repos/PDAL/PDAL","forks_url":"https://api.github.com/repos/PDAL/PDAL/forks","keys_url":"https://api.github.com/repos/PDAL/PDAL/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PDAL/PDAL/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PDAL/PDAL/teams","hooks_url":"https://api.github.com/repos/PDAL/PDAL/hooks","issue_events_url":"https://api.github.com/repos/PDAL/PDAL/issues/events{/number}","events_url":"https://api.github.com/repos/PDAL/PDAL/events","assignees_url":"https://api.github.com/repos/PDAL/PDAL/assignees{/user}","branches_url":"https://api.github.com/repos/PDAL/PDAL/branches{/branch}","tags_url":"https://api.github.com/repos/PDAL/PDAL/tags","blobs_url":"https://api.github.com/repos/PDAL/PDAL/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PDAL/PDAL/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PDAL/PDAL/git/refs{/sha}","trees_url":"https://api.github.com/repos/PDAL/PDAL/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PDAL/PDAL/statuses/{sha}","languages_url":"https://api.github.com/repos/PDAL/PDAL/languages","stargazers_url":"https://api.github.com/repos/PDAL/PDAL/stargazers","contributors_url":"https://api.github.com/repos/PDAL/PDAL/contributors","subscribers_url":"https://api.github.com/repos/PDAL/PDAL/subscribers","subscription_url":"https://api.github.com/repos/PDAL/PDAL/subscription","commits_url":"https://api.github.com/repos/PDAL/PDAL/commits{/sha}","git_commits_url":"https://api.github.com/repos/PDAL/PDAL/git/commits{/sha}","comments_url":"https://api.github.com/repos/PDAL/PDAL/comments{/number}","issue_comment_url":"https://api.github.com/repos/PDAL/PDAL/issues/comments{/number}","contents_url":"https://api.github.com/repos/PDAL/PDAL/contents/{+path}","compare_url":"https://api.github.com/repos/PDAL/PDAL/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PDAL/PDAL/merges","archive_url":"https://api.github.com/repos/PDAL/PDAL/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PDAL/PDAL/downloads","issues_url":"https://api.github.com/repos/PDAL/PDAL/issues{/number}","pulls_url":"https://api.github.com/repos/PDAL/PDAL/pulls{/number}","milestones_url":"https://api.github.com/repos/PDAL/PDAL/milestones{/number}","notifications_url":"https://api.github.com/repos/PDAL/PDAL/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PDAL/PDAL/labels{/name}","releases_url":"https://api.github.com/repos/PDAL/PDAL/releases{/id}","deployments_url":"https://api.github.com/repos/PDAL/PDAL/deployments","created_at":"2011-08-19T15:57:50Z","updated_at":"2018-09-25T16:23:46Z","pushed_at":"2018-09-25T21:32:23Z","git_url":"git://github.com/PDAL/PDAL.git","ssh_url":"git@github.com:PDAL/PDAL.git","clone_url":"https://github.com/PDAL/PDAL.git","svn_url":"https://github.com/PDAL/PDAL","homepage":"https://pdal.io","size":124476,"stargazers_count":298,"watchers_count":298,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":168,"mirror_url":null,"archived":false,"open_issues_count":58,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":168,"open_issues":58,"watchers":298,"default_branch":"master"}},"base":{"label":"PDAL:master","ref":"master","sha":"cafff53a1c0ea15dc22f8d4b79d182be110ca4bd","user":{"login":"PDAL","id":859797,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1OTc5Nw==","avatar_url":"https://avatars1.githubusercontent.com/u/859797?v=4","gravatar_id":"","url":"https://api.github.com/users/PDAL","html_url":"https://github.com/PDAL","followers_url":"https://api.github.com/users/PDAL/followers","following_url":"https://api.github.com/users/PDAL/following{/other_user}","gists_url":"https://api.github.com/users/PDAL/gists{/gist_id}","starred_url":"https://api.github.com/users/PDAL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PDAL/subscriptions","organizations_url":"https://api.github.com/users/PDAL/orgs","repos_url":"https://api.github.com/users/PDAL/repos","events_url":"https://api.github.com/users/PDAL/events{/privacy}","received_events_url":"https://api.github.com/users/PDAL/received_events","type":"Organization","site_admin":false},"repo":{"id":2234863,"node_id":"MDEwOlJlcG9zaXRvcnkyMjM0ODYz","name":"PDAL","full_name":"PDAL/PDAL","private":false,"owner":{"login":"PDAL","id":859797,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1OTc5Nw==","avatar_url":"https://avatars1.githubusercontent.com/u/859797?v=4","gravatar_id":"","url":"https://api.github.com/users/PDAL","html_url":"https://github.com/PDAL","followers_url":"https://api.github.com/users/PDAL/followers","following_url":"https://api.github.com/users/PDAL/following{/other_user}","gists_url":"https://api.github.com/users/PDAL/gists{/gist_id}","starred_url":"https://api.github.com/users/PDAL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PDAL/subscriptions","organizations_url":"https://api.github.com/users/PDAL/orgs","repos_url":"https://api.github.com/users/PDAL/repos","events_url":"https://api.github.com/users/PDAL/events{/privacy}","received_events_url":"https://api.github.com/users/PDAL/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/PDAL/PDAL","description":"PDAL is Point Data Abstraction Library. GDAL for point cloud data.","fork":false,"url":"https://api.github.com/repos/PDAL/PDAL","forks_url":"https://api.github.com/repos/PDAL/PDAL/forks","keys_url":"https://api.github.com/repos/PDAL/PDAL/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PDAL/PDAL/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PDAL/PDAL/teams","hooks_url":"https://api.github.com/repos/PDAL/PDAL/hooks","issue_events_url":"https://api.github.com/repos/PDAL/PDAL/issues/events{/number}","events_url":"https://api.github.com/repos/PDAL/PDAL/events","assignees_url":"https://api.github.com/repos/PDAL/PDAL/assignees{/user}","branches_url":"https://api.github.com/repos/PDAL/PDAL/branches{/branch}","tags_url":"https://api.github.com/repos/PDAL/PDAL/tags","blobs_url":"https://api.github.com/repos/PDAL/PDAL/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PDAL/PDAL/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PDAL/PDAL/git/refs{/sha}","trees_url":"https://api.github.com/repos/PDAL/PDAL/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PDAL/PDAL/statuses/{sha}","languages_url":"https://api.github.com/repos/PDAL/PDAL/languages","stargazers_url":"https://api.github.com/repos/PDAL/PDAL/stargazers","contributors_url":"https://api.github.com/repos/PDAL/PDAL/contributors","subscribers_url":"https://api.github.com/repos/PDAL/PDAL/subscribers","subscription_url":"https://api.github.com/repos/PDAL/PDAL/subscription","commits_url":"https://api.github.com/repos/PDAL/PDAL/commits{/sha}","git_commits_url":"https://api.github.com/repos/PDAL/PDAL/git/commits{/sha}","comments_url":"https://api.github.com/repos/PDAL/PDAL/comments{/number}","issue_comment_url":"https://api.github.com/repos/PDAL/PDAL/issues/comments{/number}","contents_url":"https://api.github.com/repos/PDAL/PDAL/contents/{+path}","compare_url":"https://api.github.com/repos/PDAL/PDAL/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PDAL/PDAL/merges","archive_url":"https://api.github.com/repos/PDAL/PDAL/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PDAL/PDAL/downloads","issues_url":"https://api.github.com/repos/PDAL/PDAL/issues{/number}","pulls_url":"https://api.github.com/repos/PDAL/PDAL/pulls{/number}","milestones_url":"https://api.github.com/repos/PDAL/PDAL/milestones{/number}","notifications_url":"https://api.github.com/repos/PDAL/PDAL/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PDAL/PDAL/labels{/name}","releases_url":"https://api.github.com/repos/PDAL/PDAL/releases{/id}","deployments_url":"https://api.github.com/repos/PDAL/PDAL/deployments","created_at":"2011-08-19T15:57:50Z","updated_at":"2018-09-25T16:23:46Z","pushed_at":"2018-09-25T21:32:23Z","git_url":"git://github.com/PDAL/PDAL.git","ssh_url":"git@github.com:PDAL/PDAL.git","clone_url":"https://github.com/PDAL/PDAL.git","svn_url":"https://github.com/PDAL/PDAL","homepage":"https://pdal.io","size":124476,"stargazers_count":298,"watchers_count":298,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":168,"mirror_url":null,"archived":false,"open_issues_count":58,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":168,"open_issues":58,"watchers":298,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/PDAL/PDAL/pulls/2176"},"html":{"href":"https://github.com/PDAL/PDAL/pull/2176"},"issue":{"href":"https://api.github.com/repos/PDAL/PDAL/issues/2176"},"comments":{"href":"https://api.github.com/repos/PDAL/PDAL/issues/2176/comments"},"review_comments":{"href":"https://api.github.com/repos/PDAL/PDAL/pulls/2176/comments"},"review_comment":{"href":"https://api.github.com/repos/PDAL/PDAL/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/PDAL/PDAL/pulls/2176/commits"},"statuses":{"href":"https://api.github.com/repos/PDAL/PDAL/statuses/f5307564286aa7b8675987c45be5c170ad5ed377"}},"author_association":"NONE"}}
{"actor":{"display_login":"connormanning"}}